diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java index 8fbb98456..13cfd9121 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftProvider.java @@ -149,7 +149,7 @@ public abstract class IMinecraftProvider { */ public abstract void refreshVersions(); - public final EventHandler onRefreshingVersions = new EventHandler<>(this), + public final EventHandler onRefreshingVersions = new EventHandler<>(this), onRefreshedVersions = new EventHandler<>(this); public final EventHandler onLoadedVersion = new EventHandler<>(this); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java index fe87ab5be..98d8b75fe 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java @@ -68,7 +68,7 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public void refreshVersions() { - onRefreshingVersions.execute(null); + onRefreshingVersions.execute(service); try { MCUtils.tryWriteProfile(service.baseDirectory()); @@ -146,7 +146,7 @@ public class MinecraftVersionManager extends IMinecraftProvider { HMCLog.warn("Ignoring: " + dir + ", the json of this Minecraft is malformed.", e); } } - onRefreshedVersions.execute(null); + onRefreshedVersions.execute(service); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 42eb0444c..b86f675ae 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -98,6 +98,7 @@ public final class Config { public void setLast(String last) { this.last = last; + Settings.onProfileChanged(); Settings.save(); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Profile.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Profile.java index b515e37bc..b42458213 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Profile.java @@ -49,7 +49,7 @@ public final class Profile { gameDir = MCUtils.getInitGameDir().getPath(); } - public Profile(Profile v) { + public Profile(String name, Profile v) { this(); if (v == null) return; @@ -132,7 +132,7 @@ public final class Profile { return name; } - public void setName(String name) { + void setName(String name) { this.name = name; propertyChanged.execute("name"); } @@ -140,4 +140,8 @@ public final class Profile { public void checkFormat() { gameDir = gameDir.replace('/', OS.os().fileSeparator).replace('\\', OS.os().fileSeparator); } + + public void onSelected() { + service().version().refreshVersions(); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java index f2151c3ee..f85366aa5 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java @@ -27,6 +27,7 @@ import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.util.CollectionUtils; +import org.jackhuang.hellominecraft.util.EventHandler; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.MessageBox; @@ -56,7 +57,9 @@ public final class Settings { if (!getProfiles().containsKey(DEFAULT_PROFILE)) getProfiles().put(DEFAULT_PROFILE, new Profile()); - for (Profile e : getProfiles().values()) { + for (Map.Entry entry : getProfiles().entrySet()) { + Profile e = entry.getValue(); + e.setName(entry.getKey()); e.checkFormat(); e.propertyChanged.register(Settings::save); } @@ -91,6 +94,10 @@ public final class Settings { } } + public static Profile getLastProfile() { + return getProfile(getInstance().getLast()); + } + public static Profile getProfile(String name) { if (name == null) return getProfiles().get("Default"); @@ -113,7 +120,7 @@ public final class Settings { return SETTINGS.getConfigurations().firstEntry().getValue(); } - public static boolean trySetProfile(Profile ver) { + public static boolean putProfile(Profile ver) { if (ver == null || ver.getName() == null || getProfiles().containsKey(ver.getName())) return false; getProfiles().put(ver.getName(), ver); @@ -131,4 +138,18 @@ public final class Settings { } return getProfiles().remove(ver) != null; } + + public static final EventHandler profileChangedEvent = new EventHandler(null); + public static final EventHandler profileLoadingEvent = new EventHandler(null); + + static void onProfileChanged() { + Profile p = getLastProfile(); + profileChangedEvent.execute(p); + p.onSelected(); + } + + public static void onProfileLoading() { + profileLoadingEvent.execute(null); + onProfileChanged(); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java index 4e7d3c765..98d43f16b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java @@ -89,8 +89,22 @@ public class AnimatedPanel extends JPanel implements Selectable { g.drawImage(image, 0, 0, this); } + boolean selected = false; + + @Override + public boolean isSelected() { + return selected; + } + @Override public void onSelected() { - animate(); + if (!selected) + animate(); + selected = true; + } + + @Override + public void onLeaving() { + selected = false; } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form index 208ff0b85..5a7e38271 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form @@ -250,7 +250,7 @@ - + @@ -302,7 +302,7 @@ - + @@ -326,7 +326,7 @@ - + @@ -470,7 +470,7 @@ - + @@ -521,7 +521,7 @@ - + @@ -531,7 +531,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java index c50d60347..ff2893b0f 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java @@ -33,6 +33,7 @@ import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import java.util.List; +import javax.swing.DefaultComboBoxModel; import javax.swing.JFileChooser; import javax.swing.JMenuItem; import javax.swing.JOptionPane; @@ -49,16 +50,16 @@ import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.util.FileNameFilter; import org.jackhuang.hellominecraft.launcher.core.mod.ModInfo; import org.jackhuang.hellominecraft.launcher.core.install.InstallerType; +import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; -import org.jackhuang.hellominecraft.launcher.util.DefaultMinecraftService; import org.jackhuang.hellominecraft.launcher.setting.VersionSetting; -import org.jackhuang.hellominecraft.util.Event; import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.OverridableSwingWorker; import org.jackhuang.hellominecraft.util.version.MinecraftVersionRequest; import org.jackhuang.hellominecraft.util.system.OS; import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.func.Consumer; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; @@ -102,6 +103,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget for (Java j : Java.JAVA) cboJava.addItem(j.getLocalizedName()); + Settings.profileLoadingEvent.register(onLoadingProfiles); + Settings.profileChangedEvent.register(onSelectedProfilesChanged); + dropTarget = new DropTarget(lstExternalMods, DnDConstants.ACTION_COPY_OR_MOVE, this); } @@ -341,9 +345,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget lblDimensionX.setText("x"); chkFullscreen.setText(C.i18n("settings.fullscreen")); // NOI18N - chkFullscreen.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - chkFullscreenFocusLost(evt); + chkFullscreen.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkFullscreenItemStateChanged(evt); } }); @@ -374,9 +378,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget }); cboLauncherVisibility.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.launcher_visibility.close"), C.i18n("advancedsettings.launcher_visibility.hide"), C.i18n("advancedsettings.launcher_visibility.keep") })); - cboLauncherVisibility.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - cboLauncherVisibilityFocusLost(evt); + cboLauncherVisibility.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + cboLauncherVisibilityItemStateChanged(evt); } }); @@ -385,9 +389,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget lblRunDirectory.setText(C.i18n("settings.run_directory")); // NOI18N cboRunDirectory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.game_dir.default"), C.i18n("advancedsettings.game_dir.independent") })); - cboRunDirectory.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - cboRunDirectoryFocusLost(evt); + cboRunDirectory.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + cboRunDirectoryItemStateChanged(evt); } }); @@ -509,9 +513,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget tabVersionEdit.addTab(C.i18n("settings"), pnlSettings); // NOI18N chkDebug.setText(C.i18n("advancedsettings.debug_mode")); // NOI18N - chkDebug.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - chkDebugFocusLost(evt); + chkDebug.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkDebugItemStateChanged(evt); } }); @@ -541,16 +545,16 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget }); chkNoJVMArgs.setText(C.i18n("advancedsettings.no_jvm_args")); // NOI18N - chkNoJVMArgs.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - chkNoJVMArgsFocusLost(evt); + chkNoJVMArgs.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkNoJVMArgsItemStateChanged(evt); } }); chkCancelWrapper.setText(C.i18n("advancedsettings.cancel_wrapper_launcher")); // NOI18N - chkCancelWrapper.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - chkCancelWrapperFocusLost(evt); + chkCancelWrapper.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkCancelWrapperItemStateChanged(evt); } }); @@ -933,12 +937,8 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget }// //GEN-END:initComponents // private void cboProfilesItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboProfilesItemStateChanged - if (!isLoading) { + if (!isLoading) Settings.getInstance().setLast((String) cboProfiles.getSelectedItem()); - if (getProfile().service().version().getVersionCount() <= 0) - versionChanged(null); - prepareProfile(getProfile()); - } }//GEN-LAST:event_cboProfilesItemStateChanged private void btnNewProfileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewProfileActionPerformed @@ -956,8 +956,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged if (isLoading || evt.getStateChange() != ItemEvent.SELECTED || cboVersions.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboVersions.getSelectedItem())) return; - String mcv = (String) cboVersions.getSelectedItem(); - getProfile().setSelectedMinecraftVersion(mcv); + getProfile().setSelectedMinecraftVersion((String) cboVersions.getSelectedItem()); }//GEN-LAST:event_cboVersionsItemStateChanged private void btnRefreshVersionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshVersionsActionPerformed @@ -972,73 +971,11 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget ppmManage.show(evt.getComponent(), evt.getPoint().x, evt.getPoint().y); }//GEN-LAST:event_btnModifyMouseClicked - private void txtJavaArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaArgsFocusLost - getProfile().getSelectedVersionSetting().setJavaArgs(txtJavaArgs.getText()); - }//GEN-LAST:event_txtJavaArgsFocusLost - - private void txtMinecraftArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMinecraftArgsFocusLost - getProfile().getSelectedVersionSetting().setMinecraftArgs(txtMinecraftArgs.getText()); - }//GEN-LAST:event_txtMinecraftArgsFocusLost - - private void txtPermSizeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPermSizeFocusLost - getProfile().getSelectedVersionSetting().setPermSize(txtPermSize.getText()); - }//GEN-LAST:event_txtPermSizeFocusLost - - private void chkDebugFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkDebugFocusLost - getProfile().getSelectedVersionSetting().setDebug(chkDebug.isSelected()); - }//GEN-LAST:event_chkDebugFocusLost - - private void chkNoJVMArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkNoJVMArgsFocusLost - getProfile().getSelectedVersionSetting().setNoJVMArgs(chkNoJVMArgs.isSelected()); - }//GEN-LAST:event_chkNoJVMArgsFocusLost - - private void chkCancelWrapperFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkCancelWrapperFocusLost - getProfile().getSelectedVersionSetting().setCanceledWrapper(chkCancelWrapper.isSelected()); - }//GEN-LAST:event_chkCancelWrapperFocusLost - - private void txtPrecalledCommandFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPrecalledCommandFocusLost - getProfile().getSelectedVersionSetting().setPrecalledCommand(txtPrecalledCommand.getText()); - }//GEN-LAST:event_txtPrecalledCommandFocusLost - - private void txtServerIPFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtServerIPFocusLost - getProfile().getSelectedVersionSetting().setServerIp(txtServerIP.getText()); - }//GEN-LAST:event_txtServerIPFocusLost - - private void cboRunDirectoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboRunDirectoryFocusLost - if (cboRunDirectory.getSelectedIndex() >= 0) - getProfile().getSelectedVersionSetting().setGameDirType(GameDirType.values()[cboRunDirectory.getSelectedIndex()]); - }//GEN-LAST:event_cboRunDirectoryFocusLost - - private void cboLauncherVisibilityFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_cboLauncherVisibilityFocusLost - if (cboLauncherVisibility.getSelectedIndex() >= 0) - getProfile().getSelectedVersionSetting().setLauncherVisibility(LauncherVisibility.values()[cboLauncherVisibility.getSelectedIndex()]); - }//GEN-LAST:event_cboLauncherVisibilityFocusLost - private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed if (mcVersion != null) getProfile().service().asset().downloadAssets(mcVersion).run(); }//GEN-LAST:event_btnDownloadAllAssetsActionPerformed - private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost - getProfile().getSelectedVersionSetting().setMaxMemory(txtMaxMemory.getText()); - }//GEN-LAST:event_txtMaxMemoryFocusLost - - private void txtJavaDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaDirFocusLost - getProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); - }//GEN-LAST:event_txtJavaDirFocusLost - - private void chkFullscreenFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkFullscreenFocusLost - getProfile().getSelectedVersionSetting().setFullscreen(chkFullscreen.isSelected()); - }//GEN-LAST:event_chkFullscreenFocusLost - - private void txtHeightFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtHeightFocusLost - getProfile().getSelectedVersionSetting().setHeight(txtHeight.getText()); - }//GEN-LAST:event_txtHeightFocusLost - - private void txtWidthFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWidthFocusLost - getProfile().getSelectedVersionSetting().setWidth(txtWidth.getText()); - }//GEN-LAST:event_txtWidthFocusLost - private void txtGameDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtGameDirFocusLost getProfile().setGameDir(txtGameDir.getText()); loadVersions(); @@ -1155,34 +1092,80 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget MessageBox.Show(C.i18n("setupwindow.no_empty_name")); return; } - Settings.trySetProfile(new Profile(name).setGameDir(newGameDir.getAbsolutePath())); + Settings.putProfile(new Profile(name).setGameDir(newGameDir.getAbsolutePath())); MessageBox.Show(C.i18n("setupwindow.find_in_configurations")); loadProfiles(); } }//GEN-LAST:event_btnIncludeMinecraftActionPerformed + private void cboRunDirectoryItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboRunDirectoryItemStateChanged + if (!isLoading && cboRunDirectory.getSelectedIndex() >= 0) + getProfile().getSelectedVersionSetting().setGameDirType(GameDirType.values()[cboRunDirectory.getSelectedIndex()]); + }//GEN-LAST:event_cboRunDirectoryItemStateChanged + + private void cboLauncherVisibilityItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboLauncherVisibilityItemStateChanged + if (!isLoading && cboLauncherVisibility.getSelectedIndex() >= 0) + getProfile().getSelectedVersionSetting().setLauncherVisibility(LauncherVisibility.values()[cboLauncherVisibility.getSelectedIndex()]); + }//GEN-LAST:event_cboLauncherVisibilityItemStateChanged + + private void chkFullscreenItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkFullscreenItemStateChanged + if (!isLoading) + getProfile().getSelectedVersionSetting().setFullscreen(chkFullscreen.isSelected()); + }//GEN-LAST:event_chkFullscreenItemStateChanged + + private void chkDebugItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkDebugItemStateChanged + if (!isLoading) + getProfile().getSelectedVersionSetting().setDebug(chkDebug.isSelected()); + }//GEN-LAST:event_chkDebugItemStateChanged + + private void chkCancelWrapperItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkCancelWrapperItemStateChanged + if (!isLoading) + getProfile().getSelectedVersionSetting().setCanceledWrapper(chkCancelWrapper.isSelected()); + }//GEN-LAST:event_chkCancelWrapperItemStateChanged + + private void chkNoJVMArgsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkNoJVMArgsItemStateChanged + if (!isLoading) + getProfile().getSelectedVersionSetting().setNoJVMArgs(chkNoJVMArgs.isSelected()); + }//GEN-LAST:event_chkNoJVMArgsItemStateChanged + + private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost + getProfile().getSelectedVersionSetting().setMaxMemory(txtMaxMemory.getText()); + }//GEN-LAST:event_txtMaxMemoryFocusLost + + private void txtWidthFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWidthFocusLost + getProfile().getSelectedVersionSetting().setWidth(txtWidth.getText()); + }//GEN-LAST:event_txtWidthFocusLost + + private void txtHeightFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtHeightFocusLost + getProfile().getSelectedVersionSetting().setHeight(txtHeight.getText()); + }//GEN-LAST:event_txtHeightFocusLost + + private void txtJavaDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaDirFocusLost + getProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); + }//GEN-LAST:event_txtJavaDirFocusLost + + private void txtJavaArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaArgsFocusLost + getProfile().getSelectedVersionSetting().setJavaArgs(txtJavaArgs.getText()); + }//GEN-LAST:event_txtJavaArgsFocusLost + + private void txtMinecraftArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMinecraftArgsFocusLost + getProfile().getSelectedVersionSetting().setMinecraftArgs(txtMinecraftArgs.getText()); + }//GEN-LAST:event_txtMinecraftArgsFocusLost + + private void txtPermSizeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPermSizeFocusLost + getProfile().getSelectedVersionSetting().setPermSize(txtPermSize.getText()); + }//GEN-LAST:event_txtPermSizeFocusLost + + private void txtPrecalledCommandFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPrecalledCommandFocusLost + getProfile().getSelectedVersionSetting().setPrecalledCommand(txtPrecalledCommand.getText()); + }//GEN-LAST:event_txtPrecalledCommandFocusLost + + private void txtServerIPFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtServerIPFocusLost + getProfile().getSelectedVersionSetting().setServerIp(txtServerIP.getText()); + }//GEN-LAST:event_txtServerIPFocusLost + // // - private void loadProfiles() { - isLoading = true; - cboProfiles.removeAllItems(); - int index = 0, i = 0; - for (Profile s : Settings.getProfilesFiltered()) { - cboProfiles.addItem(s.getName()); - if (StrUtils.isEquals(s.getName(), Settings.getInstance().getLast())) - index = i; - i++; - } - - isLoading = false; - if (index < cboProfiles.getItemCount()) { - isLoading = true; - cboProfiles.setSelectedIndex(index); - isLoading = false; - prepareProfile(getProfile()); - } - } - final Profile getProfile() { return Settings.getProfile((String) cboProfiles.getSelectedItem()); } @@ -1191,24 +1174,10 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget return getProfile().getSelectedVersion(); } - Event onRefreshedVersions = (sender, e) -> { - loadVersions(); - return true; - }; - - void prepareProfile(Profile profile) { - if (profile == null) - return; - profile.selectedVersionChangedEvent.register(selectedVersionChangedEvent); - profile.service().version().onRefreshedVersions.register(onRefreshedVersions); - txtGameDir.setText(profile.getGameDir()); - - loadVersions(); - } - void prepareVersionSetting(VersionSetting profile) { if (profile == null) return; + isLoading = true; txtWidth.setText(profile.getWidth()); txtHeight.setText(profile.getHeight()); txtMaxMemory.setText(profile.getMaxMemory()); @@ -1224,33 +1193,11 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget chkCancelWrapper.setSelected(profile.isCanceledWrapper()); cboLauncherVisibility.setSelectedIndex(profile.getLauncherVisibility().ordinal()); cboRunDirectory.setSelectedIndex(profile.getGameDirType().ordinal()); - - isLoading = true; cboJava.setSelectedIndex(profile.getJavaIndexInAllJavas()); isLoading = false; cboJavaItemStateChanged(new ItemEvent(cboJava, 0, cboJava.getSelectedItem(), ItemEvent.SELECTED)); } - void loadVersions() { - isLoading = true; - cboVersions.removeAllItems(); - int index = 0, i = 0; - String selectedMC = getProfile().getSelectedVersion(); - for (MinecraftVersion each : getProfile().service().version().getVersions()) { - cboVersions.addItem(each.id); - if (StrUtils.isEquals(each.id, selectedMC)) - index = i; - i++; - } - isLoading = false; - if (index < cboVersions.getItemCount()) - cboVersions.setSelectedIndex(index); - - reloadMods(); - prepareVersionSetting(((DefaultMinecraftService) getProfile().service()).getVersionSetting(getProfile().getSelectedVersion())); - loadMinecraftVersion(getProfile().getSelectedVersion()); - } - /** * Anaylze the jar of selected minecraft version of current getProfile() to * get the version. @@ -1330,21 +1277,37 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget } // - public void versionChanged(String version) { - this.mcVersion = version; - prepareVersionSetting(getProfile().getVersionSetting(version)); - loadMinecraftVersion(version); - for (InstallerPanel p : installerPanels) - p.loadVersions(); + void save() { + VersionSetting vs = getProfile().getSelectedVersionSetting(); + if (txtServerIP.hasFocus()) + vs.setServerIp(txtServerIP.getText()); + if (txtPrecalledCommand.hasFocus()) + vs.setPrecalledCommand(txtPrecalledCommand.getText()); + if (txtPermSize.hasFocus()) + vs.setPermSize(txtPermSize.getText()); + if (txtMinecraftArgs.hasFocus()) + vs.setMinecraftArgs(txtMinecraftArgs.getText()); + if (txtJavaArgs.hasFocus()) + vs.setJavaArgs(txtJavaArgs.getText()); + if (txtJavaDir.hasFocus()) + vs.setJavaDir(txtJavaDir.getText()); + if (txtHeight.hasFocus()) + vs.setHeight(txtHeight.getText()); + if (txtWidth.hasFocus()) + vs.setWidth(txtWidth.getText()); + if (txtMaxMemory.hasFocus()) + vs.setMaxMemory(txtMaxMemory.getText()); } @Override public void onSelected() { - loadProfiles(); - if (getProfile().service().version().getVersionCount() <= 0) - versionChanged(null); - else - versionChanged((String) cboVersions.getSelectedItem()); + super.onSelected(); + Settings.onProfileLoading(); + } + + public void onLeaving() { + super.onLeaving(); + save(); } public void showGameDownloads() { @@ -1424,9 +1387,53 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget private final javax.swing.JPanel pnlGameDownloads; // - Event selectedVersionChangedEvent = (Object sender, String e) -> { - versionChanged(e); - cboVersions.setToolTipText(e); - return true; + final Runnable onLoadingProfiles = this::loadProfiles; + + private void loadProfiles() { + DefaultComboBoxModel model = new DefaultComboBoxModel(); + for (Profile s : Settings.getProfilesFiltered()) + model.addElement(s.getName()); + cboProfiles.setModel(model); + } + + final Consumer onRefreshedVersions = t -> { + if (getProfile().service() == t) + loadVersions(); + }; + + void loadVersions() { + DefaultComboBoxModel model = new DefaultComboBoxModel(); + for (MinecraftVersion each : getProfile().service().version().getVersions()) { + if (each.hidden) + continue; + model.addElement(each.id); + } + cboVersions.setModel(model); + if (getProfile().getSelectedVersion() != null) + selectedVersionChangedEvent.accept(getProfile().getSelectedVersion()); + } + + final Consumer selectedVersionChangedEvent = this::versionChanged; + + public void versionChanged(String version) { + isLoading = true; + ((DefaultComboBoxModel) cboVersions.getModel()).setSelectedItem(version); + cboVersions.setToolTipText(version); + + this.mcVersion = version; + reloadMods(); + prepareVersionSetting(getProfile().getVersionSetting(version)); + loadMinecraftVersion(version); + for (InstallerPanel p : installerPanels) + p.loadVersions(); + isLoading = false; + } + + final Consumer onSelectedProfilesChanged = t -> { + t.service().version().onRefreshedVersions.register(onRefreshedVersions); + t.selectedVersionChangedEvent.register(selectedVersionChangedEvent); + + ((DefaultComboBoxModel) cboProfiles.getModel()).setSelectedItem(t.getName()); + txtGameDir.setText(t.getGameDir()); }; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index 150ae2790..bfa15860c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -204,7 +204,7 @@ - + @@ -286,7 +286,7 @@ - + @@ -296,7 +296,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index c0a776ea7..b202ec350 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -142,9 +142,9 @@ public class LauncherSettingsPanel extends AnimatedPanel { }); chkEnableShadow.setText(C.i18n("launcher.enable_shadow")); // NOI18N - chkEnableShadow.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - chkEnableShadowFocusLost(evt); + chkEnableShadow.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkEnableShadowItemStateChanged(evt); } }); @@ -192,16 +192,16 @@ public class LauncherSettingsPanel extends AnimatedPanel { lblProxyPassword.setText(C.i18n("proxy.password")); // NOI18N chkEnableAnimation.setText(C.i18n("launcher.enable_animation")); // NOI18N - chkEnableAnimation.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - chkEnableAnimationFocusLost(evt); + chkEnableAnimation.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkEnableAnimationItemStateChanged(evt); } }); chkDecorated.setText(C.i18n("launcher.decorated")); // NOI18N - chkDecorated.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - chkDecoratedFocusLost(evt); + chkDecorated.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkDecoratedItemStateChanged(evt); } }); @@ -359,14 +359,30 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.UPDATE_CHECKER.process(true); }//GEN-LAST:event_btnCheckUpdateActionPerformed - private void chkEnableShadowFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkEnableShadowFocusLost - Settings.getInstance().setEnableShadow(chkEnableShadow.isSelected()); - }//GEN-LAST:event_chkEnableShadowFocusLost - private void cboThemeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboThemeItemStateChanged Settings.getInstance().setTheme(cboTheme.getSelectedIndex()); }//GEN-LAST:event_cboThemeItemStateChanged + private void lblModpackMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModpackMouseClicked + SwingUtils.openLink("http://blog.163.com/huanghongxun2008@126/blog/static/7738046920160323812771/"); + }//GEN-LAST:event_lblModpackMouseClicked + + private void cboLangItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboLangItemStateChanged + Settings.getInstance().setLocalization(SupportedLocales.values()[cboLang.getSelectedIndex()].name()); + }//GEN-LAST:event_cboLangItemStateChanged + + private void chkEnableShadowItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkEnableShadowItemStateChanged + Settings.getInstance().setEnableShadow(chkEnableShadow.isSelected()); + }//GEN-LAST:event_chkEnableShadowItemStateChanged + + private void chkDecoratedItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkDecoratedItemStateChanged + Settings.getInstance().setDecorated(chkDecorated.isSelected()); + }//GEN-LAST:event_chkDecoratedItemStateChanged + + private void chkEnableAnimationItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkEnableAnimationItemStateChanged + Settings.getInstance().setEnableAnimation(chkEnableAnimation.isSelected()); + }//GEN-LAST:event_chkEnableAnimationItemStateChanged + private void txtProxyHostFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtProxyHostFocusLost Settings.getInstance().setProxyHost(txtProxyHost.getText()); }//GEN-LAST:event_txtProxyHostFocusLost @@ -383,22 +399,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.getInstance().setProxyPassword(txtProxyPassword.getText()); }//GEN-LAST:event_txtProxyPasswordFocusLost - private void chkEnableAnimationFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkEnableAnimationFocusLost - Settings.getInstance().setEnableAnimation(chkEnableAnimation.isSelected()); - }//GEN-LAST:event_chkEnableAnimationFocusLost - - private void chkDecoratedFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkDecoratedFocusLost - Settings.getInstance().setDecorated(chkDecorated.isSelected()); - }//GEN-LAST:event_chkDecoratedFocusLost - - private void lblModpackMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModpackMouseClicked - SwingUtils.openLink("http://blog.163.com/huanghongxun2008@126/blog/static/7738046920160323812771/"); - }//GEN-LAST:event_lblModpackMouseClicked - - private void cboLangItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboLangItemStateChanged - Settings.getInstance().setLocalization(SupportedLocales.values()[cboLang.getSelectedIndex()].name()); - }//GEN-LAST:event_cboLangItemStateChanged - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCheckUpdate; private javax.swing.JButton btnSelBackgroundPath; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java index 98ed50a42..53ce9e62e 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java @@ -105,6 +105,7 @@ public final class MainFrame extends DraggableFrame { @Override public void windowClosing(WindowEvent e) { + closing(); } @Override @@ -268,6 +269,7 @@ public final class MainFrame extends DraggableFrame { private AnimatedPanel tabContent[]; public void selectTab(String tabName) { + int chosen = -1; for (int i = 0; i < tabHeader.size(); i++) if (tabName.equalsIgnoreCase(tabHeader.get(i).getActionCommand())) { if (tabContent[i] == null) { @@ -277,22 +279,36 @@ public final class MainFrame extends DraggableFrame { throw new Error(mustnothappen); } tabWrapper[i].add(tabContent[i]); - } - boolean flag = tabHeader.get(i).isActive(); - for (int j = 0; j < tabHeader.size(); j++) - if (j != i) - tabHeader.get(j).setIsActive(false); - tabHeader.get(i).setIsActive(true); - tabContent[i].onSelected(); - if (!flag) - tabContent[i].animate(); + } else if (tabContent[i].isSelected()) + continue; + chosen = i; break; } + if (chosen != -1) { + for (int i = 0; i < tabHeader.size(); i++) + if (i != chosen && tabContent[i] != null && tabContent[i].isSelected()) + tabContent[i].onLeaving(); + for (int i = 0; i < tabHeader.size(); i++) + if (i == chosen) { + for (int j = 0; j < tabHeader.size(); j++) + if (j != i) + tabHeader.get(j).setIsActive(false); + tabHeader.get(i).setIsActive(true); + tabContent[i].onSelected(); + } - this.infoLayout.show(this.infoSwap, tabName); + this.infoLayout.show(this.infoSwap, tabName); + } + } + + protected void closing() { + for (int i = 0; i < tabHeader.size(); i++) + if (tabContent[i] != null && tabContent[i].isSelected()) + tabContent[i].onLeaving(); } protected void closeWindow() { + closing(); System.exit(0); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java index dd76a2b7a..21cadc1fc 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java @@ -22,6 +22,7 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.event.ItemEvent; import java.awt.event.KeyEvent; +import javax.swing.DefaultComboBoxModel; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -34,10 +35,12 @@ import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager; +import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.ui.modpack.ModpackWizard; import org.jackhuang.hellominecraft.lookandfeel.GraphicsUtils; import org.jackhuang.hellominecraft.util.Event; import org.jackhuang.hellominecraft.lookandfeel.comp.ConstomButton; +import org.jackhuang.hellominecraft.util.func.Consumer; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.ui.wizard.api.WizardDisplayer; @@ -78,6 +81,8 @@ public class MainPagePanel extends AnimatedPanel { pnlMore.setOpaque(true); Settings.getInstance().authChangedEvent.register(onAuthChanged); + Settings.profileLoadingEvent.register(onLoadingProfiles); + Settings.profileChangedEvent.register(onSelectedProfilesChanged); MainFrame.INSTANCE.daemon.customizedSuccessEvent = this::prepareAuths; @@ -314,10 +319,8 @@ public class MainPagePanel extends AnimatedPanel { }//GEN-LAST:event_cboLoginModeItemStateChanged private void cboProfilesItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboProfilesItemStateChanged - if (!isLoading && cboProfiles.getSelectedIndex() != -1 && !StrUtils.isBlank((String) cboProfiles.getSelectedItem())) { + if (!isLoading && cboProfiles.getSelectedIndex() != -1 && !StrUtils.isBlank((String) cboProfiles.getSelectedItem())) Settings.getInstance().setLast((String) cboProfiles.getSelectedItem()); - loadMinecraftVersions(); - } }//GEN-LAST:event_cboProfilesItemStateChanged private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged @@ -374,7 +377,7 @@ public class MainPagePanel extends AnimatedPanel { return; String suggestedModpackId = JOptionPane.showInputDialog("Please enter your favourite game name", FileUtils.getBaseName(fc.getSelectedFile().getName())); TaskWindow.factory().append(ModpackManager.install(fc.getSelectedFile(), getProfile().service(), suggestedModpackId)).create(); - loadMinecraftVersions(); + getProfile().service().version().refreshVersions(); }//GEN-LAST:event_btnImportModpackActionPerformed private void btnExportModpackActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExportModpackActionPerformed @@ -400,57 +403,6 @@ public class MainPagePanel extends AnimatedPanel { Settings.getInstance().setLoginType(loginType); } } - - void loadFromSettings() { - for (Profile s : Settings.getProfilesFiltered()) - cboProfiles.addItem(s.getName()); - } - - boolean showedNoVersion = false; - - void loadMinecraftVersions() { - isLoading = true; - cboVersions.removeAllItems(); - int index = 0, i = 0; - getProfile().selectedVersionChangedEvent.register(onVersionChanged); - getProfile().service().version().refreshVersions(); - String selVersion = getProfile().getSelectedVersion(); - if (getProfile().service().version().getVersions().isEmpty()) { - if (!showedNoVersion) - SwingUtilities.invokeLater(() -> { - if (MessageBox.Show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) - MainFrame.INSTANCE.invokeAction("showGameDownloads"); - showedNoVersion = true; - }); - } else { - for (MinecraftVersion mcVersion : getProfile().service().version().getVersions()) { - if (mcVersion.hidden) - continue; - cboVersions.addItem(mcVersion.id); - if (mcVersion.id.equals(selVersion)) - index = i; - i++; - } - if (index < cboVersions.getItemCount()) - cboVersions.setSelectedIndex(index); - } - isLoading = false; - } - - private void refreshMinecrafts(String last) { - isLoading = true; - cboProfiles.removeAllItems(); - loadFromSettings(); - for (int i = 0; i < cboProfiles.getItemCount(); i++) { - String s = (String) cboProfiles.getItemAt(i); - if (s != null && s.equals(last)) { - cboProfiles.setSelectedIndex(i); - break; - } - } - isLoading = false; - loadMinecraftVersions(); - } // // @@ -462,12 +414,13 @@ public class MainPagePanel extends AnimatedPanel { // public Profile getProfile() { - return Settings.getProfile((String) cboProfiles.getSelectedItem()); + return Settings.getProfile(Settings.getInstance().getLast()); } @Override public void onSelected() { - refreshMinecrafts(Settings.getInstance().getLast()); + super.onSelected(); + Settings.onProfileLoading(); } // Variables declaration - do not modify//GEN-BEGIN:variables @@ -490,11 +443,6 @@ public class MainPagePanel extends AnimatedPanel { private javax.swing.JTextField txtPlayerName; // End of variables declaration//GEN-END:variables - final Event onVersionChanged = (sender, v) -> { - cboVersions.setToolTipText(v); - return true; - }; - final Event onAuthChanged = (sender, l) -> { if (l.hasPassword()) { pnlPassword.setVisible(true); @@ -517,4 +465,55 @@ public class MainPagePanel extends AnimatedPanel { return true; }; + final Runnable onLoadingProfiles = this::loadProfiles; + + private void loadProfiles() { + DefaultComboBoxModel model = new DefaultComboBoxModel(); + for (Profile s : Settings.getProfilesFiltered()) + model.addElement(s.getName()); + cboProfiles.setModel(model); + } + + final Consumer onRefreshedVersions = t -> { + if (getProfile().service() == t) + loadVersions(); + }; + + boolean showedNoVersion = false; + + void loadVersions() { + isLoading = true; + cboVersions.removeAllItems(); + String selVersion = getProfile().getSelectedVersion(); + if (getProfile().service().version().getVersions().isEmpty()) { + if (!showedNoVersion) + SwingUtilities.invokeLater(() -> { + if (MessageBox.Show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + MainFrame.INSTANCE.invokeAction("showGameDownloads"); + showedNoVersion = true; + }); + } else { + for (MinecraftVersion mcVersion : getProfile().service().version().getVersions()) { + if (mcVersion.hidden) + continue; + cboVersions.addItem(mcVersion.id); + } + versionChanged.accept(selVersion); + } + isLoading = false; + } + + final Consumer versionChanged = this::versionChanged; + + void versionChanged(String selectedVersion) { + ((DefaultComboBoxModel) cboVersions.getModel()).setSelectedItem(selectedVersion); + cboVersions.setToolTipText(selectedVersion); + } + + final Consumer onSelectedProfilesChanged = t -> { + t.service().version().onRefreshedVersions.register(onRefreshedVersions); + t.selectedVersionChangedEvent.register(versionChanged); + + ((DefaultComboBoxModel) cboProfiles.getModel()).setSelectedItem(t.getName()); + }; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.java index 78b5e82b4..d2ce6b488 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.java @@ -127,9 +127,7 @@ public final class NewProfileWindow extends javax.swing.JDialog { private void txtNewProfileNameKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtNewProfileNameKeyTyped switch (evt.getKeyCode()) { case 13: - Profile newProfile = new Profile(Settings.getProfile(cboProfiles.getSelectedItem().toString())); - newProfile.setName(txtNewProfileName.getText()); - Settings.trySetProfile(newProfile); + act(); break; case 27: this.dispose(); @@ -140,13 +138,16 @@ public final class NewProfileWindow extends javax.swing.JDialog { }//GEN-LAST:event_txtNewProfileNameKeyTyped private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed + act(); + }//GEN-LAST:event_btnOKActionPerformed + + void act() { if (!StrUtils.isBlank(txtNewProfileName.getText())) { - Profile newProfile = new Profile(Settings.getProfile(cboProfiles.getSelectedItem().toString())); - newProfile.setName(txtNewProfileName.getText()); - Settings.trySetProfile(newProfile); + Profile newProfile = new Profile(txtNewProfileName.getText(), Settings.getProfile(cboProfiles.getSelectedItem().toString())); + Settings.putProfile(newProfile); } this.dispose(); - }//GEN-LAST:event_btnOKActionPerformed + } private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelActionPerformed this.dispose(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Selectable.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Selectable.java index a48350ff8..d3a587706 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Selectable.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Selectable.java @@ -24,4 +24,8 @@ package org.jackhuang.hellominecraft.launcher.ui; public interface Selectable { void onSelected(); + + boolean isSelected(); + + void onLeaving(); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultMinecraftService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultMinecraftService.java index 1b3b26f49..4833d0a73 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultMinecraftService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultMinecraftService.java @@ -91,6 +91,10 @@ public class DefaultMinecraftService extends IMinecraftService { vs = C.GSON.fromJson(s, VersionSetting.class); } vs.id = id; + vs.propertyChanged.register((sender, t) -> { + saveVersionSetting(((VersionSetting) sender).id); + return true; + }); versionSettings.put(id, vs); }