From 7b7fba78b5cff3d8c8716fa252d348ec6319757a Mon Sep 17 00:00:00 2001 From: iMoHax Date: Thu, 1 Oct 2015 13:23:14 +0300 Subject: [PATCH] move current route to profile model. Autochange current entry if change starsystem/station --- .../trader/controllers/HelperController.java | 52 +++++++----- .../trader/controllers/ProfileController.java | 78 ++++++++---------- .../controllers/RouteSearchController.java | 3 +- .../trader/controllers/RouterController.java | 3 +- .../java/ru/trader/controllers/Screeners.java | 4 +- .../java/ru/trader/model/ProfileModel.java | 16 ++++ .../java/ru/trader/model/RouteEntryModel.java | 4 + .../main/java/ru/trader/model/RouteModel.java | 79 +++++++++++++++++-- .../view/support/cells/OfferListCell.java | 11 ++- client/src/main/resources/view/helper.fxml | 14 +++- 10 files changed, 186 insertions(+), 78 deletions(-) diff --git a/client/src/main/java/ru/trader/controllers/HelperController.java b/client/src/main/java/ru/trader/controllers/HelperController.java index ee8b05f..0fe2974 100644 --- a/client/src/main/java/ru/trader/controllers/HelperController.java +++ b/client/src/main/java/ru/trader/controllers/HelperController.java @@ -1,10 +1,9 @@ package ru.trader.controllers; import javafx.beans.property.BooleanProperty; -import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.value.ChangeListener; +import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.Parent; import javafx.scene.Scene; @@ -12,11 +11,9 @@ import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.stage.Stage; import ru.trader.KeyBinding; -import ru.trader.model.MissionModel; -import ru.trader.model.OrderModel; -import ru.trader.model.RouteEntryModel; -import ru.trader.model.RouteModel; +import ru.trader.model.*; import ru.trader.view.support.ViewUtils; +import ru.trader.view.support.cells.OfferListCell; import ru.trader.view.support.cells.OrderListCell; import javax.swing.*; @@ -39,28 +36,29 @@ public class HelperController { private ListView sellOrders; @FXML private ListView missions; + @FXML + private ListView stations; + @FXML + private ListView sellOffers; private Stage stage; private RouteModel route; private final BooleanProperty docked; - private final IntegerProperty currentEntry; public HelperController() { - currentEntry = new SimpleIntegerProperty(-1); docked = new SimpleBooleanProperty(true); } @FXML private void initialize(){ - currentEntry.addListener(routeEntryListener); + MainController.getProfile().routeProperty().addListener(routeListener); buyOrders.setCellFactory(new OrderListCell(false)); sellOrders.setCellFactory(new OrderListCell(true)); + sellOffers.setCellFactory(new OfferListCell(true)); bindKeys(); } - public void show(Parent content, RouteModel route) { - this.route = route; - currentEntry.setValue(0); + public void show(Parent content) { if (stage == null){ stage = new Stage(); stage.setScene(new Scene(content)); @@ -76,6 +74,15 @@ public class HelperController { } } + private void setRoute(RouteModel route){ + if (this.route != null){ + this.route.currentEntryProperty().removeListener(currentEntryListener); + } + this.route = route; + setRouteEntry(route.getCurrentEntry()); + this.route.currentEntryProperty().addListener(currentEntryListener); + } + private void setRouteEntry(int index){ RouteEntryModel entry = route.get(index); station.setText(entry.getStation().getName()); @@ -85,13 +92,19 @@ public class HelperController { buyOrders.setItems(entry.orders()); sellOrders.setItems(entry.sellOrders()); missions.setItems(entry.missions()); + stations.setItems(FXCollections.observableArrayList(route.getStations(index))); + sellOffers.setItems(FXCollections.observableArrayList(route.getSellOffers(index))); } @FXML private void next(){ - int index = currentEntry.get(); + int index = route.getCurrentEntry(); if (index < route.getJumps() - 1){ - currentEntry.setValue(index+1); + route.setCurrentEntry(index+1); + } else { + if (route.isLoop()){ + route.setCurrentEntry(0); + } } } @@ -102,16 +115,19 @@ public class HelperController { @FXML private void previous(){ - int index = currentEntry.get(); + int index = route.getCurrentEntry(); if (index > 0){ - currentEntry.setValue(index-1); + route.setCurrentEntry(index-1); } } - private final ChangeListener routeEntryListener = (ov, o, n) -> ViewUtils.doFX(() -> setRouteEntry(n.intValue())); - private void bindKeys(){ KeyBinding.bind(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD4, KeyEvent.CTRL_MASK | KeyEvent.ALT_MASK), k -> ViewUtils.doFX(this::previous)); KeyBinding.bind(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD6, KeyEvent.CTRL_MASK | KeyEvent.ALT_MASK), k -> ViewUtils.doFX(this::next)); } + + private final ChangeListener currentEntryListener = (ov, o, n) -> ViewUtils.doFX(() -> setRouteEntry(n.intValue())); + private final ChangeListener routeListener = (ov, o, n) -> ViewUtils.doFX(() -> setRoute(n)); + + } diff --git a/client/src/main/java/ru/trader/controllers/ProfileController.java b/client/src/main/java/ru/trader/controllers/ProfileController.java index 24f8d3c..d92bd10 100644 --- a/client/src/main/java/ru/trader/controllers/ProfileController.java +++ b/client/src/main/java/ru/trader/controllers/ProfileController.java @@ -57,43 +57,32 @@ public class ProfileController { initListeners(); } + private void consumeChanges(Runnable runnable){ + if (ignoreChanges) return; + ignoreChanges = true; + ViewUtils.doFX(runnable); + ignoreChanges = false; + } + + private void doAndConsumeChanges(Runnable runnable){ + boolean old = ignoreChanges; + ignoreChanges = true; + ViewUtils.doFX(runnable); + ignoreChanges = old; + } + private void initListeners(){ - name.textProperty().addListener((ov, o, n) -> { - if (!ignoreChanges) - profile.setName(n); - }); - balance.numberProperty().addListener((ov, o, n) -> { - if (!ignoreChanges) - profile.setBalance(n.doubleValue()); - }); + name.textProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setName(n))); + balance.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setBalance(n.doubleValue()))); system.completionProperty().addListener((ov, o , n) -> { - if (!ignoreChanges){ - ignoreChanges = true; - profile.setSystem(n); - } - station.setItems(n.getStationsList()); - ignoreChanges = false; - }); - station.valueProperty().addListener((ov, o, n) -> { - if (!ignoreChanges) - profile.setStation(n); - }); - mass.numberProperty().addListener((ov, o, n) -> { - if (!ignoreChanges) - profile.setShipMass(n.doubleValue()); - }); - tank.numberProperty().addListener((ov, o, n) -> { - if (!ignoreChanges) - profile.setShipTank(n.doubleValue()); - }); - cargo.numberProperty().addListener((ov, o, n) -> { - if (!ignoreChanges) - profile.setShipCargo(n.intValue()); - }); - engine.valueProperty().addListener((ov, o, n) -> { - if (!ignoreChanges) - profile.setShipEngine(n); + doAndConsumeChanges(() -> station.setItems(n.getStationsList())); + consumeChanges(() -> {profile.setSystem(n); profile.setStation(ModelFabric.NONE_STATION);}); }); + station.valueProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setStation(n))); + mass.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipMass(n.doubleValue()))); + tank.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipTank(n.doubleValue()))); + cargo.numberProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipCargo(n.intValue()))); + engine.valueProperty().addListener((ov, o, n) -> consumeChanges(() -> profile.setShipEngine(n))); } public void setProfile(ProfileModel profile){ @@ -101,7 +90,6 @@ public class ProfileController { unbind(); } this.profile = profile; - ignoreChanges = true; name.setText(profile.getName()); balance.setValue(profile.getBalance()); system.setValue(profile.getSystem()); @@ -111,7 +99,6 @@ public class ProfileController { cargo.setValue(profile.getShipCargo()); engine.setValue(profile.getShipEngine()); bind(); - ignoreChanges = false; } private void bind(){ @@ -137,17 +124,14 @@ public class ProfileController { } - private final ChangeListener nameListener = (ov, o, n) -> ViewUtils.doFX(() -> name.setText(n)); - private final ChangeListener balanceListener = (ov, o, n) -> ViewUtils.doFX(() -> balance.setValue(n)); - private final ChangeListener systemListener = (ov, o, n) -> { - if (!ignoreChanges) - ViewUtils.doFX(() -> system.setValue(n)); - }; - private final ChangeListener stationListener = (ov, o, n) -> ViewUtils.doFX(() -> station.setValue(n)); - private final ChangeListener massListener = (ov, o, n) -> ViewUtils.doFX(() -> mass.setValue(n)); - private final ChangeListener tankListener = (ov, o, n) -> ViewUtils.doFX(() -> tank.setValue(n)); - private final ChangeListener cargoListener = (ov, o, n) -> ViewUtils.doFX(() -> cargo.setValue(n)); - private final ChangeListener engineListener = (ov, o, n) -> ViewUtils.doFX(() -> engine.setValue(n)); + private final ChangeListener nameListener = (ov, o, n) -> consumeChanges(() -> name.setText(n)); + private final ChangeListener balanceListener = (ov, o, n) -> consumeChanges(() -> balance.setValue(n)); + private final ChangeListener systemListener = (ov, o, n) -> consumeChanges(() -> system.setValue(n)); + private final ChangeListener stationListener = (ov, o, n) -> consumeChanges(() -> station.setValue(n)); + private final ChangeListener massListener = (ov, o, n) -> consumeChanges(() -> mass.setValue(n)); + private final ChangeListener tankListener = (ov, o, n) -> consumeChanges(() -> tank.setValue(n)); + private final ChangeListener cargoListener = (ov, o, n) -> consumeChanges(() -> cargo.setValue(n)); + private final ChangeListener engineListener = (ov, o, n) -> consumeChanges(() -> engine.setValue(n)); private class EngineStringConverter extends StringConverter { @Override diff --git a/client/src/main/java/ru/trader/controllers/RouteSearchController.java b/client/src/main/java/ru/trader/controllers/RouteSearchController.java index afbecdc..325c216 100644 --- a/client/src/main/java/ru/trader/controllers/RouteSearchController.java +++ b/client/src/main/java/ru/trader/controllers/RouteSearchController.java @@ -83,7 +83,8 @@ public class RouteSearchController { if (path.isPresent()){ RouteModel route = path.get(); route.addAll(0, missionsList.getItems()); - Screeners.showHelper(route); + profile.setRoute(route); + Screeners.showHelper(); } }); } diff --git a/client/src/main/java/ru/trader/controllers/RouterController.java b/client/src/main/java/ru/trader/controllers/RouterController.java index fb25172..0c222e5 100644 --- a/client/src/main/java/ru/trader/controllers/RouterController.java +++ b/client/src/main/java/ru/trader/controllers/RouterController.java @@ -275,7 +275,8 @@ public class RouterController { if (path.isPresent()){ orders.addAll(path.get().getOrders()); addRouteToPath(path.get()); - Screeners.showHelper(path.get()); + MainController.getProfile().setRoute(path.get()); + Screeners.showHelper(); } }); } diff --git a/client/src/main/java/ru/trader/controllers/Screeners.java b/client/src/main/java/ru/trader/controllers/Screeners.java index ff928e6..6fd7afc 100644 --- a/client/src/main/java/ru/trader/controllers/Screeners.java +++ b/client/src/main/java/ru/trader/controllers/Screeners.java @@ -247,8 +247,8 @@ public class Screeners { return dialog.showAndWait(); } - public static void showHelper(RouteModel route){ - helperController.show(helperScreen, route); + public static void showHelper(){ + helperController.show(helperScreen); } public static void reinitAll() { diff --git a/client/src/main/java/ru/trader/model/ProfileModel.java b/client/src/main/java/ru/trader/model/ProfileModel.java index be46bc9..a22cfcc 100644 --- a/client/src/main/java/ru/trader/model/ProfileModel.java +++ b/client/src/main/java/ru/trader/model/ProfileModel.java @@ -21,6 +21,7 @@ public class ProfileModel { private final DoubleProperty shipTank; private final IntegerProperty shipCargo; private final ObjectProperty shipEngine; + private final ObjectProperty route; public ProfileModel(Profile profile, MarketModel market) { this.market = market; @@ -34,6 +35,7 @@ public class ProfileModel { shipTank = new SimpleDoubleProperty(); shipCargo = new SimpleIntegerProperty(); shipEngine = new SimpleObjectProperty<>(); + route = new SimpleObjectProperty<>(); refresh(); initListeners(); } @@ -50,10 +52,12 @@ public class ProfileModel { system.addListener((ov, o, n) -> { LOG.debug("Change system, old: {}, new: {}", o, n); profile.setSystem(n != null && n != ModelFabric.NONE_SYSTEM ? n.getSystem() : null); + if (route.getValue() != null) {getRoute().updateCurrentEntry(n, null);} }); station.addListener((ov, o, n) -> { LOG.debug("Change station, old: {}, new: {}", o, n); profile.setStation(n != null && n != ModelFabric.NONE_STATION ? n.getStation() : null); + if (route.getValue() != null) {getRoute().updateCurrentEntry(getSystem(), n);} }); docked.addListener((ov, o, n) -> { LOG.debug("Change docked, old: {}, new: {}", o, n); @@ -195,6 +199,18 @@ public class ProfileModel { this.shipEngine.set(engine); } + public RouteModel getRoute() { + return route.get(); + } + + public ObjectProperty routeProperty() { + return route; + } + + public void setRoute(RouteModel route) { + this.route.set(route); + } + private void refresh(){ name.setValue(profile.getName()); balance.setValue(profile.getBalance()); diff --git a/client/src/main/java/ru/trader/model/RouteEntryModel.java b/client/src/main/java/ru/trader/model/RouteEntryModel.java index f368e02..eb5e7ff 100644 --- a/client/src/main/java/ru/trader/model/RouteEntryModel.java +++ b/client/src/main/java/ru/trader/model/RouteEntryModel.java @@ -70,6 +70,10 @@ public class RouteEntryModel { return entry.getRefill(); } + public boolean isTransit(){ + return entry.isTransit(); + } + public ObservableList orders() { return orders; } diff --git a/client/src/main/java/ru/trader/model/RouteModel.java b/client/src/main/java/ru/trader/model/RouteModel.java index 8c80e3c..1f50911 100644 --- a/client/src/main/java/ru/trader/model/RouteModel.java +++ b/client/src/main/java/ru/trader/model/RouteModel.java @@ -1,8 +1,6 @@ package ru.trader.model; -import javafx.beans.property.DoubleProperty; -import javafx.beans.property.ReadOnlyDoubleProperty; -import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.*; import ru.trader.analysis.Route; import ru.trader.analysis.RouteEntry; import ru.trader.analysis.RouteFiller; @@ -11,9 +9,7 @@ import ru.trader.core.Offer; import ru.trader.core.Order; import ru.trader.model.support.BindingsHelper; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; public class RouteModel { @@ -22,6 +18,7 @@ public class RouteModel { private final DoubleProperty profit; private final DoubleProperty profitByTime; private final List entries; + private final IntegerProperty currentEntry; RouteModel(Route route, MarketModel market) { this.market = market; @@ -32,6 +29,7 @@ public class RouteModel { profitByTime = new SimpleDoubleProperty(); profitByTime.bind(profit.divide(_route.getTime())); fillSellOrders(); + currentEntry = new SimpleIntegerProperty(0); } private void fillSellOrders(){ @@ -73,6 +71,10 @@ public class RouteModel { return _route; } + public boolean isLoop(){ + return _route.isLoop(); + } + public int getLands() { return _route.getLands(); } @@ -187,4 +189,69 @@ public class RouteModel { fillSellOrders(); } + public Collection getStations(int offset){ + Collection res = new HashSet<>(); + int startIndex = _route.isLoop() ? 1 : offset+1; + if (startIndex >= entries.size()) return res; + entries.subList(startIndex, entries.size()).stream().map(RouteEntryModel::getStation) + .filter(station -> station != ModelFabric.NONE_STATION) + .forEach(res::add); + return res; + } + + public Collection getSellOffers(int offset){ + Map res = new HashMap<>(); + for (StationModel station : getStations(offset)) { + for (OfferModel offer : station.getSells()) { + if (offer.getItem().isMarketItem()){ + OfferModel old = res.get(offer.getItem()); + if (old == null || old.getPrice() > offer.getPrice()){ + res.put(offer.getItem(), offer); + } + } + } + } + return res.values(); + } + + public int getCurrentEntry() { + return currentEntry.get(); + } + + public IntegerProperty currentEntryProperty() { + return currentEntry; + } + + public void setCurrentEntry(int currentEntry) { + this.currentEntry.set(currentEntry); + } + + public void updateCurrentEntry(SystemModel system, StationModel station) { + for (int i = getCurrentEntry()+1; i < entries.size(); i++) { + RouteEntryModel entry = entries.get(i); + if (system.equals(entry.getStation().getSystem()) + && (station == null || station == ModelFabric.NONE_STATION || + station.equals(entry.getStation())) + ) + { + setCurrentEntry(i); + return; + } + if (!entry.isTransit()) return; + } + if (isLoop()){ + for (int i = 0; i < getCurrentEntry()-1; i++) { + RouteEntryModel entry = entries.get(i); + if (system.equals(entry.getStation().getSystem()) + && (station == null || station == ModelFabric.NONE_STATION || + station.equals(entry.getStation())) + ) + { + setCurrentEntry(i); + return; + } + if (!entry.isTransit()) return; + } + } + } } diff --git a/client/src/main/java/ru/trader/view/support/cells/OfferListCell.java b/client/src/main/java/ru/trader/view/support/cells/OfferListCell.java index 2558b67..20e2085 100644 --- a/client/src/main/java/ru/trader/view/support/cells/OfferListCell.java +++ b/client/src/main/java/ru/trader/view/support/cells/OfferListCell.java @@ -7,6 +7,15 @@ import ru.trader.model.OfferModel; import ru.trader.model.support.ModelBindings; public class OfferListCell implements Callback, ListCell> { + private final boolean asItem; + + public OfferListCell(){ + this(false); + } + + public OfferListCell(boolean toItemString){ + asItem = toItemString; + } @Override public ListCell call(ListView param){ @@ -19,7 +28,7 @@ public class OfferListCell implements Callback, ListCell