DEADSOFTWARE

Add preferences
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / menu / submenus / Menu.java
index dcb06d3d937877a2cf3aa8ea4dd8daf05ad119f9..7e793b7b1db1d77a21a85dbb2faf30e4437974bd 100644 (file)
@@ -1,26 +1,34 @@
 package ru.deadsoftware.cavedroid.menu.submenus;
 
+import com.badlogic.gdx.Application;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.files.FileHandle;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.graphics.g2d.TextureRegion;
 import com.badlogic.gdx.utils.ArrayMap;
 import com.badlogic.gdx.utils.JsonValue;
-import ru.deadsoftware.cavedroid.CaveGame;
-import ru.deadsoftware.cavedroid.GameScreen;
+import kotlin.text.StringsKt;
+import ru.deadsoftware.cavedroid.MainConfig;
+import ru.deadsoftware.cavedroid.menu.MenuProc;
+import ru.deadsoftware.cavedroid.menu.objects.BooleanOptionButton;
 import ru.deadsoftware.cavedroid.menu.objects.Button;
 import ru.deadsoftware.cavedroid.menu.objects.ButtonEventListener;
 import ru.deadsoftware.cavedroid.menu.objects.ButtonRenderer;
 import ru.deadsoftware.cavedroid.misc.Assets;
+import ru.deadsoftware.cavedroid.misc.utils.AssetLoader;
 
 import java.util.HashMap;
 
 public abstract class Menu {
 
-    private ButtonRenderer buttonRenderer;
+    protected final MainConfig mMainConfig;
+    protected final MenuProc.Input mMenuInput;
+    protected final AssetLoader mAssetLoader;
 
-    private float width;
-    private float height;
+    private final ButtonRenderer mButtonRenderer;
+
+    private final float mWidth;
+    private final float mHeight;
 
     /**
      * {@link ArrayMap} of {@link Button Buttons} of this menu screen
@@ -32,10 +40,18 @@ public abstract class Menu {
      * @param height         Viewport height
      * @param buttonRenderer {@link ButtonRenderer} that will draw the buttons of this menu
      */
-    Menu(float width, float height, ButtonRenderer buttonRenderer) {
-        this.width = width;
-        this.height = height;
-        this.buttonRenderer = buttonRenderer;
+    Menu(float width,
+         float height,
+         ButtonRenderer buttonRenderer,
+         MainConfig mainConfig,
+         MenuProc.Input menuInput,
+         AssetLoader assetLoader) {
+        mWidth = width;
+        mHeight = height;
+        mButtonRenderer = buttonRenderer;
+        mMainConfig = mainConfig;
+        mMenuInput = menuInput;
+        mAssetLoader = assetLoader;
         initButtons();
     }
 
@@ -61,15 +77,29 @@ public abstract class Menu {
         }
         HashMap<String, ButtonEventListener> eventListeners = getButtonEventListeners();
         JsonValue json = Assets.jsonReader.parse(jsonFile);
-        int y = (int) height / 4;
+        int y = (int) mHeight / 4;
         for (JsonValue key = json.child(); key != null; key = key.next(), y += Button.HEIGHT + 10) {
-            buttons.put(key.name(),
-                    new Button(Assets.getStringFromJson(key, "label", ""),
-                            (int) width / 2 - Button.WIDTH / 2,
-                            Assets.getIntFromJson(key, "y", y),
-                            Assets.getIntFromJson(key, "type", Button.NORMAL),
-                            eventListeners.containsKey(key.name()) ? eventListeners.get(key.name()) : () -> {
-                            }));
+
+            if (Gdx.app.getType() == Application.ApplicationType.Android &&
+                    !Assets.getBooleanFromJson(key, "visible_on_android", true)) {
+                continue;
+            }
+
+            String optionType = Assets.getStringFromJson(key, "option_type", "");
+            String label = Assets.getStringFromJson(key, "label", "");
+            int x = (int) mWidth / 2 - Button.WIDTH / 2;
+            int type = Assets.getIntFromJson(key, "type", Button.NORMAL);
+            String defaultValue = Assets.getStringFromJson(key, "default_value", "");
+
+
+            Button button = switch (optionType) {
+                case "boolean" ->
+                    new BooleanOptionButton(mMainConfig, key.name(), Boolean.parseBoolean(defaultValue), label, x, y, type);
+                default ->
+                    new Button(label, x, y, type, eventListeners.containsKey(key.name()) ? eventListeners.get(key.name()) : () -> {});
+            };
+
+            buttons.put(key.name(), button);
         }
     }
 
@@ -82,24 +112,24 @@ public abstract class Menu {
         TextureRegion background = Assets.textureRegions.get("background");
         TextureRegion gamelogo = Assets.textureRegions.get("gamelogo");
 
-        for (int x = 0; x <= width / 16; x++) {
-            for (int y = 0; y <= height / 16; y++) {
+        for (int x = 0; x <= mWidth / 16; x++) {
+            for (int y = 0; y <= mHeight / 16; y++) {
                 spriter.draw(background, x * 16, y * 16);
             }
         }
-        spriter.draw(gamelogo, width / 2 - (float) gamelogo.getRegionWidth() / 2, 8);
+        spriter.draw(gamelogo, mWidth / 2 - (float) gamelogo.getRegionWidth() / 2, 8);
 
-        float inputX = Gdx.input.getX() * width / GameScreen.getWidth();
-        float inputY = Gdx.input.getY() * height / GameScreen.getHeight();
+        float inputX = Gdx.input.getX() * mWidth / Gdx.graphics.getWidth();
+        float inputY = Gdx.input.getY() * mHeight / Gdx.graphics.getHeight();
         for (Button button : buttons.values()) {
             if (button.getType() > 0) {
-                if (button.getRect().contains(inputX, inputY) && (!CaveGame.TOUCH || Gdx.input.isTouched())) {
+                if (button.getRect().contains(inputX, inputY) && (/*!CaveGame.TOUCH || */Gdx.input.isTouched())) {
                     button.setType(2);
                 } else {
                     button.setType(1);
                 }
             }
-            button.draw(buttonRenderer);
+            button.draw(mButtonRenderer);
         }
     }