Simplify filters for ItemManager

This commit is contained in:
drdev
2014-07-22 04:40:21 +00:00
parent 2997e38fd7
commit d65c83bee4
14 changed files with 85 additions and 377 deletions

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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 + ")");
}
/**

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);

View File

@@ -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();