Skip to content

Commit 560b732

Browse files
committed
Improve toolbars and fix fuzzy matching against strings w/ whitespace
1 parent 5668e8f commit 560b732

7 files changed

Lines changed: 199 additions & 90 deletions

File tree

‎src/main/java/sc/fiji/snt/PathManagerUI.java‎

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,16 @@ public void setSelectedPaths(final Collection<Path> selectedPaths, final Object
10471047
if (navToolbar != null) navToolbar.selectedPathsChangedElsewhere(selectedPaths);
10481048
tree.clearSelection();
10491049
tree.setSelectedPaths(selectedPaths);
1050+
if (pathAndFillManager.enableUIupdates) {
1051+
final TreePath first = tree.getSelectionPath();
1052+
if (first != null) {
1053+
final Rectangle rowBounds = tree.getPathBounds(first);
1054+
if (rowBounds != null && !tree.getVisibleRect().contains(rowBounds)) {
1055+
rowBounds.height = tree.getVisibleRect().height;
1056+
tree.scrollRectToVisible(rowBounds);
1057+
}
1058+
}
1059+
}
10501060
});
10511061
}
10521062

@@ -1210,6 +1220,10 @@ public JToolBar getProofReadingToolBar() {
12101220
return proofReadingToolBar;
12111221
}
12121222

