package com.fteams.siftrain.screens;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputMultiplexer;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.List;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.viewport.ExtendViewport;
import com.fteams.siftrain.assets.Assets;
import com.fteams.siftrain.assets.GlobalConfiguration;
import com.fteams.siftrain.assets.SimpleSongLoader;
import com.fteams.siftrain.controller.Crossfader;
import com.fteams.siftrain.controller.SongLoader;
import com.fteams.siftrain.entities.SimpleSongGroup;
import com.fteams.siftrain.entities.SongFileInfo;
@SuppressWarnings("unchecked")
public class SongSelectionScreen implements Screen, InputProcessor {
private Stage stage = new Stage(new ExtendViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()));
private List<SimpleSongGroup> songList = new List<>(Assets.menuSkin, "diff_list");
private ScrollPane songListPane = new ScrollPane(null, Assets.menuSkin);
private List<SongFileInfo> diffList = new List<>(Assets.menuSkin, "diff_list");
private ScrollPane diffListPane = new ScrollPane(null, Assets.menuSkin);
private Table table = new Table();
private TextButton nextButton = new TextButton("Next", Assets.menuSkin, "item1");
private TextButton backButton = new TextButton("Back", Assets.menuSkin, "item1");
private Image backgroundImage = new Image(Assets.mainMenuBackgroundTexture);
private CheckBox randomCheckbox = new CheckBox("Randomize Notes (" + (GlobalConfiguration.random ? "X" : " ") + ")", Assets.menuSkin);
private Crossfader previewCrossfader = new Crossfader();
private void stopPreviewSong() {
previewCrossfader.dispose();
}
private void updatePreviewSong() {
if(Assets.selectedGroup == null)
return;
Music previewMusic = null;
String musicFile = Assets.selectedGroup.music_file;
if(musicFile != null)
previewMusic = SongLoader.loadSongByName(musicFile);
if(previewMusic == null)
previewMusic = SongLoader.loadSongByName(Assets.selectedGroup.resource_name);
previewCrossfader.enqueue(previewMusic);
}
@Override
public void show() {
float scaleFactor = stage.getHeight() / GlobalConfiguration.BASE_HEIGHT;
//The elements are displayed in the order you add them.
//The first appear on top, the last at the bottom.
backgroundImage.setSize(stage.getWidth(), stage.getHeight());
stage.addActor(backgroundImage);
Assets.songGroup.sort();
songList.setItems(Assets.songGroup);
if (Assets.selectedGroup != null) {
songList.setSelected(Assets.selectedGroup);
diffList.setItems(Assets.selectedGroup.songs);
} else {
if (songList.getItems().size != 0)
{
Assets.selectedGroup = songList.getItems().get(0);
diffList.setItems(Assets.selectedGroup.songs);
}
}
songList.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
SimpleSongGroup previousGroup = Assets.selectedGroup;
SimpleSongGroup newSelected = (SimpleSongGroup) ((List) actor).getSelected();
if (previousGroup == newSelected) {
// if the same group was selected we ignore it
return;
}
Assets.selectedGroup = newSelected;
diffList.setItems(newSelected.songs);
updatePreviewSong();
}
});
if (Assets.selectedBeatmap != null) {
diffList.setSelected(Assets.selectedBeatmap);
} else {
diffList.setSelected(diffList.getItems().size == 0 ? null : diffList.getItems().first());
}
diffList.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
SongFileInfo previous = Assets.selectedBeatmap;
SongFileInfo newSelection = (SongFileInfo) ((List) actor).getSelected();
if (previous == newSelection) {
return;
}
Assets.selectedBeatmap = newSelection;
}
});
nextButton.getLabel().setFontScale(scaleFactor);
backButton.getLabel().setFontScale(scaleFactor);
randomCheckbox.getLabel().setFontScale(scaleFactor);
randomCheckbox.getImageCell().width(0f);
randomCheckbox.setChecked(GlobalConfiguration.random);
songListPane.setWidget(songList);
songListPane.setWidth(stage.getWidth());
diffListPane.setWidget(diffList);
diffListPane.setWidth(stage.getWidth());
table.add(songListPane).colspan(3).size(stage.getWidth() * 0.87f, stage.getHeight() * 0.49f).padBottom(stage.getHeight() * 0.01f).row();
table.add(diffListPane).colspan(3).size(stage.getWidth() * 0.87f, stage.getHeight() * 0.23f).padBottom(stage.getHeight() * 0.01f).padTop(stage.getHeight() * 0.01f).row();
table.setWidth(stage.getWidth());
table.setHeight(stage.getHeight());
backButton.addListener((new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
Assets.selectedGroup = songList.getSelected();
Assets.selectedBeatmap = diffList.getSelected();
stopPreviewSong();
((Game) Gdx.app.getApplicationListener()).setScreen(new MainMenuScreen());
}
}));
nextButton.addListener((new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
if (diffList.getSelected() == null) {
return;
}
stopPreviewSong();
Assets.selectedBeatmap = diffList.getSelected();
SimpleSongLoader loader = new SimpleSongLoader();
Assets.selectedSong = loader.loadSong(Assets.selectedBeatmap);
if (!Assets.selectedSong.getValid() || loader.getErrors().size() > 0 || loader.getWarnings().size() > 0) {
((Game) Gdx.app.getApplicationListener()).setScreen(new BeatmapLoadingScreen());
} else {
((Game) Gdx.app.getApplicationListener()).setScreen(new LiveOptionsScreen());
}
}
}));
randomCheckbox.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
GlobalConfiguration.random = ((CheckBox) actor).isChecked();
randomCheckbox.setText("Randomize Notes (" + (GlobalConfiguration.random ? "X" : " ") + ")");
}
});
table.add(backButton).size(stage.getWidth() * 0.87f / 3, stage.getHeight() * 0.12f);
table.add(nextButton).size(stage.getWidth() * 0.87f / 3, stage.getHeight() * 0.12f);
table.add(randomCheckbox).size(stage.getWidth() * 0.87f / 3, stage.getHeight() * 0.12f).row();
stage.addActor(table);
InputMultiplexer impx = new InputMultiplexer();
impx.addProcessor(this);
impx.addProcessor(stage);
Gdx.input.setInputProcessor(impx);
Gdx.input.setCatchBackKey(true);
updatePreviewSong();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
previewCrossfader.update(delta);
songListPane.act(delta);
stage.act();
stage.draw();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
dispose();
}
@Override
public void dispose() {
stopPreviewSong();
stage.dispose();
}
@Override
public boolean keyDown(int keycode) {
return false;
}
@Override
public boolean keyUp(int keycode) {
if (keycode == Input.Keys.BACK || keycode == Input.Keys.ESCAPE) {
Assets.selectedBeatmap = diffList.getSelected();
Assets.selectedGroup = songList.getSelected();
stopPreviewSong();
((Game) Gdx.app.getApplicationListener()).setScreen(new MainMenuScreen());
// do nothing
return true;
}
return false;
}
@Override
public boolean keyTyped(char character) {
return false;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
return false;
}
@Override
public boolean scrolled(int amount) {
return false;
}
}