GUI, menu: reworked switch panels from main menu - fixed random positions, now it group buttons by related tables and sort by creating date;

This commit is contained in:
Oleg Agafonov 2024-08-11 19:34:29 +04:00
parent 7916af0e52
commit 7811bcf4c1
3 changed files with 77 additions and 16 deletions

View file

@ -617,17 +617,51 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
private void createAndShowSwitchPanelsMenu(final JComponent component, final AbstractButton windowButton) { private void createAndShowSwitchPanelsMenu(final JComponent component, final AbstractButton windowButton) {
JPopupMenu menu = new JPopupMenu(); JPopupMenu menu = new JPopupMenu();
Component[] windows = desktopPane.getComponentsInLayer(javax.swing.JLayeredPane.DEFAULT_LAYER); Component[] windows = desktopPane.getComponentsInLayer(javax.swing.JLayeredPane.DEFAULT_LAYER);
MagePaneMenuItem menuItem;
// TODO: sort menu by games, not current component order List<MagePane> panels = Arrays.stream(windows)
// lobby -> table 1 tourny, table 1 draft, table 1 game, table 2... .filter(Component::isVisible)
for (int i = 0; i < windows.length; i++) { .filter(p -> p instanceof MagePane)
if (windows[i] instanceof MagePane) { .map(p -> (MagePane) p)
MagePane window = (MagePane) windows[i]; .collect(Collectors.toList());
if (window.isVisible()) { MagePane activePanel = panels.stream().findFirst().orElse(null);
menuItem = new MagePaneMenuItem(window);
panels.sort((p1, p2) -> {
// logic order:
// - non-game panels (sort by create order except lobby)
// - game panels (group by table, sort by create order)
// non-game first
int ng1 = p1.getSortTableId() == null ? 0 : 1;
int ng2 = p2.getSortTableId() == null ? 0 : 1;
if (ng1 != ng2) {
return Integer.compare(ng1, ng2);
}
// group by table
if (p1.getSortTableId() != null && !p1.getSortTableId().equals(p2.getSortTableId())) {
return p1.getSortTableId().compareTo(p2.getSortTableId());
}
// sort inside group
return Integer.compare(p1.getSortOrder(), p2.getSortOrder());
});
UUID lastTableId = null;
for (MagePane panel : panels) {
// group by tables
if (!Objects.equals(panel.getSortTableId(), lastTableId)) {
lastTableId = panel.getSortTableId();
if (menu.getComponentCount() > 0) {
menu.addSeparator();
}
}
MagePaneMenuItem menuItem = new MagePaneMenuItem(panel);
if (activePanel == panel) {
menuItem.setState(true);
}
menuItem.setFont(GUISizeHelper.dialogFont); menuItem.setFont(GUISizeHelper.dialogFont);
menuItem.setState(i == 0);
menuItem.addActionListener(ae -> { menuItem.addActionListener(ae -> {
MagePane frame = ((MagePaneMenuItem) ae.getSource()).getFrame(); MagePane frame = ((MagePaneMenuItem) ae.getSource()).getFrame();
setActive(frame); setActive(frame);
@ -635,8 +669,6 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
//menuItem.setIcon(window.getFrameIcon()); //menuItem.setIcon(window.getFrameIcon());
menu.add(menuItem); menu.add(menuItem);
} }
}
}
menu.addPopupMenuListener(new PopupMenuListener() { menu.addPopupMenuListener(new PopupMenuListener() {
@Override @Override

View file

@ -1,6 +1,8 @@
package mage.client; package mage.client;
import java.awt.*; import java.awt.*;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* GUI: basic class for all full screen frames/tabs (example: game pane, deck editor pane, card viewer, etc) * GUI: basic class for all full screen frames/tabs (example: game pane, deck editor pane, card viewer, etc)
@ -10,8 +12,12 @@
public abstract class MagePane extends javax.swing.JLayeredPane { public abstract class MagePane extends javax.swing.JLayeredPane {
private String title = "no title set"; private String title = "no title set";
protected final int createdOrder;
private static final AtomicInteger createdOrderGenerator = new AtomicInteger();
public MagePane() { public MagePane() {
this.createdOrder = createdOrderGenerator.incrementAndGet();
initComponents(); initComponents();
} }
@ -49,6 +55,18 @@
return this; return this;
} }
/**
* GUI components sorting, e.g. in main menu switch panels
*/
public int getSortOrder() {
return this.createdOrder;
}
/**
* For game panels only: return assigned table id
*/
abstract public UUID getSortTableId();
/** /**
* Active table: game pane, deck editor in sideboarding mode, etc * Active table: game pane, deck editor in sideboarding mode, etc
* Non active table: client side panes like card viewer, deck viewer, etc * Non active table: client side panes like card viewer, deck viewer, etc

View file

@ -123,4 +123,15 @@ public class TablesPane extends MagePane {
tablesPanel.setTableFilter(); tablesPanel.setTableFilter();
} }
} }
@Override
public UUID getSortTableId() {
return null;
}
@Override
public int getSortOrder() {
// lobby must be first all the time
return 0;
}
} }