Begin refactoring Navigation

This commit is contained in:
Chris Beams 2014-11-24 10:49:22 +01:00
parent 6de4e63973
commit 5a5bfd0826
No known key found for this signature in database
GPG Key ID: 3D214F8F5BC5ED73
13 changed files with 90 additions and 115 deletions

View File

@ -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
///////////////////////////////////////////////////////////////////////////////////////////
}

View File

@ -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));
}
}
}

View File

@ -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);
}
}

View File

@ -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) -> {

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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));
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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() {

View File

@ -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

View File

@ -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();