From c8aa9e9474253ed12c6dea1726cde537af69895e Mon Sep 17 00:00:00 2001 From: iMoHax Date: Tue, 13 Oct 2015 16:52:32 +0300 Subject: [PATCH] add prototype route tracker --- .../controllers/RouteTrackController.java | 85 ++++++++++-- .../java/ru/trader/model/RouteEntryModel.java | 12 ++ .../main/java/ru/trader/model/RouteModel.java | 4 + .../java/ru/trader/view/support/Track.java | 129 ++++++++++++++++++ .../src/main/resources/view/routeTrack.fxml | 40 +++++- client/src/main/resources/view/style.css | 23 ++-- 6 files changed, 269 insertions(+), 24 deletions(-) create mode 100644 client/src/main/java/ru/trader/view/support/Track.java diff --git a/client/src/main/java/ru/trader/controllers/RouteTrackController.java b/client/src/main/java/ru/trader/controllers/RouteTrackController.java index 669493a..c1c9ff3 100644 --- a/client/src/main/java/ru/trader/controllers/RouteTrackController.java +++ b/client/src/main/java/ru/trader/controllers/RouteTrackController.java @@ -1,18 +1,24 @@ package ru.trader.controllers; +import javafx.beans.InvalidationListener; import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.scene.control.CheckBox; -import javafx.scene.control.ComboBox; -import javafx.scene.control.ListView; -import javafx.scene.control.TextField; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; import ru.trader.analysis.CrawlerSpecificator; import ru.trader.model.*; +import ru.trader.view.support.Track; import ru.trader.view.support.ViewUtils; import ru.trader.view.support.autocomplete.AutoCompletion; import ru.trader.view.support.autocomplete.SystemsProvider; +import ru.trader.view.support.cells.OfferListCell; +import ru.trader.view.support.cells.OrderListCell; +import ru.trader.view.support.cells.StationListCell; import java.util.List; import java.util.Optional; @@ -20,18 +26,45 @@ import java.util.stream.Collectors; public class RouteTrackController { + @FXML + private Node editGroup; + @FXML + private Node infoGroup; + @FXML + private Node refuelGroup; + @FXML + private Node ordersGroup; + @FXML + private Label station; + @FXML + private Label system; + @FXML + private Label time; + @FXML + private Label refuel; + @FXML + private ListView buyOrders; + @FXML + private ListView sellOrders; + @FXML + private ListView addMissionsList; @FXML private ListView missionsList; @FXML private MissionsController missionsController; + @FXML + private Pane track; private RouteModel route; - private int index; + private Track trackNode; @FXML private void initialize(){ MainController.getProfile().routeProperty().addListener(routeListener); - missionsList.setItems(missionsController.getMissions()); + addMissionsList.setItems(missionsController.getMissions()); + buyOrders.setCellFactory(new OrderListCell(false)); + sellOrders.setCellFactory(new OrderListCell(true)); + editGroup.setVisible(false); } public void setRoute(RouteModel route){ @@ -39,23 +72,56 @@ public class RouteTrackController { this.route.currentEntryProperty().removeListener(currentEntryListener); } this.route = route; + fillTrack(); setIndex(route.getCurrentEntry()); this.route.currentEntryProperty().addListener(currentEntryListener); } public void setIndex(int index){ - this.index = index; - missionsController.setStation(route.get(index).getStation()); + trackNode.setActive(index); + } + + private void fillTrack(){ + if (trackNode != null) trackNode.activeProperty().removeListener(activeEntryListener); + trackNode = new Track(route); + track.getChildren().setAll(trackNode.getNode()); + trackNode.activeProperty().addListener(activeEntryListener); + } + + private void update(){ + int index = trackNode.getActive(); + if (index == -1) return; + RouteEntryModel entry = route.get(index); + missionsController.setStation(entry.getStation()); ObservableList stations = FXCollections.observableArrayList(route.getStations(index)); missionsController.getBuyerProvider().setPossibleSuggestions(stations); missionsController.getReceiverProvider().setPossibleSuggestions(stations); List items = route.getSellOffers(index).stream().map(OfferModel::getItem).collect(Collectors.toList()); missionsController.getItem().getItems().setAll(items); + + station.setText(entry.getStation().getName()); + system.setText(entry.getStation().getSystem().getName()); + time.setText(ViewUtils.timeToString(entry.getTime())); + refuel.setText(String.valueOf(entry.getRefill())); + buyOrders.setItems(entry.orders()); + sellOrders.setItems(entry.sellOrders()); + missionsList.setItems(entry.missions()); + } + + @FXML + private void toggleEdit(){ + if (editGroup.isVisible()){ + editGroup.setVisible(false); + infoGroup.setVisible(true); + } else { + editGroup.setVisible(true); + infoGroup.setVisible(false); + } } @FXML private void addMissions(){ - int startIndex = route.isLoop() ? 0 : index; + int startIndex = route.isLoop() ? 0 : trackNode.getActive(); route.addAll(startIndex, missionsList.getItems()); } @@ -68,6 +134,7 @@ public class RouteTrackController { } private final ChangeListener currentEntryListener = (ov, o, n) -> ViewUtils.doFX(() -> setIndex(n.intValue())); + private final InvalidationListener activeEntryListener = ov -> ViewUtils.doFX(this::update); private final ChangeListener routeListener = (ov, o, n) -> { if (n != null){ ViewUtils.doFX(() -> setRoute(n)); diff --git a/client/src/main/java/ru/trader/model/RouteEntryModel.java b/client/src/main/java/ru/trader/model/RouteEntryModel.java index 01bc58c..47bf99d 100644 --- a/client/src/main/java/ru/trader/model/RouteEntryModel.java +++ b/client/src/main/java/ru/trader/model/RouteEntryModel.java @@ -79,6 +79,18 @@ public class RouteEntryModel { return entry.isTransit(); } + public boolean isBuy(){ + return !orders.isEmpty(); + } + + public boolean isSell(){ + return !sellOrders.isEmpty(); + } + + public boolean isMissionTarget(){ + return !missions.isEmpty(); + } + 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 522ce36..dfafaf6 100644 --- a/client/src/main/java/ru/trader/model/RouteModel.java +++ b/client/src/main/java/ru/trader/model/RouteModel.java @@ -63,6 +63,10 @@ public class RouteModel { return entries.get(index); } + public Collection getEntries(){ + return entries; + } + public double getDistance() { return _route.getDistance(); } diff --git a/client/src/main/java/ru/trader/view/support/Track.java b/client/src/main/java/ru/trader/view/support/Track.java new file mode 100644 index 0000000..7b56c7b --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/Track.java @@ -0,0 +1,129 @@ +package ru.trader.view.support; + +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.scene.Node; +import javafx.scene.input.MouseButton; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; +import org.controlsfx.glyphfont.Glyph; +import ru.trader.model.RouteEntryModel; +import ru.trader.model.RouteModel; +import ru.trader.model.StationModel; +import ru.trader.view.support.cells.DistanceCell; + +import java.util.ArrayList; +import java.util.List; + +public class Track { + private final static String CSS_ROUTE = "route"; + private final static String CSS_ICONS = "route-icons"; + private final static String CSS_TRACK = "route-track"; + private final static String CSS_TRACK_TEXT = "route-track-text"; + private final static String CSS_SYSTEM = "route-system"; + private final static String CSS_ACTIVE_SYSTEM = "route-active"; + private final static String CSS_TEXT = "route-text"; + private final static String CSS_SYSTEM_TEXT = "route-system-text"; + private final static String CSS_STATION_TEXT = "route-station-text"; + + private final RouteModel route; + private final HBox node = new HBox(); + private final IntegerProperty active; + private final List entryNodes; + + public Track(RouteModel route) { + this.route = route; + entryNodes = new ArrayList<>(route.getJumps()); + active = new SimpleIntegerProperty(-1); + node.getStyleClass().add(CSS_ROUTE); + build(); + } + + private void build(){ + StationModel prev = null; + for (RouteEntryModel entry : route.getEntries()) { + if (prev != null){ + VBox track = new VBox(); + VBox.setVgrow(track, Priority.ALWAYS); + track.getStyleClass().add(CSS_TRACK); + + Text t = new Text(DistanceCell.distanceToString(entry.getStation().getDistance(prev))); + t.getStyleClass().add(CSS_TRACK_TEXT); + track.getChildren().addAll(t, Glyph.create("FontAwesome|LONG_ARROW_RIGHT")); + + node.getChildren().addAll(track); + } + HBox entryNode = new HBox(); + HBox stationNode = new HBox(); + VBox icons = new VBox(); + VBox.setVgrow(icons, Priority.ALWAYS); + + stationNode.getStyleClass().add(CSS_SYSTEM); + icons.getStyleClass().add(CSS_ICONS); + + stationNode.getChildren().add(buildText(entry.getStation(), entry.isTransit())); + + if (entry.isBuy()){ + icons.getChildren().add(Glyph.create("FontAwesome|UPLOAD")); + } + if (entry.getRefill() > 0){ + icons.getChildren().add(Glyph.create("FontAwesome|REFRESH")); + } + if (entry.isSell()){ + icons.getChildren().add(Glyph.create("FontAwesome|DOWNLOAD")); + } + entryNode.getChildren().addAll(stationNode, icons); + node.getChildren().addAll(entryNode); + final int curIndex = entryNodes.size(); + entryNode.setOnMouseClicked(e -> { + if (e.getButton() == MouseButton.PRIMARY){ + setActive(curIndex); + } + }); + entryNodes.add(entryNode); + prev = entry.getStation(); + } + } + + private VBox buildText(StationModel station, boolean transit){ + Text systemText = new Text(station.getSystem().getName()); + systemText.getStyleClass().add(CSS_SYSTEM_TEXT); + + VBox text = new VBox(2); + VBox.setVgrow(text, Priority.ALWAYS); + text.getStyleClass().add(CSS_TEXT); + text.getChildren().addAll(systemText); + + if (!transit) { + Text stationText = new Text(station.getName()); + stationText.getStyleClass().add(CSS_STATION_TEXT); + Text distanceText = new Text(String.format("%.0f Ls", station.getDistance())); + distanceText.getStyleClass().add(CSS_STATION_TEXT); + text.getChildren().addAll(stationText, distanceText); + } + + return text; + } + + public int getActive() { + return active.get(); + } + + public IntegerProperty activeProperty() { + return active; + } + + public void setActive(int index){ + if (this.active.get() != -1){ + entryNodes.get(this.active.get()).getStyleClass().remove(CSS_ACTIVE_SYSTEM); + } + this.active.setValue(index); + entryNodes.get(index).getStyleClass().add(CSS_ACTIVE_SYSTEM); + } + + public Node getNode() { + return node; + } +} diff --git a/client/src/main/resources/view/routeTrack.fxml b/client/src/main/resources/view/routeTrack.fxml index 7db4621..0f68cdb 100644 --- a/client/src/main/resources/view/routeTrack.fxml +++ b/client/src/main/resources/view/routeTrack.fxml @@ -10,10 +10,38 @@ - - - - - +