Archived
0

- fix lands count

- fix memory leak on big jumps count
- fix remove order from route
- add path adding
This commit is contained in:
iMoHax
2014-08-21 16:46:13 +04:00
parent 14c2021e0c
commit d70bbb005c
17 changed files with 471 additions and 163 deletions

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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) {

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>