From 475569eb473fa8413dc725c739e0281c406dd6bc Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 11 Apr 2019 16:19:35 -0500 Subject: [PATCH 1/4] Fix issue with animation at start --- .../overlays/windows/DaoLaunchWindow.java | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java index 00c0e6c8191..cf2d244edae 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java @@ -63,6 +63,8 @@ @Slf4j public class DaoLaunchWindow extends Overlay { + private static final double DURATION = 400; + private ImageView sectionScreenshot; private ToggleGroup sectionButtonsGroup; private ArrayList
sections = new ArrayList<>(); @@ -72,22 +74,22 @@ public class DaoLaunchWindow extends Overlay { private Timeline slideTimeline; private Section selectedSection; + /////////////////////////////////////////////////////////////////////////////////////////// // Public API /////////////////////////////////////////////////////////////////////////////////////////// - @Override public void show() { width = 1003; super.show(); } + /////////////////////////////////////////////////////////////////////////////////////////// // Protected /////////////////////////////////////////////////////////////////////////////////////////// - @Override protected void createGridPane() { super.createGridPane(); @@ -110,7 +112,6 @@ protected void addHeadLine() { @Override protected void addMessage() { - sections.add(new Section(Res.get("popup.dao.launch.governance.title"), Res.get("popup.dao.launch.governance"), "dao-screenshot-governance")); sections.add(new Section(Res.get("popup.dao.launch.trading.title"), Res.get("popup.dao.launch.trading"), @@ -131,12 +132,7 @@ protected void addMessage() { protected void onShow() { display(); - Timeline timeline = new Timeline(new KeyFrame( - Duration.millis(500), - ae -> slideTimeline.playFromStart() - )); - - timeline.play(); + slideTimeline.playFrom(Duration.millis(2 * DURATION)); } @Override @@ -183,7 +179,6 @@ private void startAutoSectionChange() { } private void createSlideControls() { - sectionButtonsGroup = new ToggleGroup(); HBox slideButtons = new HBox(); @@ -257,8 +252,6 @@ private void goToNextSection() { private void createSlideAnimation() { slideTimeline = new Timeline(); - double duration = 400; - Interpolator interpolator = Interpolator.EASE_OUT; ObservableList keyFrames = slideTimeline.getKeyFrames(); @@ -267,7 +260,7 @@ private void createSlideAnimation() { keyFrames.add(new KeyFrame(Duration.millis(0), new KeyValue(sectionScreenshot.opacityProperty(), 1, interpolator), new KeyValue(sectionScreenshot.translateXProperty(), 0, interpolator))); - keyFrames.add(new KeyFrame(Duration.millis(duration), + keyFrames.add(new KeyFrame(Duration.millis(DURATION), event -> { sectionDescriptionLabel.setText(selectedSection.description); sectionScreenshot.setId(selectedSection.imageId); @@ -277,14 +270,12 @@ private void createSlideAnimation() { double startX = imageWidth; - keyFrames.add(new KeyFrame(Duration.millis(duration), + keyFrames.add(new KeyFrame(Duration.millis(DURATION), new KeyValue(sectionScreenshot.opacityProperty(), 0, interpolator), new KeyValue(sectionScreenshot.translateXProperty(), startX, interpolator))); - duration += 400; - keyFrames.add(new KeyFrame(Duration.millis(duration), + keyFrames.add(new KeyFrame(Duration.millis(DURATION * 2), new KeyValue(sectionScreenshot.opacityProperty(), 1, interpolator), new KeyValue(sectionScreenshot.translateXProperty(), 0, interpolator))); - } protected double getDuration(double duration) { @@ -292,9 +283,7 @@ protected double getDuration(double duration) { } private class SectionButton extends AutoTooltipToggleButton { - int index; - SectionButton(String title, int index) { super(title); this.index = index; @@ -306,7 +295,6 @@ private class SectionButton extends AutoTooltipToggleButton { this.setOnAction(event -> autoPlayTimeline.stop()); } - } private class Section { From 55b8be2cbc2866dc98c47cc336585e4b76edbb17 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 11 Apr 2019 16:20:53 -0500 Subject: [PATCH 2/4] Add isHiddenProperty and displayOrderPriority Needed to support a priority queue for adding multiple popups and then execute the display ordered by priority. --- .../java/bisq/desktop/main/overlays/Overlay.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java b/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java index 93475bcc0c5..5fef0114389 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java @@ -69,6 +69,8 @@ import javafx.geometry.Insets; import javafx.geometry.Pos; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ChangeListener; import javafx.collections.ObservableList; @@ -84,6 +86,8 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -134,7 +138,6 @@ protected enum Type { } protected final static double DEFAULT_WIDTH = 668; - protected Stage stage; protected GridPane gridPane; protected Pane owner; @@ -147,6 +150,15 @@ protected enum Type { private boolean showBusyAnimation; protected boolean hideCloseButton; protected boolean isDisplayed; + + @Getter + protected BooleanProperty isHiddenProperty = new SimpleBooleanProperty(); + + // Used when a priority queue is used for displaying order of popups. Higher numbers mean lower priority + @Setter + @Getter + protected Integer displayOrderPriority = Integer.MAX_VALUE; + protected boolean useAnimation = true; protected Label headlineIcon, headLineLabel, messageLabel; @@ -207,6 +219,7 @@ public void hide() { animateHide(); } isDisplayed = false; + isHiddenProperty.set(true); } protected void animateHide() { From 57115e4f5a3bf28f57d018ad69a9c39ae309cf9b Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 11 Apr 2019 16:22:58 -0500 Subject: [PATCH 3/4] Use priority queue for handling multiple popups --- .../main/java/bisq/desktop/main/MainView.java | 21 -------- .../java/bisq/desktop/main/MainViewModel.java | 48 +++++++++++++++++-- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/MainView.java b/desktop/src/main/java/bisq/desktop/main/MainView.java index 57f907b7218..d0315f7676e 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainView.java +++ b/desktop/src/main/java/bisq/desktop/main/MainView.java @@ -35,21 +35,17 @@ import bisq.desktop.main.offer.BuyOfferView; import bisq.desktop.main.offer.SellOfferView; import bisq.desktop.main.overlays.popups.Popup; -import bisq.desktop.main.overlays.windows.DaoLaunchWindow; import bisq.desktop.main.portfolio.PortfolioView; import bisq.desktop.main.settings.SettingsView; -import bisq.desktop.util.GUIUtil; import bisq.desktop.util.Transitions; import bisq.core.exceptions.BisqException; import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; -import bisq.core.user.DontShowAgainLookup; import bisq.core.util.BSFormatter; import bisq.common.Timer; import bisq.common.UserThread; -import bisq.common.app.DevEnv; import bisq.common.app.Version; import bisq.common.util.Tuple2; import bisq.common.util.Utilities; @@ -81,7 +77,6 @@ import javafx.scene.layout.VBox; import javafx.scene.text.TextAlignment; -import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.Orientation; import javafx.geometry.Pos; @@ -388,22 +383,6 @@ protected Tooltip computeValue() { transitions.fadeOutAndRemove(splashScreen, 1500, actionEvent -> { disposeSplashScreen(); - - if (DevEnv.isDaoActivated()) { - String daoLaunchPopupKey = "daoLaunchPopup"; - - if (DontShowAgainLookup.showAgain(daoLaunchPopupKey)) { - new DaoLaunchWindow() - .headLine(Res.get("popup.dao.launch.headline")) - .closeButtonText(Res.get("shared.dismiss")) - .actionButtonText(Res.get("shared.learnMore")) - .onAction(() -> GUIUtil.openWebPage("https://docs.bisq.network/dao.html")) - .buttonAlignment(HPos.CENTER) - .show(); - - DontShowAgainLookup.dontShowAgain(daoLaunchPopupKey, true); - } - } }); } }); diff --git a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java index fec7833fcf4..0e7f7dd5a8d 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java @@ -21,8 +21,10 @@ import bisq.desktop.common.model.ViewModel; import bisq.desktop.components.BalanceWithConfirmationTextField; import bisq.desktop.components.TxIdTextField; +import bisq.desktop.main.overlays.Overlay; import bisq.desktop.main.overlays.notifications.NotificationCenter; import bisq.desktop.main.overlays.popups.Popup; +import bisq.desktop.main.overlays.windows.DaoLaunchWindow; import bisq.desktop.main.overlays.windows.DisplayAlertMessageWindow; import bisq.desktop.main.overlays.windows.TacWindow; import bisq.desktop.main.overlays.windows.TorNetworkSettingsWindow; @@ -64,6 +66,8 @@ import com.google.inject.Inject; +import javafx.geometry.HPos; + import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.monadic.MonadicBinding; @@ -79,7 +83,10 @@ import javafx.collections.ObservableList; +import java.util.Comparator; import java.util.Date; +import java.util.PriorityQueue; +import java.util.Queue; import java.util.Random; import lombok.Getter; @@ -120,6 +127,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupCompleteList private Timer checkNumberOfP2pNetworkPeersTimer; @SuppressWarnings("FieldCanBeLocal") private MonadicBinding tradesAndUIReady; + private Queue popupQueue = new PriorityQueue<>(Comparator.comparing(Overlay::getDisplayOrderPriority)); /////////////////////////////////////////////////////////////////////////////////////////// @@ -255,6 +263,9 @@ void onSplashScreenRemoved() { // Delay that as we want to know what is the current path of the navigation which is set // in MainView showAppScreen handler notificationCenter.onAllServicesAndViewsInitialized(); + + maybeAddDaoLaunchWindowToQueue(); + maybeShowPopupsFromQueue(); } void onOpenDownloadWindow() { @@ -342,9 +353,10 @@ private void setupHandlers() { .show()); bisqSetup.setDisplayLocalhostHandler(key -> { if (!DevEnv.isDevMode()) { - new Popup<>().backgroundInfo(Res.get("popup.bitcoinLocalhostNode.msg")) - .dontShowAgainId(key) - .show(); + Overlay popup = new Popup<>().backgroundInfo(Res.get("popup.bitcoinLocalhostNode.msg")) + .dontShowAgainId(key); + popup.setDisplayOrderPriority(5); + popupQueue.add(popup); } }); @@ -603,4 +615,34 @@ public ObservableList getPriceFeedComboBoxItems() { public BooleanProperty getShowDaoUpdatesNotification() { return daoPresentation.getShowDaoUpdatesNotification(); } + + private void maybeAddDaoLaunchWindowToQueue() { + if (DevEnv.isDaoActivated()) { + String daoLaunchPopupKey = "daoLaunchPopup" + new Random().nextInt(1111); + if (DontShowAgainLookup.showAgain(daoLaunchPopupKey)) { + DaoLaunchWindow daoLaunchWindow = new DaoLaunchWindow() + .headLine(Res.get("popup.dao.launch.headline")) + .closeButtonText(Res.get("shared.dismiss")) + .actionButtonText(Res.get("shared.learnMore")) + .onAction(() -> GUIUtil.openWebPage("https://docs.bisq.network/dao.html")) + .buttonAlignment(HPos.CENTER); + daoLaunchWindow.setDisplayOrderPriority(1); + popupQueue.add(daoLaunchWindow); + + DontShowAgainLookup.dontShowAgain(daoLaunchPopupKey, true); + } + } + } + + private void maybeShowPopupsFromQueue() { + if (!popupQueue.isEmpty()) { + Overlay overlay = popupQueue.poll(); + overlay.getIsHiddenProperty().addListener((observable, oldValue, newValue) -> { + if (newValue) { + UserThread.runAfter(this::maybeShowPopupsFromQueue, 2); + } + }); + overlay.show(); + } + } } From b5a0cc1ce266739123b20ae83fbf37e34e37bc0a Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 11 Apr 2019 16:25:13 -0500 Subject: [PATCH 4/4] Remove random string for dev testing --- desktop/src/main/java/bisq/desktop/main/MainViewModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java index 0e7f7dd5a8d..466740754be 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java @@ -618,7 +618,7 @@ public BooleanProperty getShowDaoUpdatesNotification() { private void maybeAddDaoLaunchWindowToQueue() { if (DevEnv.isDaoActivated()) { - String daoLaunchPopupKey = "daoLaunchPopup" + new Random().nextInt(1111); + String daoLaunchPopupKey = "daoLaunchPopup"; if (DontShowAgainLookup.showAgain(daoLaunchPopupKey)) { DaoLaunchWindow daoLaunchWindow = new DaoLaunchWindow() .headLine(Res.get("popup.dao.launch.headline"))