1223+
public JToolBar getFilteringToolBar() {
1224+
return searchableBar;
1225+
}
1226+
12131227
/**
12141228
* Base class for parallel path-processing helpers (fitting, multispectral
12151229
* refinement, etc.). Encapsulates the shared SwingWorker + ExecutorService
@@ -5420,7 +5434,7 @@ private class NavigationToolBar extends JToolBar {
54205434
private final JToggleButton hideOthersButton;
54215435
private final JToggleButton showAllArborsButton;
54225436
private final JButton sortArborsButton;
5423-
private final JButton nextArborButton;
5437+
private JButton nextArborButton;
54245438
private String arborChoice = null; // currently chosen tree label
54255439
private boolean navSyncGuard = false; // prevents feedback loops between combobox and jtree
54265440

@@ -5437,7 +5451,7 @@ private class NavigationToolBar extends JToolBar {
54375451
this.embeddingParent = scrollPaneOfJTree.getColumnHeader();
54385452
arborChoiceCombo = new JComboBox<>();
54395453
sortArborsButton = sortButton();
5440-
nextArborButton = nextArborButton();
5454+
//nextArborButton = nextArborButton();
54415455
showAllArborsButton = GuiUtils.Buttons.toolbarToggleButton(showAllAction(), "Show all structures",
54425456
IconFactory.GLYPH.EYE, IconFactory.GLYPH.EYE);
54435457
showAllArborsButton.setSelected(true);
@@ -5462,14 +5476,14 @@ private class NavigationToolBar extends JToolBar {
54625476
add(sortArborsButton);
54635477
addSeparator();
54645478
add(arborChoiceCombo);
5465-
add(nextArborButton);
5479+
//add(nextArborButton);
54665480

54675481
// add show all/selected as a group
5468-
add(hideOthersButton);
5469-
add(showAllArborsButton);
54705482
final ButtonGroup group = new ButtonGroup();
54715483
group.add(showAllArborsButton);
54725484
group.add(hideOthersButton);
5485+
add(hideOthersButton);
5486+
add(showAllArborsButton);
54735487
addSeparator();
54745488

54755489
// zoom/go to
@@ -5957,7 +5971,7 @@ private void populateArborChoices() {
59575971
sortArborsButton.setEnabled(!single);
59585972
showAllArborsButton.setEnabled(!single);
59595973
arborChoiceCombo.setEnabled(!single);
5960-
nextArborButton.setEnabled(!single);
5974+
if (nextArborButton!= null) nextArborButton.setEnabled(!single);
59615975
hideOthersButton.setEnabled(!single);
59625976
if (arborChoice != null && labels.contains(arborChoice)) {
59635977
arborChoiceCombo.setSelectedItem(arborChoice);

‎src/main/java/sc/fiji/snt/gui/GuiUtils.java‎

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4629,14 +4629,22 @@ public static OptionsButton ColorTableButton(final float scalingFactor,
46294629
}
46304630

46314631
public static OptionsButton OptionsButton(final IconFactory.GLYPH glyph, final float scalingFactor, final JPopupMenu menu) {
4632-
return new OptionsButton(glyph, scalingFactor, menu);
4632+
return OptionsButton(glyph, scalingFactor, menu, true);
4633+
}
4634+
4635+
public static OptionsButton OptionsButton(final IconFactory.GLYPH glyph, final float scalingFactor, final JPopupMenu menu,
4636+
final boolean dropdownIndicator) {
4637+
return new OptionsButton(glyph, scalingFactor, menu, dropdownIndicator);
46334638
}
46344639

46354640
public static class OptionsButton extends JButton {
46364641
public final JPopupMenu popupMenu;
46374642

4638-
private OptionsButton(final IconFactory.GLYPH glyph, final float scalingFactor, final JPopupMenu popupMenu) {
4639-
super(IconFactory.dropdownMenuIcon(glyph, scalingFactor, IconFactory.defaultColor()));
4643+
private OptionsButton(final IconFactory.GLYPH glyph, final float scalingFactor, final JPopupMenu popupMenu,
4644+
final boolean dropdownIndicator) {
4645+
super( (dropdownIndicator)
4646+
? IconFactory.dropdownMenuIcon(glyph, scalingFactor, IconFactory.defaultColor())
4647+
: IconFactory.buttonIcon(glyph, scalingFactor));
46404648
this.popupMenu = popupMenu;
46414649
setDisabledIcon(IconFactory.dropdownMenuIcon(glyph, scalingFactor, GuiUtils.getDisabledComponentColor()));
46424650
// Store a back-reference so callers can locate this button from the popup alone
@@ -4812,8 +4820,52 @@ else if (current instanceof Container) {
48124820
}
48134821
return null;
48144822
}
4823+
4824+
public static class StackedButton extends JPanel {
4825+
4826+
public final JButton topButton;
4827+
public final JButton bottomButton;
4828+
4829+
public StackedButton(final GLYPH top, final GLYPH bottom,
4830+
final ActionListener topActionListener,
4831+
final ActionListener bottomActionListener) {
4832+
super(new GridLayout(2, 1, 0, 0));
4833+
setOpaque(false);
4834+
setBorder(new JButton().getBorder());
4835+
setFocusable(false);
4836+
topButton = makeHalfButton(top, topActionListener);
4837+
bottomButton = makeHalfButton(bottom, bottomActionListener);
4838+
add(topButton);
4839+
add(bottomButton);
4840+
}
4841+
4842+
private static JButton makeHalfButton(final GLYPH glyph, final ActionListener listener) {
4843+
final JButton btn = new JButton();
4844+
IconFactory.assignIcon(btn, glyph, IconFactory.defaultColor(), getDisabledComponentColor(), 1f);
4845+
if (listener != null) btn.addActionListener(listener);
4846+
btn.setMargin(new Insets(0, 0, 0, 0));
4847+
makeBorderless(btn);
4848+
btn.setFocusable(false);
4849+
return btn;
4850+
}
4851+
4852+
@Override
4853+
public void setToolTipText(final String text) {
4854+
if (topButton != null) topButton.setToolTipText(text);
4855+
if (bottomButton != null) bottomButton.setToolTipText(text);
4856+
}
4857+
4858+
@Override
4859+
public void setEnabled(final boolean enabled) {
4860+
super.setEnabled(enabled);
4861+
if (topButton != null) topButton.setEnabled(enabled);
4862+
if (bottomButton != null) bottomButton.setEnabled(enabled);
4863+
}
4864+
}
4865+
48154866
}
48164867

4868+
48174869
public static class SplitPanes {
48184870

48194871
public static JSplitPane nonDraggableRightSplitPane() {

‎src/main/java/sc/fiji/snt/gui/IconFactory.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import javax.swing.*;
3030
import javax.swing.border.TitledBorder;
3131
import java.awt.*;
32+
import java.util.List;
3233

3334
/**
3435
* A factory for {@link FADerivedIcon}s presets.
@@ -377,7 +378,8 @@ public static void assignIcon(final AbstractButton button, final GLYPH defaultGl
377378
button.setDisabledIcon(buttonIcon(defaultGlyph, GuiUtils.getDisabledComponentColor(), scalingFactor));
378379
if (button instanceof JToggleButton && selectedGlyph != null) {
379380
button.setSelectedIcon(buttonIcon(selectedGlyph, selectedColor(), scalingFactor));
380-
button.setDisabledSelectedIcon(buttonIcon(selectedGlyph, GuiUtils.getDisabledComponentColor(), scalingFactor));
381+
button.setDisabledSelectedIcon(buttonIcon(selectedGlyph,
382+
SNTColor.average(List.of(GuiUtils.getDisabledComponentColor(), selectedColor())), scalingFactor));
381383
}
382384
}
383385

‎src/main/java/sc/fiji/snt/gui/PathManagerUISearchableBar.java‎

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,9 @@ public PathManagerUISearchableBar(final PathManagerUI pmui) {
7272
_extraButtons.add(createMorphoFilteringButton());
7373
_extraButtons.add(createSubFilteringButton());
7474
setVisibleButtons(SHOW_NAVIGATION | SHOW_STATUS | SHOW_HIGHLIGHTS);
75-
setStatusLabelPlaceholder(String.format("%d Path(s) listed", pmui
76-
.getPathAndFillManager().size()));
77-
_highlightsButton.setToolTipText("Highlight all: Auto-select paths matching filtered text");
78-
//setBorderless();
75+
setStatusLabelPlaceholder(String.format("%d Path(s) listed", pmui.getPathAndFillManager().size()));
76+
_highlightsButton.setToolTipText("Select all paths matching the current search");
77+
_highlightsButton.setActionCommand("Select all paths matching the current search"); // to be displayed in SNTCommandFinder
7978
}
8079

8180
@Override
@@ -423,9 +422,6 @@ public void doMorphoFiltering(final Collection<Path> paths, final String proper
423422
}
424423

425424
private JButton createMorphoFilteringButton() {
426-
final JButton button = new JButton();
427-
formatButton(button, IconFactory.GLYPH.RULER);
428-
button.setToolTipText("Filter by morphometry or image properties");
429425
final JPopupMenu popup = new JPopupMenu();
430426
GuiUtils.addSeparator(popup, "Morphometric Traits:");
431427
for (final Component component : getMorphoFilterMenu().getMenuComponents()) {
@@ -435,34 +431,35 @@ private JButton createMorphoFilteringButton() {
435431
for (final Component component : getImageFilterMenu().getMenuComponents()) {
436432
popup.add(component);
437433
}
438-
button.addActionListener(e -> popup.show(button, button.getWidth() / 2,
439-
button.getHeight() / 2));
434+
final JButton button = GuiUtils.Buttons.OptionsButton(IconFactory.GLYPH.RULER, 1.2f, popup, false);
435+
button.setToolTipText("Filter by morphometry or image properties");
440436
return button;
441437
}
442438

443439
private JButton createTagFilteringButton() {
444440
final JButton button = new JButton();
445441
formatButton(button, IconFactory.GLYPH.TAG);
446442
button.setToolTipText("Filter by custom tags");
443+
button.setActionCommand("Filter by custom tags"); // to be displayed in SNTCommandFinder
447444
button.addActionListener(e -> doTagFiltering());
448445
return button;
449446
}
450447

451448
private JButton createColorFilteringButton() {
452-
final JButton button = new JButton();
453-
formatButton(button, IconFactory.GLYPH.COLOR);
454449
final ColorMenu colorFilterMenu = getColorFilterMenu();
455-
button.setToolTipText(colorFilterMenu.getText());
456450
final JPopupMenu popupMenu = colorFilterMenu.getPopupMenu();
457451
popupMenu.setInvoker(colorFilterMenu);
458-
button.addActionListener( e -> popupMenu.show(button, button.getWidth() / 2, button.getHeight() / 2));
452+
final JButton button = GuiUtils.Buttons.OptionsButton(IconFactory.GLYPH.COLOR, 1.2f, popupMenu, false);
453+
button.setToolTipText(colorFilterMenu.getText());
454+
button.putClientProperty("cmdFinder-ignore", "true"); // cmdFinder cannot do much with it
459455
return button;
460456
}
461457

462458
private JButton createSWCTypeFilteringButton() {
463459
final JButton button = new JButton();
464460
formatButton(button, IconFactory.GLYPH.ID);
465461
button.setToolTipText("Filter by SWC-type(s)");
462+
button.setActionCommand("Filter by SWC-type(s)"); // to be displayed in SNTCommandFinder
466463
button.addActionListener(e -> {
467464
final Collection<Path> paths = getPaths();
468465
if (paths.isEmpty()) {

0 commit comments

Comments
 (0)