- fix lands count
- fix memory leak on big jumps count - fix remove order from route - add path adding
This commit is contained in:
@@ -19,7 +19,6 @@ import ru.trader.model.OrderModel;
|
||||
import ru.trader.model.support.BindingsHelper;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
|
||||
public class OrdersController {
|
||||
private final Action OK = new AbstractAction("OK") {
|
||||
@@ -84,7 +83,7 @@ public class OrdersController {
|
||||
}
|
||||
|
||||
private Collection<OrderModel> getOrders() {
|
||||
return tblOrders.getItems().filtered((o) -> o.getCount()>0 && o.getBuyer()!=null);
|
||||
return tblOrders.getItems().filtered((o) -> o.getCount()>0 && o.getBuyOffer()!=null);
|
||||
}
|
||||
|
||||
private void init(Collection<OfferDescModel> offers, double balance, long max) {
|
||||
@@ -105,7 +104,7 @@ public class OrdersController {
|
||||
|
||||
private void setBuyer(OfferModel offer) {
|
||||
if (order != null && offer!=null) {
|
||||
order.setBuyer(offer);
|
||||
order.setBuyOffer(offer);
|
||||
order.setCount(order.getMax());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package ru.trader.controllers;
|
||||
|
||||
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ListChangeListener;
|
||||
import javafx.fxml.FXML;
|
||||
@@ -13,9 +14,6 @@ import ru.trader.view.support.NumberField;
|
||||
import ru.trader.view.support.RouteNode;
|
||||
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
|
||||
public class RoutersController {
|
||||
|
||||
@FXML
|
||||
@@ -33,7 +31,10 @@ public class RoutersController {
|
||||
private ScrollPane path;
|
||||
|
||||
@FXML
|
||||
private Button add;
|
||||
private Button editBtn;
|
||||
|
||||
@FXML
|
||||
private Button removeBtn;
|
||||
|
||||
@FXML
|
||||
private ComboBox<VendorModel> source;
|
||||
@@ -51,22 +52,36 @@ public class RoutersController {
|
||||
|
||||
private MarketModel market;
|
||||
|
||||
private PathRouteModel route;
|
||||
|
||||
@FXML
|
||||
private void initialize(){
|
||||
init();
|
||||
balance.numberProperty().addListener((ov, o, n) -> totalBalance.setValue(n));
|
||||
cargo.numberProperty().addListener((ov, o, n) -> market.setCargo(n.longValue()));
|
||||
cargo.numberProperty().addListener((ov, o, n) -> market.setCargo(n.intValue()));
|
||||
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.setOnAction((v)->cargo.requestFocus());
|
||||
cargo.setOnAction((v) -> tank.requestFocus());
|
||||
tank.setOnAction((v) -> distance.requestFocus());
|
||||
distance.setOnAction((v)->jumps.requestFocus());
|
||||
jumps.setOnAction((v)->balance.requestFocus());
|
||||
|
||||
balance.setValue(1000);
|
||||
cargo.setValue(4);
|
||||
tank.setValue(20);
|
||||
distance.setValue(7);
|
||||
jumps.setValue(3);
|
||||
|
||||
add.disableProperty().bind(this.balance.wrongProperty().or(this.cargo.wrongProperty()));
|
||||
editBtn.disableProperty().bind(tblOrders.getSelectionModel().selectedIndexProperty().isEqualTo(-1));
|
||||
removeBtn.disableProperty().bind(Bindings.createBooleanBinding(()-> {
|
||||
int sel = tblOrders.getSelectionModel().getSelectedIndex();
|
||||
return sel == -1 || sel != tblOrders.getItems().size()-1;
|
||||
}, tblOrders.getSelectionModel().selectedIndexProperty()));
|
||||
|
||||
|
||||
tblOrders.setItems(FXCollections.observableArrayList());
|
||||
tblOrders.getItems().addListener((ListChangeListener<OrderModel>) c -> {
|
||||
while (c.next()) {
|
||||
@@ -96,35 +111,47 @@ public class RoutersController {
|
||||
totalProfit.setValue(0);
|
||||
}
|
||||
|
||||
private Collection<OfferDescModel> getOffers(){
|
||||
VendorModel vendor = source.getSelectionModel().getSelectedItem();
|
||||
return vendor.getSells(market::asOfferDescModel);
|
||||
}
|
||||
|
||||
private void onAdd(OrderModel order){
|
||||
totalProfit.add(order.getProfit());
|
||||
totalBalance.add(order.getProfit());
|
||||
source.getSelectionModel().select(order.getBuyer().getVendor());
|
||||
source.getSelectionModel().select(order.getBuyOffer().getVendor());
|
||||
balance.setDisable(true);
|
||||
source.setDisable(true);
|
||||
}
|
||||
|
||||
private void onRemove(OrderModel order) {
|
||||
totalProfit.sub(order.getProfit());
|
||||
totalBalance.sub(order.getProfit());
|
||||
source.getSelectionModel().select(order.getVendor());
|
||||
if (tblOrders.getItems().isEmpty()) {
|
||||
balance.setDisable(false);
|
||||
source.setDisable(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void addOrders(){
|
||||
Collection<OrderModel> orders = Screeners.showOrders(getOffers(), totalBalance.getValue().doubleValue(), cargo.getValue().longValue());
|
||||
if (orders!=null){
|
||||
tblOrders.getItems().addAll(orders);
|
||||
public void editOrders(){
|
||||
OrderModel sel = tblOrders.getSelectionModel().getSelectedItem();
|
||||
int index = tblOrders.getSelectionModel().getSelectedIndex();
|
||||
|
||||
OrderModel order = Screeners.showOrders(market.getOrders(sel.getVendor(), sel.getBuyer(), sel.getBalance()));
|
||||
if (order!=null){
|
||||
tblOrders.getItems().set(index, order);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void removeSelected(){
|
||||
TableView.TableViewSelectionModel<OrderModel> select = tblOrders.getSelectionModel();
|
||||
if (!select.isEmpty()){
|
||||
int index = select.getSelectedIndex();
|
||||
if (index > 0){
|
||||
route = route.remove(select.getSelectedItem());
|
||||
} else {
|
||||
route = null;
|
||||
}
|
||||
tblOrders.getItems().remove(index);
|
||||
refreshPath();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,14 +159,16 @@ public class RoutersController {
|
||||
tblOrders.getItems().clear();
|
||||
totalBalance.setValue(balance.getValue());
|
||||
totalProfit.setValue(0);
|
||||
path.setContent(null);
|
||||
route = null;
|
||||
refreshPath();
|
||||
}
|
||||
|
||||
|
||||
public void showTopOrders(){
|
||||
OrderModel order = Screeners.showTopOrders(market.getTop(100, totalBalance.getValue().doubleValue()));
|
||||
OrderModel order = Screeners.showOrders(market.getTop(100, totalBalance.getValue().doubleValue()));
|
||||
if (order!=null){
|
||||
tblOrders.getItems().add(order);
|
||||
addOrderToPath(order);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,12 +177,13 @@ public class RoutersController {
|
||||
VendorModel t = target.getSelectionModel().getSelectedItem();
|
||||
OrderModel order;
|
||||
if (t==null){
|
||||
order = Screeners.showTopOrders(market.getOrders(s, totalBalance.getValue().doubleValue()));
|
||||
order = Screeners.showOrders(market.getOrders(s, totalBalance.getValue().doubleValue()));
|
||||
} else {
|
||||
order = Screeners.showTopOrders(market.getOrders(t, s, totalBalance.getValue().doubleValue()));
|
||||
order = Screeners.showOrders(market.getOrders(t, s, totalBalance.getValue().doubleValue()));
|
||||
}
|
||||
if (order!=null){
|
||||
tblOrders.getItems().add(order);
|
||||
addOrderToPath(order);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,7 +198,7 @@ public class RoutersController {
|
||||
}
|
||||
if (path!=null){
|
||||
tblOrders.getItems().addAll(path.getOrders());
|
||||
setPath(path);
|
||||
addRouteToPath(path);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,12 +206,33 @@ public class RoutersController {
|
||||
PathRouteModel path = Screeners.showRouters(market.getTopRoutes(totalBalance.getValue().doubleValue()));
|
||||
if (path!=null){
|
||||
tblOrders.getItems().addAll(path.getOrders());
|
||||
setPath(path);
|
||||
addRouteToPath(path);
|
||||
}
|
||||
}
|
||||
|
||||
private void setPath(PathRouteModel route){
|
||||
path.setContent(new RouteNode(route).getNode());
|
||||
private void addRouteToPath(PathRouteModel route){
|
||||
if (this.route == null){
|
||||
this.route = route;
|
||||
} else {
|
||||
this.route.add(route.getPath());
|
||||
}
|
||||
refreshPath();
|
||||
}
|
||||
|
||||
private void addOrderToPath(OrderModel order){
|
||||
if (route != null){
|
||||
route.add(order);
|
||||
} else {
|
||||
route = market.getPath(order);
|
||||
}
|
||||
refreshPath();
|
||||
}
|
||||
|
||||
private void refreshPath(){
|
||||
if (route != null)
|
||||
path.setContent(new RouteNode(route).getNode());
|
||||
else
|
||||
path.setContent(null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -156,8 +156,8 @@ public class Screeners {
|
||||
itemDescController.close();
|
||||
}
|
||||
|
||||
public static OrderModel showTopOrders(ObservableList<OrderModel> top) {
|
||||
return topOrdersController.showDialog(mainScreen, topOrdersScreen, top);
|
||||
public static OrderModel showOrders(ObservableList<OrderModel> orders) {
|
||||
return topOrdersController.showDialog(mainScreen, topOrdersScreen, orders);
|
||||
}
|
||||
|
||||
public static PathRouteModel showRouters(ObservableList<PathRouteModel> routers) {
|
||||
|
||||
@@ -178,7 +178,7 @@ public class MarketModel {
|
||||
}
|
||||
|
||||
|
||||
public void setCargo(long cargo){
|
||||
public void setCargo(int cargo){
|
||||
analyzer.setCargo(cargo);
|
||||
}
|
||||
|
||||
@@ -218,4 +218,15 @@ public class MarketModel {
|
||||
return BindingsHelper.observableList(analyzer.getTopPaths(100, balance), this::asModel);
|
||||
}
|
||||
|
||||
PathRoute getPath(VendorModel from, VendorModel to) {
|
||||
return analyzer.getPath(from.getVendor(), to.getVendor());
|
||||
}
|
||||
|
||||
public PathRouteModel getPath(OrderModel order) {
|
||||
PathRoute p = analyzer.getPath(order.getVendor().getVendor(), order.getBuyer().getVendor());
|
||||
p.setOrder(new Order(order.getOffer().getOffer(), order.getBuyOffer().getOffer(), order.getCount()));
|
||||
order.setPath(p);
|
||||
return asModel(p);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package ru.trader.model;
|
||||
|
||||
import javafx.beans.property.*;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import ru.trader.core.Order;
|
||||
import ru.trader.graph.PathRoute;
|
||||
import ru.trader.model.support.ModelBindings;
|
||||
|
||||
import java.util.List;
|
||||
@@ -16,6 +18,7 @@ public class OrderModel {
|
||||
private DoubleProperty profit;
|
||||
private DoubleProperty distance;
|
||||
private DoubleProperty bestProfit;
|
||||
private PathRoute path;
|
||||
|
||||
public OrderModel(OfferDescModel offer) {
|
||||
this.offer = offer;
|
||||
@@ -34,7 +37,7 @@ public class OrderModel {
|
||||
public OrderModel(OfferDescModel sellOffer, OfferModel buyOffer, long max) {
|
||||
this(sellOffer);
|
||||
this.max = max;
|
||||
setBuyer(buyOffer);
|
||||
setBuyOffer(buyOffer);
|
||||
setCount(max);
|
||||
}
|
||||
|
||||
@@ -95,16 +98,16 @@ public class OrderModel {
|
||||
return profitProperty().get();
|
||||
}
|
||||
|
||||
public ReadOnlyObjectProperty<OfferModel> buyerProperty() {
|
||||
public ReadOnlyObjectProperty<OfferModel> buyOfferProperty() {
|
||||
return buyer;
|
||||
}
|
||||
|
||||
public void setBuyer(OfferModel buyer) {
|
||||
public void setBuyOffer(OfferModel buyer) {
|
||||
this.buyer.set(buyer);
|
||||
if (distance!=null) distance.set(getVendor().getDistance(buyer.getVendor()));
|
||||
}
|
||||
|
||||
public OfferModel getBuyer() {
|
||||
public OfferModel getBuyOffer() {
|
||||
return buyer.get();
|
||||
}
|
||||
|
||||
@@ -112,6 +115,11 @@ public class OrderModel {
|
||||
return offer.getOffer().getVendor();
|
||||
}
|
||||
|
||||
public VendorModel getBuyer() {
|
||||
OfferModel buyOffer = getBuyOffer();
|
||||
return buyOffer != null ? buyer.get().getVendor() : null;
|
||||
}
|
||||
|
||||
public long getMax() {
|
||||
return max;
|
||||
}
|
||||
@@ -126,11 +134,22 @@ public class OrderModel {
|
||||
|
||||
public ReadOnlyDoubleProperty distanceProperty() {
|
||||
if (distance == null){
|
||||
OfferModel buyOffer = getBuyer();
|
||||
distance = new SimpleDoubleProperty(buyOffer!=null ? getVendor().getDistance(buyOffer.getVendor()) : Double.NaN);
|
||||
VendorModel buyer = getBuyer();
|
||||
distance = new SimpleDoubleProperty(buyer!=null ? getVendor().getDistance(buyer) : Double.NaN);
|
||||
}
|
||||
return distance;
|
||||
}
|
||||
|
||||
void setPath(PathRoute path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
PathRoute getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
public double getBalance(){
|
||||
return path != null ? path.getBalance() : max * offer.getPrice();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,15 +21,14 @@ public class PathRouteModel {
|
||||
this.path = path;
|
||||
PathRoute p = path.getRoot();
|
||||
totalProfit = p.getProfit();
|
||||
double d = 0; int j = 0, r = 0, l = 0;
|
||||
lands = p.getLandsCount();
|
||||
double d = 0; int j = 0, r = 0;
|
||||
while (p.hasNext()){
|
||||
p = p.getNext();
|
||||
d += p.getDistance();
|
||||
j++;
|
||||
if (p.isRefill()) r++;
|
||||
if (p.getBest() != null || p.isRefill()) l++;
|
||||
}
|
||||
lands = l;
|
||||
distance = d;
|
||||
jumps = j;
|
||||
refuels = r;
|
||||
@@ -71,7 +70,9 @@ public class PathRouteModel {
|
||||
p = p.getNext();
|
||||
if (cargo == null && p.getBest()!=null){
|
||||
cargo = p.getBest();
|
||||
res.add(market.asModel(cargo));
|
||||
OrderModel order = market.asModel(cargo);
|
||||
order.setPath(p);
|
||||
res.add(order);
|
||||
}
|
||||
if (cargo!=null && cargo.isBuyer(p.get())){
|
||||
cargo = null;
|
||||
@@ -79,4 +80,21 @@ public class PathRouteModel {
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public void add(OrderModel order){
|
||||
PathRoute p = market.getPath(order.getVendor(), order.getBuyer());
|
||||
if (p == null) return;
|
||||
p.getRoot().getNext().setOrder(new Order(order.getOffer().getOffer(), order.getBuyOffer().getOffer(), order.getCount()));
|
||||
PathRoute head = path.getEnd();
|
||||
add(p);
|
||||
order.setPath(head);
|
||||
}
|
||||
|
||||
public void add(PathRoute route){
|
||||
path.getEnd().add(route, true);
|
||||
}
|
||||
|
||||
public PathRouteModel remove(OrderModel order) {
|
||||
return new PathRouteModel(path.dropTo(order.getVendor().getVendor()), market);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<cellValueFactory><PropertyValueFactory property="count"/></cellValueFactory>
|
||||
</TableColumn>
|
||||
<TableColumn minWidth="160.0" text="Покупатель">
|
||||
<cellValueFactory><OfferCellValueImpl property="buyer"/></cellValueFactory>
|
||||
<cellValueFactory><OfferCellValueImpl property="buyOffer"/></cellValueFactory>
|
||||
</TableColumn>
|
||||
<TableColumn minWidth="80.0" text="Прибыль">
|
||||
<cellFactory><DoubleCell/></cellFactory>
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
<Separator GridPane.columnSpan="2" GridPane.rowIndex="3" GridPane.margin="$separator_margin"/>
|
||||
<VBox GridPane.columnSpan="2" GridPane.rowIndex="4" spacing="5">
|
||||
<HBox alignment="CENTER" spacing="5">
|
||||
<Button fx:id="add" text="Добавить" onAction="#addOrders"/>
|
||||
<Button text="Удалить" onAction="#removeSelected"/>
|
||||
<Button fx:id="editBtn" text="Изменить" onAction="#editOrders"/>
|
||||
<Button fx:id="removeBtn" text="Удалить" onAction="#removeSelected"/>
|
||||
<Button text="Очистить" onAction="#removeAll" />
|
||||
</HBox>
|
||||
<HBox alignment="CENTER" spacing="5">
|
||||
@@ -93,7 +93,7 @@
|
||||
<cellValueFactory><PropertyValueFactory property="count"/></cellValueFactory>
|
||||
</TableColumn>
|
||||
<TableColumn minWidth="120.0" text="Покупатель">
|
||||
<cellValueFactory><OfferCellValueImpl property="buyer"/></cellValueFactory>
|
||||
<cellValueFactory><OfferCellValueImpl property="buyOffer"/></cellValueFactory>
|
||||
</TableColumn>
|
||||
<TableColumn minWidth="80.0" text="Дистанция">
|
||||
<cellFactory><DoubleCell format="\%.2f LY"/></cellFactory>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<cellValueFactory><PropertyValueFactory property="count"/></cellValueFactory>
|
||||
</TableColumn>
|
||||
<TableColumn minWidth="160.0" text="Покупатель">
|
||||
<cellValueFactory><OfferCellValueImpl property="buyer"/></cellValueFactory>
|
||||
<cellValueFactory><OfferCellValueImpl property="buyOffer"/></cellValueFactory>
|
||||
</TableColumn>
|
||||
<TableColumn minWidth="80.0" text="Дистанция">
|
||||
<cellFactory><DoubleCell format="\%.2f LY"/></cellFactory>
|
||||
|
||||
Reference in New Issue
Block a user