diff --git a/SPD-classes/src/main/java/com/watabou/noosa/ui/CheckBox.java b/SPD-classes/src/main/java/com/watabou/noosa/ui/CheckBox.java deleted file mode 100644 index 56e2a461d..000000000 --- a/SPD-classes/src/main/java/com/watabou/noosa/ui/CheckBox.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2022 Evan Debenham - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - */ - -package com.watabou.noosa.ui; - -public class CheckBox extends Button { - - protected boolean checked; - - public boolean checked() { - return checked; - } - - public void checked( boolean value ) { - if (checked != value) { - checked = value; - updateState(); - } - } - - protected void updateState() { - - } - - @Override - protected void onClick() { - checked( !checked ); - onChange(); - } - - protected void onChange() { - } -} diff --git a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java index 3ccb2199e..689321350 100644 --- a/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java +++ b/android/src/main/java/com/shatteredpixel/shatteredpixeldungeon/android/AndroidGame.java @@ -40,8 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.services.news.NewsImpl; import com.shatteredpixel.shatteredpixeldungeon.services.updates.UpdateImpl; import com.shatteredpixel.shatteredpixeldungeon.services.updates.Updates; import com.watabou.noosa.Game; -import com.watabou.noosa.ui.Button; -import com.watabou.utils.DeviceCompat; +import com.shatteredpixel.shatteredpixeldungeon.ui.Button; import com.watabou.utils.FileUtils; public class AndroidGame extends AndroidApplication { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java index 1b7fbdac6..3b53fab07 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java @@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.LiquidMetal; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.AlchemistsToolkit; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; +import com.shatteredpixel.shatteredpixeldungeon.journal.Document; import com.shatteredpixel.shatteredpixeldungeon.journal.Journal; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; @@ -231,6 +232,11 @@ public class AlchemyScene extends PixelScene { }); } + + @Override + protected String hoverText() { + return Messages.titleCase(Document.ALCHEMY_GUIDE.title()); + } }; btnGuide.setRect(0, 0, 20, 20); add(btnGuide); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index b1376742e..f38ab9aea 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -391,6 +391,10 @@ public class GameScene extends PixelScene { log.newLine(); add( log ); + if (uiSize > 0){ + bringToFront(status); + } + toolbar = new Toolbar(); toolbar.camera = uiCamera; add( toolbar ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java index 56bc8c6e1..cab78c802 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/HeroSelectScene.java @@ -40,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.shatteredpixel.shatteredpixeldungeon.windows.WndChallenges; import com.shatteredpixel.shatteredpixeldungeon.windows.WndHeroInfo; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage; import com.watabou.gltextures.TextureCache; import com.watabou.input.PointerEvent; @@ -142,6 +143,11 @@ public class HeroSelectScene extends PixelScene { super.onClick(); ShatteredPixelDungeon.scene().addToFront(new WndHeroInfo(GamesInProgress.selectedClass)); } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "hero_info")); + } }; infoButton.visible = false; infoButton.setSize(21, 21); @@ -184,6 +190,11 @@ public class HeroSelectScene extends PixelScene { } super.update(); } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndChallenges.class, "title")); + } }; challengeButton.setRect(heroBtnleft + 16, Camera.main.height-HeroBtn.HEIGHT-16, 21, 21); challengeButton.visible = false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java index 9d10bec12..ade74d024 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/RankingsScene.java @@ -40,7 +40,7 @@ import com.watabou.noosa.BitmapText; import com.watabou.noosa.Camera; import com.watabou.noosa.Image; import com.watabou.noosa.audio.Music; -import com.watabou.noosa.ui.Button; +import com.shatteredpixel.shatteredpixeldungeon.ui.Button; import com.watabou.utils.GameMath; public class RankingsScene extends PixelScene { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java index 494bd826e..a34fcb5ef 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/StartScene.java @@ -38,7 +38,7 @@ import com.watabou.noosa.BitmapText; import com.watabou.noosa.Camera; import com.watabou.noosa.Image; import com.watabou.noosa.NinePatch; -import com.watabou.noosa.ui.Button; +import com.shatteredpixel.shatteredpixeldungeon.ui.Button; import java.util.ArrayList; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ActionIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ActionIndicator.java index d49facc6d..8cfd72abf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ActionIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ActionIndicator.java @@ -23,7 +23,9 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.watabou.input.GameAction; import com.watabou.noosa.Image; @@ -100,6 +102,12 @@ public class ActionIndicator extends Tag { action.doAction(); } + @Override + protected String hoverText() { + //TODO each special action should probably have its own title + return Messages.titleCase(Messages.get(WndKeyBindings.class, "tag_action")); + } + public static void setAction(Action action){ ActionIndicator.action = action; updateIcon(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/AttackIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/AttackIndicator.java index 3d31fc1de..98de4112b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/AttackIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/AttackIndicator.java @@ -25,8 +25,10 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.watabou.input.GameAction; import com.watabou.noosa.Game; import com.watabou.utils.Random; @@ -179,8 +181,13 @@ public class AttackIndicator extends Tag { } } } - - public static void target( Char target ) { + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "tag_attack")); + } + + public static void target(Char target ) { synchronized (instance) { instance.lastTarget = (Mob) target; instance.updateImage(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java index 6932b2791..4e1804f0d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java @@ -29,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndBadge; import com.watabou.noosa.Game; import com.watabou.noosa.Image; import com.watabou.noosa.audio.Sample; -import com.watabou.noosa.ui.Button; import com.watabou.noosa.ui.Component; import com.watabou.utils.Random; @@ -152,6 +151,11 @@ public class BadgesGrid extends Component { Sample.INSTANCE.play( Assets.Sounds.CLICK, 0.7f, 0.7f, 1.2f ); Game.scene().add( new WndBadge( badge, unlocked ) ); } + + @Override + protected String hoverText() { + return badge.desc(); + } } } \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java index 79b06a7c1..526f80b32 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; @@ -283,6 +284,11 @@ public class BuffIndicator extends Component { protected void onPointerUp() { //don't affect buff color } + + @Override + protected String hoverText() { + return Messages.titleCase(buff.toString()); + } } public static void refreshHero() { diff --git a/SPD-classes/src/main/java/com/watabou/noosa/ui/Button.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Button.java similarity index 67% rename from SPD-classes/src/main/java/com/watabou/noosa/ui/Button.java rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Button.java index b07714538..ce41284fe 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/ui/Button.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Button.java @@ -19,21 +19,26 @@ * along with this program. If not, see */ -package com.watabou.noosa.ui; +package com.shatteredpixel.shatteredpixeldungeon.ui; import com.watabou.input.GameAction; import com.watabou.input.KeyBindings; import com.watabou.input.KeyEvent; import com.watabou.input.PointerEvent; +import com.watabou.noosa.Camera; import com.watabou.noosa.Game; import com.watabou.noosa.PointerArea; +import com.watabou.noosa.ui.Component; import com.watabou.utils.Signal; +import java.util.ArrayList; + public class Button extends Component { public static float longClick = 0.5f; protected PointerArea hotArea; + protected Tooltip hoverTip; protected boolean pressed; protected float pressTime; @@ -60,6 +65,28 @@ public class Button extends Component { Button.this.onClick(); } } + + @Override + protected void onHoverStart(PointerEvent event) { + String text = hoverText(); + if (text != null){ + if (keyAction() != null){ + ArrayList bindings = KeyBindings.getBoundKeysForAction(keyAction()); + if (!bindings.isEmpty()){ + text += " _(" + KeyBindings.getKeyName(bindings.get(0)) + ")_"; + } + } + hoverTip = new Tooltip(text, 80); + Button.this.parent.addToFront(hoverTip); + hoverTip.camera = camera(); + alignTooltip(hoverTip); + } + } + + @Override + protected void onHoverEnd(PointerEvent event) { + killTooltip(); + } }; add( hotArea ); @@ -108,6 +135,31 @@ public class Button extends Component { protected boolean onLongClick() { return false; } + + protected String hoverText() { + return null; + } + + //TODO might be nice for more flexibility here + private void alignTooltip( Tooltip tip ){ + tip.setPos(x, y-tip.height()-1); + Camera cam = camera(); + //shift left if there's no room on the right + if (tip.right() > (cam.width+cam.scroll.x)){ + tip.setPos(tip.left() - (tip.right() - (cam.width+cam.scroll.x)), tip.top()); + } + //move to the bottom if there's no room on top + if (tip.top() < 0){ + tip.setPos(tip.left(), bottom()+1); + } + } + + public void killTooltip(){ + if (hoverTip != null){ + hoverTip.killAndErase(); + hoverTip = null; + } + } @Override protected void layout() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java index fde6387a0..3137b4421 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/DangerIndicator.java @@ -24,7 +24,9 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.watabou.input.GameAction; import com.watabou.noosa.BitmapText; import com.watabou.noosa.Camera; @@ -117,4 +119,9 @@ public class DangerIndicator extends Tag { if (Dungeon.hero.curAction == null) Camera.main.panTo(target.sprite.center(), 5f); } } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "tag_danger")); + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ExitButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ExitButton.java index b1bd6d2c0..dbbd5bde1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ExitButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ExitButton.java @@ -22,7 +22,9 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.TitleScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.watabou.noosa.Game; public class ExitButton extends IconButton { @@ -42,4 +44,9 @@ public class ExitButton extends IconButton { ShatteredPixelDungeon.switchNoFade( TitleScene.class ); } } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "back")); + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/IconButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/IconButton.java index ff9b99251..185985020 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/IconButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/IconButton.java @@ -25,7 +25,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.watabou.noosa.Image; import com.watabou.noosa.audio.Sample; -import com.watabou.noosa.ui.Button; public class IconButton extends Button { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java index c3a98621d..a41a72754 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java @@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.bags.MagicalHolster; import com.shatteredpixel.shatteredpixeldungeon.items.bags.PotionBandolier; import com.shatteredpixel.shatteredpixeldungeon.items.bags.ScrollHolder; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; @@ -551,6 +552,10 @@ public class InventoryPane extends Component { refresh(); } + @Override + protected String hoverText() { + return Messages.titleCase(bag.name()); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ItemSlot.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ItemSlot.java index c4d55284a..57f51777a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ItemSlot.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ItemSlot.java @@ -33,7 +33,6 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.BitmapText; import com.watabou.noosa.Image; -import com.watabou.noosa.ui.Button; public class ItemSlot extends Button { @@ -274,4 +273,10 @@ public class ItemSlot extends Button { } } + + @Override + protected String hoverText() { + if (item != null) return Messages.titleCase(item.name()); + else return super.hoverText(); + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/LootIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/LootIndicator.java index dc48c1be6..d1167baed 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/LootIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/LootIndicator.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.watabou.input.GameAction; public class LootIndicator extends Tag { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java index ac2d4bb40..601b74b47 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/MenuPane.java @@ -26,17 +26,18 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.journal.Document; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.windows.WndGame; import com.shatteredpixel.shatteredpixeldungeon.windows.WndJournal; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.shatteredpixel.shatteredpixeldungeon.windows.WndStory; import com.watabou.input.GameAction; import com.watabou.noosa.BitmapText; import com.watabou.noosa.Game; import com.watabou.noosa.Image; import com.watabou.noosa.audio.Sample; -import com.watabou.noosa.ui.Button; import com.watabou.noosa.ui.Component; public class MenuPane extends Component { @@ -235,6 +236,10 @@ public class MenuPane extends Component { } } + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "journal")); + } } private static class MenuButton extends Button { @@ -279,5 +284,15 @@ public class MenuPane extends Component { protected void onClick() { GameScene.show( new WndGame() ); } + + @Override + public GameAction keyAction() { + return GameAction.BACK; + } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "menu")); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java index ed44fd840..b29700e5b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java @@ -33,9 +33,9 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.watabou.input.GameAction; import com.watabou.noosa.Image; -import com.watabou.noosa.ui.Button; import com.watabou.utils.PathFinder; public class QuickSlotButton extends Button { @@ -118,6 +118,15 @@ public class QuickSlotButton extends Button { protected void onPointerUp() { sprite.resetColor(); } + + @Override + protected String hoverText() { + if (item == null){ + return Messages.titleCase(Messages.get(WndKeyBindings.class, "quickslot_" + (slotNum+1))); + } else { + return super.hoverText(); + } + } }; slot.showExtraInfo( false ); add( slot ); @@ -164,6 +173,15 @@ public class QuickSlotButton extends Button { return super.keyAction(); } } + + @Override + protected String hoverText() { + if (slot.item == null){ + return Messages.titleCase(Messages.get(WndKeyBindings.class, "quickslot_" + (slotNum+1))); + } else { + return super.hoverText(); + } + } @Override protected void onClick() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ResumeIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ResumeIndicator.java index a7f75486e..90a331b5f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ResumeIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/ResumeIndicator.java @@ -23,7 +23,9 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.SPDAction; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.watabou.input.GameAction; import com.watabou.noosa.Image; @@ -68,6 +70,11 @@ public class ResumeIndicator extends Tag { Dungeon.hero.resume(); } + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "tag_resume")); + } + @Override public void update() { if (!Dungeon.hero.isAlive()) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java index 6ec12db96..4b67c7060 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StatusPane.java @@ -28,27 +28,25 @@ import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.effects.CircleArc; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; -import com.shatteredpixel.shatteredpixeldungeon.journal.Document; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndGame; import com.shatteredpixel.shatteredpixeldungeon.windows.WndHero; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndJournal; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndStory; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.watabou.input.GameAction; +import com.watabou.input.KeyBindings; import com.watabou.noosa.BitmapText; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; import com.watabou.noosa.Image; import com.watabou.noosa.NinePatch; -import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; -import com.watabou.noosa.ui.Button; import com.watabou.noosa.ui.Component; import com.watabou.utils.ColorMath; +import java.util.ArrayList; + public class StatusPane extends Component { private NinePatch bg; @@ -104,6 +102,11 @@ public class StatusPane extends Component { public GameAction keyAction() { return SPDAction.HERO_INFO; } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "hero_info")); + } }; add(heroInfo); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StyledButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StyledButton.java index 1562a3d4b..eb9e6d41d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StyledButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/StyledButton.java @@ -27,7 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.watabou.noosa.Image; import com.watabou.noosa.NinePatch; import com.watabou.noosa.audio.Sample; -import com.watabou.noosa.ui.Button; //simple button which support a background chrome, text, and an icon. public class StyledButton extends Button { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Tag.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Tag.java index 3258f1942..af33c3473 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Tag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Tag.java @@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.Chrome; import com.watabou.noosa.Game; import com.watabou.noosa.NinePatch; -import com.watabou.noosa.ui.Button; public class Tag extends Button { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentButton.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentButton.java index c5dc7520a..01dac5ed6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentButton.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentButton.java @@ -26,23 +26,16 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.InventoryScroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMetamorphosis; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoTalent; -import com.watabou.gltextures.SmartTexture; -import com.watabou.gltextures.TextureCache; import com.watabou.noosa.ColorBlock; import com.watabou.noosa.Image; import com.watabou.noosa.PointerArea; -import com.watabou.noosa.TextureFilm; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; -import com.watabou.noosa.ui.Button; -import com.watabou.utils.Callback; import java.util.LinkedHashMap; @@ -230,7 +223,12 @@ public class TalentButton extends Button { bg.resetColor(); } - public void enable( boolean value ) { + @Override + protected String hoverText() { + return Messages.titleCase(talent.title()); + } + + public void enable(boolean value ) { active = value; icon.alpha( value ? 1.0f : 0.3f ); bg.alpha( value ? 1.0f : 0.3f ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentsPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentsPane.java index 57ee4d47a..350678e2e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentsPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/TalentsPane.java @@ -108,6 +108,10 @@ public class TalentsPane extends ScrollPane { } else { blockText = null; } + + for (TalentTierPane p : panes){ + content.bringToFront(p); + } } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java index 10a6a2162..d42412dfe 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Toolbar.java @@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndKeyBindings; import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuickBag; import com.watabou.input.GameAction; import com.watabou.noosa.Camera; @@ -94,7 +95,12 @@ public class Toolbar extends Component { public GameAction keyAction() { return SPDAction.WAIT; } - + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "wait")); + } + protected boolean onLongClick() { if (!GameScene.cancel()) { examining = false; @@ -133,6 +139,11 @@ public class Toolbar extends Component { public GameAction keyAction() { return SPDAction.SEARCH; } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "search")); + } @Override protected boolean onLongClick() { @@ -159,6 +170,11 @@ public class Toolbar extends Component { public GameAction keyAction() { return SPDAction.INVENTORY; } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "inventory")); + } @Override protected boolean onLongClick() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Tooltip.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Tooltip.java new file mode 100644 index 000000000..c7cbbe662 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/Tooltip.java @@ -0,0 +1,90 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2022 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.shatteredpixel.shatteredpixeldungeon.ui; + +import com.shatteredpixel.shatteredpixeldungeon.Chrome; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.watabou.noosa.Game; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.ui.Component; +import com.watabou.utils.GameMath; + +public class Tooltip extends Component { + + //tooltips require .5 seconds to appear, fade in over .1 second + //they then persist until none are visible for .5 seconds or more + private static float tooltipAlpha = -5f; + private static float lastUsedTime = -1; + + private NinePatch bg; + private RenderedTextBlock text; + + public Tooltip(String msg, int maxWidth){ + super(); + text.text(msg, maxWidth); + layout(); + + if (lastUsedTime != -1){ + float elapsed = Game.timeTotal - lastUsedTime; + if (elapsed >= 0.5f || tooltipAlpha < 1f){ + tooltipAlpha = -5f; + } + lastUsedTime = Game.timeTotal; + } + bg.alpha(GameMath.gate(0, tooltipAlpha, 1)); + text.alpha(GameMath.gate(0, tooltipAlpha, 1)); + } + + @Override + protected void createChildren() { + super.createChildren(); + + bg = Chrome.get(Chrome.Type.TOAST_TR); + add(bg); + + text = PixelScene.renderTextBlock(6); + add(text); + } + + @Override + public synchronized void update() { + super.update(); + tooltipAlpha = Math.min(1f, tooltipAlpha + 10f*Game.elapsed); + lastUsedTime = Game.timeTotal; + + bg.alpha(GameMath.gate(0, tooltipAlpha, 1)); + text.alpha(GameMath.gate(0, tooltipAlpha, 1)); + } + + @Override + protected void layout() { + + text.setPos(x + bg.marginLeft(), y + bg.marginTop()); + bg.x = x; + bg.y = y; + bg.size(text.width()+bg.marginHor(), text.height()+bg.marginVer()); + + width = bg.width; + height = bg.height; + + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java index f8720a208..e36b91a43 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java @@ -380,7 +380,11 @@ public class WndBag extends WndTabbed { this.bag = bag; } - + + @Override + protected String hoverText() { + return Messages.titleCase(bag.name()); + } } public static class Placeholder extends Item { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java index 0d638b291..04adaa352 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndGameInProgress.java @@ -37,7 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.watabou.noosa.Game; -import com.watabou.noosa.ui.Button; +import com.shatteredpixel.shatteredpixeldungeon.ui.Button; import com.watabou.utils.Bundle; import com.watabou.utils.FileUtils; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java index ed0a4ede3..0bcde4e20 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndHero.java @@ -149,6 +149,12 @@ public class WndHero extends WndTabbed { ShatteredPixelDungeon.scene().addToFront(new WndHeroInfo(hero.heroClass)); } } + + @Override + protected String hoverText() { + return Messages.titleCase(Messages.get(WndKeyBindings.class, "hero_info")); + } + }; infoButton.setRect(title.right(), 0, 16, 16); add(infoButton); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java index 62afc1e76..b06e87e56 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java @@ -46,7 +46,7 @@ import com.watabou.noosa.Game; import com.watabou.noosa.Group; import com.watabou.noosa.Image; import com.watabou.noosa.audio.Sample; -import com.watabou.noosa.ui.Button; +import com.shatteredpixel.shatteredpixeldungeon.ui.Button; import com.watabou.noosa.ui.Component; import java.util.Locale; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java index 672956877..981ca6351 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java @@ -45,7 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Window; import com.watabou.noosa.ColorBlock; import com.watabou.noosa.Game; import com.watabou.noosa.Image; -import com.watabou.noosa.ui.Button; +import com.shatteredpixel.shatteredpixeldungeon.ui.Button; import com.watabou.noosa.ui.Component; import com.watabou.utils.DeviceCompat; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTabbed.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTabbed.java index 909246a3c..f15fae699 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTabbed.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndTabbed.java @@ -30,7 +30,7 @@ import com.watabou.noosa.Game; import com.watabou.noosa.Image; import com.watabou.noosa.NinePatch; import com.watabou.noosa.audio.Sample; -import com.watabou.noosa.ui.Button; +import com.shatteredpixel.shatteredpixeldungeon.ui.Button; import com.watabou.utils.RectF; import java.util.ArrayList; @@ -153,6 +153,8 @@ public class WndTabbed extends Window { protected void select( boolean value ) { active = !(selected = value); + + if (!active) killTooltip(); if (bg != null) { remove( bg );