Move Advanced Search option into ItemManager as button next to search field

Add menu option to reset filters
This commit is contained in:
drdev
2015-08-30 01:17:44 +00:00
parent c40ee59491
commit c2e41d98af
10 changed files with 128 additions and 89 deletions

2
.gitattributes vendored
View File

@@ -1244,7 +1244,7 @@ forge-gui-mobile/src/forge/itemmanager/CardManager.java -text
forge-gui-mobile/src/forge/itemmanager/DeckManager.java -text
forge-gui-mobile/src/forge/itemmanager/ItemManager.java -text
forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardAdvancedFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardCMCFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardColorFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardColorlessCostFilter.java -text

View File

@@ -21,7 +21,6 @@ import forge.itemmanager.ColumnDef;
import forge.itemmanager.ItemColumn;
import forge.itemmanager.ItemManager.ContextMenuBuilder;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.filters.CardAdvancedFilter;
import forge.itemmanager.filters.ItemFilter;
import forge.limited.BoosterDraft;
import forge.menu.FCheckBoxMenuItem;
@@ -185,7 +184,6 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
protected final FLabel lblName = deckHeader.add(new FLabel.Builder().font(FSkinFont.get(16)).insets(new Vector2(Utils.scale(5), 0)).build());
private final FLabel btnSave = deckHeader.add(new FLabel.Builder().icon(FSkinImage.SAVE).align(HAlignment.CENTER).pressedColor(Header.BTN_PRESSED_COLOR).build());
private final FLabel btnMoreOptions = deckHeader.add(new FLabel.Builder().text("...").font(FSkinFont.get(20)).align(HAlignment.CENTER).pressedColor(Header.BTN_PRESSED_COLOR).build());
private final CardAdvancedFilter advancedSearchFilter;
public FDeckEditor(EditorType editorType0, DeckProxy editDeck, boolean showMainDeck) {
this(editorType0, editDeck.getName(), editDeck.getPath(), null, showMainDeck);
@@ -227,8 +225,6 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
}
}
advancedSearchFilter = catalogPage != null ? new CardAdvancedFilter(catalogPage.cardManager) : null;
switch (editorType) {
case Sealed:
//if opening brand new sealed deck, show sideboard (card pool) by default
@@ -305,15 +301,6 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
setSelectedPage(getMainDeckPage()); //select main deck page if needed so main deck is visible below dialog
}
}));
if (advancedSearchFilter != null) {
addItem(new FMenuItem("Advanced Search", FSkinImage.SEARCH, new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
advancedSearchFilter.edit();
setSelectedPage(getCatalogPage()); //select catalog page if needed so catalog is visible below dialog
}
}));
}
if (!isLimitedEditor()) {
addItem(new FMenuItem("Import from Clipboard", FSkinImage.OPEN, new FEventHandler() {
@Override

View File

@@ -8,6 +8,7 @@ import forge.assets.FSkinFont;
import forge.card.CardRenderer;
import forge.card.CardZoom;
import forge.item.PaperCard;
import forge.itemmanager.filters.AdvancedSearchFilter;
import forge.itemmanager.filters.CardColorFilter;
import forge.itemmanager.filters.CardFormatFilter;
import forge.itemmanager.filters.CardSearchFilter;
@@ -33,6 +34,11 @@ public class CardManager extends ItemManager<PaperCard> {
return createSearchFilter(this);
}
@Override
protected AdvancedSearchFilter<PaperCard> createAdvancedSearchFilter() {
return createAdvancedSearchFilter(this);
}
/* Static overrides shared with SpellShopManager*/
public static void addDefaultFilters(final ItemManager<? super PaperCard> itemManager) {
@@ -45,6 +51,10 @@ public class CardManager extends ItemManager<PaperCard> {
return new CardSearchFilter(itemManager);
}
public static AdvancedSearchFilter<PaperCard> createAdvancedSearchFilter(final ItemManager<? super PaperCard> itemManager) {
return new AdvancedSearchFilter<PaperCard>(itemManager);
}
@Override
public ItemRenderer getListItemRenderer(final CompactModeHandler compactModeHandler) {
return new ItemRenderer() {

View File

@@ -12,6 +12,7 @@ import forge.deck.FDeckViewer;
import forge.deck.io.DeckPreferences;
import forge.game.GameType;
import forge.game.IHasGameType;
import forge.itemmanager.filters.AdvancedSearchFilter;
import forge.itemmanager.filters.DeckColorFilter;
import forge.itemmanager.filters.DeckFormatFilter;
import forge.itemmanager.filters.DeckSearchFilter;
@@ -72,6 +73,11 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
return new DeckSearchFilter(this);
}
@Override
protected AdvancedSearchFilter<DeckProxy> createAdvancedSearchFilter() {
return new AdvancedSearchFilter<DeckProxy>(this);
}
@Override
protected boolean allowSortChange() {
return false;

View File

@@ -33,12 +33,15 @@ import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
import forge.card.CardZoom.ActivateHandler;
import forge.item.InventoryItem;
import forge.itemmanager.filters.AdvancedSearchFilter;
import forge.itemmanager.filters.ItemFilter;
import forge.itemmanager.filters.TextSearchFilter;
import forge.itemmanager.views.ImageView;
import forge.itemmanager.views.ItemListView;
import forge.itemmanager.views.ItemView;
import forge.menu.FDropDownMenu;
import forge.menu.FMenuItem;
import forge.menu.FPopupMenu;
import forge.screens.FScreen;
import forge.toolbox.FComboBox;
import forge.toolbox.FContainer;
@@ -58,6 +61,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
private ItemPool<T> pool;
protected final ItemManagerModel<T> model;
private Predicate<? super T> filterPredicate = null;
private AdvancedSearchFilter<? extends T> advancedSearchFilter;
private final List<ItemFilter<? extends T>> filters = new ArrayList<ItemFilter<? extends T>>();
private boolean hideFilters = false;
private boolean wantUnique = false;
@@ -72,10 +76,13 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
private final TextSearchFilter<? extends T> searchFilter;
private static final FSkinImage VIEW_OPTIONS_ICON = FSkinImage.SETTINGS;
private final FLabel btnSearch = new FLabel.ButtonBuilder()
.icon(FSkinImage.SEARCH).iconScaleFactor(0.9f).build();
private final FLabel btnView = new FLabel.ButtonBuilder()
.iconScaleFactor(0.9f).build(); //icon set later
private final FLabel btnAdvancedSearchOptions = new FLabel.Builder()
.selectable(true).align(HAlignment.CENTER)
.icon(VIEW_OPTIONS_ICON).iconScaleFactor(0.9f)
.icon(FSkinImage.SETTINGS).iconScaleFactor(0.9f)
.build();
private final FComboBox<ItemColumn> cbxSortOptions;
@@ -107,18 +114,12 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
views.add(listView);
views.add(imageView);
currentView = listView;
//initialize views
for (int i = 0; i < views.size(); i++) {
views.get(i).initialize(i);
}
btnView.setIcon(currentView.getIcon());
//build display
add(searchFilter.getWidget());
for (ItemView<T> view : views) {
add(view.getButton());
view.getButton().setSelected(view == currentView);
}
add(btnSearch);
add(btnView);
add(btnAdvancedSearchOptions);
btnAdvancedSearchOptions.setSelected(!hideFilters);
if (allowSortChange()) {
@@ -131,6 +132,57 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
add(currentView.getPnlOptions());
add(currentView.getScroller());
btnSearch.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
FPopupMenu menu = new FPopupMenu() {
@Override
protected void buildMenu() {
addItem(new FMenuItem("Advanced Search", FSkinImage.SEARCH, new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
if (advancedSearchFilter == null) {
advancedSearchFilter = createAdvancedSearchFilter();
}
advancedSearchFilter.edit();
}
}));
addItem(new FMenuItem("Reset Filters", FSkinImage.DELETE, new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
resetFilters();
}
}));
}
};
menu.show(btnSearch, 0, btnSearch.getHeight());
}
});
btnView.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
FPopupMenu menu = new FPopupMenu() {
@Override
protected void buildMenu() {
for (int i = 0; i < views.size(); i++) {
final int index = i;
ItemView<T> view = views.get(i);
FMenuItem item = new FMenuItem(view.getCaption(), view.getIcon(), new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
setViewIndex(index);
}
});
if (currentView == view) {
item.setSelected(true);
}
addItem(item);
}
}
};
menu.show(btnView, 0, btnView.getHeight());
}
});
btnAdvancedSearchOptions.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
@@ -287,13 +339,12 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
itemsToSelect = null;
}
currentView.getButton().setSelected(false);
remove(currentView.getPnlOptions());
remove(currentView.getScroller());
currentView = view;
btnView.setIcon(view.getIcon());
view.getButton().setSelected(true);
view.refresh(itemsToSelect, backupIndexToSelect, 0);
add(view.getPnlOptions());
@@ -306,12 +357,10 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
LayoutHelper helper = new LayoutHelper(this, ItemFilter.PADDING, ItemFilter.PADDING);
float fieldHeight = searchFilter.getMainComponent().getHeight();
float viewButtonWidth = fieldHeight;
float viewButtonCount = views.size() + 1;
helper.offset(0, ItemFilter.PADDING);
helper.fillLine(searchFilter.getWidget(), fieldHeight, (viewButtonWidth + helper.getGapX()) * viewButtonCount); //leave room for view buttons
for (ItemView<T> view : views) {
helper.include(view.getButton(), viewButtonWidth, fieldHeight);
}
helper.fillLine(searchFilter.getWidget(), fieldHeight, (viewButtonWidth + helper.getGapX()) * 3); //leave room for search, view, and options buttons
helper.include(btnSearch, viewButtonWidth, fieldHeight);
helper.include(btnView, viewButtonWidth, fieldHeight);
helper.include(btnAdvancedSearchOptions, viewButtonWidth, fieldHeight);
helper.newLine();
if (!hideFilters) {
@@ -740,6 +789,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
protected abstract void addDefaultFilters();
protected abstract TextSearchFilter<? extends T> createSearchFilter();
protected abstract AdvancedSearchFilter<? extends T> createAdvancedSearchFilter();
public void addFilter(final ItemFilter<? extends T> filter) {
addFilter(-1, filter);
@@ -779,6 +829,20 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
applyFilters();
}
public void resetFilters() {
lockFiltering = true; //prevent updating filtering from this change until all filters reset
for (final ItemFilter<? extends T> filter : filters) {
filter.reset();
}
searchFilter.reset();
if (advancedSearchFilter != null) {
advancedSearchFilter.reset();
}
lockFiltering = false;
applyFilters();
}
public void removeFilter(ItemFilter<? extends T> filter) {
filters.remove(filter);
remove(filter.getWidget());
@@ -1103,7 +1167,10 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
showMenu(true);
}
public FComboBox<ItemColumn> getSortOptions() {
return cbxSortOptions;
public float getPileByWidth() {
if (cbxSortOptions != null) {
return cbxSortOptions.getWidth();
}
return filters.get(filters.size() - 1).getWidget().getWidth();
}
}

View File

@@ -15,6 +15,7 @@ import forge.card.CardRenderer;
import forge.card.CardZoom;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.itemmanager.filters.AdvancedSearchFilter;
import forge.itemmanager.filters.TextSearchFilter;
import forge.quest.QuestSpellShop;
import forge.toolbox.FList;
@@ -43,6 +44,11 @@ public final class SpellShopManager extends ItemManager<InventoryItem> {
return CardManager.createSearchFilter(this);
}
@Override
protected AdvancedSearchFilter<? extends InventoryItem> createAdvancedSearchFilter() {
return CardManager.createAdvancedSearchFilter(this);
}
@Override
public ItemRenderer getListItemRenderer(final CompactModeHandler compactModeHandler) {
return new ItemRenderer() {

View File

@@ -8,8 +8,7 @@ import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.Forge;
import forge.assets.FSkinImage;
import forge.item.PaperCard;
import forge.item.InventoryItem;
import forge.itemmanager.BooleanExpression.Operator;
import forge.itemmanager.ItemManager;
import forge.menu.FTooltip;
@@ -24,26 +23,25 @@ import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FLabel;
public class CardAdvancedFilter extends ItemFilter<PaperCard> {
public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
private final List<Object> expression = new ArrayList<Object>();
private FiltersLabel label;
private FLabel btnEdit;
private boolean isAdded;
private EditScreen editScreen;
public CardAdvancedFilter(ItemManager<? super PaperCard> itemManager0) {
public AdvancedSearchFilter(ItemManager<? super T> itemManager0) {
super(itemManager0);
}
@Override
public ItemFilter<PaperCard> createCopy() {
CardAdvancedFilter copy = new CardAdvancedFilter(itemManager);
public ItemFilter<T> createCopy() {
AdvancedSearchFilter<T> copy = new AdvancedSearchFilter<T>(itemManager);
return copy;
}
@Override
protected final Predicate<PaperCard> buildPredicate() {
protected final Predicate<T> buildPredicate() {
if (expression.isEmpty()) {
return Predicates.alwaysTrue();
}
@@ -65,9 +63,9 @@ public class CardAdvancedFilter extends ItemFilter<PaperCard> {
}
@SuppressWarnings("unchecked")
private Predicate<PaperCard> getPredicatePiece(ExpressionIterator iterator) {
Predicate<PaperCard> pred = null;
Predicate<PaperCard> predPiece = null;
private Predicate<T> getPredicatePiece(ExpressionIterator iterator) {
Predicate<T> pred = null;
Predicate<T> predPiece = null;
Operator operator = null;
boolean applyNot = false;
@@ -92,7 +90,7 @@ public class CardAdvancedFilter extends ItemFilter<PaperCard> {
continue;
}
else {
predPiece = ((ItemFilter<PaperCard>) piece).buildPredicate();
predPiece = ((ItemFilter<T>) piece).buildPredicate();
}
if (applyNot) {
predPiece = Predicates.not(predPiece);
@@ -168,22 +166,11 @@ public class CardAdvancedFilter extends ItemFilter<PaperCard> {
label = new FiltersLabel();
updateLabel();
widget.add(label);
btnEdit = new FLabel.ButtonBuilder().icon(FSkinImage.SEARCH).iconScaleFactor(0.9f).command(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
edit();
}
}).build();
widget.add(btnEdit);
}
@Override
protected void doWidgetLayout(float width, float height) {
float buttonWidth = height;
float buttonHeight = height;
btnEdit.setBounds(width - buttonWidth, (height - buttonHeight) / 2, buttonWidth, buttonHeight);
label.setSize(btnEdit.getLeft() - ItemFilter.PADDING, height);
label.setSize(width, height);
}
private class FiltersLabel extends FLabel {

View File

@@ -388,7 +388,7 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
btnExpandCollapseAll.setBounds(x, y, h, h);
x += h + padding;
float pileByWidth = itemManager.getSortOptions().getWidth();
float pileByWidth = itemManager.getPileByWidth();
float groupByWidth = width - x - padding - pileByWidth;
cbGroupByOptions.setBounds(x, y, groupByWidth, h);
@@ -654,7 +654,7 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
}
@Override
protected FImage getIcon() {
public FImage getIcon() {
if (itemManager.getGenericType().equals(DeckProxy.class)) {
return FSkinImage.PACK;
}
@@ -662,7 +662,7 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
}
@Override
protected String getCaption() {
public String getCaption() {
return "Image View";
}

View File

@@ -71,12 +71,12 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
}
@Override
protected FImage getIcon() {
public FImage getIcon() {
return FSkinImage.LIST;
}
@Override
protected String getCaption() {
public String getCaption() {
return "List View";
}

View File

@@ -12,9 +12,7 @@ import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.ItemManagerModel;
import forge.toolbox.FContainer;
import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FEvent.FEventType;
import forge.toolbox.FLabel;
import forge.toolbox.FScrollPane;
import java.util.ArrayList;
@@ -22,7 +20,6 @@ import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import com.badlogic.gdx.math.Rectangle;
public abstract class ItemView<T extends InventoryItem> {
@@ -33,7 +30,6 @@ public abstract class ItemView<T extends InventoryItem> {
protected int minSelections = 0;
protected int maxSelections = 1;
private final Scroller scroller = new Scroller();
private final FLabel button;
private final OptionsPanel pnlOptions = new OptionsPanel();
private float heightBackup;
@@ -42,8 +38,6 @@ public abstract class ItemView<T extends InventoryItem> {
protected ItemView(ItemManager<T> itemManager0, ItemManagerModel<T> model0) {
itemManager = itemManager0;
model = model0;
button = new FLabel.Builder().selectable(true).align(HAlignment.CENTER)
.iconScaleFactor(0.9f).icon(getIcon()).build();
}
private class Scroller extends FScrollPane {
@@ -96,24 +90,6 @@ public abstract class ItemView<T extends InventoryItem> {
}
}
public void initialize(final int index) {
button.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
if (button.isSelected()) {
itemManager.setViewIndex(index);
}
else {
button.setSelected(true); //prevent toggling off button
}
}
});
}
public FLabel getButton() {
return button;
}
public FScrollPane getScroller() {
return scroller;
}
@@ -285,8 +261,8 @@ public abstract class ItemView<T extends InventoryItem> {
public abstract int getIndexAtPoint(float x, float y);
public abstract void scrollSelectionIntoView();
public abstract Rectangle getSelectionBounds();
protected abstract FImage getIcon();
protected abstract String getCaption();
public abstract FImage getIcon();
public abstract String getCaption();
protected abstract void onSetSelectedIndex(int index);
protected abstract void onSetSelectedIndices(Iterable<Integer> indices);
}