mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +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() {
|
||||
AdvancedSearchFilter<PaperCard> filter = itemManager.getFilter(AdvancedSearchFilter.class);
|
||||
if (filter != null) {
|
||||
if (filter.edit()) {
|
||||
itemManager.applyNewOrModifiedFilter(filter);
|
||||
}
|
||||
filter.edit();
|
||||
}
|
||||
else {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,13 +232,14 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
public void run() {
|
||||
AdvancedSearchFilter<DeckProxy> filter = getFilter(AdvancedSearchFilter.class);
|
||||
if (filter != null) {
|
||||
if (filter.edit()) {
|
||||
applyNewOrModifiedFilter(filter);
|
||||
}
|
||||
filter.edit();
|
||||
}
|
||||
else {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
protected void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
||||
public void applyNewOrModifiedFilter(final ItemFilter<? extends T> filter) {
|
||||
if (this.lockFiltering) {
|
||||
filter.afterFiltersApplied(); //ensure this called even if filters currently locked
|
||||
return;
|
||||
|
||||
@@ -2,15 +2,20 @@ package forge.itemmanager.filters;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.interfaces.IButton;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.itemmanager.AdvancedSearch;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.AdvancedSearch.IFilterControl;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FMouseAdapter;
|
||||
import forge.toolbox.FOptionPane;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinnedPanel;
|
||||
import forge.toolbox.FTextField;
|
||||
import forge.toolbox.LayoutHelper;
|
||||
@@ -41,6 +46,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
@Override
|
||||
public void reset() {
|
||||
model.reset();
|
||||
editDialog = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -56,6 +62,50 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
@Override
|
||||
protected final void buildWidget(JPanel widget) {
|
||||
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);
|
||||
widget.add(label);
|
||||
}
|
||||
@@ -77,6 +127,15 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
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")
|
||||
private class EditDialog {
|
||||
private static final int WIDTH = 400;
|
||||
@@ -120,7 +179,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
|
||||
optionPane.dispose();
|
||||
if (result != 1) {
|
||||
model.updateExpression(); //update expression when dialog accepted
|
||||
onFilterChange.run();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user