mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
Simplify filters for ItemManager
This commit is contained in:
@@ -681,11 +681,6 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
||||
}
|
||||
protected CatalogPage(ItemManagerConfig config, String caption0, FImage icon0) {
|
||||
super(config, caption0, icon0);
|
||||
|
||||
if (config == ItemManagerConfig.PLANAR_POOL || config == ItemManagerConfig.SCHEME_POOL) {
|
||||
//prevent showing image view options for planar and scheme pools by default
|
||||
cardManager.setHideViewOptions(1, true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -834,25 +829,21 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
||||
captionPrefix = "Commander";
|
||||
cardManager.setCaption("Commander");
|
||||
icon = FSkinImage.PLANESWALKER;
|
||||
cardManager.setHideViewOptions(1, true); //image view options not needed
|
||||
break;
|
||||
case Avatar:
|
||||
captionPrefix = "Avatar";
|
||||
cardManager.setCaption("Avatar");
|
||||
icon = new FTextureRegionImage(FSkin.getAvatars().get(0));
|
||||
cardManager.setHideViewOptions(1, true); //image view options not needed
|
||||
break;
|
||||
case Planes:
|
||||
captionPrefix = "Planes";
|
||||
cardManager.setCaption("Planes");
|
||||
icon = FSkinImage.CHAOS;
|
||||
cardManager.setHideViewOptions(1, true); //image view options not needed
|
||||
break;
|
||||
case Schemes:
|
||||
captionPrefix = "Schemes";
|
||||
cardManager.setCaption("Schemes");
|
||||
icon = FSkinImage.POISON;
|
||||
cardManager.setHideViewOptions(1, true); //image view options not needed
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -905,6 +896,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
||||
@Override
|
||||
protected void buildMenu(final FDropDownMenu menu, final PaperCard card) {
|
||||
switch (deckSection) {
|
||||
default:
|
||||
case Main:
|
||||
addItem(menu, "Add", null, FSkinImage.PLUS, true, false, new Callback<Integer>() {
|
||||
@Override
|
||||
@@ -1057,8 +1049,6 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
||||
protected DraftPackPage() {
|
||||
super(ItemManagerConfig.DRAFT_PACK, "Pack 1", FSkinImage.PACK);
|
||||
|
||||
//hide filters and options panel so more of pack is visible by default
|
||||
cardManager.setHideViewOptions(1, true);
|
||||
cardManager.setAlwaysNonUnique(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +58,6 @@ public class FVanguardChooser extends FScreen {
|
||||
}
|
||||
});
|
||||
lstVanguards.setup(ItemManagerConfig.VANGUARDS);
|
||||
lstVanguards.setHideViewOptions(1, true);
|
||||
lstVanguards.setPool(isAi ? allAiAvatars : allHumanAvatars, true);
|
||||
lstVanguards.setSelectionChangedHandler(selectionChangedHandler);
|
||||
selectRandom();
|
||||
|
||||
@@ -18,7 +18,7 @@ import forge.itemmanager.filters.CardSearchFilter;
|
||||
import forge.itemmanager.filters.CardSetFilter;
|
||||
import forge.itemmanager.filters.CardToughnessFilter;
|
||||
import forge.itemmanager.filters.CardTypeFilter;
|
||||
import forge.itemmanager.filters.ItemFilter;
|
||||
import forge.itemmanager.filters.TextSearchFilter;
|
||||
import forge.menu.FMenuItem;
|
||||
import forge.menu.FPopupMenu;
|
||||
import forge.menu.FSubMenu;
|
||||
@@ -41,7 +41,7 @@ public class CardManager extends ItemManager<PaperCard> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ItemFilter<PaperCard> createSearchFilter() {
|
||||
protected TextSearchFilter<PaperCard> createSearchFilter() {
|
||||
return createSearchFilter(this);
|
||||
}
|
||||
|
||||
@@ -55,10 +55,9 @@ public class CardManager extends ItemManager<PaperCard> {
|
||||
public static void addDefaultFilters(final ItemManager<? super PaperCard> itemManager) {
|
||||
itemManager.addFilter(new CardColorFilter(itemManager));
|
||||
itemManager.addFilter(new CardTypeFilter(itemManager));
|
||||
itemManager.addFilter(new CardCMCFilter(itemManager));
|
||||
}
|
||||
|
||||
public static ItemFilter<PaperCard> createSearchFilter(final ItemManager<? super PaperCard> itemManager) {
|
||||
public static TextSearchFilter<PaperCard> createSearchFilter(final ItemManager<? super PaperCard> itemManager) {
|
||||
return new CardSearchFilter(itemManager);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import forge.itemmanager.filters.DeckFolderFilter;
|
||||
import forge.itemmanager.filters.DeckFormatFilter;
|
||||
import forge.itemmanager.filters.DeckSearchFilter;
|
||||
import forge.itemmanager.filters.DeckSetFilter;
|
||||
import forge.itemmanager.filters.ItemFilter;
|
||||
import forge.itemmanager.filters.TextSearchFilter;
|
||||
import forge.menu.FMenuItem;
|
||||
import forge.menu.FPopupMenu;
|
||||
import forge.menu.FSubMenu;
|
||||
@@ -94,7 +94,7 @@ public final class DeckManager extends ItemManager<DeckProxy> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ItemFilter<DeckProxy> createSearchFilter() {
|
||||
protected TextSearchFilter<DeckProxy> createSearchFilter() {
|
||||
return new DeckSearchFilter(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,13 +30,12 @@ import forge.assets.FSkinFont;
|
||||
import forge.assets.FSkinImage;
|
||||
import forge.item.InventoryItem;
|
||||
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.menu.FSubMenu;
|
||||
import forge.model.FModel;
|
||||
import forge.screens.FScreen;
|
||||
import forge.toolbox.FContainer;
|
||||
@@ -69,23 +68,12 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
private ContextMenu contextMenu;
|
||||
private final Class<T> genericType;
|
||||
private ItemManagerConfig config;
|
||||
private String caption = "Items";
|
||||
private String ratio = "(0 / 0)";
|
||||
private boolean hasNewColumn;
|
||||
|
||||
private final ItemFilter<? extends T> mainSearchFilter;
|
||||
|
||||
private final FLabel btnFilters = new FLabel.ButtonBuilder()
|
||||
.text("Filters")
|
||||
.build();
|
||||
|
||||
private final FLabel lblCaption = new FLabel.Builder()
|
||||
.align(HAlignment.LEFT)
|
||||
.font(FSkinFont.get(12))
|
||||
.build();
|
||||
private final TextSearchFilter<? extends T> mainSearchFilter;
|
||||
|
||||
private static final FSkinImage VIEW_OPTIONS_ICON = FSkinImage.SETTINGS;
|
||||
private final FLabel btnViewOptions = new FLabel.Builder()
|
||||
private final FLabel btnAdvancedSearchOptions = new FLabel.Builder()
|
||||
.selectable(true).align(HAlignment.CENTER)
|
||||
.icon(VIEW_OPTIONS_ICON).iconScaleFactor(0.9f)
|
||||
.build();
|
||||
@@ -125,81 +113,19 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
|
||||
//build display
|
||||
add(mainSearchFilter.getPanel());
|
||||
add(btnFilters);
|
||||
add(lblCaption);
|
||||
for (ItemView<T> view : views) {
|
||||
add(view.getButton());
|
||||
view.getButton().setSelected(view == currentView);
|
||||
}
|
||||
add(btnViewOptions);
|
||||
btnViewOptions.setSelected(currentView.getPnlOptions().isVisible());
|
||||
add(btnAdvancedSearchOptions);
|
||||
btnAdvancedSearchOptions.setSelected(!hideFilters);
|
||||
add(currentView.getPnlOptions());
|
||||
add(currentView.getScroller());
|
||||
|
||||
final FEventHandler cmdAddCurrentSearch = new FEventHandler() {
|
||||
btnAdvancedSearchOptions.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
ItemFilter<? extends T> searchFilter = mainSearchFilter.createCopy();
|
||||
if (searchFilter != null) {
|
||||
lockFiltering = true; //prevent updating filtering from this change
|
||||
addFilter(searchFilter);
|
||||
mainSearchFilter.reset();
|
||||
lockFiltering = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
final FEventHandler cmdResetFilters = new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
resetFilters();
|
||||
}
|
||||
};
|
||||
final FEventHandler cmdHideFilters = new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
setHideFilters(!getHideFilters());
|
||||
}
|
||||
};
|
||||
final FSubMenu addMenu = new FSubMenu("Add", new FPopupMenu() {
|
||||
@Override
|
||||
protected void buildMenu() {
|
||||
FMenuItem currentTextSearch = new FMenuItem("Current text search", cmdAddCurrentSearch);
|
||||
currentTextSearch.setEnabled(!mainSearchFilter.isEmpty());
|
||||
addItem(currentTextSearch);
|
||||
|
||||
if (config != ItemManagerConfig.STRING_ONLY) {
|
||||
buildAddFilterMenu(this);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//setup command for btnFilters
|
||||
btnFilters.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
FPopupMenu menu = new FPopupMenu() {
|
||||
@Override
|
||||
protected void buildMenu() {
|
||||
if (hideFilters) {
|
||||
addItem(new FMenuItem("Show Filters", cmdHideFilters));
|
||||
}
|
||||
else {
|
||||
addItem(addMenu);
|
||||
addItem(new FMenuItem("Reset Filters", cmdResetFilters));
|
||||
addItem(new FMenuItem("Hide Filters", cmdHideFilters));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
menu.show(btnFilters, 0, btnFilters.getHeight());
|
||||
}
|
||||
});
|
||||
|
||||
btnViewOptions.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
currentView.getPnlOptions().setVisible(!currentView.getPnlOptions().isVisible());
|
||||
revalidate();
|
||||
setHideFilters(!hideFilters);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -272,7 +198,6 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
|
||||
currentView = view;
|
||||
|
||||
btnViewOptions.setSelected(view.getPnlOptions().isVisible());
|
||||
view.getButton().setSelected(true);
|
||||
view.refresh(itemsToSelect, backupIndexToSelect, 0);
|
||||
|
||||
@@ -281,40 +206,31 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
revalidate();
|
||||
}
|
||||
|
||||
public void setHideViewOptions(int viewIndex, boolean hideViewOptions) {
|
||||
if (viewIndex < 0 || viewIndex >= views.size()) { return; }
|
||||
ItemView<T> view = views.get(viewIndex);
|
||||
view.getPnlOptions().setVisible(!hideViewOptions);
|
||||
if (currentView == view) {
|
||||
btnViewOptions.setSelected(!hideViewOptions);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doLayout(float width, float height) {
|
||||
LayoutHelper helper = new LayoutHelper(this, ItemFilter.PADDING, 0);
|
||||
float fieldHeight = mainSearchFilter.getMainComponent().getHeight();
|
||||
float viewButtonWidth = fieldHeight;
|
||||
float viewButtonCount = views.size() + 1;
|
||||
helper.fillLine(mainSearchFilter.getPanel(), ItemFilter.PANEL_HEIGHT, (viewButtonWidth + helper.getGapX()) * viewButtonCount); //leave room for view buttons
|
||||
helper.offset(0, ItemFilter.PANEL_HEIGHT - fieldHeight);
|
||||
for (ItemView<T> view : views) {
|
||||
helper.include(view.getButton(), viewButtonWidth, fieldHeight);
|
||||
}
|
||||
helper.include(btnAdvancedSearchOptions, viewButtonWidth, fieldHeight);
|
||||
if (!hideFilters) {
|
||||
for (ItemFilter<? extends T> filter : orderedFilters) {
|
||||
helper.fillLine(filter.getPanel(), ItemFilter.PANEL_HEIGHT);
|
||||
helper.newLine();
|
||||
}
|
||||
helper.fillLine(mainSearchFilter.getPanel(), ItemFilter.PANEL_HEIGHT);
|
||||
if (currentView.getPnlOptions().getChildCount() > 0) {
|
||||
helper.fillLine(currentView.getPnlOptions(), ItemFilter.PANEL_HEIGHT);
|
||||
}
|
||||
else {
|
||||
helper.offset(0, -ItemFilter.PANEL_HEIGHT); //prevent showing whitespace for empty view options panel
|
||||
}
|
||||
}
|
||||
helper.newLine(ItemFilter.PADDING);
|
||||
float fieldHeight = mainSearchFilter.getMainComponent().getHeight();
|
||||
helper.include(btnFilters, btnFilters.getAutoSizeBounds().width * 1.2f, fieldHeight);
|
||||
float viewButtonWidth = fieldHeight;
|
||||
float viewButtonCount = views.size() + 1;
|
||||
helper.fillLine(lblCaption, fieldHeight, (viewButtonWidth + helper.getGapX()) * viewButtonCount); //leave room for view buttons
|
||||
for (ItemView<T> view : views) {
|
||||
helper.include(view.getButton(), viewButtonWidth, fieldHeight);
|
||||
}
|
||||
helper.include(btnViewOptions, viewButtonWidth, fieldHeight);
|
||||
helper.newLine(Utils.scaleY(2));
|
||||
if (currentView.getPnlOptions().isVisible()) {
|
||||
helper.fillLine(currentView.getPnlOptions(), fieldHeight + Utils.scaleY(4));
|
||||
helper.newLine(Utils.scaleY(3));
|
||||
}
|
||||
helper.fill(currentView.getScroller());
|
||||
}
|
||||
|
||||
@@ -335,7 +251,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
* @return caption to display before ratio
|
||||
*/
|
||||
public String getCaption() {
|
||||
return caption;
|
||||
return mainSearchFilter.getCaption();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -345,12 +261,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
* @param caption - caption to display before ratio
|
||||
*/
|
||||
public void setCaption(String caption0) {
|
||||
caption = caption0;
|
||||
updateCaptionLabel();
|
||||
}
|
||||
|
||||
private void updateCaptionLabel() {
|
||||
lblCaption.setText(caption + " " + ratio);
|
||||
mainSearchFilter.setCaption(caption0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -704,7 +615,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
}
|
||||
|
||||
protected abstract void addDefaultFilters();
|
||||
protected abstract ItemFilter<? extends T> createSearchFilter();
|
||||
protected abstract TextSearchFilter<? extends T> createSearchFilter();
|
||||
protected abstract void buildAddFilterMenu(FPopupMenu menu);
|
||||
|
||||
protected <F extends ItemFilter<? extends T>> F getFilter(Class<F> filterClass) {
|
||||
@@ -745,14 +656,8 @@ 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) {
|
||||
if (lockFiltering) {
|
||||
filter.afterFiltersApplied(); //ensure this called even if filters currently locked
|
||||
return;
|
||||
}
|
||||
|
||||
if (!applyFilters()) {
|
||||
filter.afterFiltersApplied(); //ensure this called even if filters didn't need to be updated
|
||||
}
|
||||
if (lockFiltering) { return; }
|
||||
applyFilters();
|
||||
}
|
||||
|
||||
public void restoreDefaultFilters() {
|
||||
@@ -839,17 +744,14 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
for (ItemFilter<? extends T> filter : orderedFilters) {
|
||||
filter.getPanel().setVisible(visible);
|
||||
}
|
||||
mainSearchFilter.getPanel().setVisible(visible);
|
||||
for (ItemView<T> view : views) {
|
||||
view.getPnlOptions().setVisible(visible);
|
||||
}
|
||||
|
||||
if (initialized) {
|
||||
btnAdvancedSearchOptions.setSelected(visible);
|
||||
|
||||
revalidate();
|
||||
|
||||
if (hideFilters0) {
|
||||
resetFilters(); //reset filters when they're hidden
|
||||
}
|
||||
else {
|
||||
applyFilters();
|
||||
}
|
||||
|
||||
if (config != null) {
|
||||
config.setHideFilters(hideFilters0);
|
||||
@@ -857,21 +759,6 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* resetFilters.
|
||||
*
|
||||
*/
|
||||
public void resetFilters() {
|
||||
lockFiltering = true; //prevent updating filtering from this change until all filters reset
|
||||
for (ItemFilter<? extends T> filter : orderedFilters) {
|
||||
filter.reset();
|
||||
}
|
||||
mainSearchFilter.reset();
|
||||
lockFiltering = false;
|
||||
applyFilters();
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh displayed items
|
||||
*/
|
||||
@@ -911,10 +798,6 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
|
||||
currentView.refresh(itemsToSelect, getSelectedIndex(), forceFilter ? 0 : currentView.getScrollValue());
|
||||
|
||||
for (ItemFilter<? extends T> filter : orderedFilters) {
|
||||
filter.afterFiltersApplied();
|
||||
}
|
||||
|
||||
//update ratio of # in filtered pool / # in total pool
|
||||
int total;
|
||||
if (!useFilter) {
|
||||
@@ -930,8 +813,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
else {
|
||||
total = pool.countAll();
|
||||
}
|
||||
ratio = "(" + getFilteredItems().countAll() + " / " + total + ")";
|
||||
updateCaptionLabel();
|
||||
mainSearchFilter.setRatio("(" + getFilteredItems().countAll() + " / " + total + ")");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -15,7 +15,7 @@ import forge.card.CardRenderer;
|
||||
import forge.card.CardZoom;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
import forge.itemmanager.filters.ItemFilter;
|
||||
import forge.itemmanager.filters.TextSearchFilter;
|
||||
import forge.menu.FPopupMenu;
|
||||
import forge.quest.QuestSpellShop;
|
||||
import forge.toolbox.FList;
|
||||
@@ -39,7 +39,7 @@ public final class SpellShopManager extends ItemManager<InventoryItem> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ItemFilter<? extends InventoryItem> createSearchFilter() {
|
||||
protected TextSearchFilter<? extends InventoryItem> createSearchFilter() {
|
||||
return CardManager.createSearchFilter(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,23 +1,14 @@
|
||||
package forge.itemmanager.filters;
|
||||
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
||||
import com.google.common.base.Predicate;
|
||||
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.SFilterUtil;
|
||||
import forge.toolbox.FComboBox;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.util.LayoutHelper;
|
||||
|
||||
|
||||
public class CardSearchFilter extends TextSearchFilter<PaperCard> {
|
||||
private FComboBox<String> cbSearchMode;
|
||||
private FLabel btnName, btnType, btnText;
|
||||
|
||||
public CardSearchFilter(ItemManager<? super PaperCard> itemManager0) {
|
||||
super(itemManager0);
|
||||
}
|
||||
@@ -27,88 +18,23 @@ public class CardSearchFilter extends TextSearchFilter<PaperCard> {
|
||||
CardSearchFilter copy = new CardSearchFilter(itemManager);
|
||||
copy.getWidget(); //initialize widget
|
||||
copy.txtSearch.setText(txtSearch.getText());
|
||||
copy.cbSearchMode.setSelectedIndex(cbSearchMode.getSelectedIndex());
|
||||
copy.btnName.setSelected(btnName.isSelected());
|
||||
copy.btnType.setSelected(btnType.isSelected());
|
||||
copy.btnText.setSelected(btnText.isSelected());
|
||||
return copy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
super.reset();
|
||||
cbSearchMode.setSelectedIndex(0);
|
||||
btnName.setSelected(true);
|
||||
btnType.setSelected(true);
|
||||
btnText.setSelected(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final void buildWidget(Widget widget) {
|
||||
super.buildWidget(widget);
|
||||
|
||||
cbSearchMode = new FComboBox<String>();
|
||||
cbSearchMode.setFont(txtSearch.getFont());
|
||||
cbSearchMode.addItem("in");
|
||||
cbSearchMode.addItem("not in");
|
||||
cbSearchMode.setChangedHandler(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
if (!txtSearch.isEmpty()) {
|
||||
applyChange();
|
||||
}
|
||||
}
|
||||
});
|
||||
widget.add(cbSearchMode);
|
||||
|
||||
btnName = addButton(widget, "Name");
|
||||
btnType = addButton(widget, "Type");
|
||||
btnText = addButton(widget, "Text");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doWidgetLayout(LayoutHelper helper) {
|
||||
final float buttonWidth = Math.max(Math.max(btnName.getAutoSizeBounds().width, btnType.getAutoSizeBounds().width), btnText.getAutoSizeBounds().width);
|
||||
final float height = helper.getParentHeight();
|
||||
|
||||
helper.fillLine(txtSearch, height, (buttonWidth + helper.getGapX()) * 4); //leave space for combo box and buttons
|
||||
helper.include(cbSearchMode, buttonWidth, height); //use button width for combo box too
|
||||
helper.include(btnName, buttonWidth, height);
|
||||
helper.include(btnType, buttonWidth, height);
|
||||
helper.include(btnText, buttonWidth, height);
|
||||
}
|
||||
|
||||
private FLabel addButton(Widget widget, String text) {
|
||||
FLabel button = new FLabel.Builder().text(text).font(txtSearch.getFont()).align(HAlignment.CENTER)
|
||||
.selectable().selected().command(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
applyChange();
|
||||
}
|
||||
})
|
||||
.build();
|
||||
widget.add(button);
|
||||
return button;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Predicate<PaperCard> buildPredicate() {
|
||||
return SFilterUtil.buildTextFilter(
|
||||
txtSearch.getText(),
|
||||
cbSearchMode.getSelectedIndex() != 0,
|
||||
btnName.isSelected(),
|
||||
btnType.isSelected(),
|
||||
btnText.isSelected(),
|
||||
false,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
false); //TODO: Support enabling searching in cost
|
||||
}
|
||||
|
||||
@Override
|
||||
protected <U extends InventoryItem> boolean showUnsupportedItem(U item) {
|
||||
//fallback to regular item text filter if item not PaperCard
|
||||
boolean result = btnName.isSelected() && SFilterUtil.buildItemTextFilter(txtSearch.getText()).apply(item);
|
||||
if (cbSearchMode.getSelectedIndex() != 0) { //invert result if needed
|
||||
result = !result;
|
||||
}
|
||||
return result;
|
||||
return SFilterUtil.buildItemTextFilter(txtSearch.getText()).apply(item);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ import forge.deck.DeckProxy;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.SFilterUtil;
|
||||
import forge.itemmanager.SItemManagerUtil.StatTypes;
|
||||
import forge.util.ItemPool;
|
||||
|
||||
|
||||
public class DeckColorFilter extends StatTypeFilter<DeckProxy> {
|
||||
@@ -34,19 +33,4 @@ public class DeckColorFilter extends StatTypeFilter<DeckProxy> {
|
||||
protected final Predicate<DeckProxy> buildPredicate() {
|
||||
return SFilterUtil.buildDeckColorFilter(buttonMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterFiltersApplied() {
|
||||
final ItemPool<? super DeckProxy> items = itemManager.getFilteredItems();
|
||||
|
||||
buttonMap.get(StatTypes.DECK_WHITE).setText(String.valueOf(items.countAll(DeckProxy.IS_WHITE, DeckProxy.class)));
|
||||
buttonMap.get(StatTypes.DECK_BLUE).setText(String.valueOf(items.countAll(DeckProxy.IS_BLUE, DeckProxy.class)));
|
||||
buttonMap.get(StatTypes.DECK_BLACK).setText(String.valueOf(items.countAll(DeckProxy.IS_BLACK, DeckProxy.class)));
|
||||
buttonMap.get(StatTypes.DECK_RED).setText(String.valueOf(items.countAll(DeckProxy.IS_RED, DeckProxy.class)));
|
||||
buttonMap.get(StatTypes.DECK_GREEN).setText(String.valueOf(items.countAll(DeckProxy.IS_GREEN, DeckProxy.class)));
|
||||
buttonMap.get(StatTypes.DECK_COLORLESS).setText(String.valueOf(items.countAll(DeckProxy.IS_COLORLESS, DeckProxy.class)));
|
||||
buttonMap.get(StatTypes.DECK_MULTICOLOR).setText(String.valueOf(items.countAll(DeckProxy.IS_MULTICOLOR, DeckProxy.class)));
|
||||
|
||||
getWidget().revalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,8 @@
|
||||
package forge.itemmanager.filters;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
|
||||
import forge.deck.DeckProxy;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.SItemManagerUtil;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.util.ItemPool;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class DeckStatTypeFilter extends StatTypeFilter<DeckProxy> {
|
||||
public DeckStatTypeFilter(ItemManager<? super DeckProxy> itemManager0) {
|
||||
@@ -21,17 +13,4 @@ public abstract class DeckStatTypeFilter extends StatTypeFilter<DeckProxy> {
|
||||
protected <U extends InventoryItem> boolean showUnsupportedItem(U item) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterFiltersApplied() {
|
||||
final ItemPool<? super DeckProxy> items = itemManager.getFilteredItems();
|
||||
|
||||
for (Map.Entry<SItemManagerUtil.StatTypes, FLabel> btn : buttonMap.entrySet()) {
|
||||
if (btn.getKey().predicate != null) {
|
||||
int count = items.countAll(DeckProxy.createPredicate(Predicates.compose(btn.getKey().predicate, PaperCard.FN_GET_RULES)), DeckProxy.class);
|
||||
btn.getValue().setText(String.valueOf(count));
|
||||
}
|
||||
}
|
||||
getWidget().revalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,8 +78,6 @@ public abstract class ItemFilter<T extends InventoryItem> {
|
||||
public abstract ItemFilter<T> createCopy();
|
||||
public abstract boolean isEmpty();
|
||||
public abstract void reset();
|
||||
public void afterFiltersApplied() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge the given filter with this filter if possible
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
package forge.itemmanager.filters;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
|
||||
import forge.assets.FSkin;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.ItemPredicate;
|
||||
import forge.item.PaperCard;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.SFilterUtil;
|
||||
import forge.itemmanager.SItemManagerUtil;
|
||||
@@ -13,8 +10,6 @@ import forge.itemmanager.SItemManagerUtil.StatTypes;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.util.ItemPool;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -50,23 +45,4 @@ public abstract class StatTypeFilter<T extends InventoryItem> extends ToggleButt
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterFiltersApplied() {
|
||||
final ItemPool<? super T> items = itemManager.getFilteredItems();
|
||||
|
||||
FLabel btnPackOrDeck = buttonMap.get(StatTypes.PACK_OR_DECK);
|
||||
if (btnPackOrDeck != null) { //support special pack/deck case
|
||||
int count = items.countAll(ItemPredicate.Presets.IS_PACK_OR_DECK, InventoryItem.class);
|
||||
btnPackOrDeck.setText(String.valueOf(count));
|
||||
}
|
||||
|
||||
for (Map.Entry<SItemManagerUtil.StatTypes, FLabel> btn : buttonMap.entrySet()) {
|
||||
if (btn.getKey().predicate != null) {
|
||||
int count = items.countAll(Predicates.compose(btn.getKey().predicate, PaperCard.FN_GET_RULES), PaperCard.class);
|
||||
btn.getValue().setText(String.valueOf(count));
|
||||
}
|
||||
}
|
||||
getWidget().revalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package forge.itemmanager.filters;
|
||||
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Predicates;
|
||||
|
||||
import forge.Graphics;
|
||||
import forge.assets.FSkinFont;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.itemmanager.ItemManager;
|
||||
@@ -16,7 +18,7 @@ import forge.util.LayoutHelper;
|
||||
|
||||
public class TextSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
|
||||
private static final FSkinFont FONT = FSkinFont.get(12);
|
||||
protected FTextField txtSearch;
|
||||
protected SearchField txtSearch;
|
||||
|
||||
public TextSearchFilter(ItemManager<? super T> itemManager0) {
|
||||
super(itemManager0);
|
||||
@@ -57,9 +59,7 @@ public class TextSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
|
||||
|
||||
@Override
|
||||
protected void buildWidget(Widget widget) {
|
||||
txtSearch = new FTextField();
|
||||
txtSearch.setFont(FONT);
|
||||
txtSearch.setGhostText("Search");
|
||||
txtSearch = new SearchField();
|
||||
widget.add(txtSearch);
|
||||
|
||||
txtSearch.setChangedHandler(new FEventHandler() {
|
||||
@@ -83,4 +83,38 @@ public class TextSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
|
||||
}
|
||||
return SFilterUtil.buildItemTextFilter(text);
|
||||
}
|
||||
|
||||
public void setRatio(String ratio0) {
|
||||
txtSearch.ratio = ratio0;
|
||||
txtSearch.ratioWidth = txtSearch.getFont().getBounds(ratio0).width;
|
||||
}
|
||||
|
||||
public String getCaption() {
|
||||
return txtSearch.getGhostText().substring("Search ".length());
|
||||
}
|
||||
public void setCaption(String caption0) {
|
||||
txtSearch.setGhostText("Search " + caption0);
|
||||
}
|
||||
|
||||
protected class SearchField extends FTextField {
|
||||
private String ratio = "(0 / 0)";
|
||||
private float ratioWidth;
|
||||
|
||||
private SearchField() {
|
||||
setFont(FONT);
|
||||
setGhostText("Search");
|
||||
setHeight(getDefaultHeight(DEFAULT_FONT)); //set height based on default filter font
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getRightPadding() {
|
||||
return ratioWidth + 2 * PADDING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Graphics g) {
|
||||
super.draw(g);
|
||||
g.drawText(ratio, renderedFont, GHOST_TEXT_COLOR, 0, 0, getWidth() - PADDING, getHeight(), false, HAlignment.RIGHT, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,7 +385,7 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
|
||||
float padding = ItemFilter.PADDING;
|
||||
float x = 0;
|
||||
float h = FTextField.getDefaultHeight(ItemFilter.DEFAULT_FONT);
|
||||
float y = (height - h) / 2;
|
||||
float y = padding;
|
||||
btnExpandCollapseAll.setBounds(x, y, h, h);
|
||||
x += h + padding;
|
||||
lblGroupBy.setBounds(x, y, lblGroupBy.getAutoSizeBounds().width, h);
|
||||
|
||||
@@ -32,12 +32,8 @@ import forge.itemmanager.ItemManagerConfig;
|
||||
import forge.itemmanager.ItemManagerModel;
|
||||
import forge.toolbox.FCheckBox;
|
||||
import forge.toolbox.FDisplayObject;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.toolbox.FList;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.badlogic.gdx.math.Rectangle;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
|
||||
@@ -90,67 +86,12 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
});
|
||||
|
||||
getPnlOptions().clear();
|
||||
|
||||
if (config.getShowUniqueCardsOption()) {
|
||||
final FCheckBox chkBox = new FCheckBox("Unique Cards Only", itemManager.getWantUnique());
|
||||
chkBox.setFont(list.getFont());
|
||||
chkBox.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
boolean wantUnique = chkBox.isSelected();
|
||||
if (itemManager.getWantUnique() == wantUnique) { return; }
|
||||
itemManager.setWantUnique(wantUnique);
|
||||
itemManager.refresh();
|
||||
|
||||
if (itemManager.getConfig() != null) {
|
||||
itemManager.setWantUnique(wantUnique);
|
||||
}
|
||||
}
|
||||
});
|
||||
getPnlOptions().add(chkBox);
|
||||
}
|
||||
|
||||
list.cols.clear();
|
||||
|
||||
int modelIndex = 0;
|
||||
for (final ItemColumn col : cols) {
|
||||
col.setIndex(modelIndex++);
|
||||
if (col.isVisible()) { list.cols.add(col); }
|
||||
|
||||
final FCheckBox chkBox = new FCheckBox(StringUtils.isEmpty(col.getShortName()) ?
|
||||
col.getLongName() : col.getShortName(), col.isVisible());
|
||||
chkBox.setFont(list.getFont());
|
||||
chkBox.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
boolean visible = chkBox.isSelected();
|
||||
if (col.isVisible() == visible) { return; }
|
||||
col.setVisible(visible);
|
||||
|
||||
if (col.isVisible()) {
|
||||
list.cols.add(col);
|
||||
|
||||
//move col into proper position
|
||||
int oldIndex = list.getCellCount() - 1;
|
||||
int newIndex = col.getIndex();
|
||||
for (int i = 0; i < col.getIndex(); i++) {
|
||||
if (!cols.get(i).isVisible()) {
|
||||
newIndex--;
|
||||
}
|
||||
}
|
||||
if (newIndex < oldIndex) {
|
||||
list.cols.remove(oldIndex);
|
||||
list.cols.add(newIndex, col);
|
||||
}
|
||||
}
|
||||
else {
|
||||
list.cols.remove(col);
|
||||
}
|
||||
ItemManagerConfig.save();
|
||||
}
|
||||
});
|
||||
getPnlOptions().add(chkBox);
|
||||
}
|
||||
|
||||
listModel.setup();
|
||||
|
||||
Reference in New Issue
Block a user