Archived
0

add paths layout

This commit is contained in:
iMoHax
2014-08-17 22:49:37 +04:00
committed by iMoHax
parent b4baf8512e
commit 2604939f96
12 changed files with 364 additions and 30 deletions

View File

@@ -67,6 +67,7 @@ public class Main extends Application {
Screeners.loadAddOfferStage(getUrl(("oEditor.fxml")));
Screeners.loadOrdersStage(getUrl(("orders.fxml")));
Screeners.loadTopOrdersStage(getUrl(("topOrders.fxml")));
Screeners.loadPathsStage(getUrl(("paths.fxml")));
}
private static URL getUrl(String filename) throws MalformedURLException {

View File

@@ -0,0 +1,64 @@
package ru.trader.controllers;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.util.converter.LongStringConverter;
import org.controlsfx.control.ButtonBar;
import org.controlsfx.control.action.AbstractAction;
import org.controlsfx.control.action.Action;
import org.controlsfx.dialog.Dialog;
import ru.trader.graph.PathRoute;
import ru.trader.model.OrderModel;
import ru.trader.model.PathRouteModel;
import java.util.Collection;
public class PathsController {
private final Action OK = new AbstractAction("OK") {
{
ButtonBar.setType(this, ButtonBar.ButtonType.OK_DONE);
}
@Override
public void handle(ActionEvent event) {
Dialog dlg = (Dialog) event.getSource();
dlg.hide();
}
};
@FXML
private TableView<PathRouteModel> tblPaths;
@FXML
private void initialize() {
}
public void showDialog(Parent parent, Parent content, Collection<PathRouteModel> paths) {
init(paths);
Dialog dlg = new Dialog(parent, String.format("Доступные маршруты"));
dlg.setContent(content);
dlg.getActions().addAll(OK, Dialog.Actions.CANCEL);
dlg.setResizable(false);
dlg.show();
}
private void init(Collection<PathRouteModel> paths) {
tblPaths.getSelectionModel().clearSelection();
tblPaths.setItems(FXCollections.observableArrayList(paths));
if (tblPaths.getSortOrder().size()>0)
tblPaths.sort();
}
}

View File

@@ -21,15 +21,22 @@ public class RoutersController {
@FXML
private NumberField balance;
@FXML
private NumberField cargo;
@FXML
private NumberField distance;
@FXML
private NumberField tank;
@FXML
private NumberField jumps;
@FXML
private Button add;
@FXML
private ComboBox<VendorModel> vendors;
private ComboBox<VendorModel> source;
@FXML
private ComboBox<VendorModel> target;
@FXML
private TableView<OrderModel> tblOrders;
@@ -40,10 +47,23 @@ public class RoutersController {
@FXML
private NumberField totalBalance;
private MarketModel market;
@FXML
private void initialize(){
init();
balance.numberProperty().addListener((ov, o, n) -> totalBalance.setValue(n));
cargo.numberProperty().addListener((ov, o, n) -> market.setCargo(n.longValue()));
tank.numberProperty().addListener((ov, o, n) -> market.setTank(n.doubleValue()));
distance.numberProperty().addListener((ov, o, n) -> market.setDistance(n.doubleValue()));
jumps.numberProperty().addListener((ov, o, n) -> market.setJumps(n.intValue()));
balance.setValue(1000);
cargo.setValue(4);
tank.setValue(30);
distance.setValue(7);
jumps.setValue(4);
add.disableProperty().bind(this.balance.wrongProperty().or(this.cargo.wrongProperty()));
tblOrders.setItems(FXCollections.observableArrayList());
tblOrders.getItems().addListener((ListChangeListener<OrderModel>) c -> {
@@ -64,30 +84,30 @@ public class RoutersController {
void init(){
MarketModel market = MainController.getMarket();
vendors.setItems(market.vendorsProperty());
vendors.getSelectionModel().selectFirst();
market = MainController.getMarket();
source.setItems(market.vendorsProperty());
source.getSelectionModel().selectFirst();
target.setItems(market.vendorsProperty());
tblOrders.getItems().clear();
totalBalance.setValue(balance.getValue());
totalProfit.setValue(0);
}
private Collection<OfferDescModel> getOffers(){
MarketModel market = MainController.getMarket();
VendorModel vendor = vendors.getSelectionModel().getSelectedItem();
VendorModel vendor = source.getSelectionModel().getSelectedItem();
return vendor.getSells(market::asOfferDescModel);
}
private void onAdd(OrderModel order){
totalProfit.add(order.getProfit());
totalBalance.add(order.getProfit());
vendors.getSelectionModel().select(order.getBuyer().getVendor());
source.getSelectionModel().select(order.getBuyer().getVendor());
}
private void onRemove(OrderModel order) {
totalProfit.sub(order.getProfit());
totalBalance.sub(order.getProfit());
vendors.getSelectionModel().select(order.getVendor());
source.getSelectionModel().select(order.getVendor());
}
public void addOrders(){
@@ -113,11 +133,20 @@ public class RoutersController {
public void showTopOrders(){
MarketModel market = MainController.getMarket();
OrderModel order = Screeners.showTopOrders(market.getTop(100, totalBalance.getValue().doubleValue(), cargo.getValue().longValue()));
OrderModel order = Screeners.showTopOrders(market.getTop(100, totalBalance.getValue().doubleValue()));
if (order!=null){
tblOrders.getItems().add(order);
}
}
public void showRoutes(){
VendorModel s = source.getSelectionModel().getSelectedItem();
VendorModel t = target.getSelectionModel().getSelectedItem();
if (t==null) return;
MarketModel market = MainController.getMarket();
Screeners.showRouters(market.getRouters(s, t, totalBalance.getValue().doubleValue()));
}
}

View File

@@ -24,6 +24,7 @@ public class Screeners {
private static Parent editOffersScreen;
private static Parent ordersScreen;
private static Parent topOrdersScreen;
private static Parent pathsScreen;
private static MainController mainController;
private static ItemDescController itemDescController;
@@ -31,6 +32,7 @@ public class Screeners {
private static OffersEditorController oEditorController;
private static OrdersController ordersController;
private static TopOrdersController topOrdersController;
private static PathsController pathsController;
private static FXMLLoader initLoader(URL url){
FXMLLoader loader = new FXMLLoader(url);
@@ -94,6 +96,15 @@ public class Screeners {
stage.setScene(new Scene(topOrdersScreen));
}
public static void loadPathsStage(URL fxml) throws IOException {
FXMLLoader loader = initLoader(fxml);
pathsScreen = loader.load();
addStylesheet(pathsScreen);
pathsController = loader.getController();
Stage stage = new Stage();
stage.setScene(new Scene(pathsScreen));
}
public static void show(Node node){
mainController.getMainPane().setCenter(node);
}
@@ -148,4 +159,8 @@ public class Screeners {
public static OrderModel showTopOrders(ObservableList<OrderModel> top) {
return topOrdersController.showDialog(mainScreen, topOrdersScreen, top);
}
public static void showRouters(ObservableList<PathRouteModel> routers) {
pathsController.showDialog(mainScreen, pathsScreen, routers);
}
}

View File

@@ -169,13 +169,32 @@ public class MarketModel {
return ModelFabrica.getModel(vendor, this);
}
public ObservableList<OrderModel> getTop(int limit, double balance, long max){
return BindingsHelper.observableList(analyzer.getTop(limit, balance, max), (o) -> {
OrderModel model = new OrderModel(asOfferDescModel(o.getSell()), balance, max);
public ObservableList<OrderModel> getTop(int limit, double balance){
return BindingsHelper.observableList(analyzer.getTop(limit, balance), (o) -> {
OrderModel model = new OrderModel(asOfferDescModel(o.getSell()), balance, analyzer.getCargo());
model.setBuyer(asModel(o.getBuy()));
model.setCount(model.getMax());
return model;
});
}
public void setCargo(long cargo){
analyzer.setCargo(cargo);
}
public void setTank(double tank){
analyzer.setTank(tank);
}
public void setJumps(int jumps){
analyzer.setJumps(jumps);
}
public void setDistance(double distance){
analyzer.setMaxDistance(distance);
}
public ObservableList<PathRouteModel> getRouters(VendorModel from, VendorModel to, double balance){
return BindingsHelper.observableList(analyzer.getPaths(from.getVendor(), to.getVendor(), balance), PathRouteModel::new);
}
}

View File

@@ -0,0 +1,50 @@
package ru.trader.model;
import ru.trader.core.Vendor;
import ru.trader.graph.PathRoute;
public class PathRouteModel {
private final double distance;
private final double totalProfit;
private final int jumps;
private final int refuels;
private final PathRoute path;
public PathRouteModel(PathRoute path) {
this.path = path;
PathRoute p = path.getRoot();
double pr =0, d = 0; int j = 0, r = 0;
while (p.hasNext()){
p = p.getNext();
d += path.getDistance();
pr += p.getMaxProfit();
j++;
if (p.isRefill()) r++;
}
totalProfit = pr;
distance = d;
jumps = j;
refuels = r;
}
public double getDistance() {
return distance;
}
public double getTotalProfit() {
return totalProfit;
}
public int getJumps() {
return jumps;
}
public int getRefuels() {
return refuels;
}
public PathRoute getPath() {
return path;
}
}

View File

@@ -0,0 +1,57 @@
package ru.trader.view.support.cells;
import javafx.geometry.Pos;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.util.Callback;
import org.controlsfx.glyphfont.GlyphFontRegistry;
import ru.trader.core.Order;
import ru.trader.graph.PathRoute;
import ru.trader.model.PathRouteModel;
public class PathRouteCell<T> implements Callback<TableColumn<PathRouteModel, T>, TableCell<PathRouteModel, T>> {
@Override
public TableCell<PathRouteModel, T> call(TableColumn<PathRouteModel, T> param) {
return new TableCell<PathRouteModel, T>(){
@Override
public void updateItem(T value, boolean empty) {
super.updateItem(value, empty);
if (!empty){
PathRoute p = ((PathRouteModel) getTableRow().getItem()).getPath().getRoot();
HBox hBox = new HBox();
HBox v = new HBox();
v.setAlignment(Pos.BOTTOM_CENTER);
v.getChildren().add(new Text(p.get().getName()));
while (p.hasNext()){
p = p.getNext();
if (p.isRefill()) v.getChildren().add(GlyphFontRegistry.glyph("FontAwesome|REFRESH"));
hBox.getChildren().add(v);
VBox dist = new VBox(new Text(String.format("(%+.0f LY)", p.getDistance())));
dist.setAlignment(Pos.BASELINE_CENTER);
dist.getChildren().add(GlyphFontRegistry.glyph("FontAwesome|LONG_ARROW_RIGHT"));
hBox.getChildren().addAll(dist);
v = new HBox();
v.setAlignment(Pos.BOTTOM_CENTER);
v.getChildren().add(new Text(p.get().getName()));
v.getChildren().add(new Text(String.format(" (%+.0f) ", p.getMaxProfit())));
}
hBox.getChildren().add(v);
setText(null);
setGraphic(hBox);
} else {
setText(null);
setGraphic(null);
}
}
};
}
}