diff --git a/client/src/main/java/ru/trader/controllers/HelperController.java b/client/src/main/java/ru/trader/controllers/HelperController.java index 31609f2..3cdc50a 100644 --- a/client/src/main/java/ru/trader/controllers/HelperController.java +++ b/client/src/main/java/ru/trader/controllers/HelperController.java @@ -1,28 +1,42 @@ package ru.trader.controllers; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; +import javafx.event.EventHandler; import javafx.fxml.FXML; +import javafx.geometry.Bounds; +import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.ListView; +import javafx.scene.control.ToggleButton; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.Pane; import javafx.stage.Stage; +import javafx.stage.StageStyle; import ru.trader.KeyBinding; import ru.trader.Main; 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 ru.trader.view.support.cells.StationListCell; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.KeyEvent; public class HelperController { + @FXML + private Node refuelGroup; + @FXML + private Node ordersGroup; + @FXML + private Node missionsGroup; + @FXML + private Node infoGroup; @FXML private Label station; @FXML @@ -41,29 +55,85 @@ public class HelperController { private ListView stations; @FXML private ListView sellOffers; + @FXML + private ToggleButton infoBtn; + private Stage stage; private RouteModel route; - private final BooleanProperty docked; - - public HelperController() { - docked = new SimpleBooleanProperty(true); - } + private RouteEntryModel entry; @FXML private void initialize(){ - MainController.getProfile().routeProperty().addListener(routeListener); + ProfileModel profile = MainController.getProfile(); + profile.routeProperty().addListener(routeListener); + profile.dockedProperty().addListener(dockedListener); buyOrders.setCellFactory(new OrderListCell(false)); sellOrders.setCellFactory(new OrderListCell(true)); sellOffers.setCellFactory(new OfferListCell(true)); + stations.setCellFactory(new StationListCell()); + infoBtn.selectedProperty().addListener((ov, o, n) -> { + if (n) showInfo(); + else hideInfo(); + }); + refuelGroup.managedProperty().bind(refuelGroup.visibleProperty()); + missionsGroup.managedProperty().bind(missionsGroup.visibleProperty()); + ordersGroup.managedProperty().bind(ordersGroup.visibleProperty()); + infoGroup.managedProperty().bind(infoGroup.visibleProperty()); + hideInfo(); + hideStationInfo(); bindKeys(); } + private void resize(){ + if (stage == null) return; + Pane root = (Pane)stage.getScene().getRoot(); + root.autosize(); + Bounds bounds = root.getLayoutBounds(); + stage.setWidth(bounds.getWidth()); + stage.setHeight(bounds.getHeight()); + } + + private void setDocked(boolean docked){ + if (docked && MainController.getProfile().getStation().equals(entry.getStation())){ + showStationInfo(); + } else { + hideStationInfo(); + hideInfo(); + } + } + + private void showStationInfo(){ + refuelGroup.setVisible(entry.getRefill() > 0); + ordersGroup.setVisible(!buyOrders.getItems().isEmpty() || !sellOrders.getItems().isEmpty()); + missionsGroup.setVisible(!missions.getItems().isEmpty()); + resize(); + } + + private void hideStationInfo(){ + refuelGroup.setVisible(false); + ordersGroup.setVisible(false); + missionsGroup.setVisible(false); + resize(); + } + + private void showInfo(){ + infoGroup.setVisible(true); + resize(); + } + + private void hideInfo(){ + infoGroup.setVisible(false); + resize(); + } + public void show(Parent content) { if (stage == null){ stage = new Stage(); stage.setScene(new Scene(content)); + stage.initStyle(StageStyle.UNDECORATED); stage.setAlwaysOnTop(true); + addDragListeners(content); stage.show(); } else { stage.show(); @@ -83,10 +153,11 @@ public class HelperController { this.route = route; setRouteEntry(route.getCurrentEntry()); this.route.currentEntryProperty().addListener(currentEntryListener); + showStationInfo(); } private void setRouteEntry(int index){ - RouteEntryModel entry = route.get(index); + entry = route.get(index); station.setText(entry.getStation().getName()); system.setText(entry.getStation().getSystem().getName()); time.setText(ViewUtils.timeToString(entry.getTime())); @@ -135,11 +206,33 @@ public class HelperController { } private final ChangeListener currentEntryListener = (ov, o, n) -> ViewUtils.doFX(() -> setRouteEntry(n.intValue())); + private final ChangeListener dockedListener = (ov, o, n) -> ViewUtils.doFX(() -> setDocked(n)); private final ChangeListener routeListener = (ov, o, n) -> { if (n != null){ ViewUtils.doFX(() -> setRoute(n)); } }; + private void addDragListeners(final Node node){ + new DragListener(node); + } + private class DragListener { + private final EventHandler pressedListener; + private final EventHandler draggedListener; + double x, y; + + private DragListener(Node node) { + pressedListener = (MouseEvent mouseEvent) -> { + x = mouseEvent.getSceneX(); + y = mouseEvent.getSceneY(); + }; + draggedListener = (MouseEvent mouseEvent) -> { + node.getScene().getWindow().setX(mouseEvent.getScreenX()-x); + node.getScene().getWindow().setY(mouseEvent.getScreenY()-y); + }; + node.setOnMousePressed(pressedListener); + node.setOnMouseDragged(draggedListener); + } + } } diff --git a/client/src/main/java/ru/trader/model/StationModel.java b/client/src/main/java/ru/trader/model/StationModel.java index a9c79ee..bae5b94 100644 --- a/client/src/main/java/ru/trader/model/StationModel.java +++ b/client/src/main/java/ru/trader/model/StationModel.java @@ -1,8 +1,11 @@ package ru.trader.model; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.StringBinding; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.core.*; +import ru.trader.model.support.ModelBindings; import java.util.Collection; import java.util.List; @@ -130,6 +133,10 @@ public class StationModel { return station.getDistance(other.station); } + public StringBinding asString(){ + return Bindings.createStringBinding(() -> getSystem().getName()+": "+getName()); + } + @Override public String toString() { if (LOG.isTraceEnabled()){ diff --git a/client/src/main/java/ru/trader/view/support/cells/StationListCell.java b/client/src/main/java/ru/trader/view/support/cells/StationListCell.java new file mode 100644 index 0000000..91f644b --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/cells/StationListCell.java @@ -0,0 +1,36 @@ +package ru.trader.view.support.cells; + +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.util.Callback; +import ru.trader.model.StationModel; + +public class StationListCell implements Callback, ListCell> { + + + @Override + public ListCell call(ListView param){ + return new ListCell(){ + private StationModel s; + + @Override + public void updateItem(StationModel station, boolean empty) { + super.updateItem(station, empty); + if (!empty){ + if (s != station){ + textProperty().unbind(); + textProperty().bind(station.asString()); + s = station; + } + } else { + textProperty().unbind(); + s = null; + setText(null); + setGraphic(null); + } + } + + + }; + } +} diff --git a/client/src/main/resources/view/helper.fxml b/client/src/main/resources/view/helper.fxml index b7303ba..85f3428 100644 --- a/client/src/main/resources/view/helper.fxml +++ b/client/src/main/resources/view/helper.fxml @@ -13,8 +13,8 @@ - - + + - + - +