Skip to content

Commit 091dcba

Browse files
Advanced options sidebar separates per-session from global settings better
1 parent 21a42b9 commit 091dcba

2 files changed

Lines changed: 54 additions & 30 deletions

File tree

Framework/Stratus/src/main/java/org/peakaboo/framework/stratus/components/ui/options/OptionSidebar.java

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.function.Consumer;
99

1010
import javax.swing.DefaultListModel;
11+
import javax.swing.DefaultListSelectionModel;
1112
import javax.swing.ImageIcon;
1213
import javax.swing.JLabel;
1314
import javax.swing.JList;
@@ -31,6 +32,7 @@ public static class Entry {
3132
String name;
3233
Optional<ImageIcon> icon;
3334
public boolean trailingSeparator = false;
35+
public boolean isHeading = false;
3436
public Entry(String name) {
3537
this.name = name;
3638
this.icon = Optional.empty();
@@ -42,6 +44,10 @@ public Entry(String name, ImageIcon icon) {
4244
public String getName() {
4345
return name;
4446
}
47+
public Entry setHeading(boolean isHeading) {
48+
this.isHeading = isHeading;
49+
return this;
50+
}
4551

4652
}
4753

@@ -65,11 +71,25 @@ public Widget() {
6571
@Override
6672
protected void onSetValue(Entry entry, boolean selected) {
6773
label.setText(entry.name);
68-
label.setForeground(this.getForeground());
69-
if (entry.icon.isPresent()) {
70-
label.setIcon(IconFactory.recolour(entry.icon.get(), this.getForeground()));
71-
} else {
74+
75+
if (entry.isHeading) {
76+
selected = false;
77+
this.setOpaque(false);
78+
label.setForeground(StratusColour.moreTransparent(this.getForeground(), 0.4f));
79+
label.setFont(label.getFont().deriveFont(11f));
80+
label.setBorder(new javax.swing.border.EmptyBorder(Spacing.huge, Spacing.huge, Spacing.small, Spacing.huge));
81+
label.setIconTextGap(0);
7282
label.setIcon(null);
83+
} else {
84+
label.setForeground(this.getForeground());
85+
label.setFont(label.getFont().deriveFont(14f));
86+
label.setBorder(Spacing.bHuge());
87+
label.setIconTextGap(Spacing.huge);
88+
if (entry.icon.isPresent()) {
89+
label.setIcon(IconFactory.recolour(entry.icon.get(), this.getForeground()));
90+
} else {
91+
label.setIcon(null);
92+
}
7393
}
7494

7595
if (entry.trailingSeparator) {
@@ -93,17 +113,28 @@ public OptionSidebar(List<Entry> entries, Consumer<Entry> selectionCallback) {
93113
list = new JList<>(model);
94114
list.setSelectionBackground(selectionBg);
95115
list.setSelectionForeground(selectionFg);
116+
list.setSelectionModel(new DefaultListSelectionModel() {
117+
@Override
118+
public void setSelectionInterval(int index0, int index1) {
119+
if (index0 == index1 && index0 >= 0 && index0 < entries.size() && entries.get(index0).isHeading) {
120+
return; // Disallow selecting this item
121+
}
122+
super.setSelectionInterval(index0, index1);
123+
}
124+
});
96125
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
97126
StencilListCellRenderer<Entry> cellRenderer = new StencilListCellRenderer<>(new Widget());
98127
list.setCellRenderer(cellRenderer);
99128
list.addListSelectionListener(new ListSelectionListener() {
100-
101129
@Override
102130
public void valueChanged(ListSelectionEvent event) {
103131
if (event.getValueIsAdjusting()) {
104132
return;
105133
}
106-
selectionCallback.accept(entries.get(list.getSelectedIndex()));
134+
int idx = list.getSelectedIndex();
135+
if (idx >= 0) {
136+
selectionCallback.accept(entries.get(idx));
137+
}
107138
}
108139
});
109140

SwingUI/src/main/java/org/peakaboo/ui/swing/options/AdvancedOptionsPanel.java

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -82,63 +82,65 @@ public Dimension getPreferredSize() {
8282
final String SETTING_PER_DATASET = "Per-Session Settings";
8383
final String SETTING_PER_USER = "Global Settings";
8484

85+
var entries = new ArrayList<Entry>();
86+
entries.add(new OptionSidebar.Entry(SETTING_PER_DATASET).setHeading(true));
87+
8588
String KEY_DETECTOR = "Detector";
8689
OptionBlocksPanel detectorPanel = makeDetectorPanel(controller);
8790
detectorPanel.setEnabled(hasdata);
88-
body.add(wrapSettingsInfo(detectorPanel, SETTING_PER_DATASET), KEY_DETECTOR);
91+
body.add(detectorPanel, KEY_DETECTOR);
8992
OptionSidebar.Entry detectorEntry = new OptionSidebar.Entry(KEY_DETECTOR, IconFactory.getImageIcon(PeakabooIcons.OPTIONS_DETECTOR, IconSize.TOOLBAR_SMALL));
93+
entries.add(detectorEntry);
9094

9195
String KEY_PEAKMODEL = "Peak Model";
9296
OptionBlocksPanel peakPanel = makePeakModelPanel(controller);
9397
peakPanel.setEnabled(hasdata);
94-
body.add(wrapSettingsInfo(peakPanel, SETTING_PER_DATASET), KEY_PEAKMODEL);
98+
body.add(peakPanel, KEY_PEAKMODEL);
9599
OptionSidebar.Entry peakEntry = new OptionSidebar.Entry(KEY_PEAKMODEL, IconFactory.getImageIcon(PeakabooIcons.OPTIONS_PEAKMODEL, IconSize.TOOLBAR_SMALL));
100+
entries.add(peakEntry);
96101

97102
String KEY_CURVEFIT = "Curve Fitting";
98103
OptionBlocksPanel curvefitPanel = makeCurvefitPanel(controller);
99104
curvefitPanel.setEnabled(hasdata);
100-
body.add(wrapSettingsInfo(curvefitPanel, SETTING_PER_DATASET), KEY_CURVEFIT);
105+
body.add(curvefitPanel, KEY_CURVEFIT);
101106
OptionSidebar.Entry curvefitEntry = new OptionSidebar.Entry(KEY_CURVEFIT, IconFactory.getImageIcon(PeakabooIcons.OPTIONS_CURVEFIT, IconSize.TOOLBAR_SMALL));
107+
entries.add(curvefitEntry);
102108

103109
String KEY_OVERLAP = "Overlap Solving";
104110
OptionBlocksPanel overlapPanel = makeOverlapPanel(controller);
105111
overlapPanel.setEnabled(hasdata);
106-
body.add(wrapSettingsInfo(overlapPanel, SETTING_PER_DATASET), KEY_OVERLAP);
112+
body.add(overlapPanel, KEY_OVERLAP);
107113
OptionSidebar.Entry overlapEntry = new OptionSidebar.Entry(KEY_OVERLAP, IconFactory.getImageIcon(PeakabooIcons.OPTIONS_SOLVER, IconSize.TOOLBAR_SMALL));
114+
entries.add(overlapEntry);
108115

109-
var entries = new ArrayList<Entry>();
110-
entries.addAll(List.of(detectorEntry, peakEntry, curvefitEntry, overlapEntry));
111-
112116
for (TierUIAutoGroup<PlotController> item : Tier.provider().getAdvancedOptions()) {
113117
Group group = item.getValue();
114118
String groupKey = group.getName();
115119
JComponent groupPanel = SwingLayoutFactory.forGroup(group).getComponent();
116-
body.add(wrapSettingsInfo(groupPanel, SETTING_PER_DATASET), groupKey);
120+
body.add(groupPanel, groupKey);
117121
OptionSidebar.Entry itemEntry = new OptionSidebar.Entry(groupKey, IconFactory.getImageIcon(Tier.provider().iconPath(), item.getIconPath(), IconSize.TOOLBAR_SMALL));
118122
entries.add(itemEntry);
119123
}
120124

121-
//separator between dataset-focused options and app options
122-
entries.get(entries.size()-1).trailingSeparator = true;
123-
125+
entries.add(new OptionSidebar.Entry(SETTING_PER_USER).setHeading(true));
124126

125127
String KEY_APP = "Appearance";
126128
OptionBlocksPanel appPanel = makeAppPanel(controller);
127-
body.add(wrapSettingsInfo(appPanel, SETTING_PER_USER), KEY_APP);
129+
body.add(appPanel, KEY_APP);
128130
OptionSidebar.Entry appEntry = new OptionSidebar.Entry(KEY_APP, IconFactory.getImageIcon(PeakabooIcons.OPTIONS_APPEARANCE, IconSize.TOOLBAR_SMALL));
129131
entries.add(appEntry);
130132

131133

132134
String KEY_PERFORMANCE = "Performance";
133135
OptionBlocksPanel perfPanel = makePerformancePanel(controller);
134-
body.add(wrapSettingsInfo(perfPanel, SETTING_PER_USER), KEY_PERFORMANCE);
136+
body.add(perfPanel, KEY_PERFORMANCE);
135137
OptionSidebar.Entry perfEntry = new OptionSidebar.Entry(KEY_PERFORMANCE, IconFactory.getImageIcon(PeakabooIcons.OPTIONS_PERFORMANCE, IconSize.TOOLBAR_SMALL));
136138
entries.add(perfEntry);
137139

138140

139141
String KEY_ERRORS = "Errors";
140142
OptionBlocksPanel errorsPanel = makeErrorsPanel(controller);
141-
body.add(wrapSettingsInfo(errorsPanel, SETTING_PER_USER), KEY_ERRORS);
143+
body.add(errorsPanel, KEY_ERRORS);
142144
OptionSidebar.Entry errorsEntry = new OptionSidebar.Entry(KEY_ERRORS, IconFactory.getImageIcon(PeakabooIcons.OPTIONS_ERRORS, IconSize.TOOLBAR_SMALL));
143145
entries.add(errorsEntry);
144146

@@ -417,16 +419,7 @@ private <T extends SelfDescribing> OptionBlock makeRadioBlock(List<T> instances,
417419
}
418420

419421

420-
private ClearPanel wrapSettingsInfo(JComponent panel, String info) {
421-
var label = new JLabel(info, SwingConstants.CENTER);
422-
label.setForeground(Stratus.getTheme().getPalette().getColour("Dark", "1"));
423-
label.setFont(label.getFont().deriveFont(11f));
424-
425-
var wrap = new ClearPanel(new BorderLayout());
426-
wrap.add(panel, BorderLayout.CENTER);
427-
wrap.add(label, BorderLayout.SOUTH);
428-
return wrap;
429-
}
422+
430423

431424
private OptionBlocksPanel makeOverlapPanel(PlotController controller) {
432425

0 commit comments

Comments
 (0)