Skip to content

Commit 60f2677

Browse files
committed
Add on-hover selection on Board/Library manager
User testing on skilled devs showed that "buttons appear on click" behaviour is far from being understood. Accessibility features (like moving with Arrow keys) should be untouched.
1 parent a47e626 commit 60f2677

7 files changed

+56
-8
lines changed

app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellEditor.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,12 @@ public Component getTableCellEditorComponent(JTable table, Object value,
7676
ContributedLibrary lib = (ContributedLibrary) chooser.getSelectedItem();
7777
onInstall(lib, editorValue.getInstalled());
7878
});
79-
editorCell.versionToInstallChooser.addItemListener(e -> editorValue
80-
.select((ContributedLibrary) editorCell.versionToInstallChooser
81-
.getSelectedItem()));
79+
editorCell.versionToInstallChooser.addActionListener(e -> {
80+
editorValue.select((ContributedLibrary) editorCell.versionToInstallChooser.getSelectedItem());
81+
if (editorCell.versionToInstallChooser.getSelectedIndex() != 0) {
82+
InstallerTableCell.dropdownSelected(true);
83+
}
84+
});
8285

8386
setEnabled(true);
8487

app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,13 @@ public ContributedLibraryTableCellJPanel(JTable parentTable, Object value,
5454
downgradeChooser.addItem("-");
5555
downgradeChooser.setMaximumSize(new Dimension((int)downgradeChooser.getPreferredSize().getWidth() + 50, (int)downgradeChooser.getPreferredSize().getHeight()));
5656
downgradeChooser.setMinimumSize(new Dimension((int)downgradeChooser.getPreferredSize().getWidth() + 50, (int)downgradeChooser.getPreferredSize().getHeight()));
57-
downgradeChooser.addItemListener(e -> {
57+
downgradeChooser.addActionListener(e -> {
5858
Object selectVersionItem = downgradeChooser.getItemAt(0);
59-
boolean disableDowngrade = (e.getItem() == selectVersionItem);
59+
boolean disableDowngrade = (downgradeChooser.getSelectedItem() == selectVersionItem);
6060
downgradeButton.setEnabled(!disableDowngrade);
61+
if (!disableDowngrade) {
62+
InstallerTableCell.dropdownSelected(true);
63+
}
6164
});
6265

6366
versionToInstallChooser = new JComboBox();

app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public LibraryManagerUI(Frame parent, LibraryInstaller installer) {
117117
@Override
118118
public void actionPerformed(ActionEvent event) {
119119
DropdownItem<ContributedLibrary> selected = (DropdownItem<ContributedLibrary>) typeChooser.getSelectedItem();
120+
previousRowAtPoint = -1;
120121
if (typeFilter == null || !typeFilter.equals(selected)) {
121122
typeFilter = selected.getFilterPredicate();
122123
if (contribTable.getCellEditor() != null) {

app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellEditor.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,12 @@ public Component getTableCellEditorComponent(JTable table, Object _value,
7474
.getSelectedItem();
7575
onInstall(selected, value.getInstalled());
7676
});
77-
cell.versionToInstallChooser.addItemListener(e -> value
78-
.select((ContributedPlatform) cell.versionToInstallChooser
79-
.getSelectedItem()));
77+
cell.versionToInstallChooser.addActionListener(e -> {
78+
value.select((ContributedPlatform) cell.versionToInstallChooser.getSelectedItem());
79+
if (cell.versionToInstallChooser.getSelectedIndex() != 0) {
80+
InstallerTableCell.dropdownSelected(true);
81+
}
82+
});
8083

8184
setEnabled(true);
8285

app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ public ContributedPlatformTableCellJPanel() {
9898
Object selectVersionItem = downgradeChooser.getItemAt(0);
9999
boolean disableDowngrade = (e.getItem() == selectVersionItem);
100100
downgradeButton.setEnabled(!disableDowngrade);
101+
if (!disableDowngrade) {
102+
InstallerTableCell.dropdownSelected(true);
103+
}
101104
});
102105

103106
versionToInstallChooser = new JComboBox();

app/src/cc/arduino/contributions/ui/InstallerJDialog.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import java.awt.event.FocusListener;
4444
import java.awt.event.KeyEvent;
4545
import java.awt.event.WindowEvent;
46+
import java.awt.event.MouseEvent;
47+
import java.awt.event.MouseMotionListener;
4648
import java.util.function.Predicate;
4749
import java.util.stream.Stream;
4850

@@ -88,6 +90,8 @@ public abstract class InstallerJDialog<T> extends JDialog {
8890
private final JButton closeButton;
8991
private final JButton dismissErrorMessageButton;
9092

93+
protected int previousRowAtPoint = -1;
94+
9195
abstract protected FilteredAbstractTableModel<T> createContribModel();
9296

9397
abstract protected TableCellRenderer createCellRenderer();
@@ -118,6 +122,7 @@ public InstallerJDialog(Frame parent, String title, ModalityType applicationModa
118122
filterField = new FilterJTextField(tr("Filter your search...")) {
119123
@Override
120124
protected void onFilter(String[] _filters) {
125+
previousRowAtPoint = -1;
121126
filters = _filters;
122127
if (contribTable.getCellEditor() != null) {
123128
contribTable.getCellEditor().stopCellEditing();
@@ -167,6 +172,25 @@ public void keyReleased(KeyEvent keyEvent) {
167172
}
168173
});
169174

175+
contribTable.addMouseMotionListener(new MouseMotionListener() {
176+
177+
public void mouseDragged(MouseEvent e) {}
178+
179+
public void mouseMoved(MouseEvent e) {
180+
// avoid firing edits events until the mouse changes cell or the user is back on the cell after selecting a dropdown
181+
int rowAtPoint = contribTable.rowAtPoint(e.getPoint());
182+
if (!InstallerTableCell.isDropdownSelected() && rowAtPoint != previousRowAtPoint) {
183+
contribTable.editCellAt(rowAtPoint, 0);
184+
previousRowAtPoint = rowAtPoint;
185+
InstallerTableCell.dropdownSelected(false);
186+
}
187+
if (InstallerTableCell.isDropdownSelected() && rowAtPoint == previousRowAtPoint) {
188+
// back to the original cell, can drop dropdown selector lock
189+
InstallerTableCell.dropdownSelected(false);
190+
}
191+
}
192+
});
193+
170194
{
171195
TableColumnModel tcm = contribTable.getColumnModel();
172196
TableColumn col = tcm.getColumn(0);
@@ -286,6 +310,7 @@ private void setErrorMessageVisible(boolean visible) {
286310
@Override
287311
public void actionPerformed(ActionEvent event) {
288312
DropdownItem<T> selected = (DropdownItem<T>) categoryChooser.getSelectedItem();
313+
previousRowAtPoint = -1;
289314
if (categoryFilter == null || !categoryFilter.equals(selected)) {
290315
categoryFilter = selected.getFilterPredicate();
291316
if (contribTable.getCellEditor() != null) {

app/src/cc/arduino/contributions/ui/InstallerTableCell.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ public abstract class InstallerTableCell extends AbstractCellEditor implements T
4141

4242
abstract public void setEnabled(boolean b);
4343

44+
private static boolean dropdownSelected = false;
45+
46+
public static boolean isDropdownSelected( ) {
47+
return dropdownSelected;
48+
}
49+
50+
public static void dropdownSelected(boolean b) {
51+
dropdownSelected = b;
52+
}
53+
4454
abstract public void setStatus(String s);
4555

4656
public static void setJTextPaneDimensionToFitContainedText(JTextPane jTextPane, int width) {

0 commit comments

Comments
 (0)