mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Fix so selection retained when changing sort
Fix so previously played deck restored on Constructed screen
This commit is contained in:
@@ -94,5 +94,4 @@ public class DecksComboBox extends FComboBoxWrapper<DeckType> {
|
||||
selectedDeckType = valueOf;
|
||||
setSelectedItem(selectedDeckType);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,14 +8,13 @@ import javax.swing.JPanel;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.game.GameType;
|
||||
import forge.game.player.RegisteredPlayer;
|
||||
import forge.gui.MouseUtil;
|
||||
import forge.gui.MouseUtil.MouseCursor;
|
||||
import forge.gui.deckchooser.DecksComboBox.DeckType;
|
||||
import forge.gui.toolbox.FLabel;
|
||||
import forge.gui.toolbox.itemmanager.DeckManager;
|
||||
@@ -32,7 +31,7 @@ import forge.quest.QuestUtil;
|
||||
public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
private boolean isUISetup = false;
|
||||
|
||||
private DecksComboBox decksComboBox;
|
||||
private DecksComboBox decksComboBox = new DecksComboBox();
|
||||
private DeckType selectedDeckType = DeckType.COLOR_DECK;
|
||||
|
||||
private final DeckManager lstDecks = new DeckManager(GameType.Constructed);
|
||||
@@ -72,10 +71,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
|
||||
public DeckType getSelectedDeckType() { return selectedDeckType; }
|
||||
public void setSelectedDeckType(DeckType selectedDeckType0) {
|
||||
if (selectedDeckType != selectedDeckType0) {
|
||||
selectedDeckType = selectedDeckType0;
|
||||
decksComboBox.refresh(selectedDeckType0);
|
||||
}
|
||||
refreshDecksList(selectedDeckType0, false, null);
|
||||
}
|
||||
|
||||
public DeckManager getLstDecks() { return lstDecks; }
|
||||
@@ -271,7 +267,6 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
}
|
||||
|
||||
public void populate() {
|
||||
setupUI();
|
||||
removeAll();
|
||||
this.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
decksComboBox.addTo(this, "w 100%, h 30px!, gapbottom 5px, spanx 2, wrap");
|
||||
@@ -282,6 +277,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
validate();
|
||||
repaint();
|
||||
}
|
||||
setupUI();
|
||||
}
|
||||
|
||||
public final boolean isAi() {
|
||||
@@ -297,9 +293,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
*/
|
||||
@Override
|
||||
public void deckTypeSelected(DecksComboBoxEvent ev) {
|
||||
MouseUtil.setMouseCursor(MouseCursor.WAIT_CURSOR);
|
||||
refreshDecksList(ev.getDeckType());
|
||||
MouseUtil.setMouseCursor(MouseCursor.DEFAULT_CURSOR);
|
||||
refreshDecksList(ev.getDeckType(), false, ev);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -312,18 +306,20 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
if (!isUISetup) {
|
||||
// Only do this once.
|
||||
isUISetup = true;
|
||||
// core UI components.
|
||||
decksComboBox = new DecksComboBox();
|
||||
// monitor events generated by these components.
|
||||
decksComboBox.addListener(this);
|
||||
// now everything is in place, fire initial populate event.
|
||||
restoreSavedState();
|
||||
decksComboBox.refresh(selectedDeckType);
|
||||
}
|
||||
}
|
||||
|
||||
private void refreshDecksList(DeckType deckType) {
|
||||
private void refreshDecksList(DeckType deckType, boolean forceRefresh, DecksComboBoxEvent ev) {
|
||||
if (selectedDeckType == deckType && !forceRefresh) { return; }
|
||||
selectedDeckType = deckType;
|
||||
|
||||
if (ev == null) {
|
||||
decksComboBox.refresh(deckType);
|
||||
}
|
||||
lstDecks.setCaption(deckType.toString());
|
||||
|
||||
switch (deckType) {
|
||||
@@ -386,14 +382,13 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
|
||||
private void restoreSavedState() {
|
||||
if (stateSetting == null) {
|
||||
//if can't restore saved state, just refresh decks combo box
|
||||
decksComboBox.refresh(selectedDeckType);
|
||||
//if can't restore saved state, just refresh deck list
|
||||
refreshDecksList(selectedDeckType, true, null);
|
||||
return;
|
||||
}
|
||||
|
||||
String savedState = prefs.getPref(stateSetting);
|
||||
selectedDeckType = getDeckTypeFromSavedState(savedState);
|
||||
decksComboBox.refresh(selectedDeckType);
|
||||
refreshDecksList(getDeckTypeFromSavedState(savedState), true, null);
|
||||
lstDecks.setSelectedStrings(getSelectedDecksFromSavedState(savedState));
|
||||
}
|
||||
|
||||
|
||||
@@ -275,7 +275,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
this.initialized = true; //must set flag just before applying filters
|
||||
if (!applyFilters()) {
|
||||
if (this.pool != null) { //ensure view updated even if filter predicate didn't change
|
||||
this.updateView(true);
|
||||
this.updateView(true, null, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -430,7 +430,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
this.pool = pool0;
|
||||
this.model.addItems(this.pool);
|
||||
this.model.setInfinite(infinite);
|
||||
this.updateView(true);
|
||||
this.updateView(true, null, 0);
|
||||
}
|
||||
|
||||
public ItemListView<T> getTable() {
|
||||
@@ -497,8 +497,8 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
*
|
||||
* @param item - Item to select
|
||||
*/
|
||||
public void setSelectedItem(T item) {
|
||||
this.table.setSelectedItem(item);
|
||||
public boolean setSelectedItem(T item) {
|
||||
return this.table.setSelectedItem(item);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -507,8 +507,8 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
*
|
||||
* @param items - Items to select
|
||||
*/
|
||||
public void setSelectedItems(Iterable<T> items) {
|
||||
this.table.setSelectedItems(items);
|
||||
public boolean setSelectedItems(Iterable<T> items) {
|
||||
return this.table.setSelectedItems(items);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -517,7 +517,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
*
|
||||
* @param strings - Strings to select
|
||||
*/
|
||||
public void setSelectedStrings(Iterable<String> strings) {
|
||||
public boolean setSelectedStrings(Iterable<String> strings) {
|
||||
List<T> items = new ArrayList<T>();
|
||||
for (String itemName : strings) {
|
||||
for (Entry<T, Integer> itemEntry : this.pool) {
|
||||
@@ -527,7 +527,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.table.setSelectedItems(items);
|
||||
return this.setSelectedItems(items);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -536,12 +536,12 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
*
|
||||
* @param itemEntrys - Item entrys to select
|
||||
*/
|
||||
public void selectItemEntrys(Iterable<Entry<T, Integer>> itemEntrys) {
|
||||
public boolean selectItemEntrys(Iterable<Entry<T, Integer>> itemEntrys) {
|
||||
List<T> items = new ArrayList<T>();
|
||||
for (Entry<T, Integer> itemEntry : itemEntrys) {
|
||||
items.add(itemEntry.getKey());
|
||||
}
|
||||
this.setSelectedItems(items);
|
||||
return this.setSelectedItems(items);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -595,12 +595,14 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
* @param qty
|
||||
*/
|
||||
public void addItem(final T item, int qty) {
|
||||
int selectedIndexBefore = this.getSelectedIndex();
|
||||
this.pool.add(item, qty);
|
||||
if (this.isUnfiltered()) {
|
||||
this.model.addItem(item, qty);
|
||||
}
|
||||
this.updateView(false);
|
||||
this.table.setSelectedItem(item);
|
||||
List<T> items = new ArrayList<T>();
|
||||
items.add(item);
|
||||
this.updateView(false, items, selectedIndexBefore);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -610,17 +612,17 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
* @param itemsToAdd
|
||||
*/
|
||||
public void addItems(Iterable<Entry<T, Integer>> itemsToAdd) {
|
||||
int selectedIndexBefore = this.getSelectedIndex();
|
||||
this.pool.addAll(itemsToAdd);
|
||||
if (this.isUnfiltered()) {
|
||||
this.model.addItems(itemsToAdd);
|
||||
}
|
||||
this.updateView(false);
|
||||
|
||||
List<T> items = new ArrayList<T>();
|
||||
for (Map.Entry<T, Integer> item : itemsToAdd) {
|
||||
items.add(item.getKey());
|
||||
}
|
||||
this.setSelectedItems(items);
|
||||
this.updateView(false, items, selectedIndexBefore);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -638,8 +640,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
if (this.isUnfiltered()) {
|
||||
this.model.removeItem(item, qty);
|
||||
}
|
||||
this.updateView(false);
|
||||
this.fixSelection(selectedIndexBefore, selectedItemsBefore);
|
||||
this.updateView(false, selectedItemsBefore, selectedIndexBefore);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -658,8 +659,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
this.model.removeItem(item.getKey(), item.getValue());
|
||||
}
|
||||
}
|
||||
this.updateView(false);
|
||||
this.fixSelection(selectedIndexBefore, selectedItemsBefore);
|
||||
this.updateView(false, selectedItemsBefore, selectedIndexBefore);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -670,20 +670,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
public void removeAllItems() {
|
||||
this.pool.clear();
|
||||
this.model.clear();
|
||||
this.updateView(false);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* fixSelection.
|
||||
*
|
||||
* @param selectedIndexBefore
|
||||
* @param selectedItemsBefore
|
||||
*/
|
||||
private void fixSelection(int selectedIndexBefore, final Iterable<T> selectedItemsBefore) {
|
||||
if (!this.table.setSelectedItems(selectedItemsBefore)) {
|
||||
this.table.setSelectedIndex(selectedIndexBefore); //restore selected index if couldn't restore selected items
|
||||
}
|
||||
this.updateView(false, null, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -813,7 +800,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
|
||||
this.filterPredicate = newFilterPredicate;
|
||||
if (this.pool != null) {
|
||||
this.updateView(true);
|
||||
this.updateView(true, this.getSelectedItems(), 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -892,10 +879,10 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
*
|
||||
* @param bForceFilter
|
||||
*/
|
||||
public void updateView(final boolean bForceFilter) {
|
||||
final boolean useFilter = (bForceFilter && (this.filterPredicate != null)) || !isUnfiltered();
|
||||
public void updateView(final boolean forceFilter, final Iterable<T> itemsToSelect, final int backupIndexToSelect) {
|
||||
final boolean useFilter = (forceFilter && (this.filterPredicate != null)) || !isUnfiltered();
|
||||
|
||||
if (useFilter || this.wantUnique || bForceFilter) {
|
||||
if (useFilter || this.wantUnique || forceFilter) {
|
||||
this.model.clear();
|
||||
}
|
||||
|
||||
@@ -912,11 +899,11 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
Iterable<Entry<T, Integer>> items = Aggregates.uniqueByLast(this.pool, this.pool.FN_GET_NAME);
|
||||
this.model.addItems(items);
|
||||
}
|
||||
else if (!useFilter && bForceFilter) {
|
||||
else if (!useFilter && forceFilter) {
|
||||
this.model.addItems(this.pool);
|
||||
}
|
||||
|
||||
this.table.getTableModel().refreshSort();
|
||||
this.table.refresh(itemsToSelect, backupIndexToSelect, false);
|
||||
|
||||
for (ItemFilter<? extends T> filter : this.orderedFilters) {
|
||||
filter.afterFiltersApplied();
|
||||
@@ -938,16 +925,6 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
|
||||
total = this.pool.countAll();
|
||||
}
|
||||
this.lblRatio.setText("(" + this.getFilteredItems().countAll() + " / " + total + ")");
|
||||
|
||||
//select first row if no row already selected
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (table.getCount() > 0 && table.getSelectionCount() == 0) {
|
||||
table.setSelectedIndex(0);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -142,6 +142,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
* @param cols   List<TableColumnInfo<InventoryItem>> of additional columns for this
|
||||
*/
|
||||
public void setup(final Map<ColumnDef, ItemColumn> cols) {
|
||||
final Iterable<T> selectedItemsBefore = getSelectedItems();
|
||||
final DefaultTableColumnModel colmodel = new DefaultTableColumnModel();
|
||||
|
||||
//ensure columns ordered properly
|
||||
@@ -164,7 +165,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
this.table.setColumnModel(colmodel);
|
||||
|
||||
this.tableModel.setup();
|
||||
this.tableModel.refreshSort();
|
||||
this.refresh(selectedItemsBefore, 0, false);
|
||||
|
||||
this.table.getTableHeader().setBackground(new Color(200, 200, 200));
|
||||
}
|
||||
@@ -210,25 +211,13 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
@Override
|
||||
protected void onSetSelectedIndex(int index) {
|
||||
int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
if (index >= count) {
|
||||
index = count - 1;
|
||||
}
|
||||
this.table.setRowSelectionInterval(index, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSetSelectedIndices(Iterable<Integer> indices) {
|
||||
int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
this.table.clearSelection();
|
||||
for (Integer index : indices) {
|
||||
if (index >= count) {
|
||||
index = count - 1;
|
||||
}
|
||||
this.table.addRowSelectionInterval(index, index);
|
||||
}
|
||||
}
|
||||
@@ -283,6 +272,11 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
return this.table.rowAtPoint(p);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRefresh() {
|
||||
this.tableModel.refreshSort();
|
||||
}
|
||||
|
||||
public final class ItemTable extends SkinnedTable {
|
||||
@Override
|
||||
protected JTableHeader createDefaultTableHeader() {
|
||||
@@ -505,16 +499,14 @@ 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
|
||||
// 2012/07/21 - Changed from modelIndex to ColumnModelIndex due to a crash
|
||||
// Crash was: Hide 2 columns, then search by last column.
|
||||
ItemTableModel.this.cascadeManager.add((ItemColumn) table.getColumnModel().getColumn(columnModelIndex), false);
|
||||
ItemTableModel.this.refreshSort();
|
||||
refresh(selectedItemsBefore, 0, true);
|
||||
table.tableChanged(new TableModelEvent(ItemTableModel.this));
|
||||
table.repaint();
|
||||
if (getCount() > 0) {
|
||||
table.setRowSelectionInterval(0, 0);
|
||||
}
|
||||
SItemManagerIO.savePreferences(getItemManager());
|
||||
}
|
||||
|
||||
@@ -544,7 +536,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
/**
|
||||
* Resort.
|
||||
*/
|
||||
public void refreshSort() {
|
||||
private void refreshSort() {
|
||||
if (this.model.getOrderedList().size() == 0) { return; }
|
||||
|
||||
Collections.sort(this.model.getOrderedList(), new MyComparator());
|
||||
|
||||
@@ -59,6 +59,33 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return this.isIncrementalSearchActive;
|
||||
}
|
||||
|
||||
public void refresh(final Iterable<T> itemsToSelect, final int backupIndexToSelect, final boolean delaySelection) {
|
||||
onRefresh();
|
||||
|
||||
if (delaySelection) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
fixSelection(itemsToSelect, backupIndexToSelect);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
fixSelection(itemsToSelect, backupIndexToSelect);
|
||||
}
|
||||
}
|
||||
protected abstract void onRefresh();
|
||||
private void fixSelection(final Iterable<T> itemsToSelect, final int backupIndexToSelect) {
|
||||
if (itemsToSelect == null) {
|
||||
setSelectedIndex(0); //select first item if no items to select
|
||||
}
|
||||
else {
|
||||
if (!setSelectedItems(itemsToSelect)) {
|
||||
setSelectedIndex(backupIndexToSelect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final T getSelectedItem() {
|
||||
int index = getSelectedIndex();
|
||||
return index >= 0 ? getItemAtIndex(index) : null;
|
||||
@@ -98,7 +125,10 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
}
|
||||
}
|
||||
if (indices.size() > 0) {
|
||||
setSelectedIndices(indices, scrollIntoView);
|
||||
onSetSelectedIndices(indices);
|
||||
if (scrollIntoView) {
|
||||
scrollSelectionIntoView();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -108,6 +138,16 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
setSelectedIndex(index, true);
|
||||
}
|
||||
public void setSelectedIndex(int index, boolean scrollIntoView) {
|
||||
int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
if (index < 0) {
|
||||
index = 0;
|
||||
}
|
||||
else if (index >= count) {
|
||||
index = count - 1;
|
||||
}
|
||||
|
||||
onSetSelectedIndex(index);
|
||||
if (scrollIntoView) {
|
||||
scrollSelectionIntoView();
|
||||
@@ -118,7 +158,25 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
setSelectedIndices(indices, true);
|
||||
}
|
||||
public void setSelectedIndices(Iterable<Integer> indices, boolean scrollIntoView) {
|
||||
onSetSelectedIndices(indices);
|
||||
int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
List<Integer> indexList = new ArrayList<Integer>();
|
||||
for (Integer index : indices) {
|
||||
if (index >= 0 && index < count) {
|
||||
indexList.add(index);
|
||||
}
|
||||
}
|
||||
|
||||
if (indexList.isEmpty()) { //if no index in range, set selected index based on first index
|
||||
for (Integer index : indices) {
|
||||
setSelectedIndex(index);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
onSetSelectedIndices(indexList);
|
||||
if (scrollIntoView) {
|
||||
scrollSelectionIntoView();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user