From 988975c612ffbaf7982b08f342743a120773f2dd Mon Sep 17 00:00:00 2001 From: yugecin Date: Sun, 11 Dec 2016 02:08:35 +0100 Subject: [PATCH] checkboxes, sliders --- res/control-check-off.png | Bin 0 -> 665 bytes res/control-check-on.png | Bin 0 -> 404 bytes res/control-sliderball.png | Bin 0 -> 348 bytes src/itdelatrisu/opsu/GameImage.java | 3 + src/itdelatrisu/opsu/Options.java | 6 +- src/itdelatrisu/opsu/states/OptionsMenu.java | 2 +- src/yugecin/opsudance/ui/OptionsOverlay.java | 81 ++++++++++++++++--- 7 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 res/control-check-off.png create mode 100644 res/control-check-on.png create mode 100644 res/control-sliderball.png diff --git a/res/control-check-off.png b/res/control-check-off.png new file mode 100644 index 0000000000000000000000000000000000000000..3603800bb4fd2ff13d2bf17862de62e67da2c46b GIT binary patch literal 665 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7i zo`tlD-wg%^CN57G$B+!?yR#Jim;)tRv;{p_7BwAK5a3{$q#RPfAS2Z1pk(2~-~2*R zU}}fa=978%&ivy{0L1`QPX=dCvE`WxMaD&pRj@bC~zeA?JhNA60+aYk64c zTbj(9whtn9hs$R$rB^o2S$igise+UL=h=Gkb7j1#c|RHN9s19dJ~u7jo~2&cHtwP9 zlgH{C-u_v(M}6G`+b2A>7MDN#*?8pjx^hd~gUJ?l@7LQj^^BbGoLAu@3t0|u zujEo?i1P^5VEo{;%89c7V`I+|1GbVpg?d=A)+~ z-}AnF*>-Qo#~1n&9^G4OeoB~?&s^@dxW@;XU(?UsTpk;{j%i=j#smKI3uYFwoqHtT zWPJLY$0`FVWYE%(@TE6XhY^Q?NgLePVpc)3-QbB`J>zgA!LA!qv!hAh6* Vv%>4cp8!)1gQu&X%Q~loCID9(5%~ZB literal 0 HcmV?d00001 diff --git a/res/control-check-on.png b/res/control-check-on.png new file mode 100644 index 0000000000000000000000000000000000000000..5818424f01f04e8574a65456f463642baced8267 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7i zo`tlD-wmLlte!58AsNnZXW8;KIY_u@YFKnFb>FyQ$pe9VCz=*VRI%_mCU$-{koYGg zEu3b4-&;*kch2;`G2M5QB--{)Ipw-jd+sG|_k-n^8}&*S-Cp+j8Sm32HX`9K+>X1x z|H-_}{OQsi&hES3b$xKms!3JjoTk+}HNyFM;h6~uOXk!I@2}8OReHm+GFbW0wrN(n zN^dT%ysTLCWd7a#F9c6E2^1>3+~E*3cRJFGhk3$FWp;9F4qw$K%c|XVaq7O!9(>0y ziz=x+jJYD@<);T3K0RX5qm;L|% literal 0 HcmV?d00001 diff --git a/res/control-sliderball.png b/res/control-sliderball.png new file mode 100644 index 0000000000000000000000000000000000000000..92625731ecf7c3eb5f5a5c5007ccfd3b4176103d GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_r*vAk26?e?&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM z&qCV7?*>rKSx*TJ|)xGq#PLVL?Uh8#HCwvIFs_- zq%!wb%>NTPQ?VuBvxfgCrTiixL(6@J%U9?MeG0z!RNJt9XXIX4nyffay4z~_?b35El-+PN;*DHO8erdm3jO)_hEE0WC zb4+g*?>by={%rsEHlw|Ct-vC(1P0x=EKtIxG(F1>FV{Om|>R629A pUf1pAOLOK6O@18xR9v8qxo_c<1HJ{W^MD>>@O1TaS?83{1OS&Tg-`$h literal 0 HcmV?d00001 diff --git a/src/itdelatrisu/opsu/GameImage.java b/src/itdelatrisu/opsu/GameImage.java index 1d46cdd4..756c8004 100644 --- a/src/itdelatrisu/opsu/GameImage.java +++ b/src/itdelatrisu/opsu/GameImage.java @@ -237,6 +237,9 @@ public enum GameImage { REPLAY_PLAYBACK_HALF ("playback-half", "png", false, false), // Non-Game Components + CONTROL_SLIDER_BALL ("control-sliderball", "png", false, false), + CONTROL_CHECK_ON ("control-check-on", "png", false, false), + CONTROL_CHECK_OFF ("control-check-off", "png", false, false), VOLUME ("volume-bg", "png", false, false) { @Override protected Image process_sub(Image img, int w, int h) { diff --git a/src/itdelatrisu/opsu/Options.java b/src/itdelatrisu/opsu/Options.java index 5759e65b..8f317b05 100644 --- a/src/itdelatrisu/opsu/Options.java +++ b/src/itdelatrisu/opsu/Options.java @@ -1305,7 +1305,7 @@ public class Options { private int max, min; /** Option types. */ - private enum OptionType { BOOLEAN, NUMERIC, OTHER }; + public enum OptionType { BOOLEAN, NUMERIC, OTHER }; /** Whether or not this is a numeric option. */ private OptionType type = OptionType.OTHER; @@ -1494,8 +1494,8 @@ public class Options { bool = Boolean.parseBoolean(s); } - public boolean isDragOption() { - return type == OptionType.NUMERIC; + public OptionType getType() { + return type; } public int getMinValue() { diff --git a/src/itdelatrisu/opsu/states/OptionsMenu.java b/src/itdelatrisu/opsu/states/OptionsMenu.java index 8c02d96c..a1d8d6de 100644 --- a/src/itdelatrisu/opsu/states/OptionsMenu.java +++ b/src/itdelatrisu/opsu/states/OptionsMenu.java @@ -173,7 +173,7 @@ public class OptionsMenu extends BasicGameState implements OptionsOverlay.Parent int width = container.getWidth(); int height = container.getHeight(); - optionsOverlay = new OptionsOverlay(this, options, 5, width, height); + optionsOverlay = new OptionsOverlay(this, options, 5, container); } @Override diff --git a/src/yugecin/opsudance/ui/OptionsOverlay.java b/src/yugecin/opsudance/ui/OptionsOverlay.java index 81c711a0..8c0abcc6 100644 --- a/src/yugecin/opsudance/ui/OptionsOverlay.java +++ b/src/yugecin/opsudance/ui/OptionsOverlay.java @@ -19,26 +19,30 @@ package yugecin.opsudance.ui; import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.Options.GameOption; +import itdelatrisu.opsu.Options.GameOption.OptionType; import itdelatrisu.opsu.Utils; import itdelatrisu.opsu.ui.Colors; import itdelatrisu.opsu.ui.Fonts; import itdelatrisu.opsu.ui.MenuButton; import itdelatrisu.opsu.ui.UI; -import org.newdawn.slick.Color; -import org.newdawn.slick.Graphics; -import org.newdawn.slick.Image; -import org.newdawn.slick.Input; +import org.newdawn.slick.*; @SuppressWarnings("unused") public class OptionsOverlay { private Parent parent; + private GameContainer container; + + private final Image sliderBallImg; + private final Image checkOnImg; + private final Image checkOffImg; private OptionTab[] tabs; private OptionTab hoverTab; private int selectedTab; private GameOption hoverOption; private GameOption selectedOption; + private boolean isListOptionOpen; private int width; private int height; @@ -51,14 +55,19 @@ public class OptionsOverlay { private int scrollOffset; private final int maxScrollOffset; - public OptionsOverlay(Parent parent, OptionTab[] tabs, int defaultSelectedTabIndex, int containerWidth, int containerHeight) { + public OptionsOverlay(Parent parent, OptionTab[] tabs, int defaultSelectedTabIndex, GameContainer container) { this.parent = parent; + this.container = container; this.tabs = tabs; selectedTab = defaultSelectedTabIndex; - width = containerWidth; - height = containerHeight; + sliderBallImg = GameImage.CONTROL_SLIDER_BALL.getImage().getScaledCopy(20, 20); + checkOnImg = GameImage.CONTROL_CHECK_ON.getImage().getScaledCopy(20, 20); + checkOffImg = GameImage.CONTROL_CHECK_OFF.getImage().getScaledCopy(20, 20); + + width = container.getWidth(); + height = container.getHeight(); // calculate positions optionWidth = width / 2; @@ -117,7 +126,8 @@ public class OptionsOverlay { for (int tabIndex = 0; tabIndex < tabs.length; tabIndex++) { OptionTab tab = tabs[tabIndex]; if (y > 0) { - Fonts.LARGE.drawString(optionStartX, y + Fonts.LARGE.getLineHeight() * 0.6f, tab.name, Color.cyan); + int x = optionStartX + (optionWidth - Fonts.LARGE.getWidth(tab.name)) / 2; + Fonts.LARGE.drawString(x, y + Fonts.LARGE.getLineHeight() * 0.6f, tab.name, Color.cyan); } y += Fonts.MEDIUM.getLineHeight() * 2; for (int optionIndex = 0; optionIndex < tab.options.length; optionIndex++) { @@ -135,13 +145,60 @@ public class OptionsOverlay { } } } + // scrollbar + g.setColor(Color.white); + g.fillRoundRect(optionStartX + optionWidth + 15, optionStartY + ((float) scrollOffset / maxScrollOffset) * (height - optionStartY), 10, 45, 2); g.clearClip(); } private void renderOption(Graphics g, GameOption option, int y, boolean focus) { Color col = focus ? Colors.GREEN : Colors.WHITE_FADE; - Fonts.MEDIUM.drawString(optionStartX, y, option.getName(), col); - Fonts.MEDIUM.drawString(optionStartX + optionWidth / 2, y, option.getValueString(), col); + OptionType type = option.getType(); + Object[] listItems = option.getListItems(); + if (listItems != null) { + renderListOption(g, option, y, col); + } else if (type == OptionType.BOOLEAN) { + renderCheckOption(g, option, y, col); + } else if (type == OptionType.NUMERIC) { + renderSliderOption(g, option, y, col); + } else { + renderGenericOption(g, option, y, col); + } + } + + private void renderListOption(Graphics g, GameOption option, int y, Color textColor) { + Fonts.MEDIUM.drawString(optionStartX, y, option.getName(), textColor); + Fonts.MEDIUM.drawString(optionStartX + optionWidth / 2, y, option.getValueString(), textColor); + } + + private void renderCheckOption(Graphics g, GameOption option, int y, Color textColor) { + if (option.getBooleanValue()) { + checkOnImg.draw(optionStartX, y + optionHeight / 4, Color.pink); + } else { + checkOffImg.draw(optionStartX, y + optionHeight / 4, Color.pink); + } + Fonts.MEDIUM.drawString(optionStartX + 30, y, option.getName(), textColor); + } + + private void renderSliderOption(Graphics g, GameOption option, int y, Color textColor) { + String value = option.getValueString(); + int nameLen = Fonts.MEDIUM.getWidth(option.getName()); + int valueLen = Fonts.MEDIUM.getWidth(value); + Fonts.MEDIUM.drawString(optionStartX, y, option.getName(), textColor); + Fonts.MEDIUM.drawString(optionStartX + optionWidth - valueLen, y, value, textColor); + int sliderLen = optionWidth - nameLen - valueLen - 50; + g.setColor(Color.pink); + g.setLineWidth(3f); + g.drawLine(optionStartX + nameLen + 25, y + optionHeight / 2, optionStartX + nameLen + 25 + sliderLen, y + optionHeight / 2); + float sliderValue = (float) (sliderLen + 10) * (option.getIntegerValue() - option.getMinValue()) / (option.getMaxValue() - option.getMinValue()); + sliderBallImg.draw(optionStartX + nameLen + 25 + sliderValue - 10, y + optionHeight / 2 - 10, Color.pink); + } + + private void renderGenericOption(Graphics g, GameOption option, int y, Color textColor) { + String value = option.getValueString(); + int valueLen = Fonts.MEDIUM.getWidth(value); + Fonts.MEDIUM.drawString(optionStartX, y, option.getName(), textColor); + Fonts.MEDIUM.drawString(optionStartX + optionWidth - valueLen, y, value, textColor); } public void renderTabs(int mouseX, int mouseY) { @@ -173,6 +230,10 @@ public class OptionsOverlay { parent.onLeave(); return; } + + if (hoverOption != null && hoverOption.getType() == OptionType.BOOLEAN) { + hoverOption.click(container); + } } public void mouseReleased(int button, int x, int y) {