diff --git a/src/main/java/io/bitsquare/BitSquare.java b/src/main/java/io/bitsquare/BitSquare.java index a45505b3b3..bd4aa2cc2b 100644 --- a/src/main/java/io/bitsquare/BitSquare.java +++ b/src/main/java/io/bitsquare/BitSquare.java @@ -21,13 +21,9 @@ import java.util.Arrays; import javafx.application.Application; import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.control.Menu; -import javafx.scene.control.MenuBar; -import javafx.scene.control.MenuItem; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; -import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,8 +43,7 @@ public class BitSquare extends Application public static void main(String[] args) { Profiler.init(); - Profiler.printMsgWithTime("main called"); - log.debug("Startup: main " + Arrays.asList(args).toString()); + Profiler.printMsgWithTime("BitSquare.main called with args " + Arrays.asList(args).toString()); if (args != null && args.length > 0) APP_NAME = args[0]; launch(args); @@ -67,7 +62,7 @@ public class BitSquare extends Application @Override public void start(Stage primaryStage) throws IOException { - Profiler.printMsgWithTime("start called"); + Profiler.printMsgWithTime("BitSquare.start called"); BitSquare.primaryStage = primaryStage; Thread.currentThread().setUncaughtExceptionHandler((thread, throwable) -> Popups.handleUncaughtExceptions(Throwables.getRootCause(throwable))); @@ -81,7 +76,7 @@ public class BitSquare extends Application walletFacade = injector.getInstance(WalletFacade.class); messageFacade = injector.getInstance(MessageFacade.class); - Profiler.printMsgWithTime("Startup: messageFacade, walletFacade inited"); + Profiler.printMsgWithTime("BitSquare: messageFacade, walletFacade created"); // apply stored data final User user = injector.getInstance(User.class); @@ -100,14 +95,9 @@ public class BitSquare extends Application GuiceFXMLLoader.setInjector(injector); final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(NavigationItem.MAIN.getFxmlUrl())); - final Parent mainView = loader.load(); - BorderPane rootPane = new BorderPane(); - rootPane.setTop(getMenuBar()); - rootPane.setCenter(mainView); - - final Scene scene = new Scene(rootPane, 1000, 750); - scene.getStylesheets().setAll(getClass().getResource("/io/bitsquare/gui/bitsquare.css").toExternalForm(), - getClass().getResource("/io/bitsquare/gui/validation.css").toExternalForm()); + final Parent view = loader.load(); + final Scene scene = new Scene(view, 1000, 750); + scene.getStylesheets().setAll(getClass().getResource("/io/bitsquare/gui/bitsquare.css").toExternalForm()); setupCloseHandlers(primaryStage, scene); @@ -117,7 +107,7 @@ public class BitSquare extends Application primaryStage.show(); - Profiler.printMsgWithTime("Startup: primaryStage.show"); + Profiler.printMsgWithTime("BitSquare: start finished"); } private void setupCloseHandlers(Stage primaryStage, Scene scene) @@ -130,34 +120,6 @@ public class BitSquare extends Application }); } - private MenuBar getMenuBar() - { - MenuBar menuBar = new MenuBar(); - // on mac we could placemenu bar in the systems menu - // menuBar.setUseSystemMenuBar(true); - menuBar.setUseSystemMenuBar(false); - - Menu fileMenu = new Menu("_File"); - fileMenu.setMnemonicParsing(true); - MenuItem backupMenuItem = new MenuItem("Backup wallet"); - fileMenu.getItems().addAll(backupMenuItem); - - Menu settingsMenu = new Menu("_Settings"); - settingsMenu.setMnemonicParsing(true); - MenuItem changePwMenuItem = new MenuItem("Change password"); - settingsMenu.getItems().addAll(changePwMenuItem); - - Menu helpMenu = new Menu("_Help"); - helpMenu.setMnemonicParsing(true); - MenuItem faqMenuItem = new MenuItem("FAQ"); - MenuItem forumMenuItem = new MenuItem("Forum"); - helpMenu.getItems().addAll(faqMenuItem, forumMenuItem); - - menuBar.getMenus().setAll(fileMenu, settingsMenu, helpMenu); - return menuBar; - } - - @Override public void stop() throws Exception { diff --git a/src/main/java/io/bitsquare/gui/MainController.java b/src/main/java/io/bitsquare/gui/MainController.java index 7389842cec..f524b161b4 100644 --- a/src/main/java/io/bitsquare/gui/MainController.java +++ b/src/main/java/io/bitsquare/gui/MainController.java @@ -8,7 +8,8 @@ import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.gui.components.NetworkSyncPane; import io.bitsquare.gui.market.MarketController; import io.bitsquare.gui.orders.OrdersController; -import io.bitsquare.gui.util.Icons; +import io.bitsquare.gui.util.ImageUtil; +import io.bitsquare.gui.util.Profiler; import io.bitsquare.gui.util.Transitions; import io.bitsquare.msg.BootstrapListener; import io.bitsquare.msg.MessageFacade; @@ -20,24 +21,29 @@ import io.bitsquare.util.AWTSystemTray; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; +import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Pane; -import javafx.scene.layout.VBox; +import javafx.scene.layout.*; import javafx.util.StringConverter; import javax.inject.Inject; import net.tomp2p.peers.PeerAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * Holds the splash screen and the application views. + * It builds up all the views and initializes the facades. + * We use a sequence of Platform.runLater cascaded calls to make the startup more smooth, otherwise the rendering is frozen for too long. + * Pre-loading of views is not implemented yet, and after a quick test it seemed that it does not give much improvements. + */ public class MainController implements Initializable, NavigationController { private static final Logger log = LoggerFactory.getLogger(MainController.class); @@ -49,7 +55,7 @@ public class MainController implements Initializable, NavigationController private final TradeManager tradeManager; private final Persistence persistence; private final ToggleGroup toggleGroup = new ToggleGroup(); - + private final ViewBuilder viewBuilder; private ChildController controller; private ToggleButton prevToggleButton; @@ -59,18 +65,7 @@ public class MainController implements Initializable, NavigationController private boolean messageFacadeInited; private boolean walletFacadeInited; - @FXML - private Pane contentPane; - @FXML - private HBox leftNavPane, rightNavPane; - @FXML - private ProgressBar loadingBar; - @FXML - private AnchorPane rootPane; - @FXML - private Label loadingLabel; - @FXML - private NetworkSyncPane networkSyncPane; + @FXML private BorderPane root; /////////////////////////////////////////////////////////////////////////////////////////// @@ -86,6 +81,8 @@ public class MainController implements Initializable, NavigationController this.tradeManager = tradeManager; this.persistence = persistence; + viewBuilder = new ViewBuilder(); + MainController.INSTANCE = this; } @@ -107,49 +104,14 @@ public class MainController implements Initializable, NavigationController @Override public void initialize(URL url, ResourceBundle rb) { - messageFacade.init(new BootstrapListener() - { - @Override - public void onCompleted() - { - messageFacadeInited = true; - if (walletFacadeInited) initialisationDone(); - } - - @Override - public void onFailed(Throwable throwable) - { - } - }); - - walletFacade.addDownloadListener(new WalletFacade.DownloadListener() - { - @Override - public void progress(double percent) - { - networkSyncPane.setProgress(percent); - } - - @Override - public void doneDownload() - { - networkSyncPane.doneDownload(); - } - }); - walletFacade.initialize(() -> { - walletFacadeInited = true; - if (messageFacadeInited) initialisationDone(); - }); - - tradeManager.addTakeOfferRequestListener(this::onTakeOfferRequested); + Profiler.printMsgWithTime("MainController.initialize"); + Platform.runLater(() -> viewBuilder.buildSplashScreen(root, this)); } - /////////////////////////////////////////////////////////////////////////////////////////// // Interface implementation: NavigationController /////////////////////////////////////////////////////////////////////////////////////////// - @Override public ChildController navigateToView(NavigationItem navigationItem) { @@ -181,57 +143,69 @@ public class MainController implements Initializable, NavigationController } - private ChildController loadView(NavigationItem navigationItem) - { - if (controller != null) - { - controller.cleanup(); - } - - final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); - try - { - final Node view = loader.load(); - contentPane.getChildren().setAll(view); - controller = loader.getController(); - controller.setNavigationController(this); - } catch (IOException e) - { - e.printStackTrace(); - log.error("Loading view failed. " + navigationItem.getFxmlUrl()); - } - return controller; - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Private methods + // Startup Handlers /////////////////////////////////////////////////////////////////////////////////////////// - private void initialisationDone() + public void onViewInitialized() { - addNavigation(); - - Transitions.fadeOutAndRemove(loadingLabel); - Transitions.fadeOutAndRemove(loadingBar); - - Transitions.fadeIn(leftNavPane); - Transitions.fadeIn(rightNavPane); - Transitions.fadeIn(contentPane); - - NavigationItem selectedNavigationItem = (NavigationItem) persistence.read(this, "selectedNavigationItem"); - if (selectedNavigationItem == null) - { - selectedNavigationItem = NavigationItem.HOME; - } - - navigateToView(selectedNavigationItem); + Profiler.printMsgWithTime("MainController.onViewInitialized"); + Platform.runLater(this::initFacades); } + private void onFacadesInitialised() + { + Profiler.printMsgWithTime("MainController.onFacadesInitialised"); + // never called on regtest + walletFacade.addDownloadListener(new WalletFacade.DownloadListener() + { + @Override + public void progress(double percent) + { + viewBuilder.loadingLabel.setText("Synchronise with network..."); + } + + @Override + public void doneDownload() + { + viewBuilder.loadingLabel.setText("Synchronise with network done."); + } + }); + + tradeManager.addTakeOfferRequestListener(this::onTakeOfferRequested); + Platform.runLater(this::addNavigation); + } + + private void onNavigationAdded() + { + Profiler.printMsgWithTime("MainController.onNavigationAdded"); + Platform.runLater(this::loadContentView); + } + + private void onContentViewLoaded() + { + Profiler.printMsgWithTime("MainController.onContentViewLoaded"); + root.setId("main-view"); + Platform.runLater(this::fadeOutSplash); + } + + private void fadeOutSplash() + { + Profiler.printMsgWithTime("MainController.fadeOutSplash"); + Transitions.blurOutAndRemove(viewBuilder.splashVBox); + Transitions.fadeIn(viewBuilder.menuBar); + Transitions.fadeIn(viewBuilder.anchorPane); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Handlers + /////////////////////////////////////////////////////////////////////////////////////////// + //TODO make ordersButton also reacting to jump to pending tab private void onTakeOfferRequested(String offerId, PeerAddress sender) { - final Button alertButton = new Button("", Icons.getIconImageView(Icons.MSG_ALERT)); + final Button alertButton = new Button("", ImageUtil.getIconImageView(ImageUtil.MSG_ALERT)); alertButton.setId("nav-alert-button"); alertButton.relocate(36, 19); alertButton.setOnAction((e) -> { @@ -244,36 +218,103 @@ public class MainController implements Initializable, NavigationController AWTSystemTray.setAlert(); } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private startup methods + /////////////////////////////////////////////////////////////////////////////////////////// + + private void initFacades() + { + Profiler.printMsgWithTime("MainController.initFacades"); + messageFacade.init(new BootstrapListener() + { + @Override + public void onCompleted() + { + messageFacadeInited = true; + if (walletFacadeInited) onFacadesInitialised(); + } + + @Override + public void onFailed(Throwable throwable) + { + log.error(throwable.toString()); + } + }); + + walletFacade.initialize(() -> { + walletFacadeInited = true; + if (messageFacadeInited) onFacadesInitialised(); + }); + } + private void addNavigation() { - homeButton = addNavButton(leftNavPane, "Overview", NavigationItem.HOME); - - buyButton = addNavButton(leftNavPane, "Buy BTC", NavigationItem.BUY); - - sellButton = addNavButton(leftNavPane, "Sell BTC", NavigationItem.SELL); + Profiler.printMsgWithTime("MainController.addNavigation"); + homeButton = addNavButton(viewBuilder.leftNavPane, "Overview", NavigationItem.HOME); + buyButton = addNavButton(viewBuilder.leftNavPane, "Buy BTC", NavigationItem.BUY); + sellButton = addNavButton(viewBuilder.leftNavPane, "Sell BTC", NavigationItem.SELL); ordersButtonButtonHolder = new Pane(); ordersButton = addNavButton(ordersButtonButtonHolder, "Orders", NavigationItem.ORDERS); - leftNavPane.getChildren().add(ordersButtonButtonHolder); + viewBuilder.leftNavPane.getChildren().add(ordersButtonButtonHolder); - fundsButton = addNavButton(leftNavPane, "Funds", NavigationItem.FUNDS); + fundsButton = addNavButton(viewBuilder.leftNavPane, "Funds", NavigationItem.FUNDS); final Pane msgButtonHolder = new Pane(); msgButton = addNavButton(msgButtonHolder, "Message", NavigationItem.MSG); - leftNavPane.getChildren().add(msgButtonHolder); + viewBuilder.leftNavPane.getChildren().add(msgButtonHolder); - addBalanceInfo(rightNavPane); - addAccountComboBox(rightNavPane); + addBalanceInfo(viewBuilder.rightNavPane); + addAccountComboBox(viewBuilder.rightNavPane); - settingsButton = addNavButton(rightNavPane, "Settings", NavigationItem.SETTINGS); + settingsButton = addNavButton(viewBuilder.rightNavPane, "Settings", NavigationItem.SETTINGS); + + Platform.runLater(this::onNavigationAdded); } + private void loadContentView() + { + Profiler.printMsgWithTime("MainController.loadContentView"); + NavigationItem selectedNavigationItem = (NavigationItem) persistence.read(this, "selectedNavigationItem"); + if (selectedNavigationItem == null) + selectedNavigationItem = NavigationItem.BUY; + + navigateToView(selectedNavigationItem); + + Platform.runLater(this::onContentViewLoaded); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private methods + /////////////////////////////////////////////////////////////////////////////////////////// + + private ChildController loadView(NavigationItem navigationItem) + { + if (controller != null) + controller.cleanup(); + + final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); + try + { + final Node view = loader.load(); + viewBuilder.contentPane.getChildren().setAll(view); + controller = loader.getController(); + controller.setNavigationController(this); + } catch (IOException e) + { + e.printStackTrace(); + log.error("Loading view failed. " + navigationItem.getFxmlUrl()); + } + return controller; + } private ToggleButton addNavButton(Pane parent, String title, NavigationItem navigationItem) { final Pane pane = new Pane(); pane.setPrefSize(50, 50); - final ToggleButton toggleButton = new ToggleButton("", Icons.getIconImageView(navigationItem.getIcon())); + final ToggleButton toggleButton = new ToggleButton("", ImageUtil.getIconImageView(navigationItem.getIcon())); toggleButton.setToggleGroup(toggleGroup); toggleButton.setId("nav-button"); toggleButton.setPrefSize(50, 50); @@ -283,7 +324,7 @@ public class MainController implements Initializable, NavigationController ((ImageView) (prevToggleButton.getGraphic())).setImage(prevToggleButtonIcon); } prevToggleButtonIcon = ((ImageView) (toggleButton.getGraphic())).getImage(); - ((ImageView) (toggleButton.getGraphic())).setImage(Icons.getIconImage(navigationItem.getActiveIcon())); + ((ImageView) (toggleButton.getGraphic())).setImage(ImageUtil.getIconImage(navigationItem.getActiveIcon())); controller = loadView(navigationItem); @@ -313,7 +354,7 @@ public class MainController implements Initializable, NavigationController { final TextField balanceTextField = new TextField(); balanceTextField.setEditable(false); - balanceTextField.setPrefWidth(90); + balanceTextField.setPrefWidth(110); balanceTextField.setId("nav-balance-label"); balanceTextField.setText(walletFacade.getWalletBalance().toFriendlyString()); walletFacade.addBalanceListener(new BalanceListener() @@ -325,12 +366,9 @@ public class MainController implements Initializable, NavigationController } }); - final Label balanceCurrencyLabel = new Label("BTC"); - balanceCurrencyLabel.setPadding(new Insets(6, 0, 0, 0)); - final HBox hBox = new HBox(); hBox.setSpacing(2); - hBox.getChildren().setAll(balanceTextField, balanceCurrencyLabel); + hBox.getChildren().setAll(balanceTextField); final Label titleLabel = new Label("Balance"); titleLabel.setMouseTransparent(true); @@ -382,4 +420,134 @@ public class MainController implements Initializable, NavigationController parent.getChildren().add(vBox); } } -} \ No newline at end of file + +} + + +class ViewBuilder +{ + HBox leftNavPane, rightNavPane; + AnchorPane contentPane; + NetworkSyncPane networkSyncPane; + StackPane stackPane; + AnchorPane anchorPane; + VBox splashVBox; + MenuBar menuBar; + BorderPane root; + Label loadingLabel; + + void buildSplashScreen(BorderPane root, MainController controller) + { + Profiler.printMsgWithTime("MainController.ViewBuilder.buildSplashScreen"); + this.root = root; + + stackPane = new StackPane(); + splashVBox = getSplashScreen(); + stackPane.getChildren().add(splashVBox); + root.setCenter(stackPane); + + menuBar = getMenuBar(); + root.setTop(menuBar); + + Platform.runLater(() -> buildContentView(controller)); + } + + void buildContentView(MainController controller) + { + Profiler.printMsgWithTime("MainController.ViewBuilder.buildContentView"); + anchorPane = getContentScreen(); + stackPane.getChildren().add(anchorPane); + + Platform.runLater(controller::onViewInitialized); + } + + AnchorPane getContentScreen() + { + AnchorPane anchorPane = new AnchorPane(); + anchorPane.setId("content-pane"); + + leftNavPane = new HBox(); + leftNavPane.setAlignment(Pos.CENTER); + leftNavPane.setSpacing(10); + AnchorPane.setLeftAnchor(leftNavPane, 0d); + AnchorPane.setTopAnchor(leftNavPane, 0d); + + rightNavPane = new HBox(); + rightNavPane.setAlignment(Pos.CENTER); + rightNavPane.setSpacing(10); + AnchorPane.setRightAnchor(rightNavPane, 10d); + AnchorPane.setTopAnchor(rightNavPane, 0d); + + contentPane = new AnchorPane(); + contentPane.setId("content-pane"); + AnchorPane.setLeftAnchor(contentPane, 0d); + AnchorPane.setRightAnchor(contentPane, 0d); + AnchorPane.setTopAnchor(contentPane, 60d); + AnchorPane.setBottomAnchor(contentPane, 20d); + + networkSyncPane = new NetworkSyncPane(); + networkSyncPane.setSpacing(10); + networkSyncPane.setPrefHeight(20); + AnchorPane.setLeftAnchor(networkSyncPane, 0d); + AnchorPane.setBottomAnchor(networkSyncPane, 0d); + + anchorPane.getChildren().addAll(leftNavPane, rightNavPane, contentPane, networkSyncPane); + anchorPane.setOpacity(0); + + return anchorPane; + } + + VBox getSplashScreen() + { + VBox splashVBox = new VBox(); + splashVBox.setAlignment(Pos.CENTER); + splashVBox.setSpacing(10); + + ImageView logo = ImageUtil.getIconImageView(ImageUtil.SPLASH_LOGO); + logo.setFitWidth(270); + logo.setFitHeight(200); + + ImageView titleLabel = ImageUtil.getIconImageView(ImageUtil.SPLASH_LABEL); + titleLabel.setFitWidth(300); + titleLabel.setFitHeight(79); + + Label subTitle = new Label("The P2P Fiat-Bitcoin Exchange"); + subTitle.setAlignment(Pos.CENTER); + subTitle.setId("logo-sub-title-label"); + + loadingLabel = new Label("Initializing..."); + loadingLabel.setAlignment(Pos.CENTER); + loadingLabel.setPadding(new Insets(80, 0, 0, 0)); + + splashVBox.getChildren().addAll(logo, titleLabel, subTitle, loadingLabel); + return splashVBox; + } + + MenuBar getMenuBar() + { + MenuBar menuBar = new MenuBar(); + // on mac we could place menu bar in the systems menu + // menuBar.setUseSystemMenuBar(true); + menuBar.setUseSystemMenuBar(false); + + Menu fileMenu = new Menu("_File"); + fileMenu.setMnemonicParsing(true); + MenuItem backupMenuItem = new MenuItem("Backup wallet"); + fileMenu.getItems().addAll(backupMenuItem); + + Menu settingsMenu = new Menu("_Settings"); + settingsMenu.setMnemonicParsing(true); + MenuItem changePwMenuItem = new MenuItem("Change password"); + settingsMenu.getItems().addAll(changePwMenuItem); + + Menu helpMenu = new Menu("_Help"); + helpMenu.setMnemonicParsing(true); + MenuItem faqMenuItem = new MenuItem("FAQ"); + MenuItem forumMenuItem = new MenuItem("Forum"); + helpMenu.getItems().addAll(faqMenuItem, forumMenuItem); + + menuBar.getMenus().setAll(fileMenu, settingsMenu, helpMenu); + menuBar.setOpacity(0); + return menuBar; + } +} diff --git a/src/main/java/io/bitsquare/gui/MainView.fxml b/src/main/java/io/bitsquare/gui/MainView.fxml index f68e1d896d..a5c871aa24 100644 --- a/src/main/java/io/bitsquare/gui/MainView.fxml +++ b/src/main/java/io/bitsquare/gui/MainView.fxml @@ -1,16 +1,6 @@ - - - - - + - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/main/java/io/bitsquare/gui/NavigationItem.java b/src/main/java/io/bitsquare/gui/NavigationItem.java index f17cf7257e..32f1424554 100644 --- a/src/main/java/io/bitsquare/gui/NavigationItem.java +++ b/src/main/java/io/bitsquare/gui/NavigationItem.java @@ -1,17 +1,17 @@ package io.bitsquare.gui; -import io.bitsquare.gui.util.Icons; +import io.bitsquare.gui.util.ImageUtil; public enum NavigationItem { MAIN("/io/bitsquare/gui/MainView.fxml"), - HOME("/io/bitsquare/gui/home/HomeView.fxml", Icons.HOME, Icons.HOME_ACTIVE), - BUY("/io/bitsquare/gui/market/MarketView.fxml", Icons.NAV_BUY, Icons.NAV_BUY_ACTIVE), - SELL("/io/bitsquare/gui/market/MarketView.fxml", Icons.NAV_SELL, Icons.NAV_SELL_ACTIVE), - ORDERS("/io/bitsquare/gui/orders/OrdersView.fxml", Icons.ORDERS, Icons.ORDERS_ACTIVE), - FUNDS("/io/bitsquare/gui/funds/FundsView.fxml", Icons.FUNDS, Icons.FUNDS_ACTIVE), - MSG("/io/bitsquare/gui/msg/MsgView.fxml", Icons.MSG, Icons.MSG_ACTIVE), - SETTINGS("/io/bitsquare/gui/settings/SettingsView.fxml", Icons.SETTINGS, Icons.SETTINGS_ACTIVE), + HOME("/io/bitsquare/gui/home/HomeView.fxml", ImageUtil.HOME, ImageUtil.HOME_ACTIVE), + BUY("/io/bitsquare/gui/market/MarketView.fxml", ImageUtil.NAV_BUY, ImageUtil.NAV_BUY_ACTIVE), + SELL("/io/bitsquare/gui/market/MarketView.fxml", ImageUtil.NAV_SELL, ImageUtil.NAV_SELL_ACTIVE), + ORDERS("/io/bitsquare/gui/orders/OrdersView.fxml", ImageUtil.ORDERS, ImageUtil.ORDERS_ACTIVE), + FUNDS("/io/bitsquare/gui/funds/FundsView.fxml", ImageUtil.FUNDS, ImageUtil.FUNDS_ACTIVE), + MSG("/io/bitsquare/gui/msg/MsgView.fxml", ImageUtil.MSG, ImageUtil.MSG_ACTIVE), + SETTINGS("/io/bitsquare/gui/settings/SettingsView.fxml", ImageUtil.SETTINGS, ImageUtil.SETTINGS_ACTIVE), ORDER_BOOK("/io/bitsquare/gui/market/orderbook/OrderBookView.fxml"), CREATE_OFFER("/io/bitsquare/gui/market/createOffer/CreateOfferView.fxml"), diff --git a/src/main/java/io/bitsquare/gui/bitsquare.css b/src/main/java/io/bitsquare/gui/bitsquare.css index e7870f3609..7e913b94b8 100644 --- a/src/main/java/io/bitsquare/gui/bitsquare.css +++ b/src/main/java/io/bitsquare/gui/bitsquare.css @@ -1,4 +1,13 @@ -#root-pane { +#splash { + -fx-background-color: #ffffff; +} + +#logo-sub-title-label{ + -fx-font-weight: bold; + -fx-font-size: 24; +} + +#main-view { -fx-background-color: #dddddd; } @@ -53,7 +62,7 @@ .text-field:readonly { -fx-text-fill: #000000; - -fx-background-color: #FAFAFA; + -fx-background-color: #FBFBFB; } #feedback-text { diff --git a/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java b/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java index 561f344df2..db0bdc986e 100644 --- a/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java +++ b/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java @@ -15,7 +15,7 @@ import io.bitsquare.gui.market.createOffer.CreateOfferController; import io.bitsquare.gui.market.trade.TakerOfferController; import io.bitsquare.gui.popups.Popups; import io.bitsquare.gui.util.BitSquareFormatter; -import io.bitsquare.gui.util.Icons; +import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.locale.Country; import io.bitsquare.locale.CurrencyUtil; import io.bitsquare.locale.Localisation; @@ -65,8 +65,8 @@ public class OrderBookController implements Initializable, ChildController private final Settings settings; private final Persistence persistence; - private final Image buyIcon = Icons.getIconImage(Icons.BUY); - private final Image sellIcon = Icons.getIconImage(Icons.SELL); + private final Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY); + private final Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL); @FXML public AnchorPane holderPane; @FXML @@ -433,7 +433,7 @@ public class OrderBookController implements Initializable, ChildController if (offer.getMessagePublicKey().equals(user.getMessagePublicKey())) { - icon = Icons.getIconImage(Icons.REMOVE); + icon = ImageUtil.getIconImage(ImageUtil.REMOVE); title = "Remove"; button.setOnAction(event -> removeOffer(orderBookListItem.getOffer())); } @@ -499,7 +499,7 @@ public class OrderBookController implements Initializable, ChildController Country country = orderBookListItem.getOffer().getBankAccountCountry(); try { - hBox.getChildren().add(Icons.getIconImageView("/images/countries/" + country.getCode().toLowerCase() + ".png")); + hBox.getChildren().add(ImageUtil.getIconImageView("/images/countries/" + country.getCode().toLowerCase() + ".png")); } catch (Exception e) { diff --git a/src/main/java/io/bitsquare/gui/orders/offer/OfferController.java b/src/main/java/io/bitsquare/gui/orders/offer/OfferController.java index 1aec62e410..a1b0fd5ea5 100644 --- a/src/main/java/io/bitsquare/gui/orders/offer/OfferController.java +++ b/src/main/java/io/bitsquare/gui/orders/offer/OfferController.java @@ -3,7 +3,7 @@ package io.bitsquare.gui.orders.offer; import io.bitsquare.gui.ChildController; import io.bitsquare.gui.Hibernate; import io.bitsquare.gui.NavigationController; -import io.bitsquare.gui.util.Icons; +import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.trade.Offer; import io.bitsquare.trade.TradeManager; import java.net.URL; @@ -172,7 +172,7 @@ public class OfferController implements Initializable, ChildController, Hibernat { return new TableCell() { - final ImageView iconView = Icons.getIconImageView(Icons.REMOVE); + final ImageView iconView = ImageUtil.getIconImageView(ImageUtil.REMOVE); final Button button = new Button(); { diff --git a/src/main/java/io/bitsquare/gui/orders/pending/PendingTradeController.java b/src/main/java/io/bitsquare/gui/orders/pending/PendingTradeController.java index 5aeeaebd43..80be476771 100644 --- a/src/main/java/io/bitsquare/gui/orders/pending/PendingTradeController.java +++ b/src/main/java/io/bitsquare/gui/orders/pending/PendingTradeController.java @@ -14,7 +14,7 @@ import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.gui.util.ConfidenceDisplay; -import io.bitsquare.gui.util.Icons; +import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.locale.Country; import io.bitsquare.locale.Localisation; import io.bitsquare.trade.Direction; @@ -52,8 +52,8 @@ public class PendingTradeController implements Initializable, ChildController, H private Trade currentTrade; private NavigationController navigationController; - private Image buyIcon = Icons.getIconImage(Icons.BUY); - private Image sellIcon = Icons.getIconImage(Icons.SELL); + private Image buyIcon = ImageUtil.getIconImage(ImageUtil.BUY); + private Image sellIcon = ImageUtil.getIconImage(ImageUtil.SELL); private ConfidenceDisplay confidenceDisplay; @FXML @@ -390,7 +390,7 @@ public class PendingTradeController implements Initializable, ChildController, H Country country = tradesTableItem.getTrade().getOffer().getBankAccountCountry(); try { - hBox.getChildren().add(Icons.getIconImageView("/images/countries/" + country.getCode().toLowerCase() + ".png")); + hBox.getChildren().add(ImageUtil.getIconImageView("/images/countries/" + country.getCode().toLowerCase() + ".png")); } catch (Exception e) { diff --git a/src/main/java/io/bitsquare/gui/settings/SettingsController.java b/src/main/java/io/bitsquare/gui/settings/SettingsController.java index 992ae78dea..7bba3642dc 100644 --- a/src/main/java/io/bitsquare/gui/settings/SettingsController.java +++ b/src/main/java/io/bitsquare/gui/settings/SettingsController.java @@ -10,7 +10,7 @@ import io.bitsquare.gui.ChildController; import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.util.BitSquareValidator; -import io.bitsquare.gui.util.Icons; +import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.locale.*; import io.bitsquare.msg.MessageFacade; import io.bitsquare.settings.Settings; @@ -358,7 +358,7 @@ public class SettingsController implements Initializable, ChildController, Navig final HBox hBox = new HBox(); final Label label = new Label(); final Button removeButton = new Button(); - final ImageView icon = Icons.getIconImageView(Icons.REMOVE); + final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE); { label.setPrefWidth(565); @@ -443,7 +443,7 @@ public class SettingsController implements Initializable, ChildController, Navig final HBox hBox = new HBox(); final Label label = new Label(); final Button removeButton = new Button(); - final ImageView icon = Icons.getIconImageView(Icons.REMOVE); + final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE); { label.setPrefWidth(565); @@ -513,7 +513,7 @@ public class SettingsController implements Initializable, ChildController, Navig final HBox hBox = new HBox(); final Label label = new Label(); final Button removeButton = new Button(); - final ImageView icon = Icons.getIconImageView(Icons.REMOVE); + final ImageView icon = ImageUtil.getIconImageView(ImageUtil.REMOVE); { label.setPrefWidth(565); diff --git a/src/main/java/io/bitsquare/gui/util/Icons.java b/src/main/java/io/bitsquare/gui/util/ImageUtil.java similarity index 82% rename from src/main/java/io/bitsquare/gui/util/Icons.java rename to src/main/java/io/bitsquare/gui/util/ImageUtil.java index 0cf614101b..ca516c26b9 100644 --- a/src/main/java/io/bitsquare/gui/util/Icons.java +++ b/src/main/java/io/bitsquare/gui/util/ImageUtil.java @@ -3,8 +3,11 @@ package io.bitsquare.gui.util; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -public class Icons +public class ImageUtil { + public static final String SPLASH_LOGO = "/images/logo_200_270.png"; + public static final String SPLASH_LABEL = "/images/bitsquare_logo_label_300_69.png"; + public static final String SYS_TRAY = "/images/systemTrayIcon.png"; public static final String SYS_TRAY_ALERT = "/images/systemTrayAlertIcon.png"; @@ -32,12 +35,12 @@ public class Icons public static Image getIconImage(String iconName) { - return new Image(Icons.class.getResourceAsStream(iconName)); + return new Image(ImageUtil.class.getResourceAsStream(iconName)); } public static ImageView getIconImageView(String iconName) { - return new ImageView(new Image(Icons.class.getResourceAsStream(iconName))); + return new ImageView(new Image(ImageUtil.class.getResourceAsStream(iconName))); } } diff --git a/src/main/java/io/bitsquare/gui/util/Transitions.java b/src/main/java/io/bitsquare/gui/util/Transitions.java index 98ad331419..a203004478 100644 --- a/src/main/java/io/bitsquare/gui/util/Transitions.java +++ b/src/main/java/io/bitsquare/gui/util/Transitions.java @@ -6,74 +6,104 @@ import javafx.scene.Node; import javafx.scene.effect.GaussianBlur; import javafx.scene.layout.Pane; import javafx.util.Duration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static com.google.common.base.Preconditions.checkState; @SuppressWarnings("WeakerAccess") public class Transitions { + private static final Logger log = LoggerFactory.getLogger(Transitions.class); public static final int UI_ANIMATION_TIME = 800; - public static void fadeIn(Node ui) + public static void fadeIn(Node node) { - fadeIn(ui, UI_ANIMATION_TIME); + fadeIn(node, UI_ANIMATION_TIME); } @SuppressWarnings("SameParameterValue") - public static void fadeIn(Node ui, int time) + public static void fadeIn(Node node, int duration) { - FadeTransition ft = new FadeTransition(Duration.millis(time), ui); + FadeTransition ft = new FadeTransition(Duration.millis(duration), node); ft.setFromValue(0.0); ft.setToValue(1.0); ft.play(); } - - public static Animation fadeOut(Node ui) + public static Animation fadeOut(Node node) { - FadeTransition ft = new FadeTransition(Duration.millis(UI_ANIMATION_TIME), ui); - ft.setFromValue(ui.getOpacity()); + return fadeOut(node, UI_ANIMATION_TIME); + } + + public static Animation fadeOut(Node node, int duration) + { + FadeTransition ft = new FadeTransition(Duration.millis(duration), node); + ft.setFromValue(node.getOpacity()); ft.setToValue(0.0); ft.play(); return ft; } @SuppressWarnings("UnusedReturnValue") - - public static Animation fadeOutAndRemove(Node ui) + public static Animation fadeOutAndRemove(Node node) { - Animation animation = fadeOut(ui); - animation.setOnFinished(actionEvent -> ((Pane) (ui.getParent())).getChildren().remove(ui)); + return fadeOutAndRemove(node, UI_ANIMATION_TIME); + } + + public static Animation fadeOutAndRemove(Node node, int duration) + { + Animation animation = fadeOut(node, duration); + animation.setOnFinished(actionEvent -> { + ((Pane) (node.getParent())).getChildren().remove(node); + Profiler.printMsgWithTime("fadeOutAndRemove"); + }); return animation; } + public static Timeline blurOutAndRemove(Node node) + { + return blurOutAndRemove(node, UI_ANIMATION_TIME); + } + + public static Timeline blurOutAndRemove(Node node, int duration) + { + Timeline timeline = blurOut(node, duration); + timeline.setOnFinished(actionEvent -> { + ((Pane) (node.getParent())).getChildren().remove(node); + Profiler.printMsgWithTime("blurOutAndRemove"); + }); + return timeline; + } + public static void blurOut(Node node) { blurOut(node, UI_ANIMATION_TIME); } @SuppressWarnings("SameParameterValue") - public static void blurOut(Node node, int time) + public static Timeline blurOut(Node node, int duration) { GaussianBlur blur = new GaussianBlur(0.0); node.setEffect(blur); Timeline timeline = new Timeline(); KeyValue kv = new KeyValue(blur.radiusProperty(), 10.0); - KeyFrame kf = new KeyFrame(Duration.millis(time), kv); + KeyFrame kf = new KeyFrame(Duration.millis(duration), kv); timeline.getKeyFrames().add(kf); timeline.play(); + return timeline; } public static void blurIn(Node node) { GaussianBlur blur = (GaussianBlur) node.getEffect(); - Timeline timeline = new Timeline(); + Timeline durationline = new Timeline(); KeyValue kv = new KeyValue(blur.radiusProperty(), 0.0); KeyFrame kf = new KeyFrame(Duration.millis(UI_ANIMATION_TIME), kv); - timeline.getKeyFrames().add(kf); - timeline.setOnFinished(actionEvent -> node.setEffect(null)); - timeline.play(); + durationline.getKeyFrames().add(kf); + durationline.setOnFinished(actionEvent -> node.setEffect(null)); + durationline.play(); } public static void checkGuiThread() diff --git a/src/main/java/io/bitsquare/gui/validation.css b/src/main/java/io/bitsquare/gui/validation.css deleted file mode 100644 index c07d0ce106..0000000000 --- a/src/main/java/io/bitsquare/gui/validation.css +++ /dev/null @@ -1,22 +0,0 @@ -.text-field.validation_error, .text-area.validation_error .content, .date-picker.validation_error > .text-field { - -fx-effect: innershadow(three-pass-box, red, 12 , 0.5, 1, 1); -} - - -#error-msg-item .label { - -fx-text-fill: white; -} - -#error-msg-item:focused { - -fx-background-color: #B80000; -} - -#error-msg-item:focused .label { - -fx-text-fill: white; -} - -#error-msg { - -fx-background-color: #B80000; - -fx-padding: 0; - -fx-background-radius: 4 4 4 4; -} diff --git a/src/main/java/io/bitsquare/msg/MessageFacade.java b/src/main/java/io/bitsquare/msg/MessageFacade.java index 2a3d31c671..658659334e 100644 --- a/src/main/java/io/bitsquare/msg/MessageFacade.java +++ b/src/main/java/io/bitsquare/msg/MessageFacade.java @@ -258,7 +258,7 @@ public class MessageFacade implements MessageBroker Platform.runLater(() -> orderBookListeners.stream().forEach(orderBookListener -> orderBookListener.onOffersReceived(futureGet.dataMap(), baseFuture.isSuccess()))); if (baseFuture.isSuccess()) { - log.trace("Get offers from DHT was successful. Stored data: [key: " + locationKey + ", values: " + futureGet.dataMap() + "]"); + //log.trace("Get offers from DHT was successful. Stored data: [key: " + locationKey + ", values: " + futureGet.dataMap() + "]"); } else { diff --git a/src/main/java/io/bitsquare/util/AWTSystemTray.java b/src/main/java/io/bitsquare/util/AWTSystemTray.java index 7ada023d62..ad3835d395 100644 --- a/src/main/java/io/bitsquare/util/AWTSystemTray.java +++ b/src/main/java/io/bitsquare/util/AWTSystemTray.java @@ -2,7 +2,7 @@ package io.bitsquare.util; import io.bitsquare.BitSquare; -import io.bitsquare.gui.util.Icons; +import io.bitsquare.gui.util.ImageUtil; import java.awt.*; import javafx.application.Platform; import javafx.stage.Stage; @@ -27,7 +27,7 @@ public class AWTSystemTray Platform.setImplicitExit(false); SystemTray systemTray = SystemTray.getSystemTray(); - trayIcon = new TrayIcon(getImage(Icons.SYS_TRAY)); + trayIcon = new TrayIcon(getImage(ImageUtil.SYS_TRAY)); trayIcon.setToolTip("BitSquare P2P Fiat-Bitcoin exchange"); PopupMenu popupMenu = new PopupMenu(); @@ -78,12 +78,12 @@ public class AWTSystemTray public static void setAlert() { - trayIcon.setImage(getImage(Icons.SYS_TRAY_ALERT)); + trayIcon.setImage(getImage(ImageUtil.SYS_TRAY_ALERT)); } public static void unSetAlert() { - trayIcon.setImage(getImage(Icons.SYS_TRAY)); + trayIcon.setImage(getImage(ImageUtil.SYS_TRAY)); } public static void setStageHidden() diff --git a/src/main/resources/images/bitsquare_logo_label_300_69.png b/src/main/resources/images/bitsquare_logo_label_300_69.png new file mode 100644 index 0000000000..c2b83609f1 Binary files /dev/null and b/src/main/resources/images/bitsquare_logo_label_300_69.png differ diff --git a/src/main/resources/images/logo.png b/src/main/resources/images/logo.png deleted file mode 100644 index 67a24d97e4..0000000000 Binary files a/src/main/resources/images/logo.png and /dev/null differ diff --git a/src/main/resources/images/logo_200_270.png b/src/main/resources/images/logo_200_270.png new file mode 100644 index 0000000000..ecb3d190dd Binary files /dev/null and b/src/main/resources/images/logo_200_270.png differ