mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Add right-click menu to desktop advanced search
This commit is contained in:
@@ -163,13 +163,14 @@ public class CardManager extends ItemManager<PaperCard> {
|
|||||||
public void run() {
|
public void run() {
|
||||||
AdvancedSearchFilter<PaperCard> filter = itemManager.getFilter(AdvancedSearchFilter.class);
|
AdvancedSearchFilter<PaperCard> filter = itemManager.getFilter(AdvancedSearchFilter.class);
|
||||||
if (filter != null) {
|
if (filter != null) {
|
||||||
if (filter.edit()) {
|
filter.edit();
|
||||||
itemManager.applyNewOrModifiedFilter(filter);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
filter = new AdvancedSearchFilter<PaperCard>(itemManager);
|
filter = new AdvancedSearchFilter<PaperCard>(itemManager);
|
||||||
if (filter.edit()) {
|
itemManager.lockFiltering = true; //ensure filter not applied until added
|
||||||
|
boolean result = filter.edit();
|
||||||
|
itemManager.lockFiltering = false;
|
||||||
|
if (result) {
|
||||||
itemManager.addFilter(filter);
|
itemManager.addFilter(filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -232,13 +232,14 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
|||||||
public void run() {
|
public void run() {
|
||||||
AdvancedSearchFilter<DeckProxy> filter = getFilter(AdvancedSearchFilter.class);
|
AdvancedSearchFilter<DeckProxy> filter = getFilter(AdvancedSearchFilter.class);
|
||||||
if (filter != null) {
|
if (filter != null) {
|
||||||
if (filter.edit()) {
|
filter.edit();
|
||||||
applyNewOrModifiedFilter(filter);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
filter = new AdvancedSearchFilter<DeckProxy>(DeckManager.this);
|
filter = new AdvancedSearchFilter<DeckProxy>(DeckManager.this);
|
||||||
if (filter.edit()) {
|
lockFiltering = true; //ensure filter not applied until added
|
||||||
|
boolean result = filter.edit();
|
||||||
|
lockFiltering = false;
|
||||||
|
if (result) {
|
||||||
addFilter(filter);
|
addFilter(filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -860,7 +860,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
//apply filters and focus existing filter's main component if filtering not locked
|
//apply filters and focus existing filter's main component if filtering not locked
|
||||||
protected void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
public void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
||||||
if (this.lockFiltering) {
|
if (this.lockFiltering) {
|
||||||
filter.afterFiltersApplied(); //ensure this called even if filters currently locked
|
filter.afterFiltersApplied(); //ensure this called even if filters currently locked
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -2,15 +2,20 @@ package forge.itemmanager.filters;
|
|||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
|
import forge.gui.GuiUtils;
|
||||||
import forge.interfaces.IButton;
|
import forge.interfaces.IButton;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
import forge.itemmanager.AdvancedSearch;
|
import forge.itemmanager.AdvancedSearch;
|
||||||
import forge.itemmanager.ItemManager;
|
import forge.itemmanager.ItemManager;
|
||||||
|
import forge.itemmanager.AdvancedSearch.IFilterControl;
|
||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
|
import forge.toolbox.FMouseAdapter;
|
||||||
import forge.toolbox.FOptionPane;
|
import forge.toolbox.FOptionPane;
|
||||||
import forge.toolbox.FScrollPane;
|
import forge.toolbox.FScrollPane;
|
||||||
|
import forge.toolbox.FSkin;
|
||||||
import forge.toolbox.FSkin.SkinnedPanel;
|
import forge.toolbox.FSkin.SkinnedPanel;
|
||||||
import forge.toolbox.FTextField;
|
import forge.toolbox.FTextField;
|
||||||
import forge.toolbox.LayoutHelper;
|
import forge.toolbox.LayoutHelper;
|
||||||
@@ -41,6 +46,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
@Override
|
@Override
|
||||||
public void reset() {
|
public void reset() {
|
||||||
model.reset();
|
model.reset();
|
||||||
|
editDialog = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -56,6 +62,50 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
@Override
|
@Override
|
||||||
protected final void buildWidget(JPanel widget) {
|
protected final void buildWidget(JPanel widget) {
|
||||||
label = new FLabel.Builder().fontAlign(SwingConstants.LEFT).fontSize(12).build();
|
label = new FLabel.Builder().fontAlign(SwingConstants.LEFT).fontSize(12).build();
|
||||||
|
label.addMouseListener(new FMouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void onLeftDoubleClick(final MouseEvent e) {
|
||||||
|
edit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRightClick(final MouseEvent e) {
|
||||||
|
final JPopupMenu menu = new JPopupMenu("AdvancedSearchContextMenu");
|
||||||
|
|
||||||
|
boolean hasFilters = !isEmpty();
|
||||||
|
if (hasFilters) {
|
||||||
|
//add a menu item for each filter to allow easily editing just that filter
|
||||||
|
for (final IFilterControl<T> control : model.getControls()) {
|
||||||
|
GuiUtils.addMenuItem(menu, FSkin.encodeSymbols(control.getFilter().toString(), false), null, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
model.editFilterControl(control, onFilterChange);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
GuiUtils.addSeparator(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
GuiUtils.addMenuItem(menu, "Edit Expression", null, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
edit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (hasFilters) {
|
||||||
|
GuiUtils.addMenuItem(menu, "Clear Filter", null, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
reset();
|
||||||
|
itemManager.applyNewOrModifiedFilter(AdvancedSearchFilter.this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.show(e.getComponent(), e.getX(), e.getY());
|
||||||
|
}
|
||||||
|
});
|
||||||
model.setLabel(label);
|
model.setLabel(label);
|
||||||
widget.add(label);
|
widget.add(label);
|
||||||
}
|
}
|
||||||
@@ -77,6 +127,15 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final Runnable onFilterChange = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
//update expression when edit screen closed or a single filter is changed
|
||||||
|
model.updateExpression();
|
||||||
|
itemManager.applyNewOrModifiedFilter(AdvancedSearchFilter.this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
private class EditDialog {
|
private class EditDialog {
|
||||||
private static final int WIDTH = 400;
|
private static final int WIDTH = 400;
|
||||||
@@ -120,7 +179,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
|
|
||||||
optionPane.dispose();
|
optionPane.dispose();
|
||||||
if (result != 1) {
|
if (result != 1) {
|
||||||
model.updateExpression(); //update expression when dialog accepted
|
onFilterChange.run();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user