mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
autoselect the items that were just added to the other list when choosing order for simultaneous abilities or cards from the sidebar between match rounds. this allows accidental moves to be undone with a single click
This commit is contained in:
@@ -63,12 +63,23 @@ public class DualListBox<T> extends FPanel {
|
|||||||
private int remainingObjects = 0;
|
private int remainingObjects = 0;
|
||||||
|
|
||||||
private boolean sideboardingMode = false;
|
private boolean sideboardingMode = false;
|
||||||
|
private boolean showCard = true;
|
||||||
|
|
||||||
public DualListBox(int remainingObjects, String label, List<T> sourceElements, List<T> destElements,
|
public DualListBox(int remainingObjects, String label, List<T> sourceElements, List<T> destElements,
|
||||||
Card referenceCard) {
|
Card referenceCard) {
|
||||||
this.remainingObjects = remainingObjects;
|
this.remainingObjects = remainingObjects;
|
||||||
initScreen();
|
initScreen();
|
||||||
orderedLabel.setText(label);
|
orderedLabel.setText(label);
|
||||||
|
if (destElements != null && !destElements.isEmpty()) {
|
||||||
|
addDestinationElements(destElements);
|
||||||
|
|
||||||
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
destList.setSelectedIndex(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
if (sourceElements != null && !sourceElements.isEmpty()) {
|
if (sourceElements != null && !sourceElements.isEmpty()) {
|
||||||
addSourceElements(sourceElements);
|
addSourceElements(sourceElements);
|
||||||
|
|
||||||
@@ -79,9 +90,6 @@ public class DualListBox<T> extends FPanel {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (destElements != null) {
|
|
||||||
addDestinationElements(destElements);
|
|
||||||
}
|
|
||||||
this.setButtonState();
|
this.setButtonState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,12 +131,8 @@ public class DualListBox<T> extends FPanel {
|
|||||||
fillListModel(destListModel, newValue);
|
fillListModel(destListModel, newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") // Java 7 has type parameterized ListModel
|
|
||||||
private void fillListModel(UnsortedListModel<T> model, ListModel newValues) {
|
private void fillListModel(UnsortedListModel<T> model, ListModel newValues) {
|
||||||
int size = newValues.getSize();
|
model.addAll(newValues);
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
model.add((T) newValues.getElementAt(i));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSourceElements(List<T> newValue) {
|
public void addSourceElements(List<T> newValue) {
|
||||||
@@ -167,7 +171,10 @@ public class DualListBox<T> extends FPanel {
|
|||||||
return sourceListModel.model;
|
return sourceListModel.model;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void showSelectedCard(Object obj) {
|
private void showSelectedCard(Object obj) {
|
||||||
|
if (!showCard) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Card card = null;
|
Card card = null;
|
||||||
if (obj instanceof Card) {
|
if (obj instanceof Card) {
|
||||||
card = (Card) obj;
|
card = (Card) obj;
|
||||||
@@ -184,7 +191,7 @@ public class DualListBox<T> extends FPanel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addCardViewListener(final FList list) {
|
private void addCardViewListener(final FList list) {
|
||||||
list.getModel().addListDataListener(new ListDataListener() {
|
list.getModel().addListDataListener(new ListDataListener() {
|
||||||
@Override
|
@Override
|
||||||
public void intervalRemoved(ListDataEvent e) {
|
public void intervalRemoved(ListDataEvent e) {
|
||||||
@@ -207,13 +214,35 @@ public class DualListBox<T> extends FPanel {
|
|||||||
SwingUtilities.invokeLater(new Runnable() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
showCard = false;
|
||||||
list.setSelectedIndex(cardIdx);
|
list.setSelectedIndex(cardIdx);
|
||||||
|
showCard = true;
|
||||||
|
list.requestFocusInWindow();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void intervalAdded(ListDataEvent e) {
|
public void intervalAdded(final ListDataEvent e) {
|
||||||
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// select just-added items so user can undo the add with a single click
|
||||||
|
int startIdx = Math.min(e.getIndex0(), e.getIndex1());
|
||||||
|
int endIdx = Math.max(e.getIndex0(), e.getIndex1());
|
||||||
|
int[] addedIndices = new int[endIdx - startIdx + 1];
|
||||||
|
for (int idx = startIdx; idx <= endIdx; ++idx) {
|
||||||
|
addedIndices[idx - startIdx] = idx;
|
||||||
|
}
|
||||||
|
// attempt to scroll to just-added item (setSelectedIndices does not scroll)
|
||||||
|
// this will scroll to the wrong item if there are other identical items previously in the list
|
||||||
|
showCard = false;
|
||||||
|
list.setSelectedValue(list.getModel().getElementAt(
|
||||||
|
Math.min(endIdx, startIdx + list.getVisibleRowCount())), true);
|
||||||
|
list.setSelectedIndices(addedIndices);
|
||||||
|
showCard = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -320,8 +349,8 @@ public class DualListBox<T> extends FPanel {
|
|||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<T> selected = (List<T>) Arrays.asList(destList.getSelectedValues());
|
List<T> selected = (List<T>) Arrays.asList(destList.getSelectedValues());
|
||||||
addSourceElements(selected);
|
|
||||||
clearDestinationSelected();
|
clearDestinationSelected();
|
||||||
|
addSourceElements(selected);
|
||||||
setButtonState();
|
setButtonState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.AbstractListModel;
|
import javax.swing.AbstractListModel;
|
||||||
|
import javax.swing.ListModel;
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
@@ -27,27 +28,43 @@ public class UnsortedListModel<T> extends AbstractListModel { // Java 7 has a ge
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void add(T element) {
|
public void add(T element) {
|
||||||
if (model.add(element)) {
|
model.add(element);
|
||||||
fireContentsChanged(this, 0, getSize());
|
fireIntervalAdded(this, getSize() - 1, getSize() - 1);
|
||||||
}
|
fireContentsChanged(this, 0, getSize() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addAll(T[] elements) {
|
public void addAll(T[] elements) {
|
||||||
for (T e : elements) {
|
for (T e : elements) {
|
||||||
model.add(e);
|
model.add(e);
|
||||||
}
|
}
|
||||||
fireContentsChanged(this, 0, getSize());
|
fireIntervalAdded(this, getSize() - elements.length, getSize() - 1);
|
||||||
|
fireContentsChanged(this, 0, getSize() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addAll(Collection<T> elements) {
|
public void addAll(Collection<T> elements) {
|
||||||
|
if (elements.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
model.addAll(elements);
|
model.addAll(elements);
|
||||||
fireContentsChanged(this, 0, getSize());
|
fireIntervalAdded(this, getSize() - elements.size(), getSize() - 1);
|
||||||
|
fireContentsChanged(this, 0, getSize() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") // Java 7 has type parameterized ListModel
|
||||||
|
public void addAll(ListModel otherModel) {
|
||||||
|
Collection<T> elements = new ArrayList<T>();
|
||||||
|
int size = otherModel.getSize();
|
||||||
|
for (int i = 0; size > i; ++i) {
|
||||||
|
elements.add((T)otherModel.getElementAt(i));
|
||||||
|
}
|
||||||
|
addAll(elements);
|
||||||
|
}
|
||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
|
int prevSize = getSize();
|
||||||
model.clear();
|
model.clear();
|
||||||
fireContentsChanged(this, 0, getSize());
|
fireIntervalRemoved(this, 0, prevSize - 1);
|
||||||
|
fireContentsChanged(this, 0, prevSize - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean contains(Object element) {
|
public boolean contains(Object element) {
|
||||||
|
|||||||
Reference in New Issue
Block a user