/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.gui;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Graphics;
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.SelectBox;
import com.badlogic.gdx.scenes.scene2d.ui.Slider;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.happydroids.droidtowers.DroidTowersGame;
import com.happydroids.droidtowers.TowerAssetManager;
import com.happydroids.droidtowers.gamestate.server.TowerGameService;
import com.happydroids.droidtowers.platform.Display;
import com.happydroids.droidtowers.scenes.components.SceneManager;
import com.happydroids.security.SecurePreferences;
import javax.annotation.Nullable;
import java.util.List;
public class OptionsDialog extends Dialog {
private final SecurePreferences preferences;
private final CheckBox fullscreenCheckbox;
private SelectBox displayResolution;
private List<Graphics.DisplayMode> displayModeList;
private boolean displayModeChanged;
public OptionsDialog(Stage stage) {
super(stage);
preferences = TowerGameService.instance().getPreferences();
fullscreenCheckbox = FontManager.RobotoBold18.makeCheckBox("Fullscreen");
fullscreenCheckbox.setChecked(Gdx.graphics.isFullscreen());
setTitle("Options");
Table c = new Table();
c.defaults().top().left().space(Display.devicePixel(16));
c.row().fillX();
c.add(FontManager.Default.makeLabel("Music Volume"));
c.add(makeMusicVolumeSlider());
c.row().fillX();
c.add(FontManager.Default.makeLabel("Effects Volume"));
c.add(makeSoundEffectsVolumeSlider());
if (Gdx.app.getType().equals(Application.ApplicationType.Android)) {
c.row().fillX();
c.add();
c.add(makeHapticFeedbackCheckbox());
}
if (Gdx.app.getType().equals(Application.ApplicationType.Desktop)) {
c.row().fillX();
c.add(FontManager.RobotoBold18.makeLabel("Resolution: "));
c.add(makeResolutionSelectBox());
fullscreenCheckbox.addListener(new VibrateClickListener() {
@Override
public void onClick(InputEvent event, float x, float y) {
saveDisplayChanges(displayModeList.get(displayResolution.getSelectionIndex()));
}
});
c.row();
c.add();
c.add(fullscreenCheckbox);
setDismissCallback(new Runnable() {
@Override
public void run() {
if (displayModeChanged) {
Gdx.graphics
.setDisplayMode(preferences.getInteger("width"), preferences.getInteger("height"), preferences.getBoolean("fullscreen"));
SceneManager.restartActiveScene();
}
}
});
}
setView(c);
}
private CheckBox makeHapticFeedbackCheckbox() {
final CheckBox checkBox = FontManager.Roboto18.makeCheckBox("Vibrate on touch");
checkBox.setChecked(VibrateClickListener.isVibrateEnabled());
checkBox.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
VibrateClickListener.setVibrateEnabled(checkBox.isChecked());
preferences.putBoolean("vibrateOnTouch", checkBox.isChecked());
preferences.flush();
}
});
return checkBox;
}
private Slider makeMusicVolumeSlider() {
final Slider slider = new Slider(0f, 1f, 0.1f, false, TowerAssetManager.getCustomSkin());
slider.setValue(DroidTowersGame.getSoundController().getMusicVolume());
slider.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
DroidTowersGame.getSoundController().setMusicVolume(slider.getValue());
}
});
return slider;
}
private Slider makeSoundEffectsVolumeSlider() {
final Slider slider = new Slider(0f, 1f, 0.1f, false, TowerAssetManager.getCustomSkin());
slider.setValue(DroidTowersGame.getSoundController().getEffectsVolume());
slider.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
preferences.putFloat("effectsVolume", slider.getValue());
DroidTowersGame.getSoundController().setEffectsVolume(slider.getValue());
}
});
return slider;
}
private SelectBox makeResolutionSelectBox() {
List<Graphics.DisplayMode> displayModes = Lists.newArrayList();
for (Graphics.DisplayMode displayMode : Gdx.graphics.getDisplayModes()) {
if (displayMode.width > 800 && displayMode.height > 480) {
displayModes.add(displayMode);
}
}
displayModeList = Ordering.natural().onResultOf(new Function<Graphics.DisplayMode, Comparable>() {
@Override
public Comparable apply(@Nullable Graphics.DisplayMode input) {
return input.width * input.height * input.bitsPerPixel;
}
}).sortedCopy(Lists.newArrayList(displayModes));
List<String> displayModeStrings = Lists.newArrayList();
for (Graphics.DisplayMode displayMode : displayModeList) {
displayModeStrings.add(displayMode.width + "x" + displayMode.height);
}
displayResolution = new SelectBox(displayModeStrings.toArray(), TowerAssetManager.getCustomSkin());
int currentResolution = displayModeStrings.indexOf(Display.getWidth() + "x" + Gdx.graphics.getHeight());
if (currentResolution > -1) {
displayResolution.setSelection(currentResolution);
}
displayResolution.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
saveDisplayChanges(displayModeList.get(displayResolution.getSelectionIndex()));
}
});
return displayResolution;
}
private String formatDisplayMode(Graphics.DisplayMode displayMode) {
return displayMode.width + "x" + displayMode.height;
}
private void saveDisplayChanges(Graphics.DisplayMode displayMode) {
displayModeChanged = true;
preferences.putInteger("width", displayMode.width);
preferences.putInteger("height", displayMode.height);
preferences.putBoolean("fullscreen", fullscreenCheckbox.isChecked());
preferences.flush();
}
}