mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Don't retain selection when clicking to change column sort
Support showing color deck options in proper order with no column header
This commit is contained in:
@@ -5,6 +5,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@@ -113,8 +114,16 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
}
|
||||
|
||||
private class ColorDeckGenerator extends DeckGenerator {
|
||||
public ColorDeckGenerator(String name0) {
|
||||
private int index;
|
||||
|
||||
public ColorDeckGenerator(String name0, int index0) {
|
||||
super(name0);
|
||||
this.index = index0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Comparable<?> getCompareValue() {
|
||||
return this.index; //ensure color items appear in proper order
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -133,15 +142,12 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
private void updateColors() {
|
||||
lstDecks.setAllowMultipleSelections(true);
|
||||
|
||||
String[] colors = new String[] { "Random 1", "Random 2", "Random 3",
|
||||
"White", "Blue", "Black", "Red", "Green" };
|
||||
ArrayList<Deck> decks = new ArrayList<Deck>();
|
||||
decks.add(new ColorDeckGenerator("Random 1"));
|
||||
decks.add(new ColorDeckGenerator("Random 2"));
|
||||
decks.add(new ColorDeckGenerator("Random 3"));
|
||||
decks.add(new ColorDeckGenerator("White"));
|
||||
decks.add(new ColorDeckGenerator("Blue"));
|
||||
decks.add(new ColorDeckGenerator("Black"));
|
||||
decks.add(new ColorDeckGenerator("Red"));
|
||||
decks.add(new ColorDeckGenerator("Green"));
|
||||
for (int i = 0; i < colors.length; i++) {
|
||||
decks.add(new ColorDeckGenerator(colors[i], i));
|
||||
}
|
||||
|
||||
lstDecks.setPool(decks);
|
||||
lstDecks.update(true);
|
||||
|
||||
@@ -6,8 +6,6 @@ import java.awt.Rectangle;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
@@ -56,7 +54,7 @@ public final class DeckManager extends ItemManager<Deck> {
|
||||
private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT_OVER);
|
||||
|
||||
private final GameType gametype;
|
||||
private boolean nameOnly, preventEdit;
|
||||
private boolean stringOnly, preventEdit;
|
||||
private Command cmdDelete, cmdSelect;
|
||||
private final Map<ColumnDef, ItemColumn> columns = SColumnUtil.getColumns(
|
||||
ColumnDef.DECK_ACTIONS,
|
||||
@@ -102,28 +100,27 @@ public final class DeckManager extends ItemManager<Deck> {
|
||||
public void update() {
|
||||
update(false, false);
|
||||
}
|
||||
public void update(boolean nameOnly0) {
|
||||
update(nameOnly0, nameOnly0);
|
||||
public void update(boolean stringOnly0) {
|
||||
update(stringOnly0, stringOnly0);
|
||||
}
|
||||
public void update(boolean nameOnly0, boolean preventEdit0) {
|
||||
if (this.nameOnly != nameOnly0) {
|
||||
this.nameOnly = nameOnly0;
|
||||
boolean visible = !nameOnly0;
|
||||
for (Entry<ColumnDef, ItemColumn> column : columns.entrySet()) {
|
||||
if (column.getKey() != ColumnDef.NAME) {
|
||||
column.getValue().setVisible(visible);
|
||||
}
|
||||
}
|
||||
public void update(boolean stringOnly0, boolean preventEdit0) {
|
||||
if (this.stringOnly != stringOnly0) {
|
||||
this.stringOnly = stringOnly0;
|
||||
this.restoreDefaultFilters();
|
||||
}
|
||||
if (nameOnly0) {
|
||||
if (stringOnly0) {
|
||||
preventEdit0 = true; //if name only, always prevent edit
|
||||
}
|
||||
if (this.preventEdit != preventEdit0) {
|
||||
this.preventEdit = preventEdit0;
|
||||
columns.get(ColumnDef.DECK_ACTIONS).setVisible(!preventEdit0);
|
||||
}
|
||||
this.getTable().setup(columns);
|
||||
if (stringOnly0) {
|
||||
this.getTable().setup(SColumnUtil.getStringColumn());
|
||||
}
|
||||
else {
|
||||
this.getTable().setup(columns);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -146,7 +143,7 @@ public final class DeckManager extends ItemManager<Deck> {
|
||||
|
||||
@Override
|
||||
protected void addDefaultFilters() {
|
||||
if (!this.nameOnly) {
|
||||
if (!this.stringOnly) {
|
||||
addFilter(new DeckColorFilter(this));
|
||||
}
|
||||
}
|
||||
@@ -158,7 +155,7 @@ public final class DeckManager extends ItemManager<Deck> {
|
||||
|
||||
@Override
|
||||
protected void buildAddFilterMenu(JMenu menu) {
|
||||
if (this.nameOnly) { return; }
|
||||
if (this.stringOnly) { return; }
|
||||
|
||||
GuiUtils.addSeparator(menu); //separate from current search item
|
||||
|
||||
|
||||
@@ -917,7 +917,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
this.model.addItems(this.pool);
|
||||
}
|
||||
|
||||
this.table.refresh(itemsToSelect, backupIndexToSelect, false);
|
||||
this.table.refresh(itemsToSelect, backupIndexToSelect);
|
||||
|
||||
for (ItemFilter<? extends T> filter : this.orderedFilters) {
|
||||
filter.afterFiltersApplied();
|
||||
|
||||
@@ -52,7 +52,6 @@ import forge.limited.DraftRankCache;
|
||||
*
|
||||
* @param <T> a generic type
|
||||
*/
|
||||
|
||||
public class ItemColumn extends TableColumn {
|
||||
private static final long serialVersionUID = 3749431834643427572L;
|
||||
|
||||
@@ -166,6 +165,19 @@ public class ItemColumn extends TableColumn {
|
||||
}
|
||||
|
||||
public enum ColumnDef {
|
||||
STRING("", "", 0, -1, -1, SortState.ASC, new ItemCellRenderer(),
|
||||
new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
|
||||
@Override
|
||||
public Comparable<?> apply(final Entry<InventoryItem, Integer> from) {
|
||||
return from.getKey().getCompareValue();
|
||||
}
|
||||
},
|
||||
new Function<Entry<? extends InventoryItem, Integer>, Object>() {
|
||||
@Override
|
||||
public Object apply(final Entry<? extends InventoryItem, Integer> from) {
|
||||
return from.getKey().toString();
|
||||
}
|
||||
}),
|
||||
NAME("Name", "Name", 180, -1, -1, SortState.ASC, new ItemCellRenderer(),
|
||||
new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
|
||||
@Override
|
||||
|
||||
@@ -20,6 +20,7 @@ package forge.gui.toolbox.itemmanager.views;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.KeyboardFocusManager;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
@@ -53,8 +54,6 @@ import javax.swing.table.TableCellRenderer;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import forge.gui.toolbox.FMouseAdapter;
|
||||
import forge.gui.toolbox.FSkin;
|
||||
import forge.gui.toolbox.FSkin.SkinnedTable;
|
||||
@@ -75,6 +74,8 @@ import forge.util.ItemPoolSorter;
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
private static final int ROW_HEIGHT = 20;
|
||||
|
||||
private final ItemTable table = new ItemTable();
|
||||
private final ItemTableModel tableModel;
|
||||
|
||||
@@ -127,8 +128,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
this.table.setFont(FSkin.getFont(12));
|
||||
this.table.setBorder((Border)null);
|
||||
this.table.getTableHeader().setBorder(null);
|
||||
this.table.setRowHeight(20);
|
||||
this.table.setRowHeight(ROW_HEIGHT);
|
||||
this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
|
||||
|
||||
// prevent tables from intercepting tab focus traversals
|
||||
@@ -160,14 +160,20 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
if (col.isVisible()) { colmodel.addColumn(col); }
|
||||
}
|
||||
|
||||
//hide table header if only showing single string column
|
||||
if (cols.size() == 1 && cols.containsKey(ColumnDef.STRING)) {
|
||||
this.table.getTableHeader().setPreferredSize(new Dimension(0, 0));
|
||||
}
|
||||
else {
|
||||
this.table.getTableHeader().setPreferredSize(new Dimension(0, ROW_HEIGHT));
|
||||
}
|
||||
|
||||
this.tableModel.addListeners();
|
||||
this.table.setModel(this.tableModel);
|
||||
this.table.setColumnModel(colmodel);
|
||||
|
||||
this.tableModel.setup();
|
||||
this.refresh(selectedItemsBefore, 0, false);
|
||||
|
||||
this.table.getTableHeader().setBackground(new Color(200, 200, 200));
|
||||
this.refresh(selectedItemsBefore, 0);
|
||||
}
|
||||
|
||||
public JTable getTable() {
|
||||
@@ -292,6 +298,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
return tableColumn.getLongName();
|
||||
}
|
||||
};
|
||||
header.setBorder(null);
|
||||
header.setBackground(new Color(200, 200, 200));
|
||||
((DefaultTableCellRenderer)header.getDefaultRenderer()).setHorizontalAlignment(SwingConstants.LEFT);
|
||||
return header;
|
||||
}
|
||||
@@ -412,22 +420,22 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
public void setup() {
|
||||
final Enumeration<TableColumn> e = table.getColumnModel().getColumns();
|
||||
final TableColumn[] sortcols = new TableColumn[table.getColumnCount()];
|
||||
final ItemColumn[] sortcols = new ItemColumn[table.getColumnCount()];
|
||||
|
||||
// Assemble priority sort.
|
||||
while (e.hasMoreElements()) {
|
||||
final ItemColumn col = (ItemColumn) e.nextElement();
|
||||
if (col.getSortPriority() > 0 && col.getSortPriority() < sortcols.length) {
|
||||
sortcols[col.getSortPriority()] = col;
|
||||
if (col.getSortPriority() > 0 && col.getSortPriority() <= sortcols.length) {
|
||||
sortcols[col.getSortPriority() - 1] = col;
|
||||
}
|
||||
}
|
||||
|
||||
cascadeManager.reset();
|
||||
|
||||
ArrayUtils.reverse(sortcols);
|
||||
for (int i = 1; i < sortcols.length; i++) {
|
||||
if (sortcols[i] != null) {
|
||||
cascadeManager.add((ItemColumn) sortcols[i], true);
|
||||
for (int i = sortcols.length - 1; i >= 0; i--) {
|
||||
ItemColumn col = sortcols[i];
|
||||
if (col != null) {
|
||||
cascadeManager.add(col, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -499,14 +507,12 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
return;
|
||||
}
|
||||
|
||||
//backup selected items to restore
|
||||
final Iterable<T> selectedItemsBefore = getSelectedItems();
|
||||
|
||||
// This will invert if needed
|
||||
ItemTableModel.this.cascadeManager.add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false);
|
||||
refresh(selectedItemsBefore, 0, true);
|
||||
ItemTableModel.this.refreshSort();
|
||||
table.tableChanged(new TableModelEvent(ItemTableModel.this));
|
||||
table.repaint();
|
||||
ItemListView.this.setSelectedIndex(0);
|
||||
SItemManagerIO.savePreferences(getItemManager());
|
||||
}
|
||||
|
||||
|
||||
@@ -59,20 +59,9 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return this.isIncrementalSearchActive;
|
||||
}
|
||||
|
||||
public void refresh(final Iterable<T> itemsToSelect, final int backupIndexToSelect, final boolean delaySelection) {
|
||||
public void refresh(final Iterable<T> itemsToSelect, final int backupIndexToSelect) {
|
||||
onRefresh();
|
||||
|
||||
if (delaySelection) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
fixSelection(itemsToSelect, backupIndexToSelect);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
fixSelection(itemsToSelect, backupIndexToSelect);
|
||||
}
|
||||
fixSelection(itemsToSelect, backupIndexToSelect);
|
||||
}
|
||||
protected abstract void onRefresh();
|
||||
private void fixSelection(final Iterable<T> itemsToSelect, final int backupIndexToSelect) {
|
||||
|
||||
@@ -46,6 +46,12 @@ public final class SColumnUtil {
|
||||
return columns;
|
||||
}
|
||||
|
||||
public static Map<ColumnDef, ItemColumn> getStringColumn() {
|
||||
Map<ColumnDef, ItemColumn> columns = getColumns(ColumnDef.STRING);
|
||||
columns.get(ColumnDef.STRING).setSortPriority(1);
|
||||
return columns;
|
||||
}
|
||||
|
||||
public static Map<ColumnDef, ItemColumn> getCatalogDefaultColumns() {
|
||||
Map<ColumnDef, ItemColumn> columns = getColumns(
|
||||
ColumnDef.FAVORITE,
|
||||
|
||||
@@ -19,7 +19,6 @@ import forge.util.ItemPool;
|
||||
*
|
||||
*/
|
||||
public class QuestRewardCardChooser extends QuestRewardCard implements InventoryItem {
|
||||
|
||||
/**
|
||||
* Possible types for this object.
|
||||
*/
|
||||
@@ -61,6 +60,16 @@ public class QuestRewardCardChooser extends QuestRewardCard implements Inventory
|
||||
return description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Comparable<?> getCompareValue() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* The item type.
|
||||
*
|
||||
|
||||
@@ -14,7 +14,6 @@ import forge.util.ItemPool;
|
||||
*
|
||||
*/
|
||||
public class QuestRewardCardDuplicate implements IQuestRewardCard {
|
||||
|
||||
private final String description;
|
||||
|
||||
/**
|
||||
@@ -45,6 +44,16 @@ public class QuestRewardCardDuplicate implements IQuestRewardCard {
|
||||
return "duplicate card";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Comparable<?> getCompareValue() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces a list of options to choose from, in this case,
|
||||
* the player's current cards.
|
||||
|
||||
@@ -15,7 +15,6 @@ import forge.item.PaperCard;
|
||||
*
|
||||
*/
|
||||
public class QuestRewardCardFiltered extends QuestRewardCard implements IQuestRewardCard {
|
||||
|
||||
private final String description;
|
||||
private final Predicate<PaperCard> predicates;
|
||||
|
||||
@@ -39,6 +38,15 @@ public class QuestRewardCardFiltered extends QuestRewardCard implements IQuestRe
|
||||
return description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Comparable<?> getCompareValue() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* The item type.
|
||||
|
||||
Reference in New Issue
Block a user