From 974d3498c15f6fd1def82d629916526bac27e3c3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Jul 2021 11:11:28 -0400 Subject: [PATCH] Settings tooltips --- core/assets/bundles/bundle.properties | 7 +- core/assets/bundles/bundle_ru.properties | 5 +- .../mindustry/maps/filters/FilterOption.java | 20 +++-- .../ui/dialogs/SettingsMenuDialog.java | 82 +++++++++---------- gradle.properties | 2 +- 5 files changed, 59 insertions(+), 57 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 5e19a8781e..918aee562a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -846,7 +846,6 @@ setting.doubletapmine.name = Double-Tap to Mine setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animated Surfaces setting.animatedshields.name = Animated Shields -setting.antialias.name = Antialias[lightgray] (requires restart)[] setting.playerindicators.name = Player Indicators setting.indicators.name = Enemy Indicators setting.autotarget.name = Auto-Target @@ -855,7 +854,8 @@ setting.touchscreen.name = Touchscreen Controls setting.fpscap.name = Max FPS setting.fpscap.none = None setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (restart required)[] +setting.uiscale.name = UI Scaling +setting.uiscale.description = Restart required to apply changes. setting.swapdiagonal.name = Always Diagonal Placement setting.difficulty.training = Training setting.difficulty.easy = Easy @@ -873,7 +873,8 @@ setting.saveinterval.name = Save Interval setting.seconds = {0} seconds setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) +setting.borderlesswindow.name = Borderless Window +setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = Show FPS & Ping setting.smoothcamera.name = Smooth Camera setting.vsync.name = VSync diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 8a8c1924de..25cfa5d9da 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -845,7 +845,6 @@ setting.doubletapmine.name = Добыча руды двойным нажатие setting.modcrashdisable.name = Отключение модификаций после вылета при запуске setting.animatedwater.name = Анимированные поверхности setting.animatedshields.name = Анимированные щиты -setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[] setting.playerindicators.name = Индикаторы направления игроков setting.indicators.name = Индикаторы направления врагов setting.autotarget.name = Автозахват цели @@ -854,7 +853,7 @@ setting.touchscreen.name = Сенсорное управление setting.fpscap.name = Максимальный FPS setting.fpscap.none = Неограниченный setting.fpscap.text = {0} FPS -setting.uiscale.name = Масштаб пользовательского интерфейса[lightgray] (необходим перезапуск)[] +setting.uiscale.name = Масштаб пользовательского интерфейса setting.swapdiagonal.name = Всегда диагональное размещение setting.difficulty.training = Обучение setting.difficulty.easy = Лёгкая @@ -872,7 +871,7 @@ setting.saveinterval.name = Интервал сохранения setting.seconds = {0} секунд setting.milliseconds = {0} миллисекунд setting.fullscreen.name = Полноэкранный режим -setting.borderlesswindow.name = Безрамочное окно[lightgray] (может потребоваться перезапуск) +setting.borderlesswindow.name = Безрамочное окно setting.fps.name = Показывать FPS и пинг setting.smoothcamera.name = Плавная камера setting.vsync.name = Вертикальная синхронизация diff --git a/core/src/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index 6b2e3aa1f1..41974a06f9 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -3,6 +3,7 @@ package mindustry.maps.filters; import arc.*; import arc.func.*; +import arc.scene.*; import arc.scene.event.*; import arc.scene.style.*; import arc.scene.ui.*; @@ -60,16 +61,19 @@ public abstract class FilterOption{ @Override public void build(Table table){ - Label label; + Element base; if(!display){ - label = new Label("@filter.option." + name); + Label l = new Label("@filter.option." + name); + l.setWrap(true); + l.setStyle(Styles.outlineLabel); + base = l; }else{ - label = new Label(() -> Core.bundle.get("filter.option." + name) + ": " + Strings.autoFixed(getter.get(), 2)); + Table t = new Table().marginLeft(11f).marginRight(11f); + base = t; + t.add("@filter.option." + name).growX().wrap().style(Styles.outlineLabel); + t.label(() -> Strings.autoFixed(getter.get(), 2)).style(Styles.outlineLabel).right().labelAlign(Align.right).padLeft(6); } - label.setWrap(true); - label.setAlignment(Align.center); - label.touchable = Touchable.disabled; - label.setStyle(Styles.outlineLabel); + base.touchable = Touchable.disabled; Slider slider = new Slider(min, max, step, false); slider.moved(setter); @@ -80,7 +84,7 @@ public abstract class FilterOption{ slider.released(changed); } - table.stack(slider, label).colspan(2).pad(3).growX().row(); + table.stack(slider, base).colspan(2).pad(3).growX().row(); } } diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 6578e9c60c..e291ace87d 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -6,6 +6,8 @@ import arc.func.*; import arc.graphics.*; import arc.graphics.Texture.*; import arc.input.*; +import arc.math.geom.*; +import arc.scene.*; import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.TextButton.*; @@ -28,7 +30,6 @@ import java.io.*; import java.util.zip.*; import static arc.Core.*; -import static mindustry.Vars.net; import static mindustry.Vars.*; public class SettingsMenuDialog extends Dialog{ @@ -283,9 +284,9 @@ public class SettingsMenuDialog extends Dialog{ } void addSettings(){ - sound.sliderPref("musicvol", bundle.get("setting.musicvol.name", "Music Volume"), 100, 0, 100, 1, i -> i + "%"); - sound.sliderPref("sfxvol", bundle.get("setting.sfxvol.name", "SFX Volume"), 100, 0, 100, 1, i -> i + "%"); - sound.sliderPref("ambientvol", bundle.get("setting.ambientvol.name", "Ambient Volume"), 100, 0, 100, 1, i -> i + "%"); + sound.sliderPref("musicvol", 100, 0, 100, 1, i -> i + "%"); + sound.sliderPref("sfxvol", 100, 0, 100, 1, i -> i + "%"); + sound.sliderPref("ambientvol", 100, 0, 100, 1, i -> i + "%"); game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i)); @@ -562,52 +563,26 @@ public class SettingsMenuDialog extends Dialog{ rebuild(); } - public SliderSetting sliderPref(String name, String title, int def, int min, int max, StringProcessor s){ - return sliderPref(name, title, def, min, max, 1, s); - } - - public SliderSetting sliderPref(String name, String title, int def, int min, int max, int step, StringProcessor s){ - SliderSetting res; - list.add(res = new SliderSetting(name, title, def, min, max, step, s)); - settings.defaults(name, def); - rebuild(); - return res; - } - public SliderSetting sliderPref(String name, int def, int min, int max, StringProcessor s){ return sliderPref(name, def, min, max, 1, s); } public SliderSetting sliderPref(String name, int def, int min, int max, int step, StringProcessor s){ SliderSetting res; - list.add(res = new SliderSetting(name, bundle.get("setting." + name + ".name"), def, min, max, step, s)); + list.add(res = new SliderSetting(name, def, min, max, step, s)); settings.defaults(name, def); rebuild(); return res; } - public void checkPref(String name, String title, boolean def){ - list.add(new CheckSetting(name, title, def, null)); - settings.defaults(name, def); - rebuild(); - } - - public void checkPref(String name, String title, boolean def, Boolc changed){ - list.add(new CheckSetting(name, title, def, changed)); - settings.defaults(name, def); - rebuild(); - } - - /** Localized title. */ public void checkPref(String name, boolean def){ - list.add(new CheckSetting(name, bundle.get("setting." + name + ".name"), def, null)); + list.add(new CheckSetting(name, def, null)); settings.defaults(name, def); rebuild(); } - /** Localized title. */ public void checkPref(String name, boolean def, Boolc changed){ - list.add(new CheckSetting(name, bundle.get("setting." + name + ".name"), def, changed)); + list.add(new CheckSetting(name, def, changed)); settings.defaults(name, def); rebuild(); } @@ -631,17 +606,41 @@ public class SettingsMenuDialog extends Dialog{ public abstract static class Setting{ public String name; public String title; + public @Nullable String description; + + Setting(String name){ + this.name = name; + title = bundle.get("setting." + name + ".name"); + description = bundle.getOrNull("setting." + name + ".description"); + } public abstract void add(SettingsTable table); + + public void addDesc(Element elem){ + if(description == null) return; + + elem.addListener(new Tooltip(t -> t.background(Styles.black8).margin(4f).add(description).color(Color.lightGray)){ + { + allowMobile = true; + } + @Override + protected void setContainerPosition(Element element, float x, float y){ + this.targetActor = element; + Vec2 pos = element.localToStageCoordinates(Tmp.v1.set(0, 0)); + container.pack(); + container.setPosition(pos.x, pos.y, Align.topLeft); + container.setOrigin(0, element.getHeight()); + } + }); + } } public static class CheckSetting extends Setting{ boolean def; Boolc changed; - CheckSetting(String name, String title, boolean def, Boolc changed){ - this.name = name; - this.title = title; + CheckSetting(String name, boolean def, Boolc changed){ + super(name); this.def = def; this.changed = changed; } @@ -660,7 +659,7 @@ public class SettingsMenuDialog extends Dialog{ }); box.left(); - table.add(box).left().padTop(3f); + addDesc(table.add(box).left().padTop(3f).get()); table.row(); } } @@ -669,9 +668,8 @@ public class SettingsMenuDialog extends Dialog{ int def, min, max, step; StringProcessor sp; - SliderSetting(String name, String title, int def, int min, int max, int step, StringProcessor s){ - this.name = name; - this.title = title; + SliderSetting(String name, int def, int min, int max, int step, StringProcessor s){ + super(name); this.def = def; this.min = min; this.max = max; @@ -689,7 +687,7 @@ public class SettingsMenuDialog extends Dialog{ Table content = new Table(); content.add(title, Styles.outlineLabel).left().growX().wrap(); content.add(value).padLeft(10f).right(); - content.margin(3f, 33.5f, 3f, 33.5f); + content.margin(3f, 33f, 3f, 33f); content.touchable = Touchable.disabled; slider.changed(() -> { @@ -699,7 +697,7 @@ public class SettingsMenuDialog extends Dialog{ slider.change(); - table.stack(slider, content).width(Math.min(Core.graphics.getWidth() / 1.2f, 460f)).left().padTop(4f); + addDesc(table.stack(slider, content).width(Math.min(Core.graphics.getWidth() / 1.2f, 460f)).left().padTop(4f).get()); table.row(); } } diff --git a/gradle.properties b/gradle.properties index 97ea62c507..e9750a191e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=65939d39bd6b20ddcfa85cb76cb1ceb815d91aec +archash=e52908cb23da2dead7ac049a1f395bacda64007c