diff --git a/src/main/java/io/bitsquare/gui/Navigation.java b/src/main/java/io/bitsquare/gui/Navigation.java index e29a02973c..41ffbdb4cc 100644 --- a/src/main/java/io/bitsquare/gui/Navigation.java +++ b/src/main/java/io/bitsquare/gui/Navigation.java @@ -26,72 +26,71 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Navigation { - // New listeners can be added during iteration so we use CopyOnWriteArrayList to prevent invalid array - // modification + + private static final String CURRENT_PATH_KEY = "currentPath"; + + // TODO: MAIN->BUY is the default view for now; should be MAIN->HOME later + private static final FxmlView[] DEFAULT_PATH = new FxmlView[]{ FxmlView.MAIN, FxmlView.BUY }; + + // New listeners can be added during iteration so we use CopyOnWriteArrayList to + // prevent invalid array modification private final List listeners = new CopyOnWriteArrayList<>(); + private final Persistence persistence; - private FxmlView[] currentItems; - // Used for returning to the last important view - // After setup is done we want to return to the last opened view (e.g. sell/buy) - private FxmlView[] itemsForReturning; + private FxmlView[] currentPath; + // Used for returning to the last important view. After setup is done we want to + // return to the last opened view (e.g. sell/buy) + private FxmlView[] returnPath; - /////////////////////////////////////////////////////////////////////////////////////////// - // Constructor - /////////////////////////////////////////////////////////////////////////////////////////// @Inject public Navigation(Persistence persistence) { this.persistence = persistence; } - /////////////////////////////////////////////////////////////////////////////////////////// - // Public methods - /////////////////////////////////////////////////////////////////////////////////////////// + public void navigateTo(FxmlView... newPath) { + if (newPath == null) + return; - public void navigationTo(FxmlView... items) { List temp = new ArrayList<>(); - if (items != null) { - for (int i = 0; i < items.length; i++) { - FxmlView item = items[i]; - temp.add(item); - if (currentItems == null || - (currentItems != null && - currentItems.length > i && - item != currentItems[i] && - i != items.length - 1)) { - List temp2 = new ArrayList<>(temp); - for (int n = i + 1; n < items.length; n++) { - FxmlView[] newTemp = new FxmlView[i + 1]; - currentItems = temp2.toArray(newTemp); - navigationTo(currentItems); - item = items[n]; - temp2.add(item); - } + for (int i = 0; i < newPath.length; i++) { + FxmlView element = newPath[i]; + temp.add(element); + if (currentPath == null || + (currentPath != null && + currentPath.length > i && + element != currentPath[i] && + i != newPath.length - 1)) { + List temp2 = new ArrayList<>(temp); + for (int n = i + 1; n < newPath.length; n++) { + FxmlView[] newTemp = new FxmlView[i + 1]; + currentPath = temp2.toArray(newTemp); + navigateTo(currentPath); + element = newPath[n]; + temp2.add(element); } } - - currentItems = items; - - persistence.write(this, "navigationItems", items); - listeners.stream().forEach((e) -> e.onNavigationRequested(items)); } + + currentPath = newPath; + persistence.write(this, CURRENT_PATH_KEY, currentPath); + listeners.stream().forEach((e) -> e.onNavigationRequested(currentPath)); } - public void navigateToLastStoredItem() { - FxmlView[] items = (FxmlView[]) persistence.read(this, "navigationItems"); - // TODO we set BUY as default yet, should be HOME later - if (items == null || items.length == 0) - items = new FxmlView[]{FxmlView.MAIN, FxmlView.BUY}; + public void navigateToLastOpenView() { + FxmlView[] lastPath = (FxmlView[]) persistence.read(this, CURRENT_PATH_KEY); - navigationTo(items); + if (lastPath == null || lastPath.length == 0) + lastPath = DEFAULT_PATH; + + navigateTo(lastPath); } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Listeners - /////////////////////////////////////////////////////////////////////////////////////////// + public static interface Listener { + void onNavigationRequested(FxmlView... path); + } public void addListener(Listener listener) { listeners.add(listener); @@ -101,40 +100,16 @@ public class Navigation { listeners.remove(listener); } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Getters - /////////////////////////////////////////////////////////////////////////////////////////// - - public FxmlView[] getItemsForReturning() { - return itemsForReturning; + public FxmlView[] getReturnPath() { + return returnPath; } - public FxmlView[] getCurrentItems() { - return currentItems; + public FxmlView[] getCurrentPath() { + return currentPath; } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Setters - /////////////////////////////////////////////////////////////////////////////////////////// - - public void setItemsForReturning(FxmlView[] itemsForReturning) { - this.itemsForReturning = itemsForReturning; + public void setReturnPath(FxmlView[] returnPath) { + this.returnPath = returnPath; } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Interface - /////////////////////////////////////////////////////////////////////////////////////////// - - public static interface Listener { - void onNavigationRequested(FxmlView... items); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Enum - /////////////////////////////////////////////////////////////////////////////////////////// - } diff --git a/src/main/java/io/bitsquare/gui/main/MainView.java b/src/main/java/io/bitsquare/gui/main/MainView.java index f92d66b71b..8d96000d1f 100644 --- a/src/main/java/io/bitsquare/gui/main/MainView.java +++ b/src/main/java/io/bitsquare/gui/main/MainView.java @@ -156,7 +156,7 @@ public class MainView extends ActivatableView { model.numPendingTrades.addListener((ov2, prev2, numPendingTrades) -> applyPendingTradesInfoIcon((int) numPendingTrades, portfolioButtonHolder)); - navigation.navigateToLastStoredItem(); + navigation.navigateToLastOpenView(); transitions.fadeOutAndRemove(splashScreen, 1500); } @@ -360,7 +360,7 @@ public class MainView extends ActivatableView { } }); - this.setOnAction(e -> navigation.navigationTo(FxmlView.MAIN, item)); + this.setOnAction(e -> navigation.navigateTo(FxmlView.MAIN, item)); } } } \ No newline at end of file diff --git a/src/main/java/io/bitsquare/gui/main/account/AccountView.java b/src/main/java/io/bitsquare/gui/main/account/AccountView.java index acecbb4d39..0bb01a6861 100644 --- a/src/main/java/io/bitsquare/gui/main/account/AccountView.java +++ b/src/main/java/io/bitsquare/gui/main/account/AccountView.java @@ -58,10 +58,10 @@ public class AccountView extends ActivatableView { tabChangeListener = (ov, oldValue, newValue) -> { if (newValue == accountSettingsTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT, + navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT, FxmlView.ACCOUNT_SETTINGS); else - navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT, + navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT, FxmlView.ARBITRATOR_SETTINGS); }; @@ -72,18 +72,18 @@ public class AccountView extends ActivatableView { navigation.addListener(navigationListener); root.getSelectionModel().selectedItemProperty().addListener(tabChangeListener); - if (navigation.getCurrentItems().length == 2 && - navigation.getCurrentItems()[1] == FxmlView.ACCOUNT) { + if (navigation.getCurrentPath().length == 2 && + navigation.getCurrentPath()[1] == FxmlView.ACCOUNT) { if (model.getNeedRegistration()) { - navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT, + navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT, FxmlView.ACCOUNT_SETUP); } else { if (root.getSelectionModel().getSelectedItem() == accountSettingsTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT, + navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT, FxmlView.ACCOUNT_SETTINGS); else - navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT, + navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT, FxmlView.ARBITRATOR_SETTINGS); } } diff --git a/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java b/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java index 371dc750ee..2930e8c9e5 100644 --- a/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java +++ b/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java @@ -89,10 +89,10 @@ class AccountSettingsView extends ActivatableViewAndModel { @Override public void doActivate() { navigation.addListener(listener); - FxmlView[] items = navigation.getCurrentItems(); + FxmlView[] items = navigation.getCurrentPath(); if (items.length == 3 && items[2] == FxmlView.ACCOUNT_SETTINGS) { - navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT, + navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT, FxmlView.ACCOUNT_SETTINGS, FxmlView.FIAT_ACCOUNT); } else { @@ -164,7 +164,7 @@ class MenuItem extends ToggleButton { setGraphic(icon); - setOnAction((event) -> navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT, + setOnAction((event) -> navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT, FxmlView.ACCOUNT_SETTINGS, navigationItem)); selectedProperty().addListener((ov, oldValue, newValue) -> { diff --git a/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java b/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java index 2384a273a2..ceaf7a4589 100644 --- a/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java +++ b/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java @@ -146,10 +146,10 @@ class AccountSetupWizard extends ActivatableView implements Wizard { else if (currentStep instanceof RegistrationView) { registration.onCompleted(); - if (navigation.getItemsForReturning() != null) - navigation.navigationTo(navigation.getItemsForReturning()); + if (navigation.getReturnPath() != null) + navigation.navigateTo(navigation.getReturnPath()); else - navigation.navigationTo(FxmlView.MAIN, FxmlView.BUY); + navigation.navigateTo(FxmlView.MAIN, FxmlView.BUY); } } diff --git a/src/main/java/io/bitsquare/gui/main/funds/FundsView.java b/src/main/java/io/bitsquare/gui/main/funds/FundsView.java index 058e0df724..516228be5d 100644 --- a/src/main/java/io/bitsquare/gui/main/funds/FundsView.java +++ b/src/main/java/io/bitsquare/gui/main/funds/FundsView.java @@ -58,9 +58,9 @@ class FundsView extends ActivatableViewAndModel { tabChangeListener = (ov, oldValue, newValue) -> { if (newValue == withdrawalTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.WITHDRAWAL); + navigation.navigateTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.WITHDRAWAL); else if (newValue == transactionsTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.TRANSACTIONS); + navigation.navigateTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.TRANSACTIONS); }; } @@ -70,9 +70,9 @@ class FundsView extends ActivatableViewAndModel { navigation.addListener(navigationListener); if (root.getSelectionModel().getSelectedItem() == transactionsTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.TRANSACTIONS); + navigation.navigateTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.TRANSACTIONS); else - navigation.navigationTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.WITHDRAWAL); + navigation.navigateTo(FxmlView.MAIN, FxmlView.FUNDS, FxmlView.WITHDRAWAL); } @Override diff --git a/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java b/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java index 39121f5918..0cfe1c1d15 100644 --- a/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java +++ b/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java @@ -61,12 +61,12 @@ class PortfolioView extends ActivatableViewAndModel { tabChangeListener = (ov, oldValue, newValue) -> { if (newValue == offersTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.OFFERS); + navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.OFFERS); else if (newValue == openTradesTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO, + navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.PENDING_TRADES); else if (newValue == closedTradesTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.CLOSED_TRADES); + navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.CLOSED_TRADES); }; } @@ -76,9 +76,9 @@ class PortfolioView extends ActivatableViewAndModel { navigation.addListener(navigationListener); if (tradeManager.getPendingTrades().size() == 0) - navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.OFFERS); + navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.OFFERS); else - navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.PENDING_TRADES); + navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.PENDING_TRADES); } @Override diff --git a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java index 8be1dc8e88..c4d477e04c 100644 --- a/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java +++ b/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java @@ -181,7 +181,7 @@ class PendingTradesView extends ActivatableViewAndModel - navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO, + navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.CLOSED_TRADES)); } diff --git a/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java b/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java index cb57ff9f15..6463fe4678 100644 --- a/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java +++ b/src/main/java/io/bitsquare/gui/main/settings/SettingsView.java @@ -60,10 +60,10 @@ class SettingsView extends ActivatableViewAndModel { tabChangeListener = (ov, oldValue, newValue) -> { if (newValue == preferencesTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.SETTINGS, + navigation.navigateTo(FxmlView.MAIN, FxmlView.SETTINGS, FxmlView.PREFERENCES); else if (newValue == networkSettingsTab) - navigation.navigationTo(FxmlView.MAIN, FxmlView.SETTINGS, + navigation.navigateTo(FxmlView.MAIN, FxmlView.SETTINGS, FxmlView.NETWORK_SETTINGS); }; } @@ -74,11 +74,11 @@ class SettingsView extends ActivatableViewAndModel { navigation.addListener(navigationListener); if (root.getSelectionModel().getSelectedItem() == preferencesTab) - navigation.navigationTo(FxmlView.MAIN, + navigation.navigateTo(FxmlView.MAIN, FxmlView.SETTINGS, FxmlView.PREFERENCES); else - navigation.navigationTo(FxmlView.MAIN, + navigation.navigateTo(FxmlView.MAIN, FxmlView.SETTINGS, FxmlView.NETWORK_SETTINGS); } diff --git a/src/main/java/io/bitsquare/gui/main/trade/TradeView.java b/src/main/java/io/bitsquare/gui/main/trade/TradeView.java index cefc6ee5a6..f618145216 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/TradeView.java +++ b/src/main/java/io/bitsquare/gui/main/trade/TradeView.java @@ -98,7 +98,7 @@ public class TradeView extends ActivatableView { }); navigation.addListener(listener); - navigation.navigationTo(FxmlView.MAIN, navigationItem, FxmlView.OFFER_BOOK); + navigation.navigateTo(FxmlView.MAIN, navigationItem, FxmlView.OFFER_BOOK); } @Override @@ -110,14 +110,14 @@ public class TradeView extends ActivatableView { public void createOffer(Coin amount, Fiat price) { this.amount = amount; this.price = price; - navigation.navigationTo(FxmlView.MAIN, navigationItem, FxmlView.CREATE_OFFER); + navigation.navigateTo(FxmlView.MAIN, navigationItem, FxmlView.CREATE_OFFER); } public void takeOffer(Coin amount, Fiat price, Offer offer) { this.amount = amount; this.price = price; this.offer = offer; - navigation.navigationTo(FxmlView.MAIN, navigationItem, FxmlView.TAKE_OFFER); + navigation.navigateTo(FxmlView.MAIN, navigationItem, FxmlView.TAKE_OFFER); } private View loadView(FxmlView navigationItem) { @@ -173,14 +173,14 @@ public class TradeView extends ActivatableView { offerBookView.enableCreateOfferButton(); // update the navigation state - navigation.navigationTo(FxmlView.MAIN, navigationItem, FxmlView.OFFER_BOOK); + navigation.navigateTo(FxmlView.MAIN, navigationItem, FxmlView.OFFER_BOOK); } private void onTakeOfferViewRemoved() { takeOfferView = null; // update the navigation state - navigation.navigationTo(FxmlView.MAIN, navigationItem, FxmlView.OFFER_BOOK); + navigation.navigateTo(FxmlView.MAIN, navigationItem, FxmlView.OFFER_BOOK); } } diff --git a/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java b/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java index 60aa1538fd..67c96c4527 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java +++ b/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.java @@ -222,7 +222,7 @@ public class CreateOfferView extends ActivatableViewAndModel