Archived
0

implement editing orders of track

This commit is contained in:
iMoHax
2015-12-03 14:29:46 +03:00
parent 064549b268
commit eb6acf5b56
8 changed files with 195 additions and 52 deletions

View File

@@ -94,6 +94,14 @@ public class RouteTrackController {
MainController.getProfile().routeProperty().removeListener(routeListener); MainController.getProfile().routeProperty().removeListener(routeListener);
} }
private void updateRoute(RouteModel newRoute){
if (MainController.getProfile().getRoute() == route){
MainController.getProfile().setRoute(newRoute);
} else {
setRoute(newRoute);
}
}
public void setRoute(RouteModel route){ public void setRoute(RouteModel route){
if (this.route != null){ if (this.route != null){
this.route.currentEntryProperty().removeListener(currentEntryListener); this.route.currentEntryProperty().removeListener(currentEntryListener);
@@ -194,11 +202,7 @@ public class RouteTrackController {
RouteModel newRoute = route.set(startIndex, path.get()); RouteModel newRoute = route.set(startIndex, path.get());
newRoute.addAll(startIndex, notAdded); newRoute.addAll(startIndex, notAdded);
newRoute.addAll(startIndex, oldMissions); newRoute.addAll(startIndex, oldMissions);
if (MainController.getProfile().getRoute() == route){ updateRoute(newRoute);
MainController.getProfile().setRoute(newRoute);
} else {
setRoute(newRoute);
}
} }
}); });
} else { } else {
@@ -237,22 +241,69 @@ public class RouteTrackController {
if (!ModelFabric.isFake(toSystem)){ if (!ModelFabric.isFake(toSystem)){
if (route != null){ if (route != null){
if (!ModelFabric.isFake(toStation)){ if (!ModelFabric.isFake(toStation)){
setRoute(route.add(toStation)); updateRoute(route.add(toStation));
} else { } else {
setRoute(route.add(toSystem)); updateRoute(route.add(toSystem));
} }
} else { } else {
RouteModel r; RouteModel r;
ProfileModel profile = MainController.getProfile();
if (!ModelFabric.isFake(toStation)){ if (!ModelFabric.isFake(toStation)){
r = RouteModel.asRoute(toStation); r = RouteModel.asRoute(toStation, profile);
} else { } else {
r = RouteModel.asRoute(toSystem); r = RouteModel.asRoute(toSystem, profile);
} }
setRoute(r); updateRoute(r);
} }
} }
} }
@FXML
private void addOrder(){
if (route != null){
final int startIndex = trackNode.getActive();
RouteEntryModel entry = route.get(startIndex);
if (entry.isTransit()) return;
StationModel seller = entry.getStation();
if (ModelFabric.isFake(seller)) return;
if (startIndex != route.getJumps()){
Collection<StationModel> buyers = route.getStations(startIndex);
route.getMarket().getOrders(seller, buyers, route.getBalance(startIndex), orders -> {
Optional<OrderModel> order = Screeners.showOrders(orders);
if (order.isPresent()){
route.add(startIndex, order.get());
}
});
} else {
route.getMarket().getOrders(seller, route.getBalance(startIndex), orders -> {
Optional<OrderModel> order = Screeners.showOrders(orders);
if (order.isPresent()){
updateRoute(route.add(order.get()));
}
});
}
}
}
@FXML
private void removeOrder(){
if (route != null){
final int index = trackNode.getActive();
OrderModel order = buyOrders.getSelectionModel().getSelectedItem();
if (order != null){
route.remove(index, order);
}
}
}
@FXML
private void clearOrders(){
if (route != null){
final int index = trackNode.getActive();
route.clearOrders(index);
}
}
@FXML @FXML
private void setActive(){ private void setActive(){
MainController.getProfile().setRoute(route); MainController.getProfile().setRoute(route);
@@ -260,7 +311,7 @@ public class RouteTrackController {
@FXML @FXML
private void clear(){ private void clear(){
setRoute(null); updateRoute(null);
} }
@FXML @FXML

View File

@@ -23,8 +23,11 @@ import ru.trader.view.support.Localization;
import ru.trader.view.support.autocomplete.StationsProvider; import ru.trader.view.support.autocomplete.StationsProvider;
import ru.trader.view.support.autocomplete.SystemsProvider; import ru.trader.view.support.autocomplete.SystemsProvider;
import java.util.Collection;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
public class MarketModel { public class MarketModel {
@@ -171,16 +174,8 @@ public class MarketModel {
return BindingsHelper.observableList(analyzer.getVendors(filter), modeler::get); return BindingsHelper.observableList(analyzer.getVendors(filter), modeler::get);
} }
public void getOrders(SystemModel from, double balance, Consumer<ObservableList<OrderModel>> result) { public void getOrders(StationModel from, double balance, Consumer<ObservableList<OrderModel>> result) {
getOrders(from, ModelFabric.NONE_STATION, ModelFabric.NONE_SYSTEM, ModelFabric.NONE_STATION, balance, result); getOrders(ModelFabric.NONE_SYSTEM, from, ModelFabric.NONE_SYSTEM, ModelFabric.NONE_STATION, balance, result);
}
public void getOrders(SystemModel from, SystemModel to, double balance, Consumer<ObservableList<OrderModel>> result) {
getOrders(from, ModelFabric.NONE_STATION, to, ModelFabric.NONE_STATION, balance, result);
}
public void getOrders(StationModel from, StationModel to, double balance, Consumer<ObservableList<OrderModel>> result) {
getOrders(from.getSystem(), from, to.getSystem(), to, balance, result);
} }
public void getOrders(SystemModel from, StationModel stationFrom, SystemModel to, StationModel stationTo, double balance, Consumer<ObservableList<OrderModel>> result) { public void getOrders(SystemModel from, StationModel stationFrom, SystemModel to, StationModel stationTo, double balance, Consumer<ObservableList<OrderModel>> result) {
@@ -202,6 +197,22 @@ public class MarketModel {
}); });
} }
public void getOrders(StationModel seller, Collection<StationModel> buyers, double balance, Consumer<ObservableList<OrderModel>> result) {
ProgressController progress = new ProgressController(Screeners.getMainScreen(), Localization.getString("analyzer.orders.title"));
Profile profile = Profile.clone(ModelFabric.get(MainController.getProfile()));
profile.setBalance(balance);
List<Vendor> vendors = buyers.stream().map(ModelFabric::get).collect(Collectors.toList());
OrdersSearchTask task = new OrdersSearchTask(this, ModelFabric.get(seller), vendors, profile);
progress.run(task, order -> {
ObservableList<OrderModel> res = BindingsHelper.observableList(order, modeler::get);
if (Platform.isFxApplicationThread()) {
result.accept(res);
} else {
Platform.runLater(() -> result.accept(res));
}
});
}
public void getTop(double balance, Consumer<ObservableList<OrderModel>> result){ public void getTop(double balance, Consumer<ObservableList<OrderModel>> result){
getOrders(ModelFabric.NONE_SYSTEM, ModelFabric.NONE_STATION, ModelFabric.NONE_SYSTEM, ModelFabric.NONE_STATION, balance, result); getOrders(ModelFabric.NONE_SYSTEM, ModelFabric.NONE_STATION, ModelFabric.NONE_SYSTEM, ModelFabric.NONE_STATION, balance, result);
} }

View File

@@ -162,6 +162,21 @@ public class RouteModel {
return copyFill(route); return copyFill(route);
} }
public void add(int offset, OrderModel order){
_route.add(offset, ModelFabric.get(order));
refresh(offset);
}
public void remove(int offset, OrderModel order){
_route.remove(offset, ModelFabric.get(order));
refresh(offset);
}
public void clearOrders(int offset){
_route.removeAllOrders(offset);
refresh(offset);
}
public RouteModel add(SystemModel system){ public RouteModel add(SystemModel system){
RouteEntryModel last = entries.get(entries.size()-1); RouteEntryModel last = entries.get(entries.size()-1);
StationModel fromStation = last.getStation(); StationModel fromStation = last.getStation();
@@ -205,11 +220,7 @@ public class RouteModel {
_route.reserve(reserves); _route.reserve(reserves);
mission.setReserves(reserves); mission.setReserves(reserves);
completeIndex = RouteReserve.getCompleteIndex(reserves, offset); completeIndex = RouteReserve.getCompleteIndex(reserves, offset);
for (RouteEntryModel entry : entries) { refresh();
entry.sellOrders().clear();
entry.refresh(market);
}
fillSellOrders();
} }
} else } else
if (mission.isDelivery()){ if (mission.isDelivery()){
@@ -455,6 +466,15 @@ public class RouteModel {
return getCurrentEntry() == entries.size()-1; return getCurrentEntry() == entries.size()-1;
} }
private void refresh(int index){
RouteEntryModel entry = get(index);
entry.refresh(market);
for (RouteEntryModel e : entries) {
e.sellOrders().clear();
}
fillSellOrders();
}
private void refresh(){ private void refresh(){
for (RouteEntryModel entry : entries) { for (RouteEntryModel entry : entries) {
entry.sellOrders().clear(); entry.sellOrders().clear();
@@ -463,13 +483,13 @@ public class RouteModel {
fillSellOrders(); fillSellOrders();
} }
public static RouteModel asRoute(SystemModel system){ public static RouteModel asRoute(SystemModel system, ProfileModel profile){
Route route = Route.singletone(ModelFabric.get(system).asTransit()); Route route = Route.singletone(ModelFabric.get(system).asTransit(), profile.getBalance(), profile.getShipCargo());
return new RouteModel(route, system.getMarket()); return new RouteModel(route, system.getMarket());
} }
public static RouteModel asRoute(StationModel station){ public static RouteModel asRoute(StationModel station, ProfileModel profile){
Route route = Route.singletone(ModelFabric.get(station)); Route route = Route.singletone(ModelFabric.get(station), profile.getBalance(), profile.getShipCargo());
return new RouteModel(route, station.getMarket()); return new RouteModel(route, station.getMarket());
} }

View File

@@ -7,12 +7,14 @@ import ru.trader.core.Vendor;
import ru.trader.model.MarketModel; import ru.trader.model.MarketModel;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
public class OrdersSearchTask extends AnalyzerTask<Collection<Order>>{ public class OrdersSearchTask extends AnalyzerTask<Collection<Order>>{
private final Place from; private final Place from;
private final Vendor stationFrom; private final Vendor stationFrom;
private final Place to; private final Place to;
private final Vendor stationTo; private final Vendor stationTo;
private final Collection<Vendor> vendors;
public OrdersSearchTask(MarketModel market, Place from, Vendor stationFrom, Place to, Vendor stationTo, Profile profile) { public OrdersSearchTask(MarketModel market, Place from, Vendor stationFrom, Place to, Vendor stationTo, Profile profile) {
super(market, profile); super(market, profile);
@@ -20,11 +22,23 @@ public class OrdersSearchTask extends AnalyzerTask<Collection<Order>>{
this.stationFrom = stationFrom; this.stationFrom = stationFrom;
this.to = to; this.to = to;
this.stationTo = stationTo; this.stationTo = stationTo;
this.vendors = Collections.emptyList();
} }
public OrdersSearchTask(MarketModel market, Vendor seller, Collection<Vendor> buyers, Profile profile) {
super(market, profile);
this.from = null;
this.stationFrom = seller;
this.to = null;
this.stationTo = null;
this.vendors = buyers;
}
@Override @Override
protected Collection<Order> call() throws Exception { protected Collection<Order> call() throws Exception {
Collection<Order> orders; Collection<Order> orders;
if (vendors.isEmpty()){
if (stationFrom != null){ if (stationFrom != null){
if (stationTo != null){ if (stationTo != null){
orders = analyzer.getOrders(stationFrom, stationTo); orders = analyzer.getOrders(stationFrom, stationTo);
@@ -50,6 +64,13 @@ public class OrdersSearchTask extends AnalyzerTask<Collection<Order>>{
} }
} }
} }
} else {
if (stationFrom != null){
orders = analyzer.getOrders(Collections.singleton(stationFrom), vendors, 0);
} else {
orders = Collections.emptyList();
}
}
return orders; return orders;
} }
} }

View File

@@ -39,7 +39,14 @@
</VBox> </VBox>
<VBox> <VBox>
<Label text="Купить:" /> <Label text="Купить:" />
<HBox spacing="4">
<ListView fx:id="buyOrders"/> <ListView fx:id="buyOrders"/>
<VBox spacing="4" alignment="TOP_RIGHT">
<Button prefWidth="30" onAction="#addOrder"><graphic><Glyph text="FontAwesome|PLUS"/></graphic></Button>
<Button prefWidth="30" onAction="#removeOrder"><graphic><Glyph text="FontAwesome|MINUS"/></graphic></Button>
<Button prefWidth="30" onAction="#clearOrders"><graphic><Glyph text="FontAwesome|TRASH"/></graphic></Button>
</VBox>
</HBox>
</VBox> </VBox>
</HBox> </HBox>
<VBox fx:id="missionsGroup" maxHeight="120"> <VBox fx:id="missionsGroup" maxHeight="120">

View File

@@ -3,6 +3,7 @@ package ru.trader.analysis;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.core.Order;
import ru.trader.core.TransitVendor; import ru.trader.core.TransitVendor;
import ru.trader.core.Vendor; import ru.trader.core.Vendor;
@@ -115,6 +116,27 @@ public class Route implements Comparable<Route> {
updateStats(); updateStats();
} }
public void add(int index, Order order){
LOG.trace("Add order {} to route {}, index = {}", order, this, index);
RouteEntry entry = entries.get(index);
entry.add(order);
updateStats();
}
public void remove(int index, Order order){
LOG.trace("Remove order {} from route {}, index = {}", order, this, index);
RouteEntry entry = entries.get(index);
entry.remove(order);
updateStats();
}
public void removeAllOrders(int index){
LOG.trace("Remove all orders from route {}, index = {}", this, index);
RouteEntry entry = entries.get(index);
entry.clear();
updateStats();
}
public void addAll(Collection<RouteEntry> entries){ public void addAll(Collection<RouteEntry> entries){
LOG.trace("Add {} entries {} to route {}", entries, this); LOG.trace("Add {} entries {} to route {}", entries, this);
this.entries.addAll(entries); this.entries.addAll(entries);
@@ -313,12 +335,15 @@ public class Route implements Comparable<Route> {
}; };
} }
public static Route singletone(Vendor root){ public static Route singletone(Vendor root, double balance, long cargo){
RouteEntry entry = new RouteEntry(root, 0,0,0); RouteEntry entry = new RouteEntry(root, 0,0,0);
if (!(root instanceof TransitVendor)){ if (!(root instanceof TransitVendor)){
entry.setLand(true); entry.setLand(true);
} }
return new Route(entry); Route route = new Route(entry);
route.setBalance(balance);
route.setCargo(cargo);
return route;
} }
public static Route clone(Route route){ public static Route clone(Route route){

View File

@@ -94,6 +94,14 @@ public class RouteEntry {
orders.add(fixedWrap(order)); orders.add(fixedWrap(order));
} }
void remove(Order order){
orders.removeIf(o -> o.fixed && o.equals(order));
}
void clear(){
orders.removeIf(o -> o.fixed);
}
void addAll(Collection<Order> orders){ void addAll(Collection<Order> orders){
orders.forEach(this::add); orders.forEach(this::add);
} }

View File

@@ -139,7 +139,7 @@ public class MarketAnalyzer {
return res; return res;
} }
private Collection<Order> getOrders(Collection<Vendor> sellers, Collection<Vendor> buyers, double lowProfit) { public Collection<Order> getOrders(Collection<Vendor> sellers, Collection<Vendor> buyers, double lowProfit) {
List<Order> res = new ArrayList<>(); List<Order> res = new ArrayList<>();
callback.start(sellers.size()); callback.start(sellers.size());
for (Vendor seller : sellers) { for (Vendor seller : sellers) {