diff --git a/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties b/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties index 6e553fe7b55f64165bef092e56959af31f7551a3..9d1ef416099bc0f14fe5a98243cfd5bf81b02e33 100644 --- a/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties +++ b/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties @@ -22,6 +22,7 @@ UI.Dialog.Launch.Title=Projekt w UI.Window.Main.Title=Play Wall [Projekt: {} - Profil: {}] UI.Window.Changelog.Title=Was ist neu? UI.Window.Settings.Title=Einstellungen - {} +UI.Window.GlobalSettings.Title=Programm Einstellungen UI.Window.PadSettings.Title=Kachel Einstellungen - {} | {} UI.Window.PadSettings.Title.Empty=Kachel Einstellungen - {} UI.Dialog.DragAndDrop.Title=Drag and Drop @@ -175,6 +176,9 @@ Mapper.Midi.toString=Midi {} # Das ist Midi und Tastatur gemeinsam Info.Mapper.PressKey=Dr�cken Sie eine Taste auf dem Ger�t. +#UI - Settings - Alerts +UI.Settings.Alert.NewKeyShortcut.Text=Dr�cken Sie bitte die gew�nschte Tastenkombination. (Erlaubt sind Buchstaben, Ziffern und Funktionstasten). + # UI - Window - PadSettings UI.Window.PadSettings.General.Title=Allgemein UI.Window.PadSettings.Player.Title=Player diff --git a/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties b/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties index cd795228fbeda47c5c6fb90924bd95065b6bf5db..47b3ca8394b5967a3d91c2933efd33959882dd22 100644 --- a/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties +++ b/PlayWall/assets/de/tobias/playpad/assets/lang/ui_de.properties @@ -17,6 +17,7 @@ main.menuitem.plugins=Erweiterungen... main.menuitem.dnd=Bearbeitungsmodus main.menuitem.errors=Fehlerbericht anzeigen... main.menuitem.settings=Einstellungen... +main.menuitem.globalsettings=Globale (Programm) Einstellungen main.menuitem.about=�ber Play Wall... main.menuitem.website=Webseite besuchen... main.menuitem.senderror=Fehler senden... @@ -75,6 +76,14 @@ settings.update.label.channel=Update Kanal: settings.update.label.infoC=Program settings.update.label.infoE=Erweiterung +settings.keys.label.headline=Tastenkombinationen +settings.keys.label.name=Name: +settings.keys.label.shortcut=Kurzbefehl: +settings.keys.button.change=Neu +settings.keys.table.name=Name +settings.keys.table.shortcut=Kurzbefehl +settings.keys.textfieldsearch=Suchen... + settings.button.finish=Fertig settings.checkbox.activate=Aktivieren diff --git a/PlayWall/assets/de/tobias/playpad/assets/modern_style.css b/PlayWall/assets/de/tobias/playpad/assets/modern_style.css index e6696ef97cc54d85301cd95b4ee53c8d2789b095..84ae1898d566a5f64fa01c995e0619c2c561284f 100644 --- a/PlayWall/assets/de/tobias/playpad/assets/modern_style.css +++ b/PlayWall/assets/de/tobias/playpad/assets/modern_style.css @@ -146,4 +146,4 @@ .progress-indicator .percentage { -fx-fill: white; -} \ No newline at end of file +} diff --git a/PlayWall/assets/de/tobias/playpad/assets/view/main/desktop/header.fxml b/PlayWall/assets/de/tobias/playpad/assets/view/main/desktop/header.fxml index 9d5745755f8bbe303e3d406e6f8b4d0a8ea6c951..28fd4171e78dfaae93f973a26f6e21f1c64c1f94 100644 --- a/PlayWall/assets/de/tobias/playpad/assets/view/main/desktop/header.fxml +++ b/PlayWall/assets/de/tobias/playpad/assets/view/main/desktop/header.fxml @@ -12,18 +12,18 @@ <menus> <Menu mnemonicParsing="false" text="%main.menu.file"> <items> - <MenuItem mnemonicParsing="false" onAction="#newDocumentHandler" text="%main.menuitem.new"> + <MenuItem fx:id="newProjectMenuItem" mnemonicParsing="false" onAction="#newDocumentHandler" text="%main.menuitem.new"> <accelerator> <KeyCodeCombination alt="UP" code="N" control="UP" meta="UP" shift="UP" shortcut="DOWN" /> </accelerator> </MenuItem> <Menu fx:id="recentOpenMenu" mnemonicParsing="false" text="%main.menuitem.recentFiles" /> - <MenuItem mnemonicParsing="false" onAction="#openDocumentHandler" text="%main.menuitem.project"> + <MenuItem fx:id="openProjectMenuItem" mnemonicParsing="false" onAction="#openDocumentHandler" text="%main.menuitem.project"> <accelerator> <KeyCodeCombination alt="UP" code="O" control="UP" meta="UP" shift="UP" shortcut="DOWN" /> </accelerator> </MenuItem> - <MenuItem fx:id="saveMenuItem" mnemonicParsing="false" onAction="#saveMenuHandler" text="%main.menuitem.save"> + <MenuItem fx:id="saveProjectMenuItem" mnemonicParsing="false" onAction="#saveMenuHandler" text="%main.menuitem.save"> <accelerator> <KeyCodeCombination alt="UP" code="S" control="UP" meta="UP" shift="UP" shortcut="DOWN" /> </accelerator> @@ -31,7 +31,7 @@ <SeparatorMenuItem mnemonicParsing="false" /> <MenuItem fx:id="profileMenu" mnemonicParsing="false" onAction="#profileMenuHandler" text="%main.menuitem.profile" /> <SeparatorMenuItem mnemonicParsing="false" /> - <MenuItem mnemonicParsing="false" onAction="#printMenuHandler" text="%main.menuitem.print"> + <MenuItem fx:id="printProjectMenuItem" mnemonicParsing="false" onAction="#printMenuHandler" text="%main.menuitem.print"> <accelerator> <KeyCodeCombination alt="UP" code="P" control="UP" meta="UP" shift="UP" shortcut="DOWN" /> </accelerator></MenuItem> @@ -50,13 +50,18 @@ </accelerator> </MenuItem> <SeparatorMenuItem mnemonicParsing="false" /> - <MenuItem mnemonicParsing="false" onAction="#pluginMenuItemHandler" text="%main.menuitem.plugins" /> + <MenuItem fx:id="pluginMenu" mnemonicParsing="false" onAction="#pluginMenuItemHandler" text="%main.menuitem.plugins" /> <SeparatorMenuItem mnemonicParsing="false" /> <MenuItem fx:id="settingsMenuItem" mnemonicParsing="false" onAction="#settingsHandler" text="%main.menuitem.settings"> <accelerator> <KeyCodeCombination alt="UP" code="COMMA" control="UP" meta="UP" shift="UP" shortcut="DOWN" /> </accelerator> </MenuItem> + <MenuItem fx:id="globalSettingsMenuItem" mnemonicParsing="false" onAction="#globalSettingsHandler" text="%main.menuitem.globalsettings"> + <accelerator> + <KeyCodeCombination alt="UP" code="COMMA" control="UP" meta="UP" shift="DOWN" shortcut="DOWN" /> + </accelerator> + </MenuItem> </items> </Menu> <Menu mnemonicParsing="false" text="%main.menu.view"> diff --git a/PlayWall/assets/de/tobias/playpad/assets/view/option/global/globalSettingsView.fxml b/PlayWall/assets/de/tobias/playpad/assets/view/option/global/globalSettingsView.fxml new file mode 100644 index 0000000000000000000000000000000000000000..23efae52a75f75d6b931db277299917bba3eea67 --- /dev/null +++ b/PlayWall/assets/de/tobias/playpad/assets/view/option/global/globalSettingsView.fxml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.*?> +<?import javafx.scene.control.*?> +<?import java.lang.*?> +<?import javafx.scene.layout.*?> + +<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="592.0" prefWidth="645.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> + <children> + <TabPane fx:id="tabPane" prefHeight="348.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="52.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> + <Button fx:id="finishButton" layoutX="508.0" layoutY="360.0" mnemonicParsing="false" onAction="#finishButtonHandler" text="%settings.button.finish" AnchorPane.bottomAnchor="14.0" AnchorPane.rightAnchor="14.0" /> + </children> +</AnchorPane> diff --git a/PlayWall/assets/de/tobias/playpad/assets/view/option/global/keysTab.fxml b/PlayWall/assets/de/tobias/playpad/assets/view/option/global/keysTab.fxml new file mode 100644 index 0000000000000000000000000000000000000000..5c068743d7c8ad9398c6d8c470e8fa42fdf169a1 --- /dev/null +++ b/PlayWall/assets/de/tobias/playpad/assets/view/option/global/keysTab.fxml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.*?> +<?import javafx.scene.control.*?> +<?import java.lang.*?> +<?import javafx.scene.layout.*?> + +<VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" spacing="14.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> + <children> + <Label text="%settings.keys.label.headline" underline="true" /> + <TextField fx:id="searchTextField" promptText="%settings.keys.textfieldsearch" /> + <TableView fx:id="table" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS"> + <columns> + <TableColumn fx:id="nameTableColumn" editable="false" prefWidth="378.0" text="%settings.keys.table.name" /> + <TableColumn fx:id="shortcutTableColumn" editable="false" minWidth="0.0" prefWidth="139.0" text="%settings.keys.table.shortcut" /> + </columns> + </TableView> + <Separator prefWidth="200.0" /> + <HBox spacing="14.0"> + <children> + <Label alignment="CENTER_RIGHT" prefWidth="150.0" text="%settings.keys.label.name" /> + <Label fx:id="nameLabel" prefWidth="100.0" /> + </children> + </HBox> + <HBox alignment="CENTER_LEFT" spacing="14.0"> + <children> + <Label alignment="CENTER_RIGHT" prefWidth="150.0" text="%settings.keys.label.shortcut" /> + <Label fx:id="shortcutLabel" prefWidth="100.0" /> + <Button fx:id="newShortcutButton" mnemonicParsing="false" onAction="#newShortcutButtonHandler" text="%settings.keys.button.change" /> + </children> + </HBox> + </children> + <padding> + <Insets bottom="14.0" left="14.0" right="14.0" top="14.0" /> + </padding> +</VBox> diff --git a/PlayWall/assets/de/tobias/playpad/assets/view/option/updateTab.fxml b/PlayWall/assets/de/tobias/playpad/assets/view/option/global/updateTab.fxml similarity index 100% rename from PlayWall/assets/de/tobias/playpad/assets/view/option/updateTab.fxml rename to PlayWall/assets/de/tobias/playpad/assets/view/option/global/updateTab.fxml diff --git a/PlayWall/assets/de/tobias/playpad/assets/view/option/midiTab_old.fxml b/PlayWall/assets/de/tobias/playpad/assets/view/option/midiTab_old.fxml deleted file mode 100644 index 5923d8e0a7b57dd5fb8b9142528faf0ad80c962b..0000000000000000000000000000000000000000 --- a/PlayWall/assets/de/tobias/playpad/assets/view/option/midiTab_old.fxml +++ /dev/null @@ -1,58 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<?import javafx.scene.control.*?> -<?import java.lang.*?> -<?import javafx.scene.layout.*?> - -<AnchorPane fx:id="rootPane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> - <children> - <HBox layoutX="34.0" layoutY="34.0" prefHeight="67.0" prefWidth="523.0" spacing="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> - <children> - <VBox alignment="CENTER_RIGHT" layoutX="9.0" layoutY="19.0" prefHeight="67.0" spacing="25.0" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="14.0"> - <children> - <Label layoutX="9.0" layoutY="19.0" text="%settings.midi.label.device" /> - <Label layoutX="11.0" layoutY="51.0" text="%settings.midi.label.preset" /> - </children> - </VBox> - <VBox layoutX="127.0" layoutY="14.0" maxWidth="1.7976931348623157E308" spacing="14.0" HBox.hgrow="ALWAYS"> - <children> - <HBox alignment="CENTER_LEFT" layoutX="127.0" layoutY="14.0" maxWidth="1.7976931348623157E308" spacing="14.0" AnchorPane.leftAnchor="127.0" AnchorPane.rightAnchor="121.0" VBox.vgrow="ALWAYS"> - <children> - <ComboBox fx:id="deviceComboBox" onAction="#deviceHandler" prefWidth="150.0" /> - <Pane HBox.hgrow="ALWAYS" /> - <CheckBox fx:id="midiActiveCheckBox" mnemonicParsing="false" text="%settings.checkbox.activate" /> - </children> - </HBox> - <HBox layoutX="127.0" layoutY="47.0" maxWidth="1.7976931348623157E308" spacing="14.0" VBox.vgrow="ALWAYS"> - <children> - <ComboBox fx:id="presetsList" layoutX="127.0" layoutY="47.0" prefWidth="150.0" /> - <Button fx:id="presetsEditButton" layoutX="304.0" layoutY="47.0" mnemonicParsing="false" onAction="#presetsEditButtonHandler" text="%settings.midi.presetEdit" /> - <Button fx:id="activateButton" mnemonicParsing="false" onAction="#activateButtonHandler" text="%settings.midi.button.activate" /> - </children> - </HBox> - </children> - </VBox> - </children> - </HBox> - <TreeView fx:id="contentTreeView" prefHeight="375.0" prefWidth="300.0" AnchorPane.bottomAnchor="135.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="90.0" /> - <ComboBox fx:id="midiActionTypeComboBox" layoutX="312.0" layoutY="90.0" prefWidth="264.0" AnchorPane.leftAnchor="314.0" /> - <AnchorPane fx:id="settingsAnchorPane" layoutX="306.0" layoutY="133.0" prefHeight="467.0" prefWidth="300.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="300.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="133.0" /> - <HBox layoutX="14.0" layoutY="534.0" prefHeight="52.0" prefWidth="281.0" spacing="14.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0"> - <children> - <VBox spacing="14.0"> - <children> - <Button fx:id="addMidiButton" defaultButton="true" layoutX="14.0" layoutY="319.0" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#addMidiButtonHandler" text="%settings.midi.button.add" AnchorPane.bottomAnchor="56.0" AnchorPane.leftAnchor="14.0" /> - <Button fx:id="addMidiDraftButton" layoutX="14.0" layoutY="354.0" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#addMidiDraftButtonHandler" text="%settings.midi.button.addDraft" AnchorPane.bottomAnchor="21.0" AnchorPane.leftAnchor="14.0" /> - <Button fx:id="draftButton" mnemonicParsing="false" onAction="#draftButtonHandler" text="%settings.midi.button.saveDraft" /> - </children> - </VBox> - <VBox spacing="14.0"> - <children> - <Button fx:id="deleteMidiButton" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#deleteMidiButtonHandler" text="%settings.midi.button.delete" /> - <Button fx:id="clearMidiButton" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#clearMidiButtonHandler" prefHeight="26.0" prefWidth="68.0" text="%settings.midi.button.clear" /> - </children> - </VBox> - </children> - </HBox> - </children> -</AnchorPane> diff --git a/PlayWall/src/de/tobias/playpad/PlayPadImpl.java b/PlayWall/src/de/tobias/playpad/PlayPadImpl.java index d0a1828b92e8afb6a25a687366ca9812330e371b..1cf6ca0f90831a209b82a4a49d45ff105d4cd13d 100644 --- a/PlayWall/src/de/tobias/playpad/PlayPadImpl.java +++ b/PlayWall/src/de/tobias/playpad/PlayPadImpl.java @@ -18,10 +18,11 @@ import de.tobias.playpad.plugin.PadListener; import de.tobias.playpad.plugin.SettingsListener; import de.tobias.playpad.plugin.WindowListener; import de.tobias.playpad.project.Project; +import de.tobias.playpad.settings.GlobalSettings; import de.tobias.playpad.viewcontroller.IPadSettingsViewController; -import de.tobias.playpad.viewcontroller.ISettingsViewController; import de.tobias.playpad.viewcontroller.main.IMainViewController; import de.tobias.playpad.viewcontroller.main.MainViewControllerV2; +import de.tobias.playpad.viewcontroller.option.ISettingsViewController; import de.tobias.utils.application.ApplicationUtils; import de.tobias.utils.application.container.PathType; import de.tobias.utils.util.Worker; @@ -44,10 +45,13 @@ public class PlayPadImpl implements PlayPad { private MainViewControllerV2 mainViewController; private Project currentProject; + protected GlobalSettings globalSettings; - public PlayPadImpl() { + public PlayPadImpl(GlobalSettings globalSettings) { pluginManager = PluginManagerFactory.createPluginManager(); deletedPlugins = new HashSet<>(); + + this.globalSettings = globalSettings; } @Override @@ -161,6 +165,11 @@ public class PlayPadImpl implements PlayPad { pluginManager.addPluginsFrom(uri); } + @Override + public GlobalSettings getGlobalSettings() { + return globalSettings; + } + public void openProject(Project project) { if (mainViewController == null) { mainViewController = new MainViewControllerV2(mainViewListeners); diff --git a/PlayWall/src/de/tobias/playpad/PlayPadMain.java b/PlayWall/src/de/tobias/playpad/PlayPadMain.java index 861720fe69d7cdf2a31cd6094a7d381bb4190d64..db41cdcf63dc2209d4430172e69b3ee19a0434b7 100644 --- a/PlayWall/src/de/tobias/playpad/PlayPadMain.java +++ b/PlayWall/src/de/tobias/playpad/PlayPadMain.java @@ -21,8 +21,7 @@ import de.tobias.playpad.midi.device.PD12; import de.tobias.playpad.project.Project; import de.tobias.playpad.project.ProjectReference; import de.tobias.playpad.registry.NoSuchComponentException; -import de.tobias.playpad.settings.Profile; -import de.tobias.playpad.settings.ProfileListener; +import de.tobias.playpad.settings.GlobalSettings; import de.tobias.playpad.settings.ProfileReference; import de.tobias.playpad.update.PlayPadUpdater; import de.tobias.playpad.update.UpdateRegistery; @@ -73,7 +72,7 @@ import javafx.stage.Stage; // FEATURE lnk für Windows mit Dateiparameter // FEATURE Backups irgendwann löschen -public class PlayPadMain extends Application implements LocalizationDelegate, ProfileListener { +public class PlayPadMain extends Application implements LocalizationDelegate { private static final String iconPath = "icon_small.png"; public static Optional<Image> stageIcon = Optional.empty(); @@ -110,7 +109,12 @@ public class PlayPadMain extends Application implements LocalizationDelegate, Pr @Override public void init() throws Exception { - impl = new PlayPadImpl(); + App app = ApplicationUtils.getApplication(); + + Path globalSettingsPath = app.getPath(PathType.CONFIGURATION, "GlobalSettings.yml"); + GlobalSettings globalSettings = GlobalSettings.load(globalSettingsPath); + + impl = new PlayPadImpl(globalSettings); PlayPadPlugin.setImplementation(impl); PlayPadPlugin.setRegistryCollection(new RegistryCollectionImpl()); @@ -118,9 +122,9 @@ public class PlayPadMain extends Application implements LocalizationDelegate, Pr setupLocalization(); // Console - if (!ApplicationUtils.getApplication().isDebug()) { - System.setOut(ConsoleUtils.streamToFile(ApplicationUtils.getApplication().getPath(PathType.LOG, "out.log"))); - System.setErr(ConsoleUtils.streamToFile(ApplicationUtils.getApplication().getPath(PathType.LOG, "err.log"))); + if (!app.isDebug()) { + System.setOut(ConsoleUtils.streamToFile(app.getPath(PathType.LOG, "out.log"))); + System.setErr(ConsoleUtils.streamToFile(app.getPath(PathType.LOG, "err.log"))); } } @@ -131,8 +135,7 @@ public class PlayPadMain extends Application implements LocalizationDelegate, Pr try { Image stageIcon = new Image(iconPath); PlayPadMain.stageIcon = Optional.of(stageIcon); - } catch (Exception e) { - } + } catch (Exception e) {} /* * Setup @@ -167,16 +170,46 @@ public class PlayPadMain extends Application implements LocalizationDelegate, Pr } ViewController.create(LaunchDialog.class, stage); + + // Check Updates + checkUpdates(impl.globalSettings); + } catch (Exception e) { e.printStackTrace(); } } + private void checkUpdates(GlobalSettings globalSettings) { + if (globalSettings.isAutoUpdate()) { + Worker.runLater(() -> + { + UpdateRegistery.lookupUpdates(globalSettings.getUpdateChannel()); + if (!UpdateRegistery.getAvailableUpdates().isEmpty()) { + Platform.runLater(() -> + { + Alert alert = new Alert(AlertType.CONFIRMATION); + alert.setHeaderText(Localization.getString(Strings.UI_Dialog_AutoUpdate_Header)); + alert.setContentText(Localization.getString(Strings.UI_Dialog_AutoUpdate_Content)); + alert.showAndWait().filter(item -> item == ButtonType.OK).ifPresent(result -> + { + try { + Updates.startUpdate(); + } catch (IOException e) { + e.printStackTrace(); + } + }); + }); + } + }); + } + } + @Override public void stop() throws Exception { try { ProfileReference.saveProfiles(); ProjectReference.saveProjects(); + impl.getGlobalSettings().save(); } catch (Exception e) { e.printStackTrace(); // Speichern Fehler } @@ -196,8 +229,6 @@ public class PlayPadMain extends Application implements LocalizationDelegate, Pr // Midi DeviceRegistry.getFactoryInstance().registerDevice(PD12.NAME, PD12.class); - Profile.registerListener(this); - try { // Load Components RegistryCollection registryCollection = PlayPadPlugin.getRegistryCollection(); @@ -219,6 +250,10 @@ public class PlayPadMain extends Application implements LocalizationDelegate, Pr e.printStackTrace(); } + // Key Bindings + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + globalSettings.getKeyCollection().loadDefaultFromFile("de/tobias/playpad/components/Keys.xml", uiResourceBundle); + // Mapper MapperRegistry.setOverviewViewController(new MapperOverviewViewController()); } @@ -238,36 +273,6 @@ public class PlayPadMain extends Application implements LocalizationDelegate, Pr uiResourceBundle = Localization.loadBundle("de/tobias/playpad/assets/lang/ui", getClass().getClassLoader()); } - /** - * Handle Auto Update on profile reload - */ - @Override - public void reloadSettings(Profile oldProfile, Profile newProfile) { - // Update PlayWall - if (newProfile.getProfileSettings().isAutoUpdate()) { - Worker.runLater(() -> - { - UpdateRegistery.lookupUpdates(newProfile.getProfileSettings().getUpdateChannel()); - if (!UpdateRegistery.getAvailableUpdates().isEmpty()) { - Platform.runLater(() -> - { - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setHeaderText(Localization.getString(Strings.UI_Dialog_AutoUpdate_Header)); - alert.setContentText(Localization.getString(Strings.UI_Dialog_AutoUpdate_Content)); - alert.showAndWait().filter(item -> item == ButtonType.OK).ifPresent(result -> - { - try { - Updates.startUpdate(); - } catch (IOException e) { - e.printStackTrace(); - } - }); - }); - } - }); - } - } - @Override public String getBaseResource() { return "de/tobias/playpad/assets/lang/"; diff --git a/PlayWall/src/de/tobias/playpad/Strings.java b/PlayWall/src/de/tobias/playpad/Strings.java index 57939d09a2c2bce4bdf1d6224442c71a52bc7070..7234c38e9af7f4ac4488865c2033ee586f12a52b 100644 --- a/PlayWall/src/de/tobias/playpad/Strings.java +++ b/PlayWall/src/de/tobias/playpad/Strings.java @@ -21,6 +21,7 @@ public class Strings { public static final String UI_Window_Main_Title = "UI.Window.Main.Title"; public static final String UI_Window_Changelog_Title = "UI.Window.Changelog.Title"; public static final String UI_Window_Settings_Title = "UI.Window.Settings.Title"; + public static final String UI_Window_GlobalSettings_Title = "UI.Window.GlobalSettings.Title"; public static final String UI_Window_PadSettings_Title = "UI.Window.PadSettings.Title"; public static final String UI_Window_PadSettings_Title_Empty = "UI.Window.PadSettings.Title.Empty"; public static final String UI_Dialog_DragAndDrop_Title = "UI.Dialog.DragAndDrop.Title"; @@ -167,6 +168,10 @@ public class Strings { // Info - Mapper public static final String Info_Mapper_PressKey = "Info.Mapper.PressKey"; + // UI - Settings - Aler + + public static final String UI_Settings_Alert_NewKeyShortcut_Text = "UI.Settings.Alert.NewKeyShortcut.Text"; + // UI - Window - PadSettings public static final String UI_Window_PadSettings_General_Title = "UI.Window.PadSettings.General.Title"; public static final String UI_Window_PadSettings_Player_Title = "UI.Window.PadSettings.Player.Title"; diff --git a/PlayWall/src/de/tobias/playpad/components/Keys.xml b/PlayWall/src/de/tobias/playpad/components/Keys.xml new file mode 100644 index 0000000000000000000000000000000000000000..e874f5b9c11597c4fa3517008958ac6d867cba9b --- /dev/null +++ b/PlayWall/src/de/tobias/playpad/components/Keys.xml @@ -0,0 +1,32 @@ +<Keys> + <Windows> + <Key id="new_proj" name="main.menuitem.new" key="N" ctrl="true" alt="false" meta="false" shift="false"/> + <Key id="open_proj" name="main.menuitem.project" key="O" ctrl="true" alt="false" meta="false" shift="false"/> + <Key id="save_proj" name="main.menuitem.save" key="S" ctrl="true" alt="false" meta="false" shift="false"/> + <Key id="print_proj" name="main.menuitem.print" key="P" ctrl="true" alt="false" meta="false" shift="false"/> + + <Key id="dnd" name="main.menuitem.dnd" key="M" ctrl="true" alt="false" meta="false" shift="false"/> + <Key id="errors" name="main.menuitem.errors" key="E" ctrl="true" alt="false" meta="false" shift="false"/> + <Key id="plugins" name="main.menuitem.plugins"/> + <Key id="profile_settings" name="main.menuitem.settings" key="," ctrl="true" alt="false" meta="false" shift="false"/> + <Key id="global_settings" name="main.menuitem.globalsettings" key="," ctrl="true" alt="false" meta="false" shift="true"/> + + <Key id="window_top" name="main.menuitem.onTop"/> + <Key id="window_fullscreen" name="main.menuitem.fullScreen" key="F" ctrl="true" alt="false" meta="false" shift="true"/> + </Windows> + <Mac> + <Key id="new_proj" name="main.menuitem.new" key="N" ctrl="false" alt="false" meta="true" shift="false"/> + <Key id="open_proj" name="main.menuitem.project" key="O" ctrl="false" alt="false" meta="true" shift="false"/> + <Key id="save_proj" name="main.menuitem.save" key="S" ctrl="false" alt="false" meta="true" shift="false"/> + <Key id="print_proj" name="main.menuitem.print" key="P" ctrl="false" alt="false" meta="true" shift="false"/> + + <Key id="dnd" name="main.menuitem.dnd" key="M" ctrl="false" alt="false" meta="true" shift="false"/> + <Key id="errors" name="main.menuitem.errors" key="E" ctrl="false" alt="false" meta="true" shift="false"/> + <Key id="plugins" name="main.menuitem.plugins"/> + <Key id="profile_settings" name="main.menuitem.settings" key="," ctrl="false" alt="false" meta="true" shift="false"/> + <Key id="global_settings" name="main.menuitem.globalsettings" key="," ctrl="false" alt="false" meta="true" shift="true"/> + + <Key id="window_top" name="main.menuitem.onTop"/> + <Key id="window_fullscreen" name="main.menuitem.fullScreen" key="F" ctrl="false" alt="false" meta="true" shift="true"/> + </Mac> +</Keys> \ No newline at end of file diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java index 94adf0b7a44dbc70bbe7a16caa25e75e4279f9fd..1abb14457d876c41953cac103adcefd82aab0b82 100644 --- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java +++ b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java @@ -17,12 +17,13 @@ import de.tobias.playpad.project.ProjectNotFoundException; import de.tobias.playpad.project.ProjectReference; import de.tobias.playpad.registry.NoSuchComponentException; import de.tobias.playpad.registry.Registry; +import de.tobias.playpad.settings.GlobalSettings; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileNotFoundException; import de.tobias.playpad.settings.ProfileSettings; +import de.tobias.playpad.settings.keys.KeyCollection; import de.tobias.playpad.view.main.MainLayoutConnect; import de.tobias.playpad.view.main.MenuType; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.dialog.ImportDialog; import de.tobias.playpad.viewcontroller.dialog.NewProjectDialog; import de.tobias.playpad.viewcontroller.dialog.PluginViewController; @@ -31,7 +32,10 @@ import de.tobias.playpad.viewcontroller.dialog.ProfileViewController; import de.tobias.playpad.viewcontroller.dialog.ProjectManagerDialog; import de.tobias.playpad.viewcontroller.main.BasicMenuToolbarViewController; import de.tobias.playpad.viewcontroller.main.IMainViewController; +import de.tobias.playpad.viewcontroller.option.GlobalSettingsTabViewController; +import de.tobias.playpad.viewcontroller.option.SettingsTabViewController; import de.tobias.playpad.viewcontroller.option.SettingsViewController; +import de.tobias.playpad.viewcontroller.option.global.GlobalSettingsViewController; import de.tobias.playpad.viewcontroller.pad.PadDragListener; import de.tobias.utils.application.ApplicationInfo; import de.tobias.utils.application.ApplicationUtils; @@ -65,14 +69,21 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro // meuBar @FXML protected MenuBar menuBar; - @FXML protected MenuItem saveMenuItem; + @FXML protected MenuItem newProjectMenuItem; + @FXML protected MenuItem openProjectMenuItem; + @FXML protected MenuItem saveProjectMenuItem; @FXML protected MenuItem profileMenu; + @FXML protected MenuItem printProjectMenuItem; + @FXML protected CheckMenuItem dndModeMenuItem; @FXML protected MenuItem errorMenu; + @FXML protected MenuItem pluginMenu; @FXML protected MenuItem settingsMenuItem; - @FXML protected CheckMenuItem dndModeMenuItem; + @FXML protected MenuItem globalSettingsMenuItem; + @FXML protected CheckMenuItem fullScreenMenuItem; @FXML protected CheckMenuItem alwaysOnTopItem; + @FXML protected Menu layoutMenu; @FXML protected Menu extensionMenu; @@ -81,6 +92,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro private IMainViewController mainViewController; private SettingsViewController settingsViewController; + private GlobalSettingsViewController globalSettingsViewController; public DesktopMenuToolbarViewController(IMainViewController controller) { super("header", "de/tobias/playpad/assets/view/main/desktop/", PlayPadMain.getUiResourceBundle(), controller); @@ -151,6 +163,23 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro } } + @Override + public void loadKeybinding(KeyCollection keys) { + newProjectMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("new_proj").getKeyCode())); + openProjectMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("open_proj").getKeyCode())); + saveProjectMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("save_proj").getKeyCode())); + printProjectMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("print_proj").getKeyCode())); + + dndModeMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("dnd").getKeyCode())); + errorMenu.setAccelerator(KeyCombination.valueOf(keys.getKey("errors").getKeyCode())); + pluginMenu.setAccelerator(KeyCombination.valueOf(keys.getKey("plugins").getKeyCode())); + settingsMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("profile_settings").getKeyCode())); + globalSettingsMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("global_settings").getKeyCode())); + + fullScreenMenuItem.setAccelerator(KeyCombination.valueOf(keys.getKey("window_fullscreen").getKeyCode())); + alwaysOnTopItem.setAccelerator(KeyCombination.valueOf(keys.getKey("window_top").getKeyCode())); + } + @Override public void setLocked(boolean looked) { dndModeMenuItem.setDisable(looked); @@ -246,7 +275,6 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro } // EventHandler - // Basic Event Handler @FXML void newDocumentHandler(ActionEvent event) { doAction(() -> @@ -385,7 +413,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro if (settingsViewController == null) { Stage mainStage = mainViewController.getStage(); - settingsViewController = new SettingsViewController(midi, mainViewController.getScreen(), mainStage, currentProject, () -> + Runnable onFinish = () -> { midi.setListener(mainViewController.getMidiHandler()); @@ -403,13 +431,41 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro settingsViewController = null; mainStage.toFront(); - }); + }; + + settingsViewController = new SettingsViewController(midi, mainViewController.getScreen(), mainStage, currentProject, onFinish); settingsViewController.getStage().show(); } else if (settingsViewController.getStage().isShowing()) { settingsViewController.getStage().toFront(); } + } + @FXML + void globalSettingsHandler(ActionEvent event) { + if (globalSettingsViewController == null) { + + Stage mainStage = mainViewController.getStage(); + Runnable onFinish = () -> + { + Project currentProject = PlayPadMain.getProgramInstance().getCurrentProject(); + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + + for (GlobalSettingsTabViewController controller : globalSettingsViewController.getTabs()) { + if (controller.needReload()) { + controller.reload(globalSettings, currentProject, mainViewController); + } + } + + globalSettingsViewController = null; + mainStage.toFront(); + }; + + globalSettingsViewController = new GlobalSettingsViewController(mainStage, onFinish); + globalSettingsViewController.getStage().show(); + } else { + globalSettingsViewController.getStage().toFront(); + } } @FXML diff --git a/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java b/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java index 34f32b4c40276eafa94da850f641ea32d2a45909..3e463aeb64931b9edbc97607f127bcfea036426f 100644 --- a/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java +++ b/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java @@ -5,10 +5,12 @@ import de.tobias.playpad.PlayPadPlugin; import de.tobias.playpad.Strings; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileSettings; +import de.tobias.playpad.settings.keys.KeyCollection; import de.tobias.playpad.view.main.MainLayoutConnect; import de.tobias.playpad.view.main.MenuType; import de.tobias.playpad.viewcontroller.main.BasicMenuToolbarViewController; import de.tobias.playpad.viewcontroller.main.IMainViewController; +import de.tobias.utils.ui.icon.FontIcon; import de.tobias.utils.util.Localization; import javafx.event.ActionEvent; import javafx.fxml.FXML; @@ -18,7 +20,6 @@ import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Label; import javafx.scene.control.MenuItem; import javafx.scene.control.Slider; -import javafx.scene.image.Image; public class TouchMenuToolbarViewController extends BasicMenuToolbarViewController { @@ -38,8 +39,14 @@ public class TouchMenuToolbarViewController extends BasicMenuToolbarViewControll toolbarHBox.prefHeightProperty().bind(toolbar.minHeightProperty()); showLiveInfo(false); - } - + + // Schriftgröße Icons + FontIcon icon = (FontIcon) volumeDownLabel.getGraphic(); + icon.setSize(35); + icon = (FontIcon) volumeUpLabel.getGraphic(); + icon.setSize(35); + } + @Override public void initPageButtons() { pageHBox.getChildren().clear(); @@ -56,9 +63,12 @@ public class TouchMenuToolbarViewController extends BasicMenuToolbarViewControll } @Override - public void setLocked(boolean looked) { - + public void loadKeybinding(KeyCollection keys) { + } + + @Override + public void setLocked(boolean looked) {} @Override public void setAlwaysOnTopActive(boolean alwaysOnTopActive) { diff --git a/PlayWall/src/de/tobias/playpad/pad/content/AudioContentConnect.java b/PlayWall/src/de/tobias/playpad/pad/content/AudioContentConnect.java index c111f13bee8d9a7c49f937d741697f31363270c2..61451e4075039196f109511cb713ba93be7a075d 100644 --- a/PlayWall/src/de/tobias/playpad/pad/content/AudioContentConnect.java +++ b/PlayWall/src/de/tobias/playpad/pad/content/AudioContentConnect.java @@ -5,8 +5,8 @@ import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.conntent.PadContent; import de.tobias.playpad.pad.conntent.PadContentConnect; import de.tobias.playpad.pad.view.IPadContentView; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.option.AudioTabViewController; +import de.tobias.playpad.viewcontroller.option.SettingsTabViewController; import de.tobias.utils.ui.icon.FontAwesomeType; import de.tobias.utils.ui.icon.FontIcon; import de.tobias.utils.util.Localization; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/dialog/PluginViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/dialog/PluginViewController.java index dbe7f9aefae577b2c99d0e62bc95747d84c760df..42341a2c4ebd3b53e96a89c1f079945e4337f675 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/dialog/PluginViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/dialog/PluginViewController.java @@ -8,9 +8,11 @@ import org.bukkit.configuration.MemorySection; import de.tobias.playpad.AppUserInfoStrings; import de.tobias.playpad.PlayPadMain; +import de.tobias.playpad.PlayPadPlugin; import de.tobias.playpad.Strings; import de.tobias.playpad.plugin.Plugin; import de.tobias.playpad.plugin.Plugins; +import de.tobias.playpad.settings.GlobalSettings; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.update.UpdateChannel; import de.tobias.playpad.viewcontroller.cell.PluginCell; @@ -44,9 +46,10 @@ public class PluginViewController extends ViewController { try { String pluginInfoURL = null; - MemorySection userInfo = ApplicationUtils.getApplication().getInfo().getUserInfo(); - UpdateChannel updateChannel = Profile.currentProfile().getProfileSettings().getUpdateChannel(); + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + UpdateChannel updateChannel = globalSettings.getUpdateChannel(); + MemorySection userInfo = ApplicationUtils.getApplication().getInfo().getUserInfo(); if (updateChannel == UpdateChannel.STABLE) { pluginInfoURL = userInfo.getString(AppUserInfoStrings.PLUGINS_URL_STABLE); } else if (updateChannel == UpdateChannel.BETA) { diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java index ef839e189a4f7c97131584c9d3f38e30c093ecb5..51e2c9ffe6cdb931fb08bf9a10c41d2ebdfd493f 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java @@ -23,9 +23,11 @@ import de.tobias.playpad.plugin.WindowListener; import de.tobias.playpad.project.Project; import de.tobias.playpad.registry.DefaultRegistry; import de.tobias.playpad.registry.NoSuchComponentException; +import de.tobias.playpad.settings.GlobalSettings; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileListener; import de.tobias.playpad.settings.ProfileSettings; +import de.tobias.playpad.settings.keys.KeyCollection; import de.tobias.playpad.view.main.MainLayoutConnect; import de.tobias.playpad.view.main.MainLayoutHandler; import de.tobias.playpad.viewcontroller.pad.PadDragListener; @@ -193,7 +195,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon ProfileSettings settings = Profile.currentProfile().getProfileSettings(); if (menuToolbarViewController != null) { - menuToolbarViewController.deinit(); + // menuToolbarViewController.deinit(); menuToolbarViewController.getVolumeSlider().valueProperty().unbindBidirectional(settings.volumeProperty()); menuToolbarViewController.getVolumeSlider().valueProperty().removeListener(volumeChangeListener); @@ -215,6 +217,10 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon menuToolbarViewController.getVolumeSlider().valueProperty().bindBidirectional(settings.volumeProperty()); menuToolbarViewController.getVolumeSlider().valueProperty().addListener(volumeChangeListener); + // Keyboard Shortcuts + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + menuToolbarViewController.loadKeybinding(globalSettings.getKeyCollection()); + createPadViews(); showPage(currentPageShowing); @@ -512,8 +518,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon { try { Thread.sleep(PlayPadMain.displayTimeMillis * 2); - } catch (Exception e) { - } + } catch (Exception e) {} Platform.runLater(() -> { if (menuToolbarViewController != null) @@ -587,6 +592,13 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon } } + @Override + public void loadKeybinding(KeyCollection keys) { + if (menuToolbarViewController != null) { + menuToolbarViewController.loadKeybinding(keys); + } + } + @Override public void setGridColor(Color color) { this.gridColor = color; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/AudioTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/AudioTabViewController.java index 2bcf1adfeadcc7c8dae598ebab78031c6bfee1a0..f27e3ae3f111bdacd6c81be80a23c357d9bbea38 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/AudioTabViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/AudioTabViewController.java @@ -9,7 +9,6 @@ import de.tobias.playpad.registry.NoSuchComponentException; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileSettings; import de.tobias.playpad.viewcontroller.AudioTypeViewController; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.main.IMainViewController; import de.tobias.utils.util.Localization; import de.tobias.utils.util.Worker; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/DesignTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/DesignTabViewController.java index 5f5370b232bb22aa79b8d5a58456a1cf47431853..e466e4a0a3ad2cccae08cfe66505302c711abda1 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/DesignTabViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/DesignTabViewController.java @@ -9,7 +9,6 @@ import de.tobias.playpad.project.Project; import de.tobias.playpad.registry.NoSuchComponentException; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.viewcontroller.GlobalDesignViewController; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.cell.DisplayableCell; import de.tobias.playpad.viewcontroller.main.IMainViewController; import de.tobias.utils.util.Localization; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/GeneralTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/GeneralTabViewController.java index 2dde64d74fb173af212708537f4779fc61e09a91..594a1e1f2711d6eb8fa45eb17aa1bb703ee17b82 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/GeneralTabViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/GeneralTabViewController.java @@ -13,7 +13,6 @@ import de.tobias.playpad.design.GlobalDesign; import de.tobias.playpad.project.Project; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileSettings; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.main.IMainViewController; import de.tobias.utils.application.ApplicationUtils; import de.tobias.utils.application.container.PathType; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java index 5d07685f255278a9352ccee1173c36ccb8277de0..3f86e36edf496c79165ed322e412d9dbd43572fb 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java @@ -18,7 +18,6 @@ import de.tobias.playpad.registry.NoSuchComponentException; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.viewcontroller.IMapperOverviewViewController; import de.tobias.playpad.viewcontroller.IMappingTabViewController; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.cell.DisplayableCell; import de.tobias.playpad.viewcontroller.cell.DisplayableTreeCell; import de.tobias.playpad.viewcontroller.dialog.MappingListViewController; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/MidiTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/MidiTabViewController.java index 0c6e45c2e1c371685cd8d0ba349f51a78f3eaddb..b6eb72a750fde0fd5b4fbb599ed3ccfe67711c9e 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/MidiTabViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/MidiTabViewController.java @@ -9,7 +9,6 @@ import de.tobias.playpad.midi.Midi; import de.tobias.playpad.project.Project; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileSettings; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.main.IMainViewController; import de.tobias.utils.util.Localization; import javafx.event.ActionEvent; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/PlayerTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/PlayerTabViewController.java index 94713e8a15dba9fae93ac619173bdf5eebfd416a..a8545938921566807f10785031e530859889eea5 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/PlayerTabViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/PlayerTabViewController.java @@ -6,7 +6,6 @@ import de.tobias.playpad.pad.TimeMode; import de.tobias.playpad.project.Project; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileSettings; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.cell.EnumCell; import de.tobias.playpad.viewcontroller.main.IMainViewController; import de.tobias.playpad.viewcontroller.settings.FadeViewController; diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/SettingsViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/SettingsViewController.java index 11755e500c8f8d62fd5f374ee1083897f53fc7f2..642c15a2d220e67884f10b7ba66537db2a27ea31 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/SettingsViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/SettingsViewController.java @@ -12,8 +12,6 @@ import de.tobias.playpad.project.Project; import de.tobias.playpad.registry.NoSuchComponentException; import de.tobias.playpad.settings.Profile; import de.tobias.playpad.settings.ProfileSettings; -import de.tobias.playpad.viewcontroller.ISettingsViewController; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.utils.ui.ViewController; import de.tobias.utils.ui.icon.FontAwesomeType; import de.tobias.utils.ui.icon.FontIcon; @@ -64,8 +62,6 @@ public class SettingsViewController extends ViewController implements ISettingsV } } - addTab(new UpdateTabViewController()); - getStage().initOwner(owner); // Show Current Settings @@ -159,7 +155,8 @@ public class SettingsViewController extends ViewController implements ISettingsV } saveTabs(); - onFinish.run(); // Reload MainViewController Settings + if (onFinish != null) + onFinish.run(); // Reload MainViewController Settings return true; } @@ -173,6 +170,7 @@ public class SettingsViewController extends ViewController implements ISettingsV tabPane.setDisable(isLocked); } + @Override public void addTab(SettingsTabViewController controller) { tabs.add(controller); tabPane.getTabs().add(new Tab(controller.name(), controller.getParent())); diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/GlobalSettingsViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/GlobalSettingsViewController.java new file mode 100644 index 0000000000000000000000000000000000000000..6534d2976f3b068c46f230e869c673b065712604 --- /dev/null +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/GlobalSettingsViewController.java @@ -0,0 +1,133 @@ +package de.tobias.playpad.viewcontroller.option.global; + +import java.util.ArrayList; +import java.util.List; + +import de.tobias.playpad.PlayPadMain; +import de.tobias.playpad.PlayPadPlugin; +import de.tobias.playpad.Strings; +import de.tobias.playpad.settings.GlobalSettings; +import de.tobias.playpad.settings.Profile; +import de.tobias.playpad.viewcontroller.option.GlobalSettingsTabViewController; +import de.tobias.playpad.viewcontroller.option.IGlobalSettingsViewController; +import de.tobias.utils.ui.ViewController; +import de.tobias.utils.util.Localization; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; +import javafx.scene.control.ToggleButton; +import javafx.stage.Stage; +import javafx.stage.Window; + +public class GlobalSettingsViewController extends ViewController implements IGlobalSettingsViewController { + + @FXML private TabPane tabPane; + @FXML private ToggleButton lockedButton; + @FXML private Button finishButton; + + protected List<GlobalSettingsTabViewController> tabs = new ArrayList<>(); + + private Runnable onFinish; + + public GlobalSettingsViewController(Window owner, Runnable onFinish) { + super("globalSettingsView", "de/tobias/playpad/assets/view/option/global/", null, PlayPadMain.getUiResourceBundle()); + this.onFinish = onFinish; + + getStage().initOwner(owner); + + addTab(new KeysTabViewController()); + addTab(new UpdateTabViewController()); + + // Show Current Settings + loadTabs(); + } + + @Override + public void init() { + // KeyCode + addCloseKeyShortcut(() -> finishButton.fire()); + + finishButton.defaultButtonProperty().bind(finishButton.focusedProperty()); + } + + @Override + public void initStage(Stage stage) { + PlayPadMain.stageIcon.ifPresent(stage.getIcons()::add); + + stage.setMinWidth(715); + stage.setMinHeight(700); + stage.setTitle(Localization.getString(Strings.UI_Window_GlobalSettings_Title)); + + Profile.currentProfile().currentLayout().applyCss(getStage()); + } + + /** + * Zeigt die aktuellen Einstellungen für die Tabs an. + */ + private void loadTabs() { + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + + for (GlobalSettingsTabViewController controller : tabs) { + controller.loadSettings(globalSettings); + } + } + + /** + * Speichert die Einstellungen der Tabs. + */ + private void saveTabs() { + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + + for (GlobalSettingsTabViewController controller : tabs) { + controller.saveSettings(globalSettings); + } + + try { + globalSettings.save(); + } catch (Exception e) { + showErrorMessage(Localization.getString(Strings.Error_Profile_Save, e.getLocalizedMessage())); + e.printStackTrace(); + } + } + + public boolean closeRequest() { + return onFinish(); + } + + // Button Listener + @FXML + private void finishButtonHandler(ActionEvent event) { + onFinish(); + getStage().close(); + } + + /** + * Speichert alle Informationen. + * + * @return <code>true</code>Alle Einstellungen sind Valid. + */ + private boolean onFinish() { + for (GlobalSettingsTabViewController controller : tabs) { + if (controller.validSettings() == false) { + return false; + } + } + + saveTabs(); + if (onFinish != null) + onFinish.run(); // Reload MainViewController Settings + return true; + } + + @Override + public void addTab(GlobalSettingsTabViewController controller) { + tabs.add(controller); + tabPane.getTabs().add(new Tab(controller.name(), controller.getParent())); + } + + public List<GlobalSettingsTabViewController> getTabs() { + return tabs; + } +} diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java new file mode 100644 index 0000000000000000000000000000000000000000..4781a824ebfe051e85448e3c3d7392c5d21b8320 --- /dev/null +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java @@ -0,0 +1,145 @@ +package de.tobias.playpad.viewcontroller.option.global; + +import de.tobias.playpad.PlayPadMain; +import de.tobias.playpad.PlayPadPlugin; +import de.tobias.playpad.Strings; +import de.tobias.playpad.project.Project; +import de.tobias.playpad.settings.GlobalSettings; +import de.tobias.playpad.settings.keys.Key; +import de.tobias.playpad.viewcontroller.main.IMainViewController; +import de.tobias.playpad.viewcontroller.option.GlobalSettingsTabViewController; +import de.tobias.utils.util.Localization; +import de.tobias.utils.util.OS; +import javafx.application.Platform; +import javafx.beans.property.SimpleStringProperty; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.input.KeyCode; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.Label; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.stage.Stage; + +public class KeysTabViewController extends GlobalSettingsTabViewController { + + @FXML private TextField searchTextField; + + @FXML private TableView<Key> table; + @FXML private TableColumn<Key, String> shortcutTableColumn; + @FXML private TableColumn<Key, String> nameTableColumn; + + @FXML private Label nameLabel; + @FXML private Label shortcutLabel; + @FXML private Button newShortcutButton; + + private Key currentKey; + + public KeysTabViewController() { + super("keysTab", "de/tobias/playpad/assets/view/option/global/", PlayPadMain.getUiResourceBundle()); + } + + @Override + public void init() { + shortcutTableColumn.setCellValueFactory(param -> + { + return param.getValue().displayProperty(); + }); + nameTableColumn.setCellValueFactory(param -> + { + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + return new SimpleStringProperty(globalSettings.getKeyCollection().getName(param.getValue().getId())); + }); + + table.getSelectionModel().selectedItemProperty().addListener((a, b, c) -> + { + setDetailView(c); + }); + } + + private void setDetailView(Key key) { + currentKey = key; + + if (key != null) { + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + + String name = globalSettings.getKeyCollection().getName(key.getId()); + nameLabel.setText(name); + + shortcutLabel.setText(key.toString()); + newShortcutButton.setDisable(false); + } else { + nameLabel.setText(""); + shortcutLabel.setText(""); + newShortcutButton.setDisable(true); + } + } + + @FXML + void newShortcutButtonHandler(ActionEvent event) { + Alert alert = new Alert(AlertType.NONE); + alert.setContentText(Localization.getString(Strings.UI_Settings_Alert_NewKeyShortcut_Text)); + Scene scene = alert.getDialogPane().getScene(); + + scene.setOnKeyPressed(ev -> + { + boolean macCondition = ev.getCode().isLetterKey() || ev.getCode().isKeypadKey() || ev.getCode().isDigitKey() + || ev.getCode().isFunctionKey() || ev.getCode() == KeyCode.PERIOD || ev.getCode() == KeyCode.COMMA; + + if (OS.isWindows() || macCondition) { + String key = ev.getCode().getName(); + currentKey.setKey(key); + + currentKey.setAlt(ev.isAltDown()); + currentKey.setMeta(ev.isMetaDown()); + currentKey.setCtrl(ev.isControlDown()); + currentKey.setShift(ev.isShiftDown()); + + shortcutLabel.setText(currentKey.toString()); + + Platform.runLater(() -> ((Stage) scene.getWindow()).close()); + } + }); + + alert.getButtonTypes().add(ButtonType.CANCEL); + alert.initOwner(getWindow()); + alert.showAndWait(); + } + + @Override + public void loadSettings(GlobalSettings settings) { + table.getItems().setAll(settings.getKeyCollection().getKeys()); + } + + @Override + public void saveSettings(GlobalSettings settings) { + // Passiert beim Drücken von Tasten automatisch + } + + @Override + public boolean needReload() { + return true; + } + + @Override + public void reload(GlobalSettings settings, Project project, IMainViewController controller) { + controller.loadKeybinding(settings.getKeyCollection()); + } + + @Override + public boolean validSettings() { + return true; + } + + @Override + public String name() { + // TODO Auto-generated method stub + return "Keyboard (I18N)"; + } + +} diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/UpdateTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/UpdateTabViewController.java similarity index 78% rename from PlayWall/src/de/tobias/playpad/viewcontroller/option/UpdateTabViewController.java rename to PlayWall/src/de/tobias/playpad/viewcontroller/option/global/UpdateTabViewController.java index 0bf463e78c590218e2303fee471d4475a84323ca..d457d9475fb51e867940fb3a8729824ae1603cf9 100644 --- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/UpdateTabViewController.java +++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/UpdateTabViewController.java @@ -1,19 +1,20 @@ -package de.tobias.playpad.viewcontroller.option; +package de.tobias.playpad.viewcontroller.option.global; import java.io.IOException; import de.tobias.playpad.PlayPadMain; +import de.tobias.playpad.PlayPadPlugin; import de.tobias.playpad.Strings; +import de.tobias.playpad.settings.GlobalSettings; import de.tobias.playpad.settings.Profile; -import de.tobias.playpad.settings.ProfileSettings; import de.tobias.playpad.update.Updatable; import de.tobias.playpad.update.UpdateChannel; import de.tobias.playpad.update.UpdateRegistery; import de.tobias.playpad.update.Updates; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.cell.EnumCell; import de.tobias.playpad.viewcontroller.cell.UpdateCell; import de.tobias.playpad.viewcontroller.dialog.UpdaterDialog; +import de.tobias.playpad.viewcontroller.option.GlobalSettingsTabViewController; import de.tobias.utils.application.ApplicationInfo; import de.tobias.utils.application.ApplicationUtils; import de.tobias.utils.util.Localization; @@ -29,7 +30,7 @@ import javafx.scene.control.ListView; import javafx.scene.control.ProgressIndicator; import javafx.scene.image.ImageView; -public class UpdateTabViewController extends SettingsTabViewController { +public class UpdateTabViewController extends GlobalSettingsTabViewController { @FXML private Label currentVersionLabel; @@ -49,10 +50,11 @@ public class UpdateTabViewController extends SettingsTabViewController { private Label placeholderLabel; public UpdateTabViewController() { - super("updateTab", "de/tobias/playpad/assets/view/option/", PlayPadMain.getUiResourceBundle()); + super("updateTab", "de/tobias/playpad/assets/view/option/global/", PlayPadMain.getUiResourceBundle()); - ProfileSettings profileSettings = Profile.currentProfile().getProfileSettings(); - updateChannelComboBox.setValue(profileSettings.getUpdateChannel()); + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + + updateChannelComboBox.setValue(globalSettings.getUpdateChannel()); openUpdateList.getItems().setAll(UpdateRegistery.getAvailableUpdates()); updateButton.setDisable(openUpdateList.getItems().isEmpty()); @@ -71,7 +73,8 @@ public class UpdateTabViewController extends SettingsTabViewController { updateChannelComboBox.valueProperty().addListener((a, b, c) -> { - Profile.currentProfile().getProfileSettings().setUpdateChannel(c); + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + globalSettings.setUpdateChannel(c); }); infoCLabel.setGraphic(new ImageView("de/tobias/playpad/assets/files/class_obj.png")); @@ -98,7 +101,8 @@ public class UpdateTabViewController extends SettingsTabViewController { Worker.runLater(() -> { // Search for updates - UpdateRegistery.lookupUpdates(profile.getProfileSettings().getUpdateChannel()); + GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings(); + UpdateRegistery.lookupUpdates(globalSettings.getUpdateChannel()); Platform.runLater(() -> { @@ -128,13 +132,13 @@ public class UpdateTabViewController extends SettingsTabViewController { // Settings Tab Methods @Override - public void loadSettings(Profile profile) { - automaticSearchCheckBox.setSelected(profile.getProfileSettings().isAutoUpdate()); + public void loadSettings(GlobalSettings profile) { + automaticSearchCheckBox.setSelected(profile.isAutoUpdate()); } @Override - public void saveSettings(Profile profile) { - profile.getProfileSettings().setAutoUpdate(automaticSearchCheckBox.isSelected()); + public void saveSettings(GlobalSettings profile) { + profile.setAutoUpdate(automaticSearchCheckBox.isSelected()); } @Override diff --git a/PlayWallCore/src/de/tobias/playpad/PlayPad.java b/PlayWallCore/src/de/tobias/playpad/PlayPad.java index ba0648a62c2a20fd92a59f98fe721460c17dfe31..7326cfbbde2f9e11be3ef46f1bb3670131f0eb8b 100644 --- a/PlayWallCore/src/de/tobias/playpad/PlayPad.java +++ b/PlayWallCore/src/de/tobias/playpad/PlayPad.java @@ -7,6 +7,7 @@ import java.util.Optional; import de.tobias.playpad.plugin.PadListener; import de.tobias.playpad.plugin.SettingsListener; import de.tobias.playpad.plugin.WindowListener; +import de.tobias.playpad.settings.GlobalSettings; import de.tobias.playpad.viewcontroller.main.IMainViewController; import javafx.scene.image.Image; @@ -105,4 +106,11 @@ public interface PlayPad { * Quelle des Plugin */ public void loadPlugin(URI uri); + + /** + * Gibt die globalen Einstellungen zurück. + * + * @return Global Settings + */ + public GlobalSettings getGlobalSettings(); } diff --git a/PlayWallCore/src/de/tobias/playpad/pad/conntent/PadContentConnect.java b/PlayWallCore/src/de/tobias/playpad/pad/conntent/PadContentConnect.java index 88dccf7273cdff6a998b7d157d96af79f2745f61..eb3ebb8b41937a4a998ac51efd9aee7e04ea9704 100644 --- a/PlayWallCore/src/de/tobias/playpad/pad/conntent/PadContentConnect.java +++ b/PlayWallCore/src/de/tobias/playpad/pad/conntent/PadContentConnect.java @@ -6,7 +6,7 @@ import de.tobias.playpad.Displayable; import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.view.IPadContentView; import de.tobias.playpad.viewcontroller.PadSettingsTabViewController; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; +import de.tobias.playpad.viewcontroller.option.SettingsTabViewController; import de.tobias.utils.util.FileUtils; import javafx.scene.layout.Pane; diff --git a/PlayWallCore/src/de/tobias/playpad/settings/GlobalSettings.java b/PlayWallCore/src/de/tobias/playpad/settings/GlobalSettings.java new file mode 100644 index 0000000000000000000000000000000000000000..d597901378ecdc7230d8730573dd5f7ba58d0590 --- /dev/null +++ b/PlayWallCore/src/de/tobias/playpad/settings/GlobalSettings.java @@ -0,0 +1,121 @@ +package de.tobias.playpad.settings; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; + +import de.tobias.playpad.PlayPad; +import de.tobias.playpad.settings.keys.KeyCollection; +import de.tobias.playpad.update.UpdateChannel; + +/** + * Globale Einstellungen für das Programm. Eine Instanz von diesen Einstellungen wird in {@link PlayPad} verwaltet. + * + * @author tobias + * + * @since 5.1.0 + * + * @see PlayPad#getGlobalSettings() + * + */ +public class GlobalSettings { + + private Path savePath; + + private KeyCollection keyCollection = new KeyCollection(); + + private boolean autoUpdate = true; + private UpdateChannel updateChannel = UpdateChannel.STABLE; + + // Getter + public boolean isAutoUpdate() { + return autoUpdate; + } + + public UpdateChannel getUpdateChannel() { + return updateChannel; + } + + public KeyCollection getKeyCollection() { + return keyCollection; + } + + // Setter + public void setAutoUpdate(boolean autoUpdate) { + this.autoUpdate = autoUpdate; + } + + public void setUpdateChannel(UpdateChannel updateChannel) { + this.updateChannel = updateChannel; + } + + private static final String KEYS_ELEMENT = "Keys"; + private static final String AUTO_UPDATE_ELEMENT = "AutoUpdate"; + private static final String UPDATE_CHANNEL_ELEMENT = "UpdateChannel"; + + /** + * Lädt eine neue Instanz der Globalen Einstellungen. + * + * @return GlobalSettings + * @throws DocumentException + * XML Fehler + * @throws IOException + * Fehler bei IO + */ + public static GlobalSettings load(Path savePath) throws DocumentException, IOException { + GlobalSettings settings = new GlobalSettings(); + settings.savePath = savePath; + + if (Files.exists(savePath)) { + SAXReader reader = new SAXReader(); + Document document = reader.read(Files.newInputStream(savePath)); + Element root = document.getRootElement(); + + if (root.element(KEYS_ELEMENT) != null) + settings.keyCollection.load(root.element(KEYS_ELEMENT)); + + if (root.element(AUTO_UPDATE_ELEMENT) != null) { + settings.setAutoUpdate(Boolean.valueOf(root.element(AUTO_UPDATE_ELEMENT).getStringValue())); + } + + if (root.element(UPDATE_CHANNEL_ELEMENT) != null) { + settings.setUpdateChannel(UpdateChannel.valueOf(root.element(UPDATE_CHANNEL_ELEMENT).getStringValue())); + } + } + return settings; + } + + /** + * Speichert die Globalen Einstellungen + * + * @throws UnsupportedEncodingException + * Fehler bei XML + * @throws IOException + * Fehler bei IO + */ + public void save() throws UnsupportedEncodingException, IOException { + Document document = DocumentHelper.createDocument(); + Element root = document.addElement("Config"); + + // Keys + Element keyCollectionElement = root.addElement(KEYS_ELEMENT); + keyCollection.save(keyCollectionElement); + + // Update + root.addElement(AUTO_UPDATE_ELEMENT).addText(String.valueOf(autoUpdate)); + root.addElement(UPDATE_CHANNEL_ELEMENT).addText(updateChannel.name()); + + XMLWriter writer = new XMLWriter(Files.newOutputStream(savePath), OutputFormat.createPrettyPrint()); + writer.write(document); + writer.close(); + } +} diff --git a/PlayWallCore/src/de/tobias/playpad/settings/ProfileSettings.java b/PlayWallCore/src/de/tobias/playpad/settings/ProfileSettings.java index ea0e10f48df2b66c8f59d11d31cdb2b0b0ba934f..676a8a8b67daa576513be27231d63e16eb7afca2 100644 --- a/PlayWallCore/src/de/tobias/playpad/settings/ProfileSettings.java +++ b/PlayWallCore/src/de/tobias/playpad/settings/ProfileSettings.java @@ -17,7 +17,6 @@ import org.dom4j.io.XMLWriter; import de.tobias.playpad.PlayPadPlugin; import de.tobias.playpad.pad.TimeMode; -import de.tobias.playpad.update.UpdateChannel; import de.tobias.utils.application.ApplicationUtils; import de.tobias.utils.application.container.PathType; import de.tobias.utils.settings.SettingsSerializable; @@ -73,10 +72,6 @@ public class ProfileSettings implements SettingsSerializable { // Folder @Storable private Path cachePath = ApplicationUtils.getApplication().getPath(PathType.CACHE); - // Update - TODO GlobalSettings - @Storable private boolean autoUpdate = true; - @Storable private UpdateChannel updateChannel = UpdateChannel.STABLE; - public boolean isLocked() { return lockedProperty.get(); } @@ -180,14 +175,6 @@ public class ProfileSettings implements SettingsSerializable { return audioUserInfo; } - public boolean isAutoUpdate() { - return autoUpdate; - } - - public UpdateChannel getUpdateChannel() { - return updateChannel; - } - // Setter public void setMidiDeviceName(String midiDevice) { this.midiDevice = midiDevice; @@ -267,14 +254,6 @@ public class ProfileSettings implements SettingsSerializable { this.audioClass = audioClass; } - public void setAutoUpdate(boolean autoUpdate) { - this.autoUpdate = autoUpdate; - } - - public void setUpdateChannel(UpdateChannel updateChannel) { - this.updateChannel = updateChannel; - } - // Properties public DoubleProperty volumeProperty() { return volumeProperty; @@ -282,8 +261,6 @@ public class ProfileSettings implements SettingsSerializable { private static final String LOCKED_ELEMENT = "Locked"; private static final String ITEM_ELEMENT = "Item"; - private static final String AUTO_UPDATE_ELEMENT = "AutoUpdate"; - private static final String UPDATE_CHANNEL_ELEMENT = "UpdateChannel"; private static final String CACHE_PATH_ELEMENT = "Cache-Path"; private static final String VOLUME_ELEMENT = "Volume"; private static final String KEY_ATTRIBUTE = "key"; @@ -396,14 +373,6 @@ public class ProfileSettings implements SettingsSerializable { if (root.element(CACHE_PATH_ELEMENT) != null) { profileSettings.setCachePath(Paths.get(root.element(CACHE_PATH_ELEMENT).getStringValue())); } - - if (root.element(AUTO_UPDATE_ELEMENT) != null) { - profileSettings.setAutoUpdate(Boolean.valueOf(root.element(AUTO_UPDATE_ELEMENT).getStringValue())); - } - - if (root.element(UPDATE_CHANNEL_ELEMENT) != null) { - profileSettings.setUpdateChannel(UpdateChannel.valueOf(root.element(UPDATE_CHANNEL_ELEMENT).getStringValue())); - } } return profileSettings; } @@ -452,10 +421,6 @@ public class ProfileSettings implements SettingsSerializable { // Paths root.addElement(CACHE_PATH_ELEMENT).addText(cachePath.toString()); - // Update - root.addElement(AUTO_UPDATE_ELEMENT).addText(String.valueOf(autoUpdate)); - root.addElement(UPDATE_CHANNEL_ELEMENT).addText(updateChannel.name()); - XMLWriter writer = new XMLWriter(Files.newOutputStream(path), OutputFormat.createPrettyPrint()); writer.write(document); writer.close(); diff --git a/PlayWallCore/src/de/tobias/playpad/settings/keys/Key.java b/PlayWallCore/src/de/tobias/playpad/settings/keys/Key.java new file mode 100644 index 0000000000000000000000000000000000000000..bb8111f0867057b8bde2f400120c5effc66c1df7 --- /dev/null +++ b/PlayWallCore/src/de/tobias/playpad/settings/keys/Key.java @@ -0,0 +1,123 @@ +package de.tobias.playpad.settings.keys; + +import de.tobias.playpad.Displayable; +import de.tobias.utils.util.OS; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +public class Key implements Displayable { + + private String id; + + private String key; + private boolean ctrl; + private boolean alt; + private boolean meta; + private boolean shift; + + public Key(String id) { + this.id = id; + } + + public Key(String id, String key, boolean ctrl, boolean alt, boolean meta, boolean shift) { + this.id = id; + + this.key = key; + this.ctrl = ctrl; + this.alt = alt; + this.meta = meta; + this.shift = shift; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + + displayProperty.set(toString()); + } + + public boolean isCtrl() { + return ctrl; + } + + public void setCtrl(boolean ctrl) { + this.ctrl = ctrl; + + displayProperty.set(toString()); + } + + public boolean isAlt() { + return alt; + } + + public void setAlt(boolean alt) { + this.alt = alt; + + displayProperty.set(toString()); + } + + public boolean isMeta() { + return meta; + } + + public void setMeta(boolean meta) { + this.meta = meta; + + displayProperty.set(toString()); + } + + public boolean isShift() { + return shift; + } + + public void setShift(boolean shift) { + this.shift = shift; + + displayProperty.set(toString()); + } + + public String getId() { + return id; + } + + public String getKeyCode() { + StringBuilder builder = new StringBuilder(); + + if (ctrl) + builder.append("ctrl+"); + + if (alt) + builder.append("alt+"); + + if (meta) + builder.append("meta+"); + + if (shift) + builder.append("shift+"); + + builder.append(key); + + return builder.toString(); + } + + @Override + public String toString() { + if (OS.isMacOS()) { + return getKeyCode().replace("meta", String.valueOf((char) 8984)).replace("shift", String.valueOf((char) 8679)) + .replace("ctrl", String.valueOf((char) 8963)).replace("alt", String.valueOf((char) 8997)); + } else { + return getKeyCode(); + } + } + + private StringProperty displayProperty = new SimpleStringProperty(); + + @Override + public StringProperty displayProperty() { + displayProperty.set(toString()); + return displayProperty; + } +} diff --git a/PlayWallCore/src/de/tobias/playpad/settings/keys/KeyCollection.java b/PlayWallCore/src/de/tobias/playpad/settings/keys/KeyCollection.java new file mode 100644 index 0000000000000000000000000000000000000000..8e41c287a6439f0f5515cfde3c3ca5820831a32b --- /dev/null +++ b/PlayWallCore/src/de/tobias/playpad/settings/keys/KeyCollection.java @@ -0,0 +1,115 @@ +package de.tobias.playpad.settings.keys; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.ResourceBundle; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import de.tobias.playpad.xml.XMLHandler; +import de.tobias.utils.util.OS; + +public class KeyCollection { + + // Schlüssel: ID, Value: Key + private HashMap<String, Key> keys; + private HashMap<String, String> names; + + public KeyCollection() { + keys = new HashMap<>(); + names = new HashMap<>(); + } + + public void register(Key key) { + if (!keys.containsKey(key.getId())) { + if (!keysConflict(key)) { + keys.put(key.getId(), key); + } + } + } + + public String getName(String id) { + return names.get(id); + } + + public Key getKey(String id) { + return keys.get(id); + } + + public Collection<Key> getKeys() { + return keys.values(); + } + + public boolean keysConflict(Key key) { + for (Key k : keys.values()) { + if (k.getKeyCode().equals(key)) { + return true; + } + } + return false; + } + + private static final String KEY_ELEMENT = "Key"; + + public void load(Element element) { + XMLHandler<Key> handler = new XMLHandler<>(element); + List<Key> keys = handler.loadElements(KEY_ELEMENT, new KeySerializer()); + for (Key key : keys) { + register(key); + } + } + + public void save(Element element) { + XMLHandler<Key> handler = new XMLHandler<>(element); + handler.saveElements(KEY_ELEMENT, getKeys(), new KeySerializer()); + } + + private static final String WINDOWS_KEYS = "Windows"; + private static final String MAC_KEYS = "Mac"; + + public void loadDefaultFromFile(String classPath, ResourceBundle bundle) { + SAXReader reader = new SAXReader(); + try { + Document document = reader.read(getClass().getClassLoader().getResourceAsStream(classPath)); + Element rootElement = document.getRootElement(); + + Element keysElement = null; + if (OS.isWindows()) + keysElement = rootElement.element(WINDOWS_KEYS); + else if (OS.isMacOS()) + keysElement = rootElement.element(MAC_KEYS); + + if (keysElement != null) { + KeySerializer keySerializer = new KeySerializer(); + + for (Object obj : keysElement.elements(KEY_ELEMENT)) { + if (obj instanceof Element) { + Element keyElement = (Element) obj; + + String name = loadName(keyElement, bundle); + Key key = keySerializer.loadElement(keyElement); + + System.out.println(key); + + names.put(key.getId(), name); + register(key); + } + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } + } + + private String loadName(Element element, ResourceBundle bundle) { + String name = element.attributeValue("name"); + if (name != null) { + return bundle.getString(name); + } + return null; + } +} diff --git a/PlayWallCore/src/de/tobias/playpad/settings/keys/KeySerializer.java b/PlayWallCore/src/de/tobias/playpad/settings/keys/KeySerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..cb8e7fc7a9d30c60e6b56f769758fe81fd05e391 --- /dev/null +++ b/PlayWallCore/src/de/tobias/playpad/settings/keys/KeySerializer.java @@ -0,0 +1,57 @@ +package de.tobias.playpad.settings.keys; + +import org.dom4j.Element; + +import de.tobias.playpad.xml.XMLDeserializer; +import de.tobias.playpad.xml.XMLSerializer; + +public class KeySerializer implements XMLSerializer<Key>, XMLDeserializer<Key> { + + private static final String ID_ATTR = "id"; + private static final String KEY_ATTR = "key"; + private static final String ALT_ATTR = "alt"; + private static final String CTRL_ATTR = "ctrl"; + private static final String META_ATTR = "meta"; + private static final String SHIFT_ATTR = "shift"; + + public Key loadElement(Element element) { + boolean shift = false; + if (element.attributeValue(SHIFT_ATTR) != null) { + shift = Boolean.valueOf(element.attributeValue(SHIFT_ATTR)); + } + boolean meta = false; + if (element.attributeValue(META_ATTR) != null) { + meta = Boolean.valueOf(element.attributeValue(META_ATTR)); + } + boolean ctrl = false; + if (element.attributeValue(CTRL_ATTR) != null) { + ctrl = Boolean.valueOf(element.attributeValue(CTRL_ATTR)); + } + boolean alt = false; + if (element.attributeValue(ALT_ATTR) != null) { + alt = Boolean.valueOf(element.attributeValue(ALT_ATTR)); + } + + String key = ""; + if (element.attributeValue(KEY_ATTR) != null) { + key = element.attributeValue(KEY_ATTR); + } + + String id = ""; + if (element.attributeValue(ID_ATTR) != null) { + id = element.attributeValue(ID_ATTR); + } + + return new Key(id, key, ctrl, alt, meta, shift); + } + + @Override + public void saveElement(Element newElement, Key data) { + newElement.addAttribute(SHIFT_ATTR, String.valueOf(data.isShift())); + newElement.addAttribute(META_ATTR, String.valueOf(data.isMeta())); + newElement.addAttribute(CTRL_ATTR, String.valueOf(data.isCtrl())); + newElement.addAttribute(ALT_ATTR, String.valueOf(data.isAlt())); + newElement.addAttribute(KEY_ATTR, data.getKey()); + newElement.addAttribute(ID_ATTR, data.getId()); + } +} diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java index 8a31a01cc36a1dd5682a68275f537c9efa33058e..5a2331e2bc07205871230830573eae9c6effbf70 100644 --- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java +++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java @@ -4,6 +4,7 @@ import java.util.List; import de.tobias.playpad.midi.MidiListener; import de.tobias.playpad.pad.view.IPadViewV2; +import de.tobias.playpad.settings.keys.KeyCollection; import de.tobias.playpad.view.main.MainLayoutConnect; import de.tobias.playpad.view.main.MainLayoutHandler; import de.tobias.utils.ui.NotificationHandler; @@ -147,4 +148,12 @@ public interface IMainViewController extends NotificationHandler { * Funktion */ public void performLayoutDependendAction(MainLayoutHandler runnable); + + /** + * Lädt die Tastenkombinationen für das Menü und co neu. + * + * @param keys + * Einstellungen der Key Bindings + */ + public void loadKeybinding(KeyCollection keys); } diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java index 9e2c066a3f8fa0275756c0d3234a1e916f51269d..623ba4aadac4676dd2628e1ef48d8fff2bea9cee 100644 --- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java +++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java @@ -3,6 +3,7 @@ package de.tobias.playpad.viewcontroller.main; import java.util.ResourceBundle; import de.tobias.playpad.settings.ProfileSettings; +import de.tobias.playpad.settings.keys.KeyCollection; import de.tobias.playpad.view.main.MenuType; import de.tobias.utils.ui.ContentViewController; import javafx.scene.Node; @@ -169,4 +170,11 @@ public abstract class MenuToolbarViewController extends ContentViewController { * @see IMainViewController#showPage(int) */ public abstract void hilightPageButton(int page); + + /** + * Lädt das Keyboard Binding. + * + * @param keys Einstellungen der Keybinding + */ + public abstract void loadKeybinding(KeyCollection keys); } diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/GlobalSettingsTabViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/GlobalSettingsTabViewController.java new file mode 100644 index 0000000000000000000000000000000000000000..d68501939df07675382c8c8e3b00e02ad73cc37b --- /dev/null +++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/GlobalSettingsTabViewController.java @@ -0,0 +1,77 @@ +package de.tobias.playpad.viewcontroller.option; + +import java.util.ResourceBundle; + +import de.tobias.playpad.project.Project; +import de.tobias.playpad.settings.GlobalSettings; +import de.tobias.playpad.settings.Profile; +import de.tobias.playpad.viewcontroller.main.IMainViewController; +import de.tobias.utils.ui.ContentViewController; + +public abstract class GlobalSettingsTabViewController extends ContentViewController { + + /** + * Erstellt einen neuen Tab. + * + * @param name + * Name der FXML + * @param path + * Pfad zu FXML (ohne Dateiname) + * @param localization + * ResourceBundle oder null + */ + public GlobalSettingsTabViewController(String name, String path, ResourceBundle localization) { + super(name, path, localization); + } + + /** + * Lädt alle Einstellungen vom Model in die GUI. + * + * @param settings + * Aktuelles GlobalSettings + */ + public abstract void loadSettings(GlobalSettings settings); + + /** + * Speichert alle Änderungen in das Model. + * + * @param settings + * Aktuelles GlobalSettings + */ + public abstract void saveSettings(GlobalSettings settings); + + /** + * Gibt <code>true</code> zurück, wenn im Hauptprogramm etwas neu geladen werden muss. Der eigentliche Reload wird in + * {@link #reload(Profile, Project, IMainViewController)} ausgeführt. + * + * @return <code>true</code> Benötigt Reload + */ + public abstract boolean needReload(); + + /** + * Lädt gestimmte Einstellungen für die GUI neu. + * + * @param settings + * Aktuelles GlobalSettings + * @param project + * Aktuelles Projekt + * @param controller + * Main View Controller + */ + public void reload(GlobalSettings settings, Project project, IMainViewController controller) {} + + /** + * Prüft ob die eingetragen Einstellungen erlaubt sind. Bei falschen Eingaben können die Einstellungen nicht geschlossen werden. + * + * @return <code>true</code> Einstellungen erlaubt. <code>false</code> Einstellungen fehlerhaft. + */ + public abstract boolean validSettings(); + + /** + * Gibt den Namen für den Tab zurück. + * + * @return Display Name des Tabs. + */ + public abstract String name(); + +} diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IGlobalSettingsViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IGlobalSettingsViewController.java new file mode 100644 index 0000000000000000000000000000000000000000..3f1c8bf5ed47431bb2bd65581fc35cb6b7ba9f3d --- /dev/null +++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IGlobalSettingsViewController.java @@ -0,0 +1,20 @@ +package de.tobias.playpad.viewcontroller.option; + +/** + * Schnittstelle um die GlobalSettingsView zu ändern. + * + * @author tobias + * + * @since 5.1.0 + */ +public interface IGlobalSettingsViewController { + + /** + * Fügt en Tab hinzu. + * + * @param globalSettingsTabViewController + * tab + */ + public void addTab(GlobalSettingsTabViewController globalSettingsTabViewController); + +} diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/ISettingsViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ISettingsViewController.java similarity index 54% rename from PlayWallCore/src/de/tobias/playpad/viewcontroller/ISettingsViewController.java rename to PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ISettingsViewController.java index 173055b25647b514d39da9f6005ea04a3959a80b..88ad688b75f497a3634169abb5411bfeb93e7308 100644 --- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/ISettingsViewController.java +++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ISettingsViewController.java @@ -1,4 +1,4 @@ -package de.tobias.playpad.viewcontroller; +package de.tobias.playpad.viewcontroller.option; /** * Schnittstelle um die ProfileSettingsView zu ändern. @@ -12,9 +12,9 @@ public interface ISettingsViewController { /** * Fügt en Tab hinzu. * - * @param videoSettingsTabViewController + * @param profileSettingsTabViewController * tab */ - public void addTab(SettingsTabViewController videoSettingsTabViewController); + public void addTab(SettingsTabViewController profileSettingsTabViewController); } diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/SettingsTabViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/SettingsTabViewController.java similarity index 97% rename from PlayWallCore/src/de/tobias/playpad/viewcontroller/SettingsTabViewController.java rename to PlayWallCore/src/de/tobias/playpad/viewcontroller/option/SettingsTabViewController.java index a8b9338e66561e84b099b118c42ef8808b2551ee..96c9975d277d67de33af0aeb7dab5a5073683312 100644 --- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/SettingsTabViewController.java +++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/SettingsTabViewController.java @@ -1,4 +1,4 @@ -package de.tobias.playpad.viewcontroller; +package de.tobias.playpad.viewcontroller.option; import java.util.ResourceBundle; diff --git a/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/main/impl/MediaSettingsTabViewController.java b/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/main/impl/MediaSettingsTabViewController.java index 0ebe6c7e678a04fa952aba4b8a5eb60bff3ce694..bdc355b727f71a6f6bfbcb2be0bfac78fe95e97f 100644 --- a/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/main/impl/MediaSettingsTabViewController.java +++ b/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/main/impl/MediaSettingsTabViewController.java @@ -7,8 +7,8 @@ import java.util.ResourceBundle; import de.tobias.playpad.mediaplugin.main.VideoSettings; import de.tobias.playpad.project.Project; import de.tobias.playpad.settings.Profile; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; import de.tobias.playpad.viewcontroller.main.IMainViewController; +import de.tobias.playpad.viewcontroller.option.SettingsTabViewController; import javafx.fxml.FXML; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; diff --git a/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/video/VideoContentConntect.java b/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/video/VideoContentConntect.java index 65a48ac94219ed5e8bcf28e4f0d1db0da86d1f69..43807c789cc2e58ed52fa27b4f5532c17f28a733 100644 --- a/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/video/VideoContentConntect.java +++ b/PlayWallPlugins/mediaplugin/de/tobias/playpad/mediaplugin/video/VideoContentConntect.java @@ -8,7 +8,7 @@ import de.tobias.playpad.pad.conntent.PadContent; import de.tobias.playpad.pad.conntent.PadContentConnect; import de.tobias.playpad.pad.view.IPadContentView; import de.tobias.playpad.viewcontroller.PadSettingsTabViewController; -import de.tobias.playpad.viewcontroller.SettingsTabViewController; +import de.tobias.playpad.viewcontroller.option.SettingsTabViewController; import de.tobias.utils.ui.icon.FontAwesomeType; import de.tobias.utils.ui.icon.FontIcon; import javafx.beans.property.SimpleStringProperty;