Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#3118 add map vault search prefs #3185

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 51 additions & 8 deletions src/main/java/com/faforever/client/map/MapVaultController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,21 @@
import com.faforever.client.map.management.MapsManagementController;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.preferences.ForgedAlliancePrefs;
import com.faforever.client.preferences.MapSearchPrefs;
import com.faforever.client.preferences.VaultPrefs;
import com.faforever.client.query.CategoryFilterController;
import com.faforever.client.query.DateRangeFilterController;
import com.faforever.client.query.RangeFilterController;
import com.faforever.client.query.SearchablePropertyMappings;
import com.faforever.client.query.TextFilterController;
import com.faforever.client.query.ToggleFilterController;
import com.faforever.client.reporting.ReportingService;
import com.faforever.client.theme.UiService;
import com.faforever.client.ui.dialog.Dialog;
import com.faforever.client.vault.VaultEntityCardController;
import com.faforever.client.vault.VaultEntityController;
import com.faforever.client.vault.search.SearchController.SearchConfig;
import javafx.beans.binding.Bindings;
import javafx.scene.Node;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
Expand All @@ -43,6 +50,8 @@ public class MapVaultController extends VaultEntityController<MapVersion> {
private MapDetailController mapDetailController;
private Integer recommendedShowRoomPageCount;
private MatchmakerQueueInfo matchmakerQueue;
private CategoryFilterController widthCategoryFilterController;
private CategoryFilterController heightCategoryFilterController;

public MapVaultController(MapService mapService, I18n i18n,
UiService uiService, NotificationService notificationService,
Expand Down Expand Up @@ -75,9 +84,19 @@ protected void initSearchController() {
searchController.setVaultRoot(vaultRoot);
searchController.setSavedQueries(vaultPrefs.getSavedMapQueries());

searchController.addTextFilter("displayName", i18n.get("map.name"), false);
searchController.addTextFilter("author.login", i18n.get("map.author"), false);
searchController.addDateRangeFilter("latestVersion.updateTime", i18n.get("map.uploadedDateTime"), 0);
MapSearchPrefs mapSearchPrefs = vaultPrefs.getMapSearch();
TextFilterController textFilterController = searchController.addTextFilter("displayName", i18n.get("map.name"), false);
textFilterController.setText(mapSearchPrefs.getMapNameField());
mapSearchPrefs.mapNameFieldProperty().bind(textFilterController.textFieldProperty().when(showing));
textFilterController = searchController.addTextFilter("author.login", i18n.get("map.author"), false);
textFilterController.setText(mapSearchPrefs.getMapAuthorField());
mapSearchPrefs.mapAuthorFieldProperty().bind(textFilterController.textFieldProperty().when(showing));

DateRangeFilterController dateRangeFilterController = searchController.addDateRangeFilter("latestVersion.updateTime", i18n.get("map.uploadedDateTime"), 0);
dateRangeFilterController.setBeforeDate(mapSearchPrefs.getUploadedBeforeDate());
dateRangeFilterController.setAfterDate(mapSearchPrefs.getUploadedAfterDate());
mapSearchPrefs.uploadedBeforeDateProperty().bind(dateRangeFilterController.beforeDateProperty().when(showing));
mapSearchPrefs.uploadedAfterDateProperty().bind(dateRangeFilterController.afterDateProperty().when(showing));

LinkedHashMap<String, String> mapSizeMap = new LinkedHashMap<>();
mapSizeMap.put("1km", "64");
Expand All @@ -88,11 +107,25 @@ protected void initSearchController() {
mapSizeMap.put("40km", "2048");
mapSizeMap.put("80km", "4096");

searchController.addCategoryFilter("latestVersion.width", i18n.get("map.width"), mapSizeMap);
searchController.addCategoryFilter("latestVersion.height", i18n.get("map.height"), mapSizeMap);
searchController.addRangeFilter("latestVersion.maxPlayers", i18n.get("map.maxPlayers"), 0, 16, 16, 0, 0, Double::intValue);
searchController.addRangeFilter("reviewsSummary.averageScore", i18n.get("reviews.averageScore"), 0, 5, 10, 4, 1);
searchController.addToggleFilter("latestVersion.ranked", i18n.get("map.onlyRanked"), "true");
widthCategoryFilterController = searchController.addCategoryFilter("latestVersion.width", i18n.get("map.width"), mapSizeMap);
mapSearchPrefs.getMapWidthFilter().forEach((item) -> widthCategoryFilterController.checkItem(item));
heightCategoryFilterController = searchController.addCategoryFilter("latestVersion.height", i18n.get("map.height"), mapSizeMap);
mapSearchPrefs.getMapHeightFilter().forEach((item) -> heightCategoryFilterController.checkItem(item));

RangeFilterController rangeFilterController = searchController.addRangeFilter("latestVersion.maxPlayers", i18n.get("map.maxPlayers"), 0, 16, 16, 0, 0, Double::intValue);
rangeFilterController.setLowValue(mapSearchPrefs.getMaxPlayersMin());
rangeFilterController.setHighValue(mapSearchPrefs.getMaxPlayersMax());
mapSearchPrefs.maxPlayersMinProperty().bind(rangeFilterController.lowValueProperty().asObject().when(showing));
mapSearchPrefs.maxPlayersMaxProperty().bind(rangeFilterController.highValueProperty().asObject().when(showing));
rangeFilterController = searchController.addRangeFilter("reviewsSummary.averageScore", i18n.get("reviews.averageScore"), 0, 5, 10, 4, 1);
rangeFilterController.setLowValue(mapSearchPrefs.getAverageReviewScoresMin());
rangeFilterController.setHighValue(mapSearchPrefs.getAverageReviewScoresMax());
mapSearchPrefs.averageReviewScoresMinProperty().bind(rangeFilterController.lowValueProperty().asObject().when(showing));
mapSearchPrefs.averageReviewScoresMaxProperty().bind(rangeFilterController.highValueProperty().asObject().when(showing));

ToggleFilterController toggleFilterController = searchController.addToggleFilter("latestVersion.ranked", i18n.get("map.onlyRanked"), "true");
toggleFilterController.setSelected(mapSearchPrefs.getOnlyRanked());
mapSearchPrefs.onlyRankedProperty().bind(toggleFilterController.selectedProperty().when(showing));
}

@Override
Expand Down Expand Up @@ -184,4 +217,14 @@ private void openUploadWindow(Path path) {
mapUploadController.setOnCancelButtonClickedListener(dialog::close);
mapUploadController.setUploadListener(this::onRefreshButtonClicked);
}

@Override
public void onShow() {
super.onShow();
MapSearchPrefs mapSearchPrefs = vaultPrefs.getMapSearch();
Bindings.bindContent(mapSearchPrefs.mapWidthFilterProperty(), widthCategoryFilterController.getCheckedItems());
addShownSubscription(() -> Bindings.unbindContent(mapSearchPrefs.mapWidthFilterProperty(), widthCategoryFilterController.getCheckedItems()));
Bindings.bindContent(mapSearchPrefs.mapHeightFilterProperty(), heightCategoryFilterController.getCheckedItems());
addShownSubscription(() -> Bindings.unbindContent(mapSearchPrefs.mapHeightFilterProperty(), heightCategoryFilterController.getCheckedItems()));
}
}
165 changes: 165 additions & 0 deletions src/main/java/com/faforever/client/preferences/MapSearchPrefs.java
Sheikah45 marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package com.faforever.client.preferences;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ListProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

import java.time.LocalDate;

public class MapSearchPrefs {
private final StringProperty mapNameField = new SimpleStringProperty("");
private final StringProperty mapAuthorField = new SimpleStringProperty("");
private final ObjectProperty<LocalDate> uploadedBeforeDate = new SimpleObjectProperty<LocalDate>();
private final ObjectProperty<LocalDate> uploadedAfterDate = new SimpleObjectProperty<LocalDate>();
private final ListProperty<String> mapWidthFilter = new SimpleListProperty<>(
FXCollections.observableArrayList()
);
private final ListProperty<String> mapHeightFilter = new SimpleListProperty<>(
FXCollections.observableArrayList()
);
private final ObjectProperty<Double> maxPlayersMin = new SimpleObjectProperty<Double>();
private final ObjectProperty<Double> maxPlayersMax = new SimpleObjectProperty<Double>();
private final ObjectProperty<Double> averageReviewScoresMin = new SimpleObjectProperty<Double>();
private final ObjectProperty<Double> averageReviewScoresMax = new SimpleObjectProperty<Double>();
private final BooleanProperty onlyRanked = new SimpleBooleanProperty();

public String getMapNameField() {
return mapNameField.get();
}

public void setMapNameField(String mapNameField) {
this.mapNameField.set(mapNameField);
}

public StringProperty mapNameFieldProperty() {
return mapNameField;
}

public String getMapAuthorField() {
return mapAuthorField.get();
}

public void setMapAuthorField(String mapAuthorField) {
this.mapAuthorField.set(mapAuthorField);
}

public StringProperty mapAuthorFieldProperty() {
return mapAuthorField;
}

public LocalDate getUploadedBeforeDate() {
return uploadedBeforeDate.get();
}

public void setUploadedBeforeDate(LocalDate uploadedBeforeDate) {
this.uploadedBeforeDate.set(uploadedBeforeDate);
}

public ObjectProperty<LocalDate> uploadedBeforeDateProperty() {
return uploadedBeforeDate;
}

public LocalDate getUploadedAfterDate() {
return uploadedAfterDate.get();
}

public void setUploadedAfterDate(LocalDate uploadedAfterDate) {
this.uploadedAfterDate.set(uploadedAfterDate);
}

public ObjectProperty<LocalDate> uploadedAfterDateProperty() {
return uploadedAfterDate;
}

public ObservableList<String> getMapWidthFilter() {
return mapWidthFilter.get();
}

public void setMapWidthFilter(ObservableList<String> mapWidthFilter) {
this.mapWidthFilter.set(mapWidthFilter);
}

public ListProperty<String> mapWidthFilterProperty() {
return mapWidthFilter;
}

public ObservableList<String> getMapHeightFilter() {
return mapHeightFilter.get();
}

public void setMapHeightFilter(ObservableList<String> mapHeightFilter) {
this.mapHeightFilter.set(mapHeightFilter);
}

public ListProperty<String> mapHeightFilterProperty() {
return mapHeightFilter;
}

public Double getMaxPlayersMin() {
return maxPlayersMin.get();
}

public void setMaxPlayersMin(Double maxPlayersMin) {
this.maxPlayersMin.set(maxPlayersMin);
}

public ObjectProperty<Double> maxPlayersMinProperty() {
return maxPlayersMin;
}

public Double getMaxPlayersMax() {
return maxPlayersMax.get();
}

public void setMaxPlayersMax(Double maxPlayersMax) {
this.maxPlayersMax.set(maxPlayersMax);
}

public ObjectProperty<Double> maxPlayersMaxProperty() {
return maxPlayersMax;
}

public Double getAverageReviewScoresMin() {
return averageReviewScoresMin.get();
}

public void setAverageReviewScoresMin(Double averageReviewScoresMin) {
this.averageReviewScoresMin.set(averageReviewScoresMin);
}

public ObjectProperty<Double> averageReviewScoresMinProperty() {
return averageReviewScoresMin;
}

public Double getAverageReviewScoresMax() {
return averageReviewScoresMax.get();
}

public void setAverageReviewScoresMax(Double averageReviewScoresMax) {
this.averageReviewScoresMax.set(averageReviewScoresMax);
}

public ObjectProperty<Double> averageReviewScoresMaxProperty() {
return averageReviewScoresMax;
}

public Boolean getOnlyRanked() {
return onlyRanked.get();
}

public void setOnlyRanked(Boolean onlyRanked) {
this.onlyRanked.set(onlyRanked);
}

public BooleanProperty onlyRankedProperty() {
return onlyRanked;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ public class VaultPrefs {
@JsonMerge
@Getter
private final ReplaySearchPrefs replaySearch = new ReplaySearchPrefs();

@JsonMerge
@Getter
private final MapSearchPrefs mapSearch = new MapSearchPrefs();

public SortConfig getOnlineReplaySortConfig() {
return onlineReplaySortConfig.get();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.github.rutledgepaulv.qbuilders.properties.concrete.InstantProperty;
import javafx.beans.InvalidationListener;
import javafx.beans.binding.Bindings;
import javafx.beans.property.ObjectProperty;
import javafx.scene.Node;
import javafx.scene.control.DatePicker;
import javafx.scene.control.MenuButton;
Expand Down Expand Up @@ -106,6 +107,14 @@ public void setInitialYearsBefore(int initialYearsBefore) {
afterDate.setValue(LocalDate.now().minusYears(initialYearsBefore));
}

public ObjectProperty<LocalDate> beforeDateProperty() {
return this.beforeDate.valueProperty();
}

public ObjectProperty<LocalDate> afterDateProperty() {
return this.afterDate.valueProperty();
}

@Override
public Node getRoot() {
return menu;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@
import com.faforever.client.notification.NotificationService;
import com.faforever.client.preferences.Preferences;
import com.faforever.client.preferences.VaultPrefs;
import com.faforever.client.query.CategoryFilterController;
import com.faforever.client.query.DateRangeFilterController;
import com.faforever.client.query.LogicalNodeController;
import com.faforever.client.query.RangeFilterController;
import com.faforever.client.query.SpecificationController;
import com.faforever.client.query.TextFilterController;
import com.faforever.client.query.ToggleFilterController;
import com.faforever.client.reporting.ReportingService;
import com.faforever.client.test.PlatformTest;
import com.faforever.client.theme.UiService;
Expand All @@ -17,6 +22,11 @@
import com.faforever.client.vault.search.SearchController;
import com.faforever.client.vault.search.SearchController.SearchConfig;
import com.faforever.client.vault.search.SearchController.SortConfig;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.layout.Pane;
import org.instancio.Instancio;
import org.junit.jupiter.api.BeforeEach;
Expand All @@ -27,10 +37,15 @@
import reactor.core.publisher.Mono;

import java.net.MalformedURLException;
import java.time.LocalDate;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyDouble;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
Expand Down Expand Up @@ -58,6 +73,16 @@ public class MapVaultControllerTest extends PlatformTest {
private ReportingService reportingService;
@Mock
private PlatformService platformService;
@Mock
private CategoryFilterController categoryFilterController;
@Mock
private DateRangeFilterController dateRangeFilterController;
@Mock
private TextFilterController textFilterController;
@Mock
private RangeFilterController rangeFilterController;
@Mock
private ToggleFilterController toggleFilterController;
@Spy
private VaultPrefs vaultPrefs;

Expand All @@ -77,7 +102,19 @@ public void setUp() throws Exception {
}).when(uiService).loadFxml("theme/vault/map/map_detail.fxml");

when(mapService.getRecommendedMapPageCount(VaultEntityController.TOP_ELEMENT_COUNT)).thenReturn(Mono.just(0));

when(searchController.addCategoryFilter(any(), any(), anyMap())).thenReturn(categoryFilterController);
when(categoryFilterController.getCheckedItems()).thenReturn(new SimpleListProperty<String>());
when(searchController.addTextFilter(anyString(), anyString(), anyBoolean())).thenReturn(textFilterController);
when(textFilterController.textFieldProperty()).thenReturn(new SimpleStringProperty());
when(searchController.addRangeFilter(anyString(), anyString(), anyDouble(), anyDouble(), anyInt(), anyInt(), anyInt())).thenReturn(rangeFilterController);
when(searchController.addRangeFilter(anyString(), anyString(), anyDouble(), anyDouble(), anyInt(), anyInt(), anyInt(), any())).thenReturn(rangeFilterController);
when(rangeFilterController.lowValueProperty()).thenReturn(new SimpleDoubleProperty());
when(rangeFilterController.highValueProperty()).thenReturn(new SimpleDoubleProperty());
when(searchController.addToggleFilter(anyString(), anyString(), anyString())).thenReturn(toggleFilterController);
when(toggleFilterController.selectedProperty()).thenReturn(new SimpleBooleanProperty());
when(searchController.addDateRangeFilter(anyString(), anyString(), anyInt())).thenReturn(dateRangeFilterController);
when(dateRangeFilterController.beforeDateProperty()).thenReturn(new SimpleObjectProperty<LocalDate>());
when(dateRangeFilterController.afterDateProperty()).thenReturn(new SimpleObjectProperty<LocalDate>());
SortConfig sortOrder = new Preferences().getVault().getMapSortConfig();
standardSearchConfig = new SearchConfig(sortOrder, "query");

Expand Down
Loading
Loading