From 09fadb4c0c124ddf1167e356f028f8fb6386ed52 Mon Sep 17 00:00:00 2001 From: Patrick <147879351+WinniePatGG@users.noreply.github.com> Date: Sat, 20 Jun 2026 23:09:00 +0200 Subject: [PATCH] Rework Settings Menu --- .../parrotmod/ui/BaseTabFragment.java | 36 +++++++++++ .../parrotmod/ui/DiscordTabFragment.java | 62 ++++++++----------- .../parrotmod/ui/GeneralTabFragment.java | 35 ++++------- .../parrotmod/ui/InfoTabFragment.java | 22 +------ .../parrotmod/ui/SettingsFragment.java | 52 +++++++++++----- 5 files changed, 113 insertions(+), 94 deletions(-) create mode 100644 src/main/java/de/winniepat/parrotmod/ui/BaseTabFragment.java diff --git a/src/main/java/de/winniepat/parrotmod/ui/BaseTabFragment.java b/src/main/java/de/winniepat/parrotmod/ui/BaseTabFragment.java new file mode 100644 index 0000000..049dad6 --- /dev/null +++ b/src/main/java/de/winniepat/parrotmod/ui/BaseTabFragment.java @@ -0,0 +1,36 @@ +package de.winniepat.parrotmod.ui; + +import icyllis.modernui.animation.ObjectAnimator; +import icyllis.modernui.fragment.Fragment; +import icyllis.modernui.view.View; +import icyllis.modernui.view.ViewGroup; +import icyllis.modernui.widget.LinearLayout; +import icyllis.modernui.widget.TextView; + +public abstract class BaseTabFragment extends Fragment { + + protected int dp(float dp) { + return (int) (dp * getContext().getResources().getDisplayMetrics().density); + } + + protected TextView makeLabel(String text) { + TextView tv = new TextView(getContext()); + tv.setText(text); + tv.setTextSize(14); + tv.setTextColor(0xFFEEEEEE); + var p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + p.topMargin = dp(12); + p.bottomMargin = dp(4); + tv.setLayoutParams(p); + return tv; + } + + @Override + public void onViewCreated(View view, icyllis.modernui.util.DataSet savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + view.setAlpha(0); + view.setTranslationY(dp(20)); + ObjectAnimator.ofFloat(view, View.ALPHA, 0, 1).setDuration(400).start(); + ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, dp(20), 0).setDuration(400).start(); + } +} diff --git a/src/main/java/de/winniepat/parrotmod/ui/DiscordTabFragment.java b/src/main/java/de/winniepat/parrotmod/ui/DiscordTabFragment.java index ca46bf2..32eac57 100644 --- a/src/main/java/de/winniepat/parrotmod/ui/DiscordTabFragment.java +++ b/src/main/java/de/winniepat/parrotmod/ui/DiscordTabFragment.java @@ -1,7 +1,6 @@ package de.winniepat.parrotmod.ui; import de.winniepat.parrotmod.config.ConfigManager; -import icyllis.modernui.fragment.Fragment; import icyllis.modernui.util.DataSet; import icyllis.modernui.view.LayoutInflater; import icyllis.modernui.view.View; @@ -9,68 +8,59 @@ import icyllis.modernui.view.ViewGroup; import icyllis.modernui.widget.LinearLayout; import icyllis.modernui.widget.Switch; import icyllis.modernui.widget.TextView; +import icyllis.modernui.view.Gravity; -public class DiscordTabFragment extends Fragment { +public class DiscordTabFragment extends BaseTabFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, DataSet savedInstanceData) { LinearLayout layout = new LinearLayout(getContext()); layout.setOrientation(LinearLayout.VERTICAL); - layout.setPadding(dp(12), dp(12), dp(12), dp(12)); + layout.setPadding(dp(20), dp(20), dp(20), dp(20)); - layout.addView(makeLabel("Enable DiscordRPC")); - Switch toggleDiscordRPC = new Switch(getContext()); - toggleDiscordRPC.setChecked(ConfigManager.getInstance().enableDiscordRPC); - toggleDiscordRPC.setOnCheckedChangeListener((v, checked) -> { + addSwitch(layout, "Enable DiscordRPC", ConfigManager.getInstance().enableDiscordRPC, (v, checked) -> { ConfigManager.getInstance().enableDiscordRPC = checked; ConfigManager.save(); }); - layout.addView(toggleDiscordRPC); - layout.addView(makeLabel("Show Biome in RPC")); - Switch toggleBiome = new Switch(getContext()); - toggleBiome.setChecked(ConfigManager.getInstance().showBiomeInRPC); - toggleBiome.setOnCheckedChangeListener((v, checked) -> { + addSwitch(layout, "Show Biome in RPC", ConfigManager.getInstance().showBiomeInRPC, (v, checked) -> { ConfigManager.getInstance().showBiomeInRPC = checked; ConfigManager.save(); }); - layout.addView(toggleBiome); - layout.addView(makeLabel("Show Held Item in RPC")); - Switch toggleHeldItem = new Switch(getContext()); - toggleHeldItem.setChecked(ConfigManager.getInstance().showHeldItemInRPC); - toggleHeldItem.setOnCheckedChangeListener((v, checked) -> { + addSwitch(layout, "Show Held Item in RPC", ConfigManager.getInstance().showHeldItemInRPC, (v, checked) -> { ConfigManager.getInstance().showHeldItemInRPC = checked; ConfigManager.save(); }); - layout.addView(toggleHeldItem); - layout.addView(makeLabel("Show Health in RPC")); - Switch toggleHealth = new Switch(getContext()); - toggleHealth.setChecked(ConfigManager.getInstance().showHealthInRPC); - toggleHealth.setOnCheckedChangeListener((v, checked) -> { + addSwitch(layout, "Show Health in RPC", ConfigManager.getInstance().showHealthInRPC, (v, checked) -> { ConfigManager.getInstance().showHealthInRPC = checked; ConfigManager.save(); }); - layout.addView(toggleHealth); return layout; } - private TextView makeLabel(String text) { + private void addSwitch(LinearLayout parent, String label, boolean checked, Switch.OnCheckedChangeListener listener) { + LinearLayout row = new LinearLayout(getContext()); + row.setOrientation(LinearLayout.HORIZONTAL); + row.setGravity(Gravity.CENTER_VERTICAL); + var rowParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + rowParams.bottomMargin = dp(12); + row.setLayoutParams(rowParams); + TextView tv = new TextView(getContext()); - tv.setText(text); - tv.setTextSize(12); - tv.setTextColor(0xFFCCCCCC); - var p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - p.topMargin = dp(8); - p.bottomMargin = dp(2); - tv.setLayoutParams(p); - return tv; - } + tv.setText(label); + tv.setTextSize(15); + tv.setTextColor(0xFFEEEEEE); + var labelParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f); + row.addView(tv, labelParams); - private int dp(float dp) { - return (int) (dp * getContext().getResources().getDisplayMetrics().density); - } + Switch s = new Switch(getContext()); + s.setChecked(checked); + s.setOnCheckedChangeListener(listener); + row.addView(s); + parent.addView(row); + } } diff --git a/src/main/java/de/winniepat/parrotmod/ui/GeneralTabFragment.java b/src/main/java/de/winniepat/parrotmod/ui/GeneralTabFragment.java index 39b6ec5..b523ff0 100644 --- a/src/main/java/de/winniepat/parrotmod/ui/GeneralTabFragment.java +++ b/src/main/java/de/winniepat/parrotmod/ui/GeneralTabFragment.java @@ -1,20 +1,21 @@ package de.winniepat.parrotmod.ui; -import de.winniepat.parrotmod.Parrotmod; import de.winniepat.parrotmod.config.ConfigManager; -import icyllis.modernui.fragment.Fragment; import icyllis.modernui.util.DataSet; -import icyllis.modernui.view.*; -import icyllis.modernui.widget.*; +import icyllis.modernui.view.LayoutInflater; +import icyllis.modernui.view.View; +import icyllis.modernui.view.ViewGroup; +import icyllis.modernui.widget.Button; +import icyllis.modernui.widget.LinearLayout; import net.minecraft.client.Minecraft; -public class GeneralTabFragment extends Fragment { +public class GeneralTabFragment extends BaseTabFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, DataSet savedInstanceData) { LinearLayout layout = new LinearLayout(getContext()); layout.setOrientation(LinearLayout.VERTICAL); - layout.setPadding(dp(12), dp(12), dp(12), dp(12)); + layout.setPadding(dp(20), dp(20), dp(20), dp(20)); layout.addView(makeLabel("Minecraft Version: " + Minecraft.getInstance().getLaunchedVersion())); @@ -22,30 +23,16 @@ public class GeneralTabFragment extends Fragment { reloadBtn.setText("Reload Config"); reloadBtn.setOnClickListener(v -> ConfigManager.load()); var p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - p.topMargin = dp(16); + p.topMargin = dp(24); layout.addView(reloadBtn, p); Button saveBtn = new Button(getContext()); saveBtn.setText("Save Config"); saveBtn.setOnClickListener(v -> ConfigManager.save()); - layout.addView(saveBtn, p); + var p2 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + p2.topMargin = dp(12); + layout.addView(saveBtn, p2); return layout; } - - private TextView makeLabel(String text) { - TextView tv = new TextView(getContext()); - tv.setText(text); - tv.setTextSize(12); - tv.setTextColor(0xFFCCCCCC); - var p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - p.topMargin = dp(8); - p.bottomMargin = dp(2); - tv.setLayoutParams(p); - return tv; - } - - private int dp(float dp) { - return (int) (dp * getContext().getResources().getDisplayMetrics().density); - } } \ No newline at end of file diff --git a/src/main/java/de/winniepat/parrotmod/ui/InfoTabFragment.java b/src/main/java/de/winniepat/parrotmod/ui/InfoTabFragment.java index 65a55b5..4d37f67 100644 --- a/src/main/java/de/winniepat/parrotmod/ui/InfoTabFragment.java +++ b/src/main/java/de/winniepat/parrotmod/ui/InfoTabFragment.java @@ -1,22 +1,20 @@ package de.winniepat.parrotmod.ui; -import icyllis.modernui.fragment.Fragment; import icyllis.modernui.util.DataSet; import icyllis.modernui.view.LayoutInflater; import icyllis.modernui.view.View; import icyllis.modernui.view.ViewGroup; import icyllis.modernui.widget.LinearLayout; -import icyllis.modernui.widget.TextView; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; -public class InfoTabFragment extends Fragment { +public class InfoTabFragment extends BaseTabFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, DataSet savedInstanceData) { LinearLayout layout = new LinearLayout(getContext()); layout.setOrientation(LinearLayout.VERTICAL); - layout.setPadding(dp(12), dp(12), dp(12), dp(12)); + layout.setPadding(dp(20), dp(20), dp(20), dp(20)); String parrotVersion = FabricLoader.getInstance().getModContainer("parrotmod").orElseThrow().getMetadata().getVersion().getFriendlyString(); layout.addView(makeLabel("Parrotmod version: " + parrotVersion)); @@ -41,20 +39,4 @@ public class InfoTabFragment extends Fragment { return layout; } - - private TextView makeLabel(String text) { - TextView tv = new TextView(getContext()); - tv.setText(text); - tv.setTextSize(12); - tv.setTextColor(0xFFCCCCCC); - var p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - p.topMargin = dp(8); - p.bottomMargin = dp(2); - tv.setLayoutParams(p); - return tv; - } - - private int dp(float dp) { - return (int) (dp * getContext().getResources().getDisplayMetrics().density); - } } diff --git a/src/main/java/de/winniepat/parrotmod/ui/SettingsFragment.java b/src/main/java/de/winniepat/parrotmod/ui/SettingsFragment.java index e169a71..915bbb0 100644 --- a/src/main/java/de/winniepat/parrotmod/ui/SettingsFragment.java +++ b/src/main/java/de/winniepat/parrotmod/ui/SettingsFragment.java @@ -1,6 +1,7 @@ package de.winniepat.parrotmod.ui; import icyllis.modernui.R; +import icyllis.modernui.animation.ObjectAnimator; import icyllis.modernui.fragment.Fragment; import icyllis.modernui.util.DataSet; import icyllis.modernui.view.*; @@ -15,19 +16,34 @@ public class SettingsFragment extends Fragment { LinearLayout root = new LinearLayout(getContext()); root.setOrientation(LinearLayout.HORIZONTAL); root.setLayoutParams(new FrameLayout.LayoutParams( - dp(520), dp(320), Gravity.CENTER)); + dp(700), dp(450), Gravity.CENTER)); + + root.setAlpha(0); + root.setScaleX(0.95f); + root.setScaleY(0.95f); + ObjectAnimator.ofFloat(root, View.ALPHA, 0, 1).setDuration(400).start(); + ObjectAnimator.ofFloat(root, View.SCALE_X, 0.95f, 1).setDuration(400).start(); + ObjectAnimator.ofFloat(root, View.SCALE_Y, 0.95f, 1).setDuration(400).start(); LinearLayout sidebar = new LinearLayout(getContext()); sidebar.setOrientation(LinearLayout.VERTICAL); - sidebar.setPadding(dp(8), dp(8), dp(8), dp(8)); - sidebar.setBackground(makeRoundedBg(0xCC1A1A2E)); + sidebar.setPadding(dp(12), dp(16), dp(12), dp(16)); + sidebar.setBackground(makeRoundedBg(0xEE161625)); - var sidebarParams = new LinearLayout.LayoutParams(dp(110), ViewGroup.LayoutParams.MATCH_PARENT); + TextView title = new TextView(getContext()); + title.setText("ParrotMod"); + title.setTextSize(20); + title.setGravity(Gravity.CENTER); + title.setTextColor(0xFFFFFFFF); + title.setPadding(0, 0, 0, dp(20)); + sidebar.addView(title); + + var sidebarParams = new LinearLayout.LayoutParams(dp(160), ViewGroup.LayoutParams.MATCH_PARENT); root.addView(sidebar, sidebarParams); FrameLayout contentArea = new FrameLayout(getContext()); contentArea.setId(R.id.content); - contentArea.setBackground(makeRoundedBg(0xCC101018)); + contentArea.setBackground(makeRoundedBg(0xEE101018)); var contentParams = new LinearLayout.LayoutParams( 0, ViewGroup.LayoutParams.MATCH_PARENT, 1f); @@ -49,10 +65,10 @@ public class SettingsFragment extends Fragment { for (int i = 0; i < tabNames.length; i++) { final int index = i; Button tab = new Button(getContext()); - tab.setText(tabNames[i]); - tab.setTextSize(13); + tab.setText(tabNames[index]); + tab.setTextSize(15); tab.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); - tab.setPadding(dp(10), dp(6), dp(10), dp(6)); + tab.setPadding(dp(16), dp(8), dp(16), dp(8)); tab.setBackground(null); tab.setOnClickListener(v -> { @@ -60,19 +76,27 @@ public class SettingsFragment extends Fragment { .setReorderingAllowed(true) .replace(contentArea.getId(), tabFragments[index]) .commit(); - for (Button b : tabs) b.setTextColor(0xFFAAAAAA); + for (Button b : tabs) { + b.setTextColor(0xFFAAAAAA); + b.setBackground(null); + } tab.setTextColor(0xFFFFFFFF); + tab.setBackground(makeRoundedBg(0x33FFFFFF)); }); var tabParams = new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, dp(32)); - tabParams.bottomMargin = dp(4); + ViewGroup.LayoutParams.MATCH_PARENT, dp(40)); + tabParams.bottomMargin = dp(8); sidebar.addView(tab, tabParams); - tabs[i] = tab; + tabs[index] = tab; } tabs[0].setTextColor(0xFFFFFFFF); - for (int i = 1; i < tabs.length; i++) tabs[i].setTextColor(0xFFAAAAAA); + tabs[0].setBackground(makeRoundedBg(0x33FFFFFF)); + for (int i = 1; i < tabs.length; i++) { + tabs[i].setTextColor(0xFFAAAAAA); + tabs[i].setBackground(null); + } return root; } @@ -83,7 +107,7 @@ public class SettingsFragment extends Fragment { private ShapeDrawable makeRoundedBg(int color) { ShapeDrawable d = new ShapeDrawable(); - d.setCornerRadius(dp(6)); + d.setCornerRadius(dp(12)); d.setColor(color); return d; }