diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.java b/src/main/java/de/bixilon/minosoft/Minosoft.java index 6c7f196d6..1ea795b9a 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.java +++ b/src/main/java/de/bixilon/minosoft/Minosoft.java @@ -23,10 +23,11 @@ import de.bixilon.minosoft.data.assets.AssetsManager; import de.bixilon.minosoft.data.locale.LocaleManager; import de.bixilon.minosoft.data.locale.minecraft.MinecraftLocaleManager; import de.bixilon.minosoft.data.mappings.versions.Versions; -import de.bixilon.minosoft.gui.main.AccountListCell; import de.bixilon.minosoft.gui.main.GUITools; import de.bixilon.minosoft.gui.main.Launcher; +import de.bixilon.minosoft.gui.main.ServerListCell; import de.bixilon.minosoft.gui.main.StartProgressWindow; +import de.bixilon.minosoft.gui.main.cells.AccountListCell; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.logging.LogLevels; import de.bixilon.minosoft.modding.event.EventManager; @@ -190,25 +191,28 @@ public final class Minosoft { } } - public static void selectAccount(Account account) { + public static boolean selectAccount(Account account) { if (account == null) { config.putString(ConfigurationPaths.StringPaths.ACCOUNT_SELECTED, ""); config.saveToFile(); - return; + return false; } - if (!account.select()) { - account.logout(); - AccountListCell.MOJANG_ACCOUNT_LIST_VIEW.getItems().remove(account); - config.removeAccount(account); + if (account.select()) { + config.putAccount(account); + config.selectAccount(account); config.saveToFile(); - return; - } - config.putAccount(account); - config.selectAccount(account); - if (Launcher.getMainWindow() != null) { - Launcher.getMainWindow().selectAccount(account); + if (Launcher.getMainWindow() != null) { + Launcher.getMainWindow().selectAccount(account); + } + AccountListCell.ACCOUNT_LIST_VIEW.refresh(); + ServerListCell.SERVER_LIST_VIEW.refresh(); + return true; } + account.logout(); + AccountListCell.ACCOUNT_LIST_VIEW.getItems().remove(account); + config.removeAccount(account); config.saveToFile(); + return false; } public static Configuration getConfig() { diff --git a/src/main/java/de/bixilon/minosoft/data/accounts/Account.java b/src/main/java/de/bixilon/minosoft/data/accounts/Account.java index 4d4334fae..56b0341d8 100644 --- a/src/main/java/de/bixilon/minosoft/data/accounts/Account.java +++ b/src/main/java/de/bixilon/minosoft/data/accounts/Account.java @@ -71,4 +71,9 @@ public abstract class Account { Minosoft.getConfig().putAccount(this); Minosoft.getConfig().saveToFile(); } + + @Override + public String toString() { + return getId(); + } } diff --git a/src/main/java/de/bixilon/minosoft/data/accounts/MojangAccount.java b/src/main/java/de/bixilon/minosoft/data/accounts/MojangAccount.java index ce36cb205..9e9704d07 100644 --- a/src/main/java/de/bixilon/minosoft/data/accounts/MojangAccount.java +++ b/src/main/java/de/bixilon/minosoft/data/accounts/MojangAccount.java @@ -110,11 +110,6 @@ public class MojangAccount extends Account { } - @Override - public String toString() { - return getId(); - } - public boolean needsRefresh() { return this.needsRefresh; } diff --git a/src/main/java/de/bixilon/minosoft/data/locale/Strings.java b/src/main/java/de/bixilon/minosoft/data/locale/Strings.java index 03b8a466d..f1e92a8f0 100644 --- a/src/main/java/de/bixilon/minosoft/data/locale/Strings.java +++ b/src/main/java/de/bixilon/minosoft/data/locale/Strings.java @@ -42,7 +42,8 @@ public enum Strings { SESSIONS_DIALOG_TITLE, ACCOUNTS_ACTION_SELECT, - ACCOUNTS_ACTION_DELETE, + ACCOUNTS_ACTION_INFO, + ACCOUNTS_ACTION_LOGOUT, SERVER_ACTION_CONNECT, SERVER_ACTION_SHOW_INFO, diff --git a/src/main/java/de/bixilon/minosoft/gui/main/AccountWindow.java b/src/main/java/de/bixilon/minosoft/gui/main/AccountWindow.java index ea0fcc903..04895b66f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/main/AccountWindow.java +++ b/src/main/java/de/bixilon/minosoft/gui/main/AccountWindow.java @@ -17,6 +17,7 @@ import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.data.accounts.Account; import de.bixilon.minosoft.data.locale.LocaleManager; import de.bixilon.minosoft.data.locale.Strings; +import de.bixilon.minosoft.gui.main.cells.AccountListCell; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.Initializable; @@ -35,11 +36,11 @@ public class AccountWindow implements Initializable { @Override public void initialize(URL url, ResourceBundle resourceBundle) { - AccountListCell.MOJANG_ACCOUNT_LIST_VIEW.setCellFactory((lv) -> AccountListCell.newInstance()); + AccountListCell.ACCOUNT_LIST_VIEW.setCellFactory((lv) -> AccountListCell.newInstance()); ObservableList accounts = FXCollections.observableArrayList(Minosoft.getConfig().getAccounts().values()); - AccountListCell.MOJANG_ACCOUNT_LIST_VIEW.setItems(accounts); - this.accountPane.setCenter(AccountListCell.MOJANG_ACCOUNT_LIST_VIEW); + AccountListCell.ACCOUNT_LIST_VIEW.setItems(accounts); + this.accountPane.setCenter(AccountListCell.ACCOUNT_LIST_VIEW); this.menuAddMojangAccount.setText(LocaleManager.translate(Strings.ACCOUNT_MODAL_MENU_ADD_MOJANG_ACCOUNT)); this.menuAddOfflineAccount.setText(LocaleManager.translate(Strings.ACCOUNT_MODAL_MENU_ADD_OFFLINE_ACCOUNT)); diff --git a/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java b/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java index 8b6434738..7042fcbd0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java +++ b/src/main/java/de/bixilon/minosoft/gui/main/ServerListCell.java @@ -104,12 +104,14 @@ public class ServerListCell extends ListCell implements Initializable { protected void updateItem(Server server, boolean empty) { super.updateItem(server, empty); - this.root.setVisible(!empty); + this.root.setVisible(server != null || !empty); if (empty) { + resetCell(); return; } if (server == null) { + resetCell(); return; } diff --git a/src/main/java/de/bixilon/minosoft/gui/main/AccountListCell.java b/src/main/java/de/bixilon/minosoft/gui/main/cells/AccountListCell.java similarity index 57% rename from src/main/java/de/bixilon/minosoft/gui/main/AccountListCell.java rename to src/main/java/de/bixilon/minosoft/gui/main/cells/AccountListCell.java index c9bcc66fa..a44922043 100644 --- a/src/main/java/de/bixilon/minosoft/gui/main/AccountListCell.java +++ b/src/main/java/de/bixilon/minosoft/gui/main/cells/AccountListCell.java @@ -11,32 +11,40 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.main; +package de.bixilon.minosoft.gui.main.cells; +import com.jfoenix.controls.JFXButton; import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.data.accounts.Account; import de.bixilon.minosoft.data.locale.LocaleManager; import de.bixilon.minosoft.data.locale.Strings; +import de.bixilon.minosoft.gui.main.GUITools; import de.bixilon.minosoft.logging.Log; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; -import javafx.scene.control.*; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.image.ImageView; +import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; -import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; public class AccountListCell extends ListCell implements Initializable { - public static final ListView MOJANG_ACCOUNT_LIST_VIEW = new ListView<>(); + public static final ListView ACCOUNT_LIST_VIEW = new ListView<>(); + public HBox hBox; + public ImageView head; + public Label username; + public Label type; + + public JFXButton selectIcon; + public JFXButton infoIcon; + public JFXButton logoutIcon; - public MenuButton optionsMenu; - public Label playerName; - public MenuItem optionsSelect; - public Label email; - public MenuItem optionsDelete; - public AnchorPane root; private Account account; @@ -54,28 +62,27 @@ public class AccountListCell extends ListCell implements Initializable @Override public void initialize(URL url, ResourceBundle rb) { updateSelected(false); - setGraphic(this.root); + setGraphic(this.hBox); // change locale - this.optionsSelect.setText(LocaleManager.translate(Strings.ACCOUNTS_ACTION_SELECT)); - this.optionsDelete.setText(LocaleManager.translate(Strings.ACCOUNTS_ACTION_DELETE)); + this.selectIcon.setText(LocaleManager.translate(Strings.ACCOUNTS_ACTION_SELECT)); + this.infoIcon.setText(LocaleManager.translate(Strings.ACCOUNTS_ACTION_INFO)); + this.logoutIcon.setText(LocaleManager.translate(Strings.ACCOUNTS_ACTION_LOGOUT)); } - public AnchorPane getRoot() { - return this.root; - } - @Override protected void updateItem(Account account, boolean empty) { super.updateItem(account, empty); - this.root.setVisible(!empty); + this.hBox.setVisible(account != null || !empty); if (empty) { + resetCell(); return; } if (account == null) { + resetCell(); return; } @@ -83,20 +90,34 @@ public class AccountListCell extends ListCell implements Initializable return; } resetCell(); + if (Minosoft.getConfig().getSelectedAccount() == account) { + this.hBox.getStyleClass().add("list-cell-selected"); + this.selectIcon.setDisable(true); + } + + // ToDo: Set head this.account = account; - this.playerName.setText(account.getUsername()); - // this.email.setText(account.getEmail()); - if (Minosoft.getConfig().getSelectedAccount() == account) { - setStyle("-fx-background-color: darkseagreen;"); - this.optionsSelect.setDisable(true); - } + this.username.setText(account.getUsername()); + this.type.setText(account.getClass().getSimpleName()); } private void resetCell() { // clear all cells - setStyle(null); - this.optionsSelect.setDisable(false); + this.hBox.getStyleClass().remove("list-cell-selected"); + this.selectIcon.setDisable(false); + this.head.setImage(GUITools.MINOSOFT_LOGO); + } + + + public void select() { + Minosoft.selectAccount(this.account); + + if (Minosoft.getConfig().getSelectedAccount() == this.account) { + // ToDo: Why isn't his working correct? + this.hBox.getStyleClass().add("list-cell-selected"); + this.selectIcon.setDisable(true); + } } public void logout() { @@ -109,26 +130,25 @@ public class AccountListCell extends ListCell implements Initializable } else { Minosoft.selectAccount(Minosoft.getConfig().getAccounts().values().iterator().next()); } - MOJANG_ACCOUNT_LIST_VIEW.refresh(); + ACCOUNT_LIST_VIEW.refresh(); } - Log.info(String.format("Deleted account (id=%s, username=%s)", this.account.getId(), this.account.getUsername())); - MOJANG_ACCOUNT_LIST_VIEW.getItems().remove(this.account); + Log.info(String.format("Deleted account (type=%s, id=%s, username=%s)", this.account.getClass().getSimpleName(), this.account.getId(), this.account.getUsername())); + ACCOUNT_LIST_VIEW.getItems().remove(this.account); + } + + public void info() { + // ToDo } public void clicked(MouseEvent e) { - switch (e.getButton()) { - case PRIMARY -> { - if (e.getClickCount() == 2) { - select(); - } - } - case SECONDARY -> this.optionsMenu.fire(); + if (e.getButton() != MouseButton.PRIMARY) { + return; } + if (e.getClickCount() != 2) { + return; + } + + select(); } - public void select() { - Minosoft.selectAccount(this.account); - MOJANG_ACCOUNT_LIST_VIEW.refresh(); - ServerListCell.SERVER_LIST_VIEW.refresh(); - } } diff --git a/src/main/java/de/bixilon/minosoft/gui/main/dialogs/MojangLoginController.java b/src/main/java/de/bixilon/minosoft/gui/main/dialogs/MojangLoginController.java index 7d2cbf446..e041babff 100644 --- a/src/main/java/de/bixilon/minosoft/gui/main/dialogs/MojangLoginController.java +++ b/src/main/java/de/bixilon/minosoft/gui/main/dialogs/MojangLoginController.java @@ -20,7 +20,7 @@ import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.data.accounts.MojangAccount; import de.bixilon.minosoft.data.locale.LocaleManager; import de.bixilon.minosoft.data.locale.Strings; -import de.bixilon.minosoft.gui.main.AccountListCell; +import de.bixilon.minosoft.gui.main.cells.AccountListCell; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.util.mojang.api.MojangAuthentication; import de.bixilon.minosoft.util.mojang.api.exceptions.AuthenticationException; @@ -91,7 +91,7 @@ public class MojangLoginController implements Initializable { account.saveToConfig(); Log.info(String.format("Added and saved account (type=mojang, username=%s, email=%s, uuid=%s)", account.getUsername(), account.getEmail(), account.getUUID())); Platform.runLater(() -> { - AccountListCell.MOJANG_ACCOUNT_LIST_VIEW.getItems().add(account); + AccountListCell.ACCOUNT_LIST_VIEW.getItems().add(account); close(); }); if (Minosoft.getConfig().getSelectedAccount() == null) { diff --git a/src/main/java/de/bixilon/minosoft/gui/main/dialogs/OfflineLoginController.java b/src/main/java/de/bixilon/minosoft/gui/main/dialogs/OfflineLoginController.java index fdedb2539..359983959 100644 --- a/src/main/java/de/bixilon/minosoft/gui/main/dialogs/OfflineLoginController.java +++ b/src/main/java/de/bixilon/minosoft/gui/main/dialogs/OfflineLoginController.java @@ -19,7 +19,7 @@ import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.data.accounts.OfflineAccount; import de.bixilon.minosoft.data.locale.LocaleManager; import de.bixilon.minosoft.data.locale.Strings; -import de.bixilon.minosoft.gui.main.AccountListCell; +import de.bixilon.minosoft.gui.main.cells.AccountListCell; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; import de.bixilon.minosoft.util.Util; @@ -85,7 +85,7 @@ public class OfflineLoginController implements Initializable { account.saveToConfig(); Log.info(String.format("Added and saved account (type=offline, username=%s, uuid=%s)", account.getUsername(), account.getUUID())); Platform.runLater(() -> { - AccountListCell.MOJANG_ACCOUNT_LIST_VIEW.getItems().add(account); + AccountListCell.ACCOUNT_LIST_VIEW.getItems().add(account); close(); }); if (Minosoft.getConfig().getSelectedAccount() == null) { diff --git a/src/main/resources/assets/locale/de_DE.json b/src/main/resources/assets/locale/de_DE.json index 801d6ff23..6ae93aed6 100644 --- a/src/main/resources/assets/locale/de_DE.json +++ b/src/main/resources/assets/locale/de_DE.json @@ -27,7 +27,8 @@ "SERVER_INFO_SERVER_MODDED_MOD_LIST": "Mod liste", "SESSIONS_DIALOG_TITLE": "Verbindungen - {0} - Minosoft", "ACCOUNTS_ACTION_SELECT": "Auswählen", - "ACCOUNTS_ACTION_DELETE": "Löschen", + "ACCOUNTS_ACTION_INFO": "Info", + "ACCOUNTS_ACTION_LOGOUT": "Abmelden", "SERVER_ACTION_CONNECT": "Verbinden", "SERVER_ACTION_SHOW_INFO": "Infos", "SERVER_ACTION_EDIT": "Bearbeiten", diff --git a/src/main/resources/assets/locale/en_US.json b/src/main/resources/assets/locale/en_US.json index 7637a5711..6b7cb04c7 100644 --- a/src/main/resources/assets/locale/en_US.json +++ b/src/main/resources/assets/locale/en_US.json @@ -28,7 +28,8 @@ "SERVER_INFO_SERVER_MODDED_MOD_LIST": "Mod list", "SESSIONS_DIALOG_TITLE": "Sessions - {0} - Minosoft", "ACCOUNTS_ACTION_SELECT": "Select", - "ACCOUNTS_ACTION_DELETE": "Delete", + "ACCOUNTS_ACTION_INFO": "Info", + "ACCOUNTS_ACTION_LOGOUT": "Logout", "SERVER_ACTION_CONNECT": "Connect", "SERVER_ACTION_SHOW_INFO": "Info", "SERVER_ACTION_EDIT": "Edit", diff --git a/src/main/resources/layout/accounts.fxml b/src/main/resources/layout/accounts.fxml index e99f20d25..cf1a6748d 100644 --- a/src/main/resources/layout/accounts.fxml +++ b/src/main/resources/layout/accounts.fxml @@ -21,8 +21,8 @@ - - + + diff --git a/src/main/resources/layout/cells/account.fxml b/src/main/resources/layout/cells/account.fxml index 2144f497a..86f3f6b62 100644 --- a/src/main/resources/layout/cells/account.fxml +++ b/src/main/resources/layout/cells/account.fxml @@ -11,20 +11,56 @@ ~ ~ This software is not affiliated with Mojang AB, the original developer of Minecraft. --> - + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/layout/style.css b/src/main/resources/layout/style.css index 6f8c6c31b..de9ac6094 100644 --- a/src/main/resources/layout/style.css +++ b/src/main/resources/layout/style.css @@ -174,6 +174,10 @@ -fx-background-color: darkseagreen; } +.list-cell-selected { + -fx-background-color: darkseagreen; +} + .ping-5-bars { -fx-text-fill: greenyellow; } @@ -205,3 +209,7 @@ .error { -fx-text-fill: red; } + +.account-type { + -fx-text-fill: -secondary-light-light-color; +}