diff --git a/.gitattributes b/.gitattributes index b99e8213656..bffb8c793d3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 79294632992..368d770b622 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -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 { 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 { } } - 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 { 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 diff --git a/forge-gui-mobile/src/forge/itemmanager/CardManager.java b/forge-gui-mobile/src/forge/itemmanager/CardManager.java index abe393a7f80..9527d7dac57 100644 --- a/forge-gui-mobile/src/forge/itemmanager/CardManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/CardManager.java @@ -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 { return createSearchFilter(this); } + @Override + protected AdvancedSearchFilter createAdvancedSearchFilter() { + return createAdvancedSearchFilter(this); + } + /* Static overrides shared with SpellShopManager*/ public static void addDefaultFilters(final ItemManager itemManager) { @@ -45,6 +51,10 @@ public class CardManager extends ItemManager { return new CardSearchFilter(itemManager); } + public static AdvancedSearchFilter createAdvancedSearchFilter(final ItemManager itemManager) { + return new AdvancedSearchFilter(itemManager); + } + @Override public ItemRenderer getListItemRenderer(final CompactModeHandler compactModeHandler) { return new ItemRenderer() { diff --git a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java index 2e7d2d752bd..f0845d0de12 100644 --- a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java @@ -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 implements IHasGam return new DeckSearchFilter(this); } + @Override + protected AdvancedSearchFilter createAdvancedSearchFilter() { + return new AdvancedSearchFilter(this); + } + @Override protected boolean allowSortChange() { return false; diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index 67602fe6f9c..c986c10aaa9 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -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 extends FContainer im private ItemPool pool; protected final ItemManagerModel model; private Predicate filterPredicate = null; + private AdvancedSearchFilter advancedSearchFilter; private final List> filters = new ArrayList>(); private boolean hideFilters = false; private boolean wantUnique = false; @@ -72,10 +76,13 @@ public abstract class ItemManager extends FContainer im private final TextSearchFilter 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 cbxSortOptions; @@ -107,18 +114,12 @@ public abstract class ItemManager 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 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 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 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 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 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 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 extends FContainer im protected abstract void addDefaultFilters(); protected abstract TextSearchFilter createSearchFilter(); + protected abstract AdvancedSearchFilter createAdvancedSearchFilter(); public void addFilter(final ItemFilter filter) { addFilter(-1, filter); @@ -779,6 +829,20 @@ public abstract class ItemManager extends FContainer im applyFilters(); } + public void resetFilters() { + lockFiltering = true; //prevent updating filtering from this change until all filters reset + for (final ItemFilter filter : filters) { + filter.reset(); + } + searchFilter.reset(); + if (advancedSearchFilter != null) { + advancedSearchFilter.reset(); + } + lockFiltering = false; + + applyFilters(); + } + public void removeFilter(ItemFilter filter) { filters.remove(filter); remove(filter.getWidget()); @@ -1103,7 +1167,10 @@ public abstract class ItemManager extends FContainer im showMenu(true); } - public FComboBox getSortOptions() { - return cbxSortOptions; + public float getPileByWidth() { + if (cbxSortOptions != null) { + return cbxSortOptions.getWidth(); + } + return filters.get(filters.size() - 1).getWidget().getWidth(); } } diff --git a/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java b/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java index 0df164de6c6..b2e50953e5a 100644 --- a/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java @@ -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 { return CardManager.createSearchFilter(this); } + @Override + protected AdvancedSearchFilter createAdvancedSearchFilter() { + return CardManager.createAdvancedSearchFilter(this); + } + @Override public ItemRenderer getListItemRenderer(final CompactModeHandler compactModeHandler) { return new ItemRenderer() { diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/CardAdvancedFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java similarity index 86% rename from forge-gui-mobile/src/forge/itemmanager/filters/CardAdvancedFilter.java rename to forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java index 293fd9e8bb4..8c26234b99b 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/CardAdvancedFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -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 { +public class AdvancedSearchFilter extends ItemFilter { private final List expression = new ArrayList(); private FiltersLabel label; - private FLabel btnEdit; private boolean isAdded; private EditScreen editScreen; - public CardAdvancedFilter(ItemManager itemManager0) { + public AdvancedSearchFilter(ItemManager itemManager0) { super(itemManager0); } @Override - public ItemFilter createCopy() { - CardAdvancedFilter copy = new CardAdvancedFilter(itemManager); + public ItemFilter createCopy() { + AdvancedSearchFilter copy = new AdvancedSearchFilter(itemManager); return copy; } @Override - protected final Predicate buildPredicate() { + protected final Predicate buildPredicate() { if (expression.isEmpty()) { return Predicates.alwaysTrue(); } @@ -65,9 +63,9 @@ public class CardAdvancedFilter extends ItemFilter { } @SuppressWarnings("unchecked") - private Predicate getPredicatePiece(ExpressionIterator iterator) { - Predicate pred = null; - Predicate predPiece = null; + private Predicate getPredicatePiece(ExpressionIterator iterator) { + Predicate pred = null; + Predicate predPiece = null; Operator operator = null; boolean applyNot = false; @@ -92,7 +90,7 @@ public class CardAdvancedFilter extends ItemFilter { continue; } else { - predPiece = ((ItemFilter) piece).buildPredicate(); + predPiece = ((ItemFilter) piece).buildPredicate(); } if (applyNot) { predPiece = Predicates.not(predPiece); @@ -168,22 +166,11 @@ public class CardAdvancedFilter extends ItemFilter { 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 { diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index 9d764a34f35..d45ff9861b2 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -388,7 +388,7 @@ public class ImageView extends ItemView { 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 extends ItemView { } @Override - protected FImage getIcon() { + public FImage getIcon() { if (itemManager.getGenericType().equals(DeckProxy.class)) { return FSkinImage.PACK; } @@ -662,7 +662,7 @@ public class ImageView extends ItemView { } @Override - protected String getCaption() { + public String getCaption() { return "Image View"; } diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java index 0d4869745ec..64626e4159e 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java @@ -71,12 +71,12 @@ public final class ItemListView extends ItemView { } @Override - protected FImage getIcon() { + public FImage getIcon() { return FSkinImage.LIST; } @Override - protected String getCaption() { + public String getCaption() { return "List View"; } diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java index 51f4eaacba6..f3819758c68 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java @@ -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 { @@ -33,7 +30,6 @@ public abstract class ItemView { 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 { protected ItemView(ItemManager itemManager0, ItemManagerModel 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 { } } - 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 { 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 indices); }