Support specifying sort for mobile game

This commit is contained in:
drdev
2014-07-25 06:11:12 +00:00
parent 0d46e58dbc
commit 2d9c4f36bf
4 changed files with 94 additions and 57 deletions

View File

@@ -70,6 +70,11 @@ public final class DeckManager extends ItemManager<DeckProxy> {
return new DeckSearchFilter(this);
}
@Override
protected boolean allowSortChange() {
return false;
}
private static final float IMAGE_SIZE = CardRenderer.MANA_SYMBOL_SIZE;
@Override

View File

@@ -37,6 +37,7 @@ import forge.itemmanager.views.ItemView;
import forge.menu.FDropDownMenu;
import forge.model.FModel;
import forge.screens.FScreen;
import forge.toolbox.FComboBox;
import forge.toolbox.FContainer;
import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler;
@@ -64,6 +65,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
private final Class<T> genericType;
private ItemManagerConfig config;
private boolean hasNewColumn;
private List<ItemColumn> sortCols = new ArrayList<ItemColumn>();
private final TextSearchFilter<? extends T> searchFilter;
@@ -73,6 +75,9 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
.icon(VIEW_OPTIONS_ICON).iconScaleFactor(0.9f)
.build();
private final FLabel lblSort;
private final FComboBox<ItemColumn> cbxSortOptions;
private final List<ItemView<T>> views = new ArrayList<ItemView<T>>();
private final ItemListView<T> listView;
private final ImageView<T> imageView;
@@ -114,6 +119,16 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
}
add(btnAdvancedSearchOptions);
btnAdvancedSearchOptions.setSelected(!hideFilters);
if (allowSortChange()) {
lblSort = add(new FLabel.Builder().text("Sort:").font(FSkinFont.get(12)).textColor(FLabel.INLINE_LABEL_COLOR).build());
lblSort.setWidth(lblSort.getAutoSizeBounds().width);
cbxSortOptions = add(new FComboBox<ItemColumn>());
cbxSortOptions.setFont(lblSort.getFont());
}
else {
lblSort = null;
cbxSortOptions = null;
}
add(currentView.getPnlOptions());
add(currentView.getScroller());
@@ -149,6 +164,72 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
public void setup(ItemManagerConfig config0, Map<ColumnDef, ItemColumn> colOverrides) {
config = config0;
setWantUnique(config0.getUniqueCardsOnly());
//ensure sort cols ordered properly
final List<ItemColumn> cols = new LinkedList<ItemColumn>();
for (ItemColumnConfig colConfig : config.getCols().values()) {
if (colOverrides == null || !colOverrides.containsKey(colConfig.getDef())) {
cols.add(new ItemColumn(colConfig));
}
else {
cols.add(colOverrides.get(colConfig.getDef()));
}
}
Collections.sort(cols, new Comparator<ItemColumn>() {
@Override
public int compare(ItemColumn arg0, ItemColumn arg1) {
return Integer.compare(arg0.getConfig().getIndex(), arg1.getConfig().getIndex());
}
});
sortCols.clear();
int modelIndex = 0;
for (final ItemColumn col : cols) {
col.setIndex(modelIndex++);
if (col.isVisible()) { sortCols.add(col); }
}
final ItemColumn[] sortcols = new ItemColumn[sortCols.size()];
// Assemble priority sort.
for (ItemColumn col : sortCols) {
if (cbxSortOptions != null) {
cbxSortOptions.addItem(col);
}
if (col.getSortPriority() > 0 && col.getSortPriority() <= sortcols.length) {
sortcols[col.getSortPriority() - 1] = col;
}
}
if (cbxSortOptions != null) {
cbxSortOptions.setText("(none)");
}
model.getCascadeManager().reset();
for (int i = sortcols.length - 1; i >= 0; i--) {
ItemColumn col = sortcols[i];
if (col != null) {
model.getCascadeManager().add(col, true);
if (cbxSortOptions != null) {
cbxSortOptions.setSelectedItem(col);
}
}
}
if (cbxSortOptions != null) {
cbxSortOptions.setChangedHandler(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
model.getCascadeManager().add(cbxSortOptions.getSelectedItem(), false);
model.refreshSort();
ItemManagerConfig.save();
updateView(true, null);
}
});
}
for (ItemView<T> view : views) {
view.setup(config0, colOverrides);
}
@@ -157,6 +238,10 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
hasNewColumn = config.getCols().containsKey(ColumnDef.NEW);
}
protected boolean allowSortChange() {
return true;
}
protected String getItemSuffix(Entry<T, Integer> item) {
return hasNewColumn && FModel.getQuest().getCards().isNew(item.getKey()) ? " *NEW*" : null;
}
@@ -218,6 +303,10 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
for (ItemFilter<? extends T> filter : filters) {
helper.include(filter.getWidget(), filter.getPreferredWidth(helper.getRemainingLineWidth(), fieldHeight), fieldHeight);
}
if (allowSortChange()) {
helper.include(lblSort, lblSort.getWidth(), fieldHeight);
helper.fillLine(cbxSortOptions, fieldHeight);
}
helper.newLine(-ItemFilter.PADDING);
if (currentView.getPnlOptions().getChildCount() > 0) {
helper.fillLine(currentView.getPnlOptions(), fieldHeight + ItemFilter.PADDING);

View File

@@ -45,7 +45,6 @@ public abstract class FormatFilter<T extends InventoryItem> extends ItemFilter<T
cbxFormats.addItem(format);
}
cbxFormats.addItem("Choose Sets...");
cbxFormats.setSelectedIndex(0);
selectedFormat = cbxFormats.getText();
cbxFormats.setChangedHandler(new FEventHandler() {

View File

@@ -26,7 +26,6 @@ import forge.assets.FSkinImage;
import forge.item.InventoryItem;
import forge.itemmanager.ColumnDef;
import forge.itemmanager.ItemColumn;
import forge.itemmanager.ItemColumnConfig;
import forge.itemmanager.ItemManager;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.ItemManagerModel;
@@ -69,32 +68,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
@Override
public void setup(ItemManagerConfig config, Map<ColumnDef, ItemColumn> colOverrides) {
//ensure cols ordered properly
final List<ItemColumn> cols = new LinkedList<ItemColumn>();
for (ItemColumnConfig colConfig : config.getCols().values()) {
if (colOverrides == null || !colOverrides.containsKey(colConfig.getDef())) {
cols.add(new ItemColumn(colConfig));
}
else {
cols.add(colOverrides.get(colConfig.getDef()));
}
}
Collections.sort(cols, new Comparator<ItemColumn>() {
@Override
public int compare(ItemColumn arg0, ItemColumn arg1) {
return Integer.compare(arg0.getConfig().getIndex(), arg1.getConfig().getIndex());
}
});
list.cols.clear();
int modelIndex = 0;
for (final ItemColumn col : cols) {
col.setIndex(modelIndex++);
if (col.isVisible()) { list.cols.add(col); }
}
listModel.setup();
refresh(null, 0, 0);
}
@@ -214,7 +187,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
public final class ItemList extends FList<Entry<T, Integer>> {
private final ItemManager<T>.ItemRenderer renderer;
private List<ItemColumn> cols = new ArrayList<ItemColumn>();
private ItemList() {
renderer = itemManager.getListItemRenderer();
@@ -284,14 +256,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
setFont(FSkinFont.get(14));
}
public Iterable<ItemColumn> getCells() {
return cols;
}
public int getCellCount() {
return cols.size();
}
@Override
protected void drawBackground(Graphics g) {
//draw no background by default
@@ -326,26 +290,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
model = model0;
}
public void setup() {
final ItemColumn[] sortcols = new ItemColumn[list.getCellCount()];
// Assemble priority sort.
for (ItemColumn col : list.getCells()) {
if (col.getSortPriority() > 0 && col.getSortPriority() <= sortcols.length) {
sortcols[col.getSortPriority() - 1] = col;
}
}
model.getCascadeManager().reset();
for (int i = sortcols.length - 1; i >= 0; i--) {
ItemColumn col = sortcols[i];
if (col != null) {
model.getCascadeManager().add(col, true);
}
}
}
public Entry<T, Integer> rowToItem(final int row) {
final List<Entry<T, Integer>> orderedList = model.getOrderedList();
return (row >= 0) && (row < orderedList.size()) ? orderedList.get(row) : null;