mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
Improve readability of advanced filters
This commit is contained in:
@@ -143,6 +143,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
|||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
if (advancedSearchFilter == null) {
|
if (advancedSearchFilter == null) {
|
||||||
advancedSearchFilter = createAdvancedSearchFilter();
|
advancedSearchFilter = createAdvancedSearchFilter();
|
||||||
|
ItemManager.this.add(advancedSearchFilter.getWidget());
|
||||||
}
|
}
|
||||||
advancedSearchFilter.edit();
|
advancedSearchFilter.edit();
|
||||||
}
|
}
|
||||||
@@ -363,6 +364,9 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
|||||||
helper.include(btnView, viewButtonWidth, fieldHeight);
|
helper.include(btnView, viewButtonWidth, fieldHeight);
|
||||||
helper.include(btnAdvancedSearchOptions, viewButtonWidth, fieldHeight);
|
helper.include(btnAdvancedSearchOptions, viewButtonWidth, fieldHeight);
|
||||||
helper.newLine();
|
helper.newLine();
|
||||||
|
if (advancedSearchFilter != null && advancedSearchFilter.getWidget().isVisible()) {
|
||||||
|
helper.fillLine(advancedSearchFilter.getWidget(), fieldHeight);
|
||||||
|
}
|
||||||
if (!hideFilters) {
|
if (!hideFilters) {
|
||||||
for (ItemFilter<? extends T> filter : filters) {
|
for (ItemFilter<? extends T> filter : filters) {
|
||||||
helper.include(filter.getWidget(), filter.getPreferredWidth(helper.getRemainingLineWidth(), fieldHeight), fieldHeight);
|
helper.include(filter.getWidget(), filter.getPreferredWidth(helper.getRemainingLineWidth(), fieldHeight), fieldHeight);
|
||||||
@@ -792,15 +796,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
|||||||
protected abstract AdvancedSearchFilter<? extends T> createAdvancedSearchFilter();
|
protected abstract AdvancedSearchFilter<? extends T> createAdvancedSearchFilter();
|
||||||
|
|
||||||
public void addFilter(final ItemFilter<? extends T> filter) {
|
public void addFilter(final ItemFilter<? extends T> filter) {
|
||||||
addFilter(-1, filter);
|
filters.add(filter);
|
||||||
}
|
|
||||||
public void addFilter(int index, final ItemFilter<? extends T> filter) {
|
|
||||||
if (index == -1) {
|
|
||||||
filters.add(filter);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
filters.add(index, filter);
|
|
||||||
}
|
|
||||||
add(filter.getWidget());
|
add(filter.getWidget());
|
||||||
|
|
||||||
boolean visible = !hideFilters;
|
boolean visible = !hideFilters;
|
||||||
@@ -812,8 +808,19 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
|||||||
}
|
}
|
||||||
|
|
||||||
//apply filters and focus existing filter's main component if filtering not locked
|
//apply filters and focus existing filter's main component if filtering not locked
|
||||||
private void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
public void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
||||||
if (lockFiltering) { return; }
|
if (lockFiltering) { return; }
|
||||||
|
|
||||||
|
if (filter == advancedSearchFilter) {
|
||||||
|
//handle update the visibility of the advanced search filter
|
||||||
|
boolean empty = filter.isEmpty();
|
||||||
|
ItemFilter<? extends T>.Widget widget = filter.getWidget();
|
||||||
|
if (widget.isVisible() == empty) {
|
||||||
|
widget.setVisible(!empty);
|
||||||
|
revalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
applyFilters();
|
applyFilters();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -837,6 +844,11 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
|||||||
searchFilter.reset();
|
searchFilter.reset();
|
||||||
if (advancedSearchFilter != null) {
|
if (advancedSearchFilter != null) {
|
||||||
advancedSearchFilter.reset();
|
advancedSearchFilter.reset();
|
||||||
|
ItemFilter<? extends T>.Widget widget = advancedSearchFilter.getWidget();
|
||||||
|
if (widget.isVisible()) {
|
||||||
|
widget.setVisible(false);
|
||||||
|
revalidate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
lockFiltering = false;
|
lockFiltering = false;
|
||||||
|
|
||||||
@@ -862,6 +874,9 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
|||||||
if (!searchFilter.isEmpty()) {
|
if (!searchFilter.isEmpty()) {
|
||||||
predicates.add(searchFilter.buildPredicate(genericType));
|
predicates.add(searchFilter.buildPredicate(genericType));
|
||||||
}
|
}
|
||||||
|
if (advancedSearchFilter != null && !advancedSearchFilter.isEmpty()) {
|
||||||
|
predicates.add(advancedSearchFilter.buildPredicate(genericType));
|
||||||
|
}
|
||||||
|
|
||||||
Predicate<? super T> newFilterPredicate = predicates.size() == 0 ? null : Predicates.and(predicates);
|
Predicate<? super T> newFilterPredicate = predicates.size() == 0 ? null : Predicates.and(predicates);
|
||||||
if (filterPredicate == newFilterPredicate) { return false; }
|
if (filterPredicate == newFilterPredicate) { return false; }
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import com.google.common.base.Predicates;
|
|||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.Forge;
|
import forge.Forge;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
import forge.itemmanager.BooleanExpression.Operator;
|
|
||||||
import forge.itemmanager.AdvancedSearch;
|
import forge.itemmanager.AdvancedSearch;
|
||||||
import forge.itemmanager.ItemManager;
|
import forge.itemmanager.ItemManager;
|
||||||
import forge.menu.FTooltip;
|
import forge.menu.FTooltip;
|
||||||
@@ -23,13 +22,13 @@ import forge.toolbox.FScrollPane;
|
|||||||
import forge.toolbox.FTextField;
|
import forge.toolbox.FTextField;
|
||||||
import forge.toolbox.FEvent.FEventHandler;
|
import forge.toolbox.FEvent.FEventHandler;
|
||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
|
import forge.util.Callback;
|
||||||
|
|
||||||
|
|
||||||
public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
|
public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
|
||||||
private final List<Object> expression = new ArrayList<Object>();
|
private final List<Object> expression = new ArrayList<Object>();
|
||||||
|
|
||||||
private FiltersLabel label;
|
private FiltersLabel label;
|
||||||
private boolean isAdded;
|
|
||||||
private EditScreen editScreen;
|
private EditScreen editScreen;
|
||||||
|
|
||||||
public AdvancedSearchFilter(ItemManager<? super T> itemManager0) {
|
public AdvancedSearchFilter(ItemManager<? super T> itemManager0) {
|
||||||
@@ -92,7 +91,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
predPiece = ((ItemFilter<T>) piece).buildPredicate();
|
predPiece = ((AdvancedSearch.Filter<T>) piece).getPredicate();
|
||||||
}
|
}
|
||||||
if (applyNot) {
|
if (applyNot) {
|
||||||
predPiece = Predicates.not(predPiece);
|
predPiece = Predicates.not(predPiece);
|
||||||
@@ -117,14 +116,6 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
editScreen = new EditScreen();
|
editScreen = new EditScreen();
|
||||||
}
|
}
|
||||||
Forge.openScreen(editScreen);
|
Forge.openScreen(editScreen);
|
||||||
/*if (!isAdded) {
|
|
||||||
isAdded = true;
|
|
||||||
itemManager.addFilter(0, this);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
itemManager.removeFilter(this);
|
|
||||||
isAdded = false;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateLabel() {
|
private void updateLabel() {
|
||||||
@@ -134,9 +125,8 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
builder.append("(none)");
|
builder.append("(none)");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
builder.append(expression.get(0));
|
for (Object piece : expression) {
|
||||||
for (int i = 1; i < expression.size(); i++) {
|
builder.append(piece);
|
||||||
builder.append(", " + expression.get(i));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
label.setText(builder.toString());
|
label.setText(builder.toString());
|
||||||
@@ -146,10 +136,18 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
if (expression.isEmpty()) { return ""; }
|
if (expression.isEmpty()) { return ""; }
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append(expression.get(0));
|
builder.append("Filters:\n");
|
||||||
|
|
||||||
for (int i = 1; i < expression.size(); i++) {
|
String indent = "";
|
||||||
builder.append("\n" + expression.get(i));
|
|
||||||
|
for (Object piece : expression) {
|
||||||
|
if (piece.equals(Operator.CLOSE_PAREN) && !indent.isEmpty()) {
|
||||||
|
indent = indent.substring(2); //trim an indent level when a close paren is hit
|
||||||
|
}
|
||||||
|
builder.append("\n" + indent + piece.toString().trim());
|
||||||
|
if (piece.equals(Operator.OPEN_PAREN)) {
|
||||||
|
indent += " "; //add an indent level when an open paren is hit
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
@@ -161,6 +159,11 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
public void reset() {
|
||||||
|
expression.clear();
|
||||||
|
editScreen = null;
|
||||||
|
if (label != null) {
|
||||||
|
updateLabel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -168,6 +171,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
label = new FiltersLabel();
|
label = new FiltersLabel();
|
||||||
updateLabel();
|
updateLabel();
|
||||||
widget.add(label);
|
widget.add(label);
|
||||||
|
widget.setVisible(!isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -211,6 +215,48 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
scroller.add(new Filter());
|
scroller.add(new Filter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void onClose(Callback<Boolean> canCloseCallback) {
|
||||||
|
//build expression when closing screen
|
||||||
|
expression.clear();
|
||||||
|
|
||||||
|
for (FDisplayObject child : scroller.getChildren()) {
|
||||||
|
Filter filter = (Filter)child;
|
||||||
|
if (filter.filter == null) { continue; } //skip any blank filters
|
||||||
|
|
||||||
|
if (filter.btnNotBeforeParen.isSelected()) {
|
||||||
|
expression.add(Operator.NOT);
|
||||||
|
}
|
||||||
|
if (filter.btnOpenParen.isSelected()) {
|
||||||
|
expression.add(Operator.OPEN_PAREN);
|
||||||
|
}
|
||||||
|
if (filter.btnNotAfterParen.isSelected()) {
|
||||||
|
expression.add(Operator.NOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
expression.add(filter.filter);
|
||||||
|
|
||||||
|
if (filter.btnCloseParen.isSelected()) {
|
||||||
|
expression.add(Operator.CLOSE_PAREN);
|
||||||
|
}
|
||||||
|
if (filter.btnAnd.isSelected()) {
|
||||||
|
expression.add(Operator.AND);
|
||||||
|
}
|
||||||
|
else if (filter.btnOr.isSelected()) {
|
||||||
|
expression.add(Operator.OR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (label != null) {
|
||||||
|
updateLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
itemManager.applyNewOrModifiedFilter(AdvancedSearchFilter.this);
|
||||||
|
|
||||||
|
super.onClose(canCloseCallback);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doLayout(float startY, float width, float height) {
|
protected void doLayout(float startY, float width, float height) {
|
||||||
scroller.setBounds(0, startY, width, height - startY);
|
scroller.setBounds(0, startY, width, height - startY);
|
||||||
@@ -329,4 +375,22 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private enum Operator {
|
||||||
|
AND(" AND "),
|
||||||
|
OR(" OR "),
|
||||||
|
NOT(" NOT "),
|
||||||
|
OPEN_PAREN("("),
|
||||||
|
CLOSE_PAREN(")");
|
||||||
|
|
||||||
|
private final String token;
|
||||||
|
|
||||||
|
private Operator(String token0) {
|
||||||
|
token = token0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user