From 10cf00c7cfda04e676443b8c24dbcc6ea65c6510 Mon Sep 17 00:00:00 2001 From: Marvin Date: Fri, 15 Jan 2021 01:21:09 +0100 Subject: [PATCH] Filter painting, filter tab (#10) --- .../fs/vatsim/map/view/map/MapViewModel.java | 4 ++ .../map/view/painter/FilterPainter.java | 70 +++++++++++++++++++ .../vatsim/map/view/painter/PilotPainter.java | 7 ++ .../fs/vatsim/map/view/tabs/TabsView.java | 2 + 4 files changed, 83 insertions(+) create mode 100644 src/main/java/net/marvk/fs/vatsim/map/view/painter/FilterPainter.java diff --git a/src/main/java/net/marvk/fs/vatsim/map/view/map/MapViewModel.java b/src/main/java/net/marvk/fs/vatsim/map/view/map/MapViewModel.java index 410816a8..cb3e5fb7 100644 --- a/src/main/java/net/marvk/fs/vatsim/map/view/map/MapViewModel.java +++ b/src/main/java/net/marvk/fs/vatsim/map/view/map/MapViewModel.java @@ -60,6 +60,7 @@ public class MapViewModel implements ViewModel { private final ObjectProperty selectionShape = new SimpleObjectProperty<>(); private final Preferences preferences; + private final FilterRepository filterRepository; private ObservableList> painterExecutors; @@ -83,6 +84,7 @@ public MapViewModel( final InternationalDateLineRepository internationalDateLineRepository, final UpperInformationRegionRepository upperInformationRegionRepository, final Preferences preferences, + final FilterRepository filterRepository, @Named("world") final List world, @Named("lakes") final List lakes ) { @@ -93,6 +95,7 @@ public MapViewModel( this.upperInformationRegionRepository = upperInformationRegionRepository; this.preferences = preferences; + this.filterRepository = filterRepository; this.scrollSpeed.bind(preferences.doubleProperty("general.scroll_speed")); @@ -225,6 +228,7 @@ private ObservableList> executors(final UpperInformationRegio PainterExecutor.ofCollection("Active Firs", new ActiveFirbPainter(mapVariables), this::flightInformationRegionBoundaries, this::isNotSelected), PainterExecutor.ofItem("Connections", new DepartureArrivalPathPainter(mapVariables), this.selectedItemProperty()::get), PainterExecutor.ofCollection("Pilots", new PilotPainter(mapVariables), this::pilots, this::isNotSelected), + PainterExecutor.ofCollection("Filters", new FilterPainter(mapVariables, filterRepository.list()), this::pilots, this::isNotSelected), PainterExecutor.ofCollection("Airports", new AirportPainter(mapVariables), this::airports, this::isNotSelected), PainterExecutor.ofCollection("Search Items", new SelectedPainter(mapVariables, Color.DEEPSKYBLUE, true), statusScope::getSearchedData, this::isNotSelected), PainterExecutor.ofItem("Selected Item", new SelectedPainter(mapVariables), selectedItem::get), diff --git a/src/main/java/net/marvk/fs/vatsim/map/view/painter/FilterPainter.java b/src/main/java/net/marvk/fs/vatsim/map/view/painter/FilterPainter.java new file mode 100644 index 00000000..ea7940ab --- /dev/null +++ b/src/main/java/net/marvk/fs/vatsim/map/view/painter/FilterPainter.java @@ -0,0 +1,70 @@ +package net.marvk.fs.vatsim.map.view.painter; + +import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; +import javafx.scene.canvas.GraphicsContext; +import net.marvk.fs.vatsim.map.data.Filter; +import net.marvk.fs.vatsim.map.data.Pilot; +import net.marvk.fs.vatsim.map.view.map.MapVariables; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class FilterPainter extends CompositeMapPainter { + + private final List filterPainters; + private MapVariables mapVariables; + + public FilterPainter(final MapVariables mapVariables, final ObservableList filters) { + this.mapVariables = mapVariables; + filterPainters = filters + .stream() + .map(FilteredPilotPainter::new) + .collect(Collectors.toCollection(ArrayList::new)); + + filters.addListener((ListChangeListener) c -> { + while (c.next()) { + filterPainters.removeIf(e -> c.getRemoved().contains(e.filter)); + c.getAddedSubList().forEach(e -> filterPainters.add(new FilteredPilotPainter(e))); + } + }); + } + + @Override + protected Collection> painters() { + return filterPainters; + } + + @Override + protected Collection> getPainters() { + return filterPainters; + } + + @Override + public void paint(final GraphicsContext context, final Pilot pilot) { + for (final FilteredPilotPainter painter : filterPainters) { + painter.paint(context, pilot); + } + } + + private class FilteredPilotPainter extends MapPainter { + private final PilotPainter painter; + private final Filter filter; + + public FilteredPilotPainter(final Filter filter) { + super(FilterPainter.this.mapVariables); + + this.painter = new PilotPainter(mapVariables, filter.getTextColor(), filter.getBackgroundColor()); + this.filter = filter; + } + + @Override + public void paint(final GraphicsContext c, final Pilot pilot) { + if (filter.test(pilot)) { + painter.paint(c, pilot); + } + } + } +} diff --git a/src/main/java/net/marvk/fs/vatsim/map/view/painter/PilotPainter.java b/src/main/java/net/marvk/fs/vatsim/map/view/painter/PilotPainter.java index e0862ad0..606dfd46 100644 --- a/src/main/java/net/marvk/fs/vatsim/map/view/painter/PilotPainter.java +++ b/src/main/java/net/marvk/fs/vatsim/map/view/painter/PilotPainter.java @@ -38,6 +38,13 @@ public class PilotPainter extends MapPainter { @Parameter(value = "Head/Tail length scaled with speed") private boolean headTailScaledWithSpeed = true; + public PilotPainter(final MapVariables mapVariables, final Color labelColor, final Color backgroundColor) { + super(mapVariables); + this.labelColor = labelColor; + this.backgroundColor = backgroundColor; + this.paintBackground = true; + } + public PilotPainter(final MapVariables mapVariables, final Color labelColor, final boolean paintBackground) { super(mapVariables); this.labelColor = labelColor; diff --git a/src/main/java/net/marvk/fs/vatsim/map/view/tabs/TabsView.java b/src/main/java/net/marvk/fs/vatsim/map/view/tabs/TabsView.java index ca4a9fb0..406c7c1e 100644 --- a/src/main/java/net/marvk/fs/vatsim/map/view/tabs/TabsView.java +++ b/src/main/java/net/marvk/fs/vatsim/map/view/tabs/TabsView.java @@ -21,6 +21,7 @@ import net.marvk.fs.vatsim.map.view.datatable.flightinformationregionboundariestable.FlightInformationRegionBoundariesTableView; import net.marvk.fs.vatsim.map.view.datatable.pilotstable.PilotsTableView; import net.marvk.fs.vatsim.map.view.datatable.upperinformationregionstable.UpperInformationRegionsTableView; +import net.marvk.fs.vatsim.map.view.filter.filteroutline.FilterOutlineView; import net.marvk.fs.vatsim.map.view.map.MapView; import net.marvk.fs.vatsim.map.view.search.SearchView; @@ -59,6 +60,7 @@ public void initialize() { tabPane.getTabs().add(createJavaViewTab("Airports", AirportsTableView.class)); tabPane.getTabs().add(createJavaViewTab("FIRs", FlightInformationRegionBoundariesTableView.class)); tabPane.getTabs().add(createJavaViewTab("UIRs", UpperInformationRegionsTableView.class)); + tabPane.getTabs().add(createFxmlViewTab("Filters", FilterOutlineView.class)); searchController.resultsVisibleProperty().bind(Bindings.createBooleanBinding( () -> tabPane.getSelectionModel().getSelectedIndex() == 0,