mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-04-18 14:55:53 -04:00
Begin refactoring Navigation
This commit is contained in:
parent
6de4e63973
commit
5a5bfd0826
@ -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<Listener> 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<FxmlView> 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<FxmlView> 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<FxmlView> 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
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ public class MainView extends ActivatableView<StackPane, MainViewModel> {
|
||||
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<StackPane, MainViewModel> {
|
||||
}
|
||||
});
|
||||
|
||||
this.setOnAction(e -> navigation.navigationTo(FxmlView.MAIN, item));
|
||||
this.setOnAction(e -> navigation.navigateTo(FxmlView.MAIN, item));
|
||||
}
|
||||
}
|
||||
}
|
@ -58,10 +58,10 @@ public class AccountView extends ActivatableView<TabPane, AccountViewModel> {
|
||||
|
||||
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<TabPane, AccountViewModel> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -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) -> {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,9 +58,9 @@ class FundsView extends ActivatableViewAndModel<TabPane, Activatable> {
|
||||
|
||||
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<TabPane, Activatable> {
|
||||
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
|
||||
|
@ -61,12 +61,12 @@ class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable> {
|
||||
|
||||
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<TabPane, Activatable> {
|
||||
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
|
||||
|
@ -181,7 +181,7 @@ class PendingTradesView extends ActivatableViewAndModel<AnchorPane, PendingTrade
|
||||
setSummaryControlsVisible(false);
|
||||
model.withdraw(withdrawAddressTextField.getText());
|
||||
Platform.runLater(() ->
|
||||
navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO,
|
||||
navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO,
|
||||
FxmlView.CLOSED_TRADES));
|
||||
}
|
||||
|
||||
|
@ -60,10 +60,10 @@ class SettingsView extends ActivatableViewAndModel<TabPane, Activatable> {
|
||||
|
||||
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<TabPane, Activatable> {
|
||||
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);
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ public class TradeView extends ActivatableView<TabPane, Void> {
|
||||
});
|
||||
|
||||
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<TabPane, Void> {
|
||||
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<TabPane, Void> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -222,7 +222,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
}
|
||||
|
||||
private void openAccountSettings() {
|
||||
navigation.navigationTo(FxmlView.MAIN,
|
||||
navigation.navigateTo(FxmlView.MAIN,
|
||||
FxmlView.ACCOUNT,
|
||||
FxmlView.ACCOUNT_SETTINGS,
|
||||
FxmlView.RESTRICTIONS);
|
||||
@ -232,7 +232,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
TabPane tabPane = ((TabPane) (root.getParent().getParent()));
|
||||
tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
|
||||
|
||||
navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.OFFERS);
|
||||
navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO, FxmlView.OFFERS);
|
||||
}
|
||||
|
||||
private void setupListeners() {
|
||||
|
@ -203,8 +203,8 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
|
||||
getProperties().put("type", "OK");
|
||||
Dialog.Actions.OK.handle(actionEvent);
|
||||
overlayManager.removeBlurContent();
|
||||
navigation.setItemsForReturning(navigation.getCurrentItems());
|
||||
navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT,
|
||||
navigation.setReturnPath(navigation.getCurrentPath());
|
||||
navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT,
|
||||
FxmlView.ACCOUNT_SETUP);
|
||||
}
|
||||
});
|
||||
@ -255,7 +255,7 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
|
||||
actions);
|
||||
|
||||
if (Popups.isYes(response))
|
||||
navigation.navigationTo(FxmlView.MAIN, FxmlView.ACCOUNT,
|
||||
navigation.navigateTo(FxmlView.MAIN, FxmlView.ACCOUNT,
|
||||
FxmlView.ACCOUNT_SETTINGS,
|
||||
FxmlView.RESTRICTIONS);
|
||||
else
|
||||
|
@ -281,7 +281,7 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
|
||||
getProperties().put("type", "CLOSE");
|
||||
try {
|
||||
close();
|
||||
navigation.navigationTo(FxmlView.MAIN, FxmlView.PORTFOLIO,
|
||||
navigation.navigateTo(FxmlView.MAIN, FxmlView.PORTFOLIO,
|
||||
FxmlView.PENDING_TRADES);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
Loading…
x
Reference in New Issue
Block a user