DEADSOFTWARE

Implement DI for menu and refactor #13
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / menu / submenus / Menu.java
1 package ru.deadsoftware.cavedroid.menu.submenus;
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.files.FileHandle;
5 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
6 import com.badlogic.gdx.graphics.g2d.TextureRegion;
7 import com.badlogic.gdx.utils.ArrayMap;
8 import com.badlogic.gdx.utils.JsonValue;
9 import ru.deadsoftware.cavedroid.MainConfig;
10 import ru.deadsoftware.cavedroid.menu.MenuProc;
11 import ru.deadsoftware.cavedroid.menu.objects.Button;
12 import ru.deadsoftware.cavedroid.menu.objects.ButtonEventListener;
13 import ru.deadsoftware.cavedroid.menu.objects.ButtonRenderer;
14 import ru.deadsoftware.cavedroid.misc.Assets;
16 import java.util.HashMap;
18 public abstract class Menu {
20 protected final MainConfig mMainConfig;
21 protected final MenuProc.Input mMenuInput;
23 private final ButtonRenderer mButtonRenderer;
25 private final float mWidth;
26 private final float mHeight;
28 /**
29 * {@link ArrayMap} of {@link Button Buttons} of this menu screen
30 */
31 private ArrayMap<String, Button> buttons;
33 /**
34 * @param width Viewport width
35 * @param height Viewport height
36 * @param buttonRenderer {@link ButtonRenderer} that will draw the buttons of this menu
37 */
38 Menu(float width, float height, ButtonRenderer buttonRenderer, MainConfig mainConfig, MenuProc.Input menuInput) {
39 mWidth = width;
40 mHeight = height;
41 mButtonRenderer = buttonRenderer;
42 mMainConfig = mainConfig;
43 mMenuInput = menuInput;
44 initButtons();
45 }
47 /**
48 * If you are loading buttons from json,
49 * override this method and create a HashMap with buttons' keys from json as keys
50 * and {@link ButtonEventListener ButtonEventListeners} as values.
51 *
52 * @return empty HashMap if not overridden
53 */
54 protected HashMap<String, ButtonEventListener> getButtonEventListeners() {
55 return new HashMap<>();
56 }
58 /**
59 * You can call this from {@link #initButtons()} to load buttons from json
60 *
61 * @param jsonFile A {@link FileHandle} to json file
62 */
63 void loadButtonsFromJson(FileHandle jsonFile) {
64 if (buttons == null) {
65 buttons = new ArrayMap<>();
66 }
67 HashMap<String, ButtonEventListener> eventListeners = getButtonEventListeners();
68 JsonValue json = Assets.jsonReader.parse(jsonFile);
69 int y = (int) mHeight / 4;
70 for (JsonValue key = json.child(); key != null; key = key.next(), y += Button.HEIGHT + 10) {
71 buttons.put(key.name(),
72 new Button(Assets.getStringFromJson(key, "label", ""),
73 (int) mWidth / 2 - Button.WIDTH / 2,
74 Assets.getIntFromJson(key, "y", y),
75 Assets.getIntFromJson(key, "type", Button.NORMAL),
76 eventListeners.containsKey(key.name()) ? eventListeners.get(key.name()) : () -> {
77 }));
78 }
79 }
81 /**
82 * Draws the menu with background, logo and it's buttons
83 *
84 * @param spriter {@link SpriteBatch} that will draw it. Should be already started.
85 */
86 public void draw(SpriteBatch spriter) {
87 TextureRegion background = Assets.textureRegions.get("background");
88 TextureRegion gamelogo = Assets.textureRegions.get("gamelogo");
90 for (int x = 0; x <= mWidth / 16; x++) {
91 for (int y = 0; y <= mHeight / 16; y++) {
92 spriter.draw(background, x * 16, y * 16);
93 }
94 }
95 spriter.draw(gamelogo, mWidth / 2 - (float) gamelogo.getRegionWidth() / 2, 8);
97 float inputX = Gdx.input.getX() * mWidth / Gdx.graphics.getWidth();
98 float inputY = Gdx.input.getY() * mHeight / Gdx.graphics.getHeight();
99 for (Button button : buttons.values()) {
100 if (button.getType() > 0) {
101 if (button.getRect().contains(inputX, inputY) && (/*!CaveGame.TOUCH || */Gdx.input.isTouched())) {
102 button.setType(2);
103 } else {
104 button.setType(1);
107 button.draw(mButtonRenderer);
111 public ArrayMap<String, Button> getButtons() {
112 return buttons;
115 /**
116 * This method is called from constructor and should initialize {@link #buttons} <br>
117 * You can run {@link #loadButtonsFromJson(FileHandle)} from it
118 */
119 protected abstract void initButtons();