Archived
0

implement filter for market analyzer

This commit is contained in:
iMoHax
2015-01-07 18:27:32 +03:00
parent 00d8f6e084
commit 9b1c975125
16 changed files with 757 additions and 216 deletions

View File

@@ -93,6 +93,7 @@ public class Main extends Application {
Screeners.loadPathsStage(getUrl(("paths.fxml")));
Screeners.loadSettingsStage(getUrl(("settings.fxml")));
Screeners.loadSEditorStage(getUrl(("sEditor.fxml")));
Screeners.loadFilterStage(getUrl(("filter.fxml")));
}
private static URL getUrl(String filename) throws MalformedURLException {

View File

@@ -2,6 +2,7 @@ package ru.trader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.trader.core.*;
import java.io.*;
import java.util.Properties;
@@ -125,4 +126,12 @@ public class Settings {
public int getPathsCount(){
return Integer.valueOf(values.getProperty("performance.limit","100"));
}
public MarketFilter getFilter(Market market){
return MarketFilter.buildFilter(values, market);
}
public void setFilter(MarketFilter filter){
filter.writeTo(values);
}
}

View File

@@ -3,7 +3,6 @@ package ru.trader;
import org.xml.sax.SAXException;
import ru.trader.core.Market;
import ru.trader.core.MarketAnalyzer;
import ru.trader.model.ModelFabric;
import ru.trader.store.simple.SimpleMarket;
import ru.trader.store.simple.Store;
import ru.trader.store.XSSFImporter;
@@ -47,6 +46,7 @@ public class World {
MarketAnalyzer analyzer = new MarketAnalyzer(market);
analyzer.setSegmentSize(Main.SETTINGS.getSegmentSize());
analyzer.setPathsCount(Main.SETTINGS.getPathsCount());
analyzer.setFilter(Main.SETTINGS.getFilter(market));
return analyzer;
}
}

View File

@@ -0,0 +1,151 @@
package ru.trader.controllers;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListView;
import org.controlsfx.control.ButtonBar;
import org.controlsfx.control.action.Action;
import org.controlsfx.dialog.Dialog;
import org.controlsfx.dialog.DialogAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.trader.core.MarketFilter;
import ru.trader.core.SERVICE_TYPE;
import ru.trader.model.MarketModel;
import ru.trader.model.ModelFabric;
import ru.trader.model.StationModel;
import ru.trader.model.SystemModel;
import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Localization;
import ru.trader.view.support.NumberField;
import ru.trader.view.support.cells.CustomListCell;
public class FilterController {
private final static Logger LOG = LoggerFactory.getLogger(FilterController.class);
@FXML
private ComboBox<SystemModel> center;
@FXML
private NumberField radius;
@FXML
private NumberField distance;
@FXML
private ComboBox<SystemModel> system;
@FXML
private ComboBox<StationModel> station;
@FXML
private CheckBox cbMarket;
@FXML
private CheckBox cbBlackMarket;
@FXML
private CheckBox cbRepair;
@FXML
private CheckBox cbMunition;
@FXML
private CheckBox cbOutfit;
@FXML
private CheckBox cbShipyard;
@FXML
private CheckBox cbMediumLandpad;
@FXML
private CheckBox cbLargeLandpad;
@FXML
private ListView<StationModel> excludes;
public final Action actSave = new DialogAction(Localization.getString("dialog.button.save"), ButtonBar.ButtonType.OK_DONE, false, true, false, (e) -> save());
private MarketModel market;
private MarketFilter filter;
@FXML
private void initialize(){
system.valueProperty().addListener((ov, o, n) -> station.setItems(n.getStationsList()));
excludes.setCellFactory(new CustomListCell<>(s -> String.format("%s (%s)", s.getSystem().getName(), s.getName())));
init();
}
void init(){
market = MainController.getMarket();
center.setItems(market.systemsListProperty());
system.setItems(market.systemsProperty());
}
private void fill(MarketFilter filter){
this.filter = filter;
center.setValue(market.getModeler().get(filter.getCenter()));
radius.setValue(filter.getRadius());
distance.setValue(filter.getDistance());
cbMarket.setSelected(filter.has(SERVICE_TYPE.MARKET));
cbBlackMarket.setSelected(filter.has(SERVICE_TYPE.BLACK_MARKET));
cbMunition.setSelected(filter.has(SERVICE_TYPE.MUNITION));
cbRepair.setSelected(filter.has(SERVICE_TYPE.REPAIR));
cbOutfit.setSelected(filter.has(SERVICE_TYPE.OUTFIT));
cbShipyard.setSelected(filter.has(SERVICE_TYPE.SHIPYARD));
cbMediumLandpad.setSelected(filter.has(SERVICE_TYPE.MEDIUM_LANDPAD));
cbLargeLandpad.setSelected(filter.has(SERVICE_TYPE.LARGE_LANDPAD));
excludes.setItems(BindingsHelper.observableList(filter.getExcludes(), market.getModeler()::get));
}
private void save() {
SystemModel s = center.getValue();
LOG.trace("Old filter", filter);
filter.setCenter(s == ModelFabric.NONE_SYSTEM ? null : market.getModeler().get(s));
filter.setRadius(radius.getValue().doubleValue());
filter.setDistance(distance.getValue().doubleValue());
if (cbMarket.isSelected()) filter.add(SERVICE_TYPE.MARKET); else filter.remove(SERVICE_TYPE.MARKET);
if (cbBlackMarket.isSelected()) filter.add(SERVICE_TYPE.BLACK_MARKET); else filter.remove(SERVICE_TYPE.BLACK_MARKET);
if (cbMunition.isSelected()) filter.add(SERVICE_TYPE.MUNITION); else filter.remove(SERVICE_TYPE.MUNITION);
if (cbRepair.isSelected()) filter.add(SERVICE_TYPE.REPAIR); else filter.remove(SERVICE_TYPE.REPAIR);
if (cbOutfit.isSelected()) filter.add(SERVICE_TYPE.OUTFIT); else filter.remove(SERVICE_TYPE.OUTFIT);
if (cbShipyard.isSelected()) filter.add(SERVICE_TYPE.SHIPYARD); else filter.remove(SERVICE_TYPE.SHIPYARD);
if (cbMediumLandpad.isSelected()) filter.add(SERVICE_TYPE.MEDIUM_LANDPAD); else filter.remove(SERVICE_TYPE.MEDIUM_LANDPAD);
if (cbLargeLandpad.isSelected()) filter.add(SERVICE_TYPE.LARGE_LANDPAD); else filter.remove(SERVICE_TYPE.LARGE_LANDPAD);
filter.clearExcludes();
excludes.getItems().forEach(st -> filter.addExclude(market.getModeler().get(st)));
LOG.trace("New filter", filter);
}
public Action showDialog(Parent parent, Parent content){
return showDialog(parent, content, new MarketFilter());
}
public Action showDialog(Parent parent, Parent content, MarketFilter filter){
Dialog dlg = new Dialog(parent, Localization.getString("filter.title"));
dlg.setContent(content);
dlg.getActions().addAll(actSave, Dialog.ACTION_CANCEL);
dlg.setResizable(false);
fill(filter);
return dlg.show();
}
public void add(ActionEvent actionEvent) {
SystemModel s = system.getValue();
if (s != null){
StationModel st = station.getValue();
if (st != null && st != ModelFabric.NONE_STATION){
excludes.getItems().add(st);
} else {
excludes.getItems().addAll(s.getStations());
}
}
}
public void remove(ActionEvent actionEvent) {
int index = excludes.getSelectionModel().getSelectedIndex();
if (index >= 0){
excludes.getItems().remove(index);
}
}
public void clean(ActionEvent actionEvent) {
excludes.getItems().clear();
}
public MarketFilter getFilter(){
return filter;
}
}

View File

@@ -177,6 +177,10 @@ public class MainController {
Screeners.showSettings();
}
public void editFilter(){
Screeners.showFilter(market.getAnalyzer().getFilter());
}
private void reload(){
world = new MarketModel(World.getMarket());
market = world;

View File

@@ -9,6 +9,8 @@ import javafx.stage.Stage;
import org.controlsfx.control.action.Action;
import org.controlsfx.dialog.Dialogs;
import ru.trader.EMDNUpdater;
import ru.trader.Main;
import ru.trader.core.MarketFilter;
import ru.trader.model.*;
import ru.trader.view.support.CustomBuilderFactory;
import ru.trader.view.support.Localization;
@@ -29,6 +31,7 @@ public class Screeners {
private static Parent pathsScreen;
private static Parent settingsScreen;
private static Parent sEditorScreen;
private static Parent filterScreen;
private static MainController mainController;
private static ItemDescController itemDescController;
@@ -39,6 +42,7 @@ public class Screeners {
private static PathsController pathsController;
private static SettingsController settingsController;
private static SystemsEditorController systemsEditorController;
private static FilterController filterController;
private static FXMLLoader initLoader(URL url){
FXMLLoader loader = new FXMLLoader(url, Localization.getResources());
@@ -127,6 +131,12 @@ public class Screeners {
systemsEditorController = loader.getController();
}
public static void loadFilterStage(URL fxml) throws IOException {
FXMLLoader loader = initLoader(fxml);
filterScreen = loader.load();
addStylesheet(filterScreen);
filterController = loader.getController();
}
public static void show(Node node){
mainController.getMainPane().setCenter(node);
@@ -195,8 +205,21 @@ public class Screeners {
settingsController.showDialog(mainScreen, settingsScreen);
}
public static MarketFilter showFilter() {
Action res = filterController.showDialog(mainScreen, filterScreen);
return res == filterController.actSave ? filterController.getFilter() : null;
}
public static void showFilter(MarketFilter filter) {
Action res = filterController.showDialog(mainScreen, filterScreen, filter);
if (res == filterController.actSave){
Main.SETTINGS.setFilter(filter);
}
}
public static void reinitAll() {
mainController.init();
filterController.init();
EMDNUpdater.setMarket(MainController.getMarket());
}
}

View File

@@ -45,6 +45,9 @@ public class ModelFabric {
return res;
}
public Place get(SystemModel model){
return model.getSystem();
}
public StationModel get(Vendor station){
if (station == null) return NONE_STATION;
@@ -60,6 +63,9 @@ public class ModelFabric {
return res;
}
public Vendor get(StationModel model){
return model.getStation();
}
public ItemModel get(Item item){
if (item == null) return null;

View File

@@ -0,0 +1,33 @@
package ru.trader.view.support.cells;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;
import java.util.function.Function;
public class CustomListCell<T> implements Callback<ListView<T>, ListCell<T>> {
private final Function<T, String> toString;
public CustomListCell(Function<T, String> toString) {
this.toString = toString;
}
@Override
public ListCell<T> call(ListView<T> param){
return new ListCell<T>(){
@Override
public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (item != null && !empty){
setText(toString.apply(item));
setGraphic(null);
} else {
setText(null);
setGraphic(null);
}
}
};
}
}