mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-08-14 01:15:44 -04:00
restore last combo box selection on focus out
This commit is contained in:
parent
8f505ab17b
commit
10347ae488
4 changed files with 38 additions and 9 deletions
|
@ -46,6 +46,7 @@ public class AutocompleteComboBox<T> extends JFXComboBox<T> {
|
||||||
private List<T> matchingList;
|
private List<T> matchingList;
|
||||||
private JFXComboBoxListViewSkin<T> comboBoxListViewSkin;
|
private JFXComboBoxListViewSkin<T> comboBoxListViewSkin;
|
||||||
private boolean selectAllShortcut = false;
|
private boolean selectAllShortcut = false;
|
||||||
|
private T lastCommittedValue;
|
||||||
|
|
||||||
public AutocompleteComboBox() {
|
public AutocompleteComboBox() {
|
||||||
this(FXCollections.observableArrayList());
|
this(FXCollections.observableArrayList());
|
||||||
|
@ -59,6 +60,30 @@ public class AutocompleteComboBox<T> extends JFXComboBox<T> {
|
||||||
fixSpaceKey();
|
fixSpaceKey();
|
||||||
setAutocompleteItems(items);
|
setAutocompleteItems(items);
|
||||||
reactToQueryChanges();
|
reactToQueryChanges();
|
||||||
|
|
||||||
|
// Store last committed value so we can restore it if nothing selected
|
||||||
|
valueProperty().addListener((obs, oldVal, newVal) -> {
|
||||||
|
if (newVal != null)
|
||||||
|
lastCommittedValue = newVal;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Restore last committed value when editor loses focus if no matches
|
||||||
|
getEditor().focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
|
||||||
|
if (!isNowFocused) {
|
||||||
|
String input = getEditor().getText();
|
||||||
|
T matched = getConverter().fromString(input);
|
||||||
|
|
||||||
|
boolean matchFound = getItems().stream()
|
||||||
|
.anyMatch(item -> item.equals(matched));
|
||||||
|
|
||||||
|
if (!matchFound) {
|
||||||
|
UserThread.execute(() -> {
|
||||||
|
getSelectionModel().select(lastCommittedValue);
|
||||||
|
getEditor().setText(asString(lastCommittedValue));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -100,10 +125,16 @@ public class AutocompleteComboBox<T> extends JFXComboBox<T> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Case 2: fire if the text is empty to support special "show all" case
|
// Case 2: fire if the text is empty
|
||||||
if (inputText.isEmpty()) {
|
if (inputText.isEmpty()) {
|
||||||
eh.handle(e);
|
eh.handle(e);
|
||||||
getParent().requestFocus();
|
getParent().requestFocus();
|
||||||
|
|
||||||
|
// Restore the last committed value
|
||||||
|
UserThread.execute(() -> {
|
||||||
|
getSelectionModel().select(lastCommittedValue);
|
||||||
|
getEditor().setText(asString(lastCommittedValue));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -501,6 +501,8 @@ public class TraditionalAccountsView extends PaymentAccountsView<GridPane, Tradi
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
paymentMethodComboBox.setOnChangeConfirmed(e -> {
|
paymentMethodComboBox.setOnChangeConfirmed(e -> {
|
||||||
|
if (paymentMethodComboBox.getEditor().getText().isEmpty())
|
||||||
|
return;
|
||||||
if (paymentMethodForm != null) {
|
if (paymentMethodForm != null) {
|
||||||
FormBuilder.removeRowsFromGridPane(root, 3, paymentMethodForm.getGridRow() + 1);
|
FormBuilder.removeRowsFromGridPane(root, 3, paymentMethodForm.getGridRow() + 1);
|
||||||
GridPane.setRowSpan(accountTitledGroupBg, paymentMethodForm.getRowSpan() + 1);
|
GridPane.setRowSpan(accountTitledGroupBg, paymentMethodForm.getRowSpan() + 1);
|
||||||
|
|
|
@ -116,15 +116,11 @@ public class TradesChartsView extends ActivatableViewAndModel<VBox, TradesCharts
|
||||||
if (comboBox.getItems().isEmpty())
|
if (comboBox.getItems().isEmpty())
|
||||||
return null;
|
return null;
|
||||||
if (query.isEmpty())
|
if (query.isEmpty())
|
||||||
return specialShowAllItem();
|
return null;
|
||||||
return comboBox.getItems().stream().
|
return comboBox.getItems().stream().
|
||||||
filter(currencyItem -> currencyItem.codeDashNameString().equals(query)).
|
filter(currencyItem -> currencyItem.codeDashNameString().equals(query)).
|
||||||
findAny().orElse(null);
|
findAny().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CurrencyListItem specialShowAllItem() {
|
|
||||||
return comboBox.getItems().get(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private final User user;
|
private final User user;
|
||||||
|
@ -291,7 +287,7 @@ public class TradesChartsView extends ActivatableViewAndModel<VBox, TradesCharts
|
||||||
|
|
||||||
currencyComboBox.setOnChangeConfirmed(e -> UserThread.execute(() -> {
|
currencyComboBox.setOnChangeConfirmed(e -> UserThread.execute(() -> {
|
||||||
if (currencyComboBox.getEditor().getText().isEmpty())
|
if (currencyComboBox.getEditor().getText().isEmpty())
|
||||||
currencyComboBox.getSelectionModel().select(SHOW_ALL);
|
return;
|
||||||
CurrencyListItem selectedItem = currencyComboBox.getSelectionModel().getSelectedItem();
|
CurrencyListItem selectedItem = currencyComboBox.getSelectionModel().getSelectedItem();
|
||||||
if (selectedItem != null) {
|
if (selectedItem != null) {
|
||||||
model.onSetTradeCurrency(selectedItem.tradeCurrency);
|
model.onSetTradeCurrency(selectedItem.tradeCurrency);
|
||||||
|
|
|
@ -347,7 +347,7 @@ abstract public class OfferBookView<R extends GridPane, M extends OfferBookViewM
|
||||||
|
|
||||||
currencyComboBox.setOnChangeConfirmed(e -> {
|
currencyComboBox.setOnChangeConfirmed(e -> {
|
||||||
if (currencyComboBox.getEditor().getText().isEmpty())
|
if (currencyComboBox.getEditor().getText().isEmpty())
|
||||||
currencyComboBox.getSelectionModel().select(SHOW_ALL);
|
return;
|
||||||
model.onSetTradeCurrency(currencyComboBox.getSelectionModel().getSelectedItem());
|
model.onSetTradeCurrency(currencyComboBox.getSelectionModel().getSelectedItem());
|
||||||
paymentMethodComboBox.setAutocompleteItems(model.getPaymentMethods());
|
paymentMethodComboBox.setAutocompleteItems(model.getPaymentMethods());
|
||||||
model.updateSelectedPaymentMethod();
|
model.updateSelectedPaymentMethod();
|
||||||
|
@ -500,7 +500,7 @@ abstract public class OfferBookView<R extends GridPane, M extends OfferBookViewM
|
||||||
if (comboBox.getItems().isEmpty())
|
if (comboBox.getItems().isEmpty())
|
||||||
return null;
|
return null;
|
||||||
if (query.isEmpty())
|
if (query.isEmpty())
|
||||||
return specialShowAllItem();
|
return null;
|
||||||
return comboBox.getItems().stream().
|
return comboBox.getItems().stream().
|
||||||
filter(item -> asString(item).equals(query)).
|
filter(item -> asString(item).equals(query)).
|
||||||
findAny().orElse(null);
|
findAny().orElse(null);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue