feat(io): SwingIO.choose renders the menu as buttons
This commit is contained in:
@@ -10,7 +10,11 @@ import thb.jeanluc.adventure.io.text.StyledText;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.Box;
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
@@ -342,6 +346,51 @@ public class SwingIO implements GameIO {
|
||||
// The GUI map panel is always visible; nothing extra to do on the 'map' command.
|
||||
}
|
||||
|
||||
@Override
|
||||
public int choose(String title, List<String> options) {
|
||||
// Same EDT↔worker handoff as readLine: the worker blocks on take(),
|
||||
// the EDT (button click / window close) offers the chosen index.
|
||||
LinkedBlockingQueue<Integer> picked = new LinkedBlockingQueue<>();
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
JDialog dialog = new JDialog(frame, title, true);
|
||||
JPanel panel = new JPanel();
|
||||
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
||||
panel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
|
||||
panel.add(new JLabel(title));
|
||||
panel.add(Box.createVerticalStrut(8));
|
||||
for (int i = 0; i < options.size(); i++) {
|
||||
int idx = i;
|
||||
JButton b = new JButton(options.get(i));
|
||||
b.setAlignmentX(0f);
|
||||
b.addActionListener(e -> {
|
||||
dialog.dispose();
|
||||
picked.offer(idx);
|
||||
});
|
||||
panel.add(b);
|
||||
panel.add(Box.createVerticalStrut(4));
|
||||
}
|
||||
// Closing the dialog counts as the last (safe/cancel) option.
|
||||
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
|
||||
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(java.awt.event.WindowEvent e) {
|
||||
dialog.dispose();
|
||||
picked.offer(options.size() - 1);
|
||||
}
|
||||
});
|
||||
dialog.setContentPane(panel);
|
||||
dialog.pack();
|
||||
dialog.setLocationRelativeTo(frame);
|
||||
dialog.setVisible(true);
|
||||
});
|
||||
try {
|
||||
return picked.take();
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
return options.size() - 1;
|
||||
}
|
||||
}
|
||||
|
||||
private void addList(List<Span> spans, List<String> xs, Style st) {
|
||||
for (int i = 0; i < xs.size(); i++) {
|
||||
if (i > 0) {
|
||||
|
||||
Reference in New Issue
Block a user