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) {
|
||||
if (advancedSearchFilter == null) {
|
||||
advancedSearchFilter = createAdvancedSearchFilter();
|
||||
ItemManager.this.add(advancedSearchFilter.getWidget());
|
||||
}
|
||||
advancedSearchFilter.edit();
|
||||
}
|
||||
@@ -363,6 +364,9 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
helper.include(btnView, viewButtonWidth, fieldHeight);
|
||||
helper.include(btnAdvancedSearchOptions, viewButtonWidth, fieldHeight);
|
||||
helper.newLine();
|
||||
if (advancedSearchFilter != null && advancedSearchFilter.getWidget().isVisible()) {
|
||||
helper.fillLine(advancedSearchFilter.getWidget(), fieldHeight);
|
||||
}
|
||||
if (!hideFilters) {
|
||||
for (ItemFilter<? extends T> filter : filters) {
|
||||
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();
|
||||
|
||||
public void addFilter(final ItemFilter<? extends T> filter) {
|
||||
addFilter(-1, filter);
|
||||
}
|
||||
public void addFilter(int index, final ItemFilter<? extends T> filter) {
|
||||
if (index == -1) {
|
||||
filters.add(filter);
|
||||
}
|
||||
else {
|
||||
filters.add(index, filter);
|
||||
}
|
||||
filters.add(filter);
|
||||
add(filter.getWidget());
|
||||
|
||||
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
|
||||
private void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
||||
public void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -837,6 +844,11 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
searchFilter.reset();
|
||||
if (advancedSearchFilter != null) {
|
||||
advancedSearchFilter.reset();
|
||||
ItemFilter<? extends T>.Widget widget = advancedSearchFilter.getWidget();
|
||||
if (widget.isVisible()) {
|
||||
widget.setVisible(false);
|
||||
revalidate();
|
||||
}
|
||||
}
|
||||
lockFiltering = false;
|
||||
|
||||
@@ -862,6 +874,9 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
if (!searchFilter.isEmpty()) {
|
||||
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);
|
||||
if (filterPredicate == newFilterPredicate) { return false; }
|
||||
|
||||
@@ -10,7 +10,6 @@ import com.google.common.base.Predicates;
|
||||
import forge.FThreads;
|
||||
import forge.Forge;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.itemmanager.BooleanExpression.Operator;
|
||||
import forge.itemmanager.AdvancedSearch;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.menu.FTooltip;
|
||||
@@ -23,13 +22,13 @@ import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FTextField;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.util.Callback;
|
||||
|
||||
|
||||
public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
|
||||
private final List<Object> expression = new ArrayList<Object>();
|
||||
|
||||
private FiltersLabel label;
|
||||
private boolean isAdded;
|
||||
private EditScreen editScreen;
|
||||
|
||||
public AdvancedSearchFilter(ItemManager<? super T> itemManager0) {
|
||||
@@ -92,7 +91,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
predPiece = ((ItemFilter<T>) piece).buildPredicate();
|
||||
predPiece = ((AdvancedSearch.Filter<T>) piece).getPredicate();
|
||||
}
|
||||
if (applyNot) {
|
||||
predPiece = Predicates.not(predPiece);
|
||||
@@ -117,14 +116,6 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
editScreen = new EditScreen();
|
||||
}
|
||||
Forge.openScreen(editScreen);
|
||||
/*if (!isAdded) {
|
||||
isAdded = true;
|
||||
itemManager.addFilter(0, this);
|
||||
}
|
||||
else {
|
||||
itemManager.removeFilter(this);
|
||||
isAdded = false;
|
||||
}*/
|
||||
}
|
||||
|
||||
private void updateLabel() {
|
||||
@@ -134,9 +125,8 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
builder.append("(none)");
|
||||
}
|
||||
else {
|
||||
builder.append(expression.get(0));
|
||||
for (int i = 1; i < expression.size(); i++) {
|
||||
builder.append(", " + expression.get(i));
|
||||
for (Object piece : expression) {
|
||||
builder.append(piece);
|
||||
}
|
||||
}
|
||||
label.setText(builder.toString());
|
||||
@@ -146,10 +136,18 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
if (expression.isEmpty()) { return ""; }
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(expression.get(0));
|
||||
builder.append("Filters:\n");
|
||||
|
||||
for (int i = 1; i < expression.size(); i++) {
|
||||
builder.append("\n" + expression.get(i));
|
||||
String indent = "";
|
||||
|
||||
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();
|
||||
}
|
||||
@@ -161,6 +159,11 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
expression.clear();
|
||||
editScreen = null;
|
||||
if (label != null) {
|
||||
updateLabel();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -168,6 +171,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
label = new FiltersLabel();
|
||||
updateLabel();
|
||||
widget.add(label);
|
||||
widget.setVisible(!isEmpty());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -211,6 +215,48 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
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
|
||||
protected void doLayout(float startY, float width, float height) {
|
||||
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