Skip to content

Commit ce54328

Browse files
replace blink dialog with radio selector
1 parent eecf8ea commit ce54328

File tree

3 files changed

+86
-9
lines changed

3 files changed

+86
-9
lines changed

enigma-swing/src/main/java/org/quiltmc/enigma/gui/element/menu_bar/view/SelectionHighlightMenu.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,24 @@
55
import org.quiltmc.enigma.gui.config.SelectionHighlightSection;
66
import org.quiltmc.enigma.gui.element.IntRangeConfigMenuItem;
77
import org.quiltmc.enigma.gui.element.menu_bar.AbstractEnigmaMenu;
8+
import org.quiltmc.enigma.gui.util.GuiUtil;
89
import org.quiltmc.enigma.util.I18n;
910

11+
import javax.swing.JMenu;
12+
1013
public class SelectionHighlightMenu extends AbstractEnigmaMenu {
11-
private final IntRangeConfigMenuItem blinks;
14+
private final JMenu blinksMenu;
1215
private final IntRangeConfigMenuItem blinkDelay;
1316

1417
protected SelectionHighlightMenu(Gui gui) {
1518
super(gui);
1619

1720
final SelectionHighlightSection config = Config.editor().selectionHighlight;
1821

19-
this.blinks = new IntRangeConfigMenuItem(
20-
gui, config.blinks,
22+
this.blinksMenu = GuiUtil.createIntConfigRadioMenu(
23+
config.blinks,
2124
SelectionHighlightSection.MIN_BLINKS, SelectionHighlightSection.MAX_BLINKS,
22-
"menu.view.selection_highlight.blinks"
25+
this::retranslateBlinksMenu
2326
);
2427

2528
this.blinkDelay = new IntRangeConfigMenuItem(
@@ -28,15 +31,24 @@ protected SelectionHighlightMenu(Gui gui) {
2831
"menu.view.selection_highlight.blink_delay"
2932
);
3033

31-
this.add(this.blinks);
34+
this.add(this.blinksMenu);
3235
this.add(this.blinkDelay);
36+
37+
this.retranslate();
3338
}
3439

3540
@Override
3641
public void retranslate() {
3742
this.setText(I18n.translate("menu.view.selection_highlight"));
3843

39-
this.blinks.retranslate();
44+
this.retranslateBlinksMenu();
4045
this.blinkDelay.retranslate();
4146
}
47+
48+
private void retranslateBlinksMenu() {
49+
this.blinksMenu.setText(I18n.translateFormatted(
50+
"menu.view.selection_highlight.blinks",
51+
Config.editor().selectionHighlight.blinks.value())
52+
);
53+
}
4254
}

enigma-swing/src/main/java/org/quiltmc/enigma/gui/util/GuiUtil.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818
import javax.swing.AbstractButton;
1919
import javax.swing.Action;
2020
import javax.swing.ActionMap;
21+
import javax.swing.ButtonGroup;
2122
import javax.swing.Icon;
2223
import javax.swing.InputMap;
2324
import javax.swing.JCheckBox;
2425
import javax.swing.JCheckBoxMenuItem;
2526
import javax.swing.JComponent;
2627
import javax.swing.JLabel;
28+
import javax.swing.JMenu;
2729
import javax.swing.JPanel;
30+
import javax.swing.JRadioButtonMenuItem;
2831
import javax.swing.JToolTip;
2932
import javax.swing.JTree;
3033
import javax.swing.KeyStroke;
@@ -70,7 +73,10 @@
7073
import java.util.Optional;
7174
import java.util.function.BiConsumer;
7275
import java.util.function.Consumer;
76+
import java.util.function.Function;
7377
import java.util.function.Supplier;
78+
import java.util.stream.Collectors;
79+
import java.util.stream.IntStream;
7480

7581
public final class GuiUtil {
7682
private GuiUtil() {
@@ -472,6 +478,68 @@ private static void syncStateWithConfigImpl(
472478
});
473479
}
474480

481+
/**
482+
* Creates a {@link JMenu} containing one {@linkplain JRadioButtonMenuItem radio item} for each value between the
483+
* passed {@code min} and {@code max}, inclusive.
484+
*
485+
* <p> Listeners are added to keep the selected radio item and the passed {@code config}'s
486+
* {@link TrackedValue#value() value} in sync.
487+
*
488+
* @param config the config value to sync with
489+
* @param min the minimum allowed value
490+
* * this should coincide with any minimum imposed on the passed {@code config}
491+
* @param max the maximum allowed value
492+
* * this should coincide with any maximum imposed on the passed {@code config}
493+
* @param onUpdate a function to run whenever the passed {@code config} changes, whether because a radio item was
494+
* clicked or because another source updated it
495+
*
496+
* @return a newly created menu allowing configuration of the passed {@code config}
497+
*/
498+
public static JMenu createIntConfigRadioMenu(
499+
TrackedValue<Integer> config, int min, int max, Runnable onUpdate
500+
) {
501+
final Map<Integer, JRadioButtonMenuItem> radiosByChoice = IntStream.range(min, max + 1)
502+
.boxed()
503+
.collect(Collectors.toMap(
504+
Function.identity(),
505+
choice -> {
506+
final JRadioButtonMenuItem choiceItem = new JRadioButtonMenuItem();
507+
choiceItem.setText(Integer.toString(choice));
508+
if (choice.equals(config.value())) {
509+
choiceItem.setSelected(true);
510+
}
511+
512+
final int finalChoice = choice;
513+
choiceItem.addActionListener(e -> {
514+
if (!choiceItem.isSelected()) {
515+
config.setValue(finalChoice);
516+
onUpdate.run();
517+
}
518+
});
519+
520+
return choiceItem;
521+
}
522+
));
523+
524+
final ButtonGroup choicesGroup = new ButtonGroup();
525+
final JMenu menu = new JMenu();
526+
for (final JRadioButtonMenuItem radio : radiosByChoice.values()) {
527+
choicesGroup.add(radio);
528+
menu.add(radio);
529+
}
530+
531+
config.registerCallback(updated -> {
532+
final JRadioButtonMenuItem choiceItem = radiosByChoice.get(updated.value());
533+
534+
if (!choiceItem.isSelected()) {
535+
choiceItem.setSelected(true);
536+
onUpdate.run();
537+
}
538+
});
539+
540+
return menu;
541+
}
542+
475543
public enum FocusCondition {
476544
/**
477545
* @see JComponent#WHEN_IN_FOCUSED_WINDOW

enigma/src/main/resources/lang/en_us.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,6 @@
7575
"menu.view.themes.none": "None (JVM Default)",
7676
"menu.view.selection_highlight": "Selection Highlight",
7777
"menu.view.selection_highlight.blinks": "Blink count (%s)",
78-
"menu.view.selection_highlight.blinks.dialog_title": "Blink Count",
79-
"menu.view.selection_highlight.blinks.dialog_explanation":
80-
"The number of times to blink highlighting that indicates an entry that has been navigated to.",
8178
"menu.view.selection_highlight.blink_delay": "Blink delay (%sms)",
8279
"menu.view.selection_highlight.blink_delay.dialog_title": "Blink Delay",
8380
"menu.view.selection_highlight.blink_delay.dialog_explanation":

0 commit comments

Comments
 (0)