From 33677806ef6d58c7a7f4eaa1d0a2d1a75742ed52 Mon Sep 17 00:00:00 2001 From: FuckYou Date: Sat, 12 Nov 2016 03:40:55 +0400 Subject: [PATCH] Major update (Stable) - Update libRefTools library - Completely rewrote Tabs class - Tabs class now uses ShiftingList to ensure that unused resources get recycled - Loaded resources can now be unloaded at will - Loaded resources can now be reloaded at will - Previously loaded, non-recycled resources are loaded from ShiftingList - Added implicit sub-tab support by requesting a parent to place tab in - Added blank settings sub-tab layout asset files - Fixed some continuity for variables in Main class - Made css style handling changes to allow for dynamic color change and selection of tabs - Id's are no longer used to define style of tabs. That is done by styleClass now - StyleClasses are now updated from Main when a tab is selected - Selected tabs use regular tab "hover" color to signify selection - Selected tabs that are being hovered over are even darker - Added "local layout" references inside onMouseClicked listeners to continuity - Made updating currently selected tab easier by moving all the code to a method --- libs/libRefTools.jar | Bin 51446 -> 51035 bytes src/Launcher/Main.java | 81 +++++++++++++++++----- src/Launcher/Tabs.java | 80 +++++++++++++++------ src/assets/layout/instance_userinfo.fxml | 6 ++ src/assets/layout/main.fxml | 10 +-- src/assets/layout/settings.fxml | 7 +- src/assets/layout/settings_generic.fxml | 6 ++ src/assets/layout/settings_minecraft.fxml | 6 ++ src/assets/style/nav.css | 26 +++++-- 9 files changed, 168 insertions(+), 54 deletions(-) create mode 100644 src/assets/layout/instance_userinfo.fxml create mode 100644 src/assets/layout/settings_generic.fxml create mode 100644 src/assets/layout/settings_minecraft.fxml diff --git a/libs/libRefTools.jar b/libs/libRefTools.jar index 4f2a003c59e904264c2e705ad6ad0a66ebf716c0..a53cd8a45fc59e5dfcc772bab26d4995bd4033ce 100644 GIT binary patch delta 25478 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 NkOT+Ao?HH&{U6NJ(@+2a delta 25765 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 diff --git a/src/Launcher/Main.java b/src/Launcher/Main.java index c27941e..dca1bf1 100644 --- a/src/Launcher/Main.java +++ b/src/Launcher/Main.java @@ -13,16 +13,19 @@ package Launcher; import com.tofvesson.reflection.SafeReflection; import javafx.application.Application; import javafx.fxml.FXMLLoader; +import javafx.scene.Node; +import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.TextField; +import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.Pane; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; import javafx.stage.StageStyle; + import java.net.URL; + import com.tofvesson.async.*; public class Main extends Application { @@ -30,13 +33,13 @@ public class Main extends Application { public static final URL mainLauncher = Main.class.getResource("../assets/layout/main.fxml"); // Launcher body private double xOffset = 0, yOffset = 0; // Offsets for dragging - private Button exit, min, Home_btn, Modpack_btn, Settings_btn, Instance_btn, Settings_General_btn, Settings_Minecraft_btn; // Define buttons + private Button exit, min, Home_btn, Modpack_btn, Settings_btn, Instance_btn; // Define buttons private ImageView icon; private TextField Search_modpacks; private Image appIcon; private Rectangle dragBar; // Draggable top bar private Pane root, tab; - private Tabs activeTab = Tabs.Home; + private Node activeTab, settings_activeTab; Async stringUpdater; @Override @@ -61,8 +64,6 @@ public class Main extends Application { Modpack_btn = (Button) root.lookup("#Modpacks-btn"); Settings_btn = (Button) root.lookup("#Settings-btn"); Instance_btn = (Button) root.lookup("#Instance-btn"); - Settings_General_btn = (Button) root.lookup("Settings-Gen-btn"); - Settings_Minecraft_btn = (Button) root.lookup("Settings-Mine-btn"); tab = (Pane) root.lookup("#tab"); @@ -75,32 +76,57 @@ public class Main extends Application { min.setOnMouseClicked(event -> primaryStage.setIconified(true)); // Minimizes the program if minimize button is clicked Home_btn.setOnMouseClicked(event ->{ - if(activeTab!=Tabs.Home){ - (activeTab=Tabs.Home).switchTab(tab); + if(!activeTab.equals(Home_btn)){ + updateTabSelection(Home_btn); + Tabs.switchTab("home", tab); } }); // Sets the active tab to the home tab unless it's already active Modpack_btn.setOnMouseClicked(event ->{ - if(activeTab!=Tabs.Modpacks){ + if(!activeTab.equals(Modpack_btn)){ + updateTabSelection(Modpack_btn); + Tabs.switchTab("modpacks", tab); if(stringUpdater!=null && stringUpdater.isAlive()) stringUpdater.cancel(); - (activeTab=Tabs.Modpacks).switchTab(tab); // Sets the active tab to the modpacks tab unless it's already active - - stringUpdater = new Async(SafeReflection.getFirstMethod(Main.class, "detectStringUpdate"), Tabs.Modpacks.loaded.lookup("#search-modpacks")); + stringUpdater = new Async(SafeReflection.getFirstMethod(Main.class, "detectStringUpdate"), Tabs.load("settings").lookup("#search-modpacks")); } }); Instance_btn.setOnMouseClicked(event -> { - if(activeTab!=Tabs.Instance){ - (activeTab = Tabs.Instance).switchTab(tab); + if(!activeTab.equals(Instance_btn)){ + updateTabSelection(Instance_btn); + Tabs.switchTab("instance", tab); + DialogPane d = new DialogPane(); + Tabs.load("instance").lookup("#Launch-VM").setOnMouseClicked(event1 -> { + Dialog d1 = new Dialog<>(); + DialogPane d2 = d1.getDialogPane(); + d2.setContent(new TextArea("Hello")); + d1.show(); + }); } }); Settings_btn.setOnMouseClicked(event ->{ - if(activeTab!=Tabs.Settings){ - (activeTab=Tabs.Settings).switchTab(tab); // Sets the active tab to the settings tab unless it's already active + if(!activeTab.equals(Settings_btn)){ + updateTabSelection(Settings_btn); + Node n = Tabs.switchTab("settings", tab); // Sets the active tab to the settings tab unless it's already active + (settings_activeTab=n.lookup("#Settings-Gen-btn")).setOnMouseClicked(event1 -> { + // Generic Settings Sub-tab + if(!settings_activeTab.equals(n.lookup("#Settings-Gen-btn"))){ + updateSettingsTabSelection(n.lookup("#Settings-Gen-btn")); + Node genericLayout = Tabs.switchTab("settings_generic", (Pane) n.lookup("#Settings-Pane")); + } + }); + + n.lookup("#Settings-Mine-btn").setOnMouseClicked(event1 -> { + // Minecraft Settings Sub-tab + if(!settings_activeTab.equals(n.lookup("#Settings-Mine-btn"))){ + updateSettingsTabSelection(n.lookup("#Settings-Mine-btn")); + Node minecraftLayout = Tabs.switchTab("settings_minecraft", (Pane) n.lookup("#Settings-Pane")); + } + }); } }); @@ -115,7 +141,8 @@ public class Main extends Application { }); // Set up default layout - Tabs.Home.switchTab(tab); + activeTab = Home_btn; // Update selected tab + Tabs.switchTab("home", tab); icon.setImage(appIcon); } @@ -123,9 +150,29 @@ public class Main extends Application { launch(args); } + /** + * Search for packs with an 80% match compared to detected string. + * @param toRead TextField to read from. + */ public static void detectStringUpdate(TextField toRead){ String s = ""; while(true) if(!s.equals(toRead.getText())) System.out.println(s = toRead.getText()); } + + void updateTabSelection(Node newTab){ + activeTab.getStyleClass().remove("selected"); + activeTab.getStyleClass().add("tab"); + activeTab = newTab; + activeTab.getStyleClass().remove("tab"); + activeTab.getStyleClass().add("selected"); + } + + void updateSettingsTabSelection(Node newTab){ + settings_activeTab.getStyleClass().remove("selected"); + settings_activeTab.getStyleClass().add("tab"); + settings_activeTab = newTab; + settings_activeTab.getStyleClass().remove("tab"); + settings_activeTab.getStyleClass().add("selected"); + } } diff --git a/src/Launcher/Tabs.java b/src/Launcher/Tabs.java index d82baba..e8b844b 100644 --- a/src/Launcher/Tabs.java +++ b/src/Launcher/Tabs.java @@ -1,37 +1,73 @@ package Launcher; +import com.tofvesson.collections.ShiftingList; import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; +import javafx.scene.Node; import javafx.scene.layout.Pane; +import javafx.util.Pair; import java.io.IOException; import java.net.URL; -public enum Tabs { +@SuppressWarnings("unused") +public class Tabs { - Modpacks(Tabs.class.getResource("../assets/layout/modpacks.fxml")), - Home(Tabs.class.getResource("../assets/layout/home.fxml")), - Settings(Tabs.class.getResource("../assets/layout/settings.fxml")), - Instance(Tabs.class.getResource("../assets/layout/instance.fxml")); + private static final ShiftingList> loaded = new ShiftingList<>(35); // Memory-efficient list of loaded files /** - * Url referencing xml. + * Loads layout from file in layout assets folder. If layout is already loaded, + * Tabs won't bother with reloading and will instead return the cached version. + * @param fileName Name of fxml file to load. (Must be located in /assets/layout/ folder or name must define name subfolder in layouts folder) + * @return Generified object referring to loaded resource. */ - public final URL url; - - /** - * Loaded layout - */ - public final Parent loaded; - - Tabs(URL url){ - this.url = url; - Parent p = null; - try { p = FXMLLoader.load(url); } catch (IOException e) { e.printStackTrace(); } - loaded = p; + public static Node load(String fileName){ + if(!fileName.endsWith(".fxml")) fileName+=".fxml"; + URL file = Main.class.getResource("../assets/layout/"+fileName); + try { + final boolean[] b = {false}; + loaded.stream().filter(p -> p.getKey().equals(file)).forEach(p->b[0]=true); + if(!b[0]) loaded.add(new Pair<>(file, FXMLLoader.load(file))); // Load file if it isn't already loaded + final Node[] p1 = new Node[]{new Pane()}; + loaded.stream().filter(p->p.getKey().equals(file)).forEach(p->p1[0]=p.getValue()); + return p1[0]; + } catch (IOException e) { + e.printStackTrace(); + return new Pane(); // Returns empty layout if all else fails + } } - public void switchTab(Pane holder){ - holder.getChildren().clear(); - holder.getChildren().add(loaded); + /** + * Switches the currently loaded tab in holder pane. Removes current children from holder and adds new tab instead. + * If holder already contains layout, method simply returns the loaded resource. + * @param newTabName Name of file containing the new tab data. + * @param holder Pane where tab should be loaded to. + * @return Generified object referring to loaded resource. + */ + public static Node switchTab(String newTabName, Pane holder){ + Node n = load(newTabName); + if(!holder.getChildren().contains(n)) { + holder.getChildren().clear(); + holder.getChildren().add(n); + } + return n; + } + + /** + * Forces unloading of resource to free up resources and/or clear data. + * @param fileName Name of resource to unload. + */ + public static void unloadTab(String fileName){ + if(!fileName.endsWith(".fxml")) fileName+=".fxml"; + URL file = Main.class.getResource("../assets/layout/"+fileName); + loaded.stream().filter(p->p.getKey().equals(file)).forEach(loaded::remove); + } + + /** + * Forces unloading and the subsequent loading of a layout resource. + * @param fileName Name of resource to reload. + * @return Newly loaded layout. + */ + public static Node reloadTab(String fileName){ + unloadTab(fileName); + return load(fileName); } } diff --git a/src/assets/layout/instance_userinfo.fxml b/src/assets/layout/instance_userinfo.fxml new file mode 100644 index 0000000..9db0fb8 --- /dev/null +++ b/src/assets/layout/instance_userinfo.fxml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/layout/main.fxml b/src/assets/layout/main.fxml index 8d0a86b..7e4e3e6 100644 --- a/src/assets/layout/main.fxml +++ b/src/assets/layout/main.fxml @@ -7,7 +7,7 @@ - + - - - + + diff --git a/src/assets/layout/settings_generic.fxml b/src/assets/layout/settings_generic.fxml new file mode 100644 index 0000000..9db0fb8 --- /dev/null +++ b/src/assets/layout/settings_generic.fxml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/layout/settings_minecraft.fxml b/src/assets/layout/settings_minecraft.fxml new file mode 100644 index 0000000..9db0fb8 --- /dev/null +++ b/src/assets/layout/settings_minecraft.fxml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/style/nav.css b/src/assets/style/nav.css index 4f1feff..435225c 100644 --- a/src/assets/style/nav.css +++ b/src/assets/style/nav.css @@ -13,15 +13,27 @@ #min:hover, #exit:hover{ -fx-background-color: #bf0000; } -#Home-btn, #Modpacks-btn, #Settings-btn, #Instance-btn, #Settings-Gen-btn, #Settings-Mine-btn{ - -fx-background-color: rgba(0, 0, 0, 0); -} -#Home-btn:hover, #Modpacks-btn:hover, #Settings-btn:hover, #Instance-btn:hover, #Settings-Gen-btn:hover, #Settings-Mine-btn:hover { - -fx-background-color: #0c182d; - -fx-background-radius: 0em; -} #search-modpacks { -fx-text-inner-color: white; -fx-background-color: rgba(0, 0, 0, 0.5); -fx-padding: 10px; +} + +.tab { + -fx-background-color: rgba(0, 0, 0, 0); + -fx-background-radius: 0em; +} + +.tab:hover{ + -fx-background-color: #0c182d; + +} + +.selected { + -fx-background-color: #0c182d; + -fx-background-radius: 0em; +} + +.selected:hover { + -fx-background-color: #050b14; } \ No newline at end of file