Many UI changes, WIP main menu rework
This commit is contained in:
33
core/src/io/anuke/mindustry/ui/FloatingDialog.java
Normal file
33
core/src/io/anuke/mindustry/ui/FloatingDialog.java
Normal file
@@ -0,0 +1,33 @@
|
||||
package io.anuke.mindustry.ui;
|
||||
|
||||
import com.badlogic.gdx.Input.Keys;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.utils.Align;
|
||||
|
||||
import io.anuke.ucore.scene.ui.Dialog;
|
||||
import io.anuke.ucore.scene.ui.Image;
|
||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||
|
||||
public class FloatingDialog extends Dialog{
|
||||
|
||||
public FloatingDialog(String title){
|
||||
super(title, "dialog");
|
||||
setFillParent(true);
|
||||
title().setAlignment(Align.center);
|
||||
getTitleTable().row();
|
||||
getTitleTable().add(new Image("white"))
|
||||
.growX().height(3f).pad(4f).units(Unit.dp).get().setColor(Color.ORANGE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCloseButton(){
|
||||
buttons().addImageTextButton("Back", "icon-arrow-left", Unit.dp.inPixels(30f), ()->{
|
||||
hide();
|
||||
}).size(230f, 64f).units(Unit.dp);
|
||||
|
||||
keyDown(key->{
|
||||
if(key == Keys.ESCAPE || key == Keys.BACK)
|
||||
hide();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -5,56 +5,70 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import io.anuke.mindustry.Vars;
|
||||
import io.anuke.mindustry.world.Map;
|
||||
import io.anuke.mindustry.world.World;
|
||||
import io.anuke.ucore.core.Core;
|
||||
import io.anuke.ucore.core.Settings;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.function.StringSupplier;
|
||||
import io.anuke.ucore.scene.ui.ButtonGroup;
|
||||
import io.anuke.ucore.scene.ui.Dialog;
|
||||
import io.anuke.ucore.scene.ui.ImageButton;
|
||||
import io.anuke.ucore.scene.ui.ScrollPane;
|
||||
import io.anuke.ucore.scene.ui.layout.Table;
|
||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||
|
||||
public class LevelDialog extends Dialog{
|
||||
public class LevelDialog extends FloatingDialog{
|
||||
private Map selectedMap = Map.delta;
|
||||
private TextureRegion region = new TextureRegion();
|
||||
|
||||
public LevelDialog(){
|
||||
super("Level Select");
|
||||
getTitleTable().getCell(title()).growX().center();
|
||||
getTitleTable().center();
|
||||
setup();
|
||||
}
|
||||
|
||||
void setup(){
|
||||
addCloseButton();
|
||||
getButtonTable().addButton("Play", ()->{
|
||||
hide();
|
||||
Vars.control.playMap(selectedMap);
|
||||
}).pad(3).size(180, 44).units(Unit.dp);
|
||||
Table maps = new Table();
|
||||
ScrollPane pane = new ScrollPane(maps);
|
||||
|
||||
ButtonGroup<ImageButton> mapgroup = new ButtonGroup<>();
|
||||
int maxwidth = 4;
|
||||
|
||||
for(Map map : Map.values()){
|
||||
for(int i = 0; i < Map.values().length; i ++){
|
||||
Map map = Map.values()[i];
|
||||
|
||||
if(!map.visible) continue;
|
||||
|
||||
content().add(map.name());
|
||||
}
|
||||
|
||||
content().row();
|
||||
|
||||
for(Map map : Map.values()){
|
||||
if(!map.visible) continue;
|
||||
if(i % maxwidth == 0){
|
||||
maps.row();
|
||||
}
|
||||
|
||||
Table inset = new Table("pane");
|
||||
inset.add("[orange]"+map.name()).pad(3f).units(Unit.dp);
|
||||
inset.row();
|
||||
inset.add((StringSupplier)(()->"High Score: [lime]" + Settings.getInt("hiscore" + map.name())))
|
||||
.pad(3f).units(Unit.dp);
|
||||
inset.pack();
|
||||
|
||||
float images = Unit.dp.inPixels(154);
|
||||
|
||||
ImageButton image = new ImageButton(new TextureRegion(World.getTexture(map)), "togglemap");
|
||||
mapgroup.add(image);
|
||||
image.row();
|
||||
image.add(inset).width(images+6);
|
||||
image.clicked(()->{
|
||||
selectedMap = map;
|
||||
hide();
|
||||
Vars.control.playMap(selectedMap);
|
||||
});
|
||||
image.getImageCell().size(Unit.dp.inPixels(164));
|
||||
content().add(image).size(Unit.dp.inPixels(180));
|
||||
image.getImageCell().size(images);
|
||||
maps.add(image).width(Unit.dp.inPixels(170)).pad(4f).units(Unit.dp);
|
||||
}
|
||||
|
||||
content().row();
|
||||
content().add(pane);
|
||||
|
||||
for(Map map : Map.values()){
|
||||
if(!map.visible) continue;
|
||||
|
||||
content().add((StringSupplier)(()->"High Score: [lime]" + Settings.getInt("hiscore" + map.name())));
|
||||
}
|
||||
shown(()->{
|
||||
//this is necessary for some reason?
|
||||
Timers.run(2f, ()->{
|
||||
Core.scene.setScrollFocus(pane);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,25 +8,27 @@ import io.anuke.mindustry.GameState;
|
||||
import io.anuke.mindustry.GameState.State;
|
||||
import io.anuke.mindustry.Vars;
|
||||
import io.anuke.mindustry.io.SaveIO;
|
||||
import io.anuke.ucore.scene.ui.Dialog;
|
||||
import io.anuke.ucore.scene.ui.Label;
|
||||
import io.anuke.ucore.scene.ui.TextButton;
|
||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||
|
||||
//TODO unified save/load dialogs
|
||||
public class LoadDialog extends Dialog{
|
||||
public class LoadDialog extends FloatingDialog{
|
||||
|
||||
public LoadDialog() {
|
||||
super("Load Game");
|
||||
public LoadDialog(){
|
||||
this("Load Game");
|
||||
}
|
||||
|
||||
public LoadDialog(String title) {
|
||||
super(title);
|
||||
setup();
|
||||
|
||||
|
||||
shown(() -> {
|
||||
setup();
|
||||
});
|
||||
|
||||
getButtonTable().addButton("Back", () -> {
|
||||
hide();
|
||||
}).pad(2).size(180, 44).units(Unit.dp);
|
||||
addCloseButton();
|
||||
}
|
||||
|
||||
private void setup(){
|
||||
@@ -49,34 +51,37 @@ public class LoadDialog extends Dialog{
|
||||
|
||||
button.add(info).padBottom(2).padTop(6);
|
||||
button.getLabel().setFontScale(Unit.dp.inPixels(0.75f));
|
||||
button.setDisabled(!SaveIO.isSaveValid(i));
|
||||
|
||||
button.clicked(() -> {
|
||||
if(!button.isDisabled()){
|
||||
Vars.ui.showLoading();
|
||||
|
||||
Timer.schedule(new Task(){
|
||||
@Override
|
||||
public void run(){
|
||||
Vars.ui.hideLoading();
|
||||
hide();
|
||||
try{
|
||||
SaveIO.loadFromSlot(slot);
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
Vars.ui.showError("[orange]Save file corrupted or invalid!");
|
||||
return;
|
||||
}
|
||||
Vars.ui.hideMenu();
|
||||
GameState.set(State.playing);
|
||||
}
|
||||
}, 3f/60f);
|
||||
}
|
||||
});
|
||||
modifyButton(button, slot);
|
||||
|
||||
content().add(button).size(400, 80).units(Unit.dp).pad(2);
|
||||
content().row();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void modifyButton(TextButton button, int slot){
|
||||
button.setDisabled(!SaveIO.isSaveValid(slot));
|
||||
button.clicked(() -> {
|
||||
if(!button.isDisabled()){
|
||||
Vars.ui.showLoading();
|
||||
|
||||
Timer.schedule(new Task(){
|
||||
@Override
|
||||
public void run(){
|
||||
Vars.ui.hideLoading();
|
||||
hide();
|
||||
try{
|
||||
SaveIO.loadFromSlot(slot);
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
Vars.ui.showError("[orange]Save file corrupted or invalid!");
|
||||
return;
|
||||
}
|
||||
Vars.ui.hideMenu();
|
||||
GameState.set(State.playing);
|
||||
}
|
||||
}, 3f/60f);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,17 +9,16 @@ import io.anuke.mindustry.GameState;
|
||||
import io.anuke.mindustry.GameState.State;
|
||||
import io.anuke.mindustry.Vars;
|
||||
import io.anuke.ucore.scene.ui.ConfirmDialog;
|
||||
import io.anuke.ucore.scene.ui.Dialog;
|
||||
import io.anuke.ucore.scene.ui.layout.Cell;
|
||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||
|
||||
public class MenuDialog extends Dialog{
|
||||
public class MenuDialog extends FloatingDialog{
|
||||
private SaveDialog save = new SaveDialog();
|
||||
private LoadDialog load = new LoadDialog();
|
||||
public boolean wasPaused = false;
|
||||
|
||||
public MenuDialog(){
|
||||
super("Paused", "dialog");
|
||||
super("Paused");
|
||||
setup();
|
||||
}
|
||||
|
||||
|
||||
34
core/src/io/anuke/mindustry/ui/MindustryKeybindDialog.java
Normal file
34
core/src/io/anuke/mindustry/ui/MindustryKeybindDialog.java
Normal file
@@ -0,0 +1,34 @@
|
||||
package io.anuke.mindustry.ui;
|
||||
|
||||
import com.badlogic.gdx.Input.Keys;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.utils.Align;
|
||||
|
||||
import io.anuke.ucore.scene.ui.Image;
|
||||
import io.anuke.ucore.scene.ui.KeybindDialog;
|
||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||
|
||||
public class MindustryKeybindDialog extends KeybindDialog{
|
||||
|
||||
public MindustryKeybindDialog(){
|
||||
setDialog();
|
||||
|
||||
setFillParent(true);
|
||||
title().setAlignment(Align.center);
|
||||
getTitleTable().row();
|
||||
getTitleTable().add(new Image("white"))
|
||||
.growX().height(3f).pad(4f).units(Unit.dp).get().setColor(Color.ORANGE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCloseButton(){
|
||||
buttons().addImageTextButton("Back", "icon-arrow-left", Unit.dp.inPixels(30f), ()->{
|
||||
hide();
|
||||
}).size(230f, 64f).units(Unit.dp);
|
||||
|
||||
keyDown(key->{
|
||||
if(key == Keys.ESCAPE || key == Keys.BACK)
|
||||
hide();
|
||||
});
|
||||
}
|
||||
}
|
||||
32
core/src/io/anuke/mindustry/ui/MindustrySettingsDialog.java
Normal file
32
core/src/io/anuke/mindustry/ui/MindustrySettingsDialog.java
Normal file
@@ -0,0 +1,32 @@
|
||||
package io.anuke.mindustry.ui;
|
||||
|
||||
import com.badlogic.gdx.Input.Keys;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.utils.Align;
|
||||
|
||||
import io.anuke.ucore.scene.ui.Image;
|
||||
import io.anuke.ucore.scene.ui.SettingsDialog;
|
||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||
|
||||
public class MindustrySettingsDialog extends SettingsDialog{
|
||||
|
||||
public MindustrySettingsDialog(){
|
||||
setFillParent(true);
|
||||
title().setAlignment(Align.center);
|
||||
getTitleTable().row();
|
||||
getTitleTable().add(new Image("white"))
|
||||
.growX().height(3f).pad(4f).units(Unit.dp).get().setColor(Color.ORANGE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCloseButton(){
|
||||
buttons().addImageTextButton("Back", "icon-arrow-left", Unit.dp.inPixels(30f), ()->{
|
||||
hide();
|
||||
}).size(230f, 64f).units(Unit.dp);
|
||||
|
||||
keyDown(key->{
|
||||
if(key == Keys.ESCAPE || key == Keys.BACK)
|
||||
hide();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,70 +1,38 @@
|
||||
package io.anuke.mindustry.ui;
|
||||
|
||||
import com.badlogic.gdx.utils.Align;
|
||||
import com.badlogic.gdx.utils.Timer;
|
||||
import com.badlogic.gdx.utils.Timer.Task;
|
||||
import com.badlogic.gdx.utils.reflect.ClassReflection;
|
||||
|
||||
import io.anuke.mindustry.Vars;
|
||||
import io.anuke.mindustry.io.SaveIO;
|
||||
import io.anuke.ucore.scene.ui.*;
|
||||
import io.anuke.ucore.scene.ui.ConfirmDialog;
|
||||
import io.anuke.ucore.scene.ui.TextButton;
|
||||
import io.anuke.ucore.scene.ui.layout.Cell;
|
||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||
|
||||
//TODO unified save/load dialogs
|
||||
public class SaveDialog extends Dialog{
|
||||
|
||||
public SaveDialog() {
|
||||
public class SaveDialog extends LoadDialog{
|
||||
|
||||
public SaveDialog(){
|
||||
super("Save Game");
|
||||
setup();
|
||||
|
||||
shown(()->{
|
||||
setup();
|
||||
});
|
||||
|
||||
getButtonTable().addButton("Back", ()->{
|
||||
hide();
|
||||
}).pad(2).size(180, 44).units(Unit.dp);
|
||||
}
|
||||
|
||||
private void setup(){
|
||||
content().clear();
|
||||
|
||||
content().add("Select a save slot.").padBottom(2);
|
||||
content().row();
|
||||
|
||||
for(int i = 0; i < Vars.saveSlots; i ++){
|
||||
final int slot = i;
|
||||
|
||||
TextButton button = new TextButton("[orange]Slot " + (i+1));
|
||||
button.getLabelCell().top().left().growX();
|
||||
button.row();
|
||||
button.pad(Unit.dp.inPixels(10));
|
||||
|
||||
Label info = new Label("[gray]" + (!SaveIO.isSaveValid(i) ? "<empty>" : "Wave " +
|
||||
SaveIO.getWave(slot)+"\nLast Saved: " + SaveIO.getTimeString(i)));
|
||||
info.setAlignment(Align.center, Align.center);
|
||||
|
||||
button.add(info).padBottom(2).padTop(6);
|
||||
button.getLabel().setFontScale(Unit.dp.inPixels(0.75f));
|
||||
|
||||
button.clicked(()->{
|
||||
if(SaveIO.isSaveValid(slot)){
|
||||
new ConfirmDialog("Overwrite", "Are you sure you want to overwrite\nthis save slot?", ()->{
|
||||
save(slot);
|
||||
}){{
|
||||
content().pad(16);
|
||||
for(Cell<?> cell : getButtonTable().getCells())
|
||||
cell.size(110, 45).pad(4).units(Unit.dp);
|
||||
}}.show();
|
||||
}else{
|
||||
@Override
|
||||
public void modifyButton(TextButton button, int slot){
|
||||
button.clicked(()->{
|
||||
if(SaveIO.isSaveValid(slot)){
|
||||
new ConfirmDialog("Overwrite", "Are you sure you want to overwrite\nthis save slot?", ()->{
|
||||
save(slot);
|
||||
}
|
||||
});
|
||||
|
||||
content().add(button).size(400, 80).units(Unit.dp).pad(2);
|
||||
content().row();
|
||||
}
|
||||
}){{
|
||||
content().pad(16);
|
||||
for(Cell<?> cell : getButtonTable().getCells())
|
||||
cell.size(110, 45).pad(4).units(Unit.dp);
|
||||
}}.show();
|
||||
}else{
|
||||
save(slot);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void save(int slot){
|
||||
|
||||
@@ -12,10 +12,12 @@ import io.anuke.mindustry.resource.Weapon;
|
||||
import io.anuke.ucore.core.Draw;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
import io.anuke.ucore.function.Listenable;
|
||||
import io.anuke.ucore.scene.ui.*;
|
||||
import io.anuke.ucore.scene.ui.Image;
|
||||
import io.anuke.ucore.scene.ui.TextButton;
|
||||
import io.anuke.ucore.scene.ui.Tooltip;
|
||||
import io.anuke.ucore.scene.ui.layout.Table;
|
||||
|
||||
public class UpgradeDialog extends Dialog{
|
||||
public class UpgradeDialog extends FloatingDialog{
|
||||
boolean wasPaused = false;
|
||||
|
||||
public UpgradeDialog() {
|
||||
|
||||
Reference in New Issue
Block a user