From 5c6b98fd1405bf125bbb7ab45e47fa0e01fa77ac Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 4 Aug 2023 05:03:24 +0000 Subject: [PATCH] Fix operation mode handling when tray is not available --- .../xpipe/app/comp/base/SideMenuBarComp.java | 7 ++- .../java/io/xpipe/app/core/AppMainWindow.java | 2 +- .../java/io/xpipe/app/core/mode/BaseMode.java | 7 +++ .../io/xpipe/app/prefs/CloseBehaviour.java | 48 ++++++++++++++----- .../xpipe/app/prefs/ExternalTerminalType.java | 2 +- .../io/xpipe/app/prefs/StartupBehaviour.java | 24 +++++++--- .../resources/lang/translations_en.properties | 1 + 7 files changed, 69 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/comp/base/SideMenuBarComp.java b/app/src/main/java/io/xpipe/app/comp/base/SideMenuBarComp.java index a33ad066a..5dd58a448 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/SideMenuBarComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/SideMenuBarComp.java @@ -53,7 +53,11 @@ public class SideMenuBarComp extends Comp> { { var fi = new FontIcon("mdi2u-update"); - var b = new IconButtonComp("mdi2u-update", () -> UpdateAvailableAlert.showIfNeeded()); + var b = new IconButtonComp("mdi2u-update", () -> UpdateAvailableAlert.showIfNeeded()) + .apply(new FancyTooltipAugment<>("updateAvailableTooltip")); + b.apply(struc -> { + AppFont.setSize(struc.get(), 2); + }); b.hide(PlatformThread.sync(Bindings.createBooleanBinding( () -> { return XPipeDistributionType.get() @@ -76,5 +80,4 @@ public class SideMenuBarComp extends Comp> { vbox.getStyleClass().add("sidebar-comp"); return new SimpleCompStructure<>(vbox); } - } diff --git a/app/src/main/java/io/xpipe/app/core/AppMainWindow.java b/app/src/main/java/io/xpipe/app/core/AppMainWindow.java index 19fc762eb..de336718e 100644 --- a/app/src/main/java/io/xpipe/app/core/AppMainWindow.java +++ b/app/src/main/java/io/xpipe/app/core/AppMainWindow.java @@ -148,7 +148,7 @@ public class AppMainWindow { Stage.getWindows().stream().filter(w -> !w.equals(stage)).toList().forEach(w -> w.fireEvent(e)); stage.close(); - AppPrefs.get().closeBehaviour().getValue().getExit().run(); + AppPrefs.get().closeBehaviour().getValue().run(); e.consume(); }); diff --git a/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java b/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java index fae040575..821a06273 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java @@ -14,6 +14,8 @@ import io.xpipe.core.util.JacksonMapper; public class BaseMode extends OperationMode { + private boolean initialized; + @Override public boolean isSupported() { return true; @@ -26,6 +28,10 @@ public class BaseMode extends OperationMode { @Override public void onSwitchTo() throws Throwable { + if (initialized) { + return; + } + TrackEvent.info("mode", "Initializing base mode components ..."); AppExtensionManager.init(true); JacksonMapper.initModularized(AppExtensionManager.getInstance().getExtendedLayer()); @@ -45,6 +51,7 @@ public class BaseMode extends OperationMode { FileBridge.init(); AppSocketServer.init(); TrackEvent.info("mode", "Finished base components initialization"); + initialized = true; } @Override diff --git a/app/src/main/java/io/xpipe/app/prefs/CloseBehaviour.java b/app/src/main/java/io/xpipe/app/prefs/CloseBehaviour.java index fee083c92..52bcf84e1 100644 --- a/app/src/main/java/io/xpipe/app/prefs/CloseBehaviour.java +++ b/app/src/main/java/io/xpipe/app/prefs/CloseBehaviour.java @@ -6,23 +6,47 @@ import lombok.Getter; @Getter public enum CloseBehaviour implements PrefsChoiceValue { - QUIT("app.quit", () -> { - OperationMode.shutdown(false, false); - }), + QUIT("app.quit") { + @Override + public void run() { + OperationMode.shutdown(false, false); + } - MINIMIZE_TO_TRAY("app.minimizeToTray", () -> { - OperationMode.switchToAsync(OperationMode.TRAY); - }); + @Override + public boolean isSelectable() { + return true; + } + }, + + MINIMIZE_TO_TRAY("app.minimizeToTray") { + @Override + public void run() { + OperationMode.switchToAsync(OperationMode.TRAY); + } + + @Override + public boolean isSelectable() { + return OperationMode.TRAY.isSupported(); + } + }, + + CONTINUE_IN_BACKGROUND("app.continueInBackground") { + @Override + public void run() { + OperationMode.switchToAsync(OperationMode.BACKGROUND); + } + + @Override + public boolean isSelectable() { + return !OperationMode.TRAY.isSupported(); + } + }; private final String id; - private final Runnable exit; - CloseBehaviour(String id, Runnable exit) { + CloseBehaviour(String id) { this.id = id; - this.exit = exit; } - public boolean isSelectable() { - return true; - } + public abstract void run(); } diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java index 198728d71..adf832d9d 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java @@ -194,7 +194,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { // Note for later: When debugging konsole launches, it will always open as a child process of // IntelliJ/XPipe even though we try to detach it. // This is not the case for production where it works as expected - return CommandBuilder.of().add("--new-tab", "-e").add("--").addFile(file); + return CommandBuilder.of().add("--new-tab", "-e").addFile(file); } @Override diff --git a/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java b/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java index d86e8bb03..9ced11aa7 100644 --- a/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java +++ b/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java @@ -1,5 +1,6 @@ package io.xpipe.app.prefs; +import io.xpipe.app.core.mode.OperationMode; import io.xpipe.app.ext.PrefsChoiceValue; import io.xpipe.core.util.XPipeDaemonMode; import lombok.AllArgsConstructor; @@ -8,13 +9,24 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum StartupBehaviour implements PrefsChoiceValue { - GUI("app.startGui", XPipeDaemonMode.GUI), - TRAY("app.startInTray", XPipeDaemonMode.TRAY); + GUI("app.startGui", XPipeDaemonMode.GUI) { + public boolean isSelectable() { + return true; + } + }, + TRAY("app.startInTray", XPipeDaemonMode.TRAY) { + + public boolean isSelectable() { + return OperationMode.TRAY.isSupported(); + } + }, + BACKGROUND("app.startInBackground", XPipeDaemonMode.BACKGROUND) { + + public boolean isSelectable() { + return !OperationMode.TRAY.isSupported(); + } + }; private final String id; private final XPipeDaemonMode mode; - - public boolean isSelectable() { - return true; - } } diff --git a/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties b/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties index df1a9082b..4bc8ece7e 100644 --- a/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties +++ b/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties @@ -199,6 +199,7 @@ updateReadyDescription=An update was downloaded and is ready to be installed updateReadyDescriptionPortable=An update is available to download updateRestart=Restart to update never=Never +updateAvailableTooltip=Update available updateAvailable=Update available: $VERSION$ downloadUpdate=Download update legalAccept=I accept the EULA and the privacy policy