Improved language combobox
This commit is contained in:
parent
308f20cb81
commit
8c23ae27e8
@ -16,9 +16,13 @@
|
|||||||
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView;
|
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView;
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.value.ChangeListener;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
|
import javafx.collections.ObservableList;
|
||||||
import javafx.concurrent.Service;
|
import javafx.concurrent.Service;
|
||||||
import javafx.concurrent.Task;
|
import javafx.concurrent.Task;
|
||||||
|
import javafx.event.Event;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.input.KeyCode;
|
||||||
|
import javafx.scene.input.KeyEvent;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
import javafx.fxml.FXMLLoader;
|
import javafx.fxml.FXMLLoader;
|
||||||
import javafx.scene.Parent;
|
import javafx.scene.Parent;
|
||||||
@ -44,6 +48,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class Controller {
|
public class Controller {
|
||||||
|
|
||||||
@ -109,6 +114,9 @@ public class Controller {
|
|||||||
public void initialize() {
|
public void initialize() {
|
||||||
appId_textfield.textProperty().addListener(appIdChangesGameName());
|
appId_textfield.textProperty().addListener(appIdChangesGameName());
|
||||||
language_combobox.setItems(FXCollections.observableArrayList(config.getLanguages()));
|
language_combobox.setItems(FXCollections.observableArrayList(config.getLanguages()));
|
||||||
|
language_combobox.setTooltip(new Tooltip());
|
||||||
|
language_combobox.setEditable(false);
|
||||||
|
new ComboBoxAutoComplete<>(language_combobox);
|
||||||
//retrieveDlcList_button.setDisable(true); // WIP
|
//retrieveDlcList_button.setDisable(true); // WIP
|
||||||
generate_tooltips();
|
generate_tooltips();
|
||||||
fix_dlc_textarea_prompt_text();
|
fix_dlc_textarea_prompt_text();
|
||||||
@ -442,4 +450,62 @@ public class Controller {
|
|||||||
public void resetFromButton() {
|
public void resetFromButton() {
|
||||||
reset(false);
|
reset(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class ComboBoxAutoComplete<T> {
|
||||||
|
|
||||||
|
private ComboBox<T> cmb;
|
||||||
|
String filter = "";
|
||||||
|
private ObservableList<T> originalItems;
|
||||||
|
|
||||||
|
public ComboBoxAutoComplete(ComboBox<T> cmb) {
|
||||||
|
this.cmb = cmb;
|
||||||
|
originalItems = FXCollections.observableArrayList(cmb.getItems());
|
||||||
|
cmb.setTooltip(new Tooltip());
|
||||||
|
cmb.setOnKeyPressed(this::handleOnKeyPressed);
|
||||||
|
cmb.setOnHidden(this::handleOnHiding);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleOnKeyPressed(KeyEvent e) {
|
||||||
|
SingleSelectionModel<T> sm = this.cmb.getSelectionModel();
|
||||||
|
ObservableList<T> filteredList = FXCollections.observableArrayList();
|
||||||
|
KeyCode code = e.getCode();
|
||||||
|
|
||||||
|
if (code.isLetterKey()) {
|
||||||
|
filter += e.getText();
|
||||||
|
}
|
||||||
|
if (code == KeyCode.BACK_SPACE && filter.length() > 0) {
|
||||||
|
filter = filter.substring(0, filter.length() - 1);
|
||||||
|
cmb.getItems().setAll(originalItems);
|
||||||
|
}
|
||||||
|
if (code == KeyCode.ESCAPE) {
|
||||||
|
filter = "";
|
||||||
|
}
|
||||||
|
if (filter.length() == 0) {
|
||||||
|
filteredList = originalItems;
|
||||||
|
cmb.getTooltip().hide();
|
||||||
|
} else {
|
||||||
|
Stream<T> items = cmb.getItems().stream();
|
||||||
|
String txtUsr = filter.toLowerCase();
|
||||||
|
items.filter(el -> el.toString().toLowerCase().contains(txtUsr)).forEach(filteredList::add);
|
||||||
|
cmb.getTooltip().setText(txtUsr);
|
||||||
|
Window stage = cmb.getScene().getWindow();
|
||||||
|
double posX = stage.getX() + cmb.getBoundsInParent().getMinX();
|
||||||
|
double posY = stage.getY() + cmb.getBoundsInParent().getMinY();
|
||||||
|
cmb.getTooltip().show(stage, posX, posY);
|
||||||
|
cmb.show();
|
||||||
|
}
|
||||||
|
cmb.getItems().setAll(filteredList);
|
||||||
|
sm.selectFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleOnHiding(Event e) {
|
||||||
|
filter = "";
|
||||||
|
cmb.getTooltip().hide();
|
||||||
|
T s = cmb.getSelectionModel().getSelectedItem();
|
||||||
|
cmb.getItems().setAll(originalItems);
|
||||||
|
cmb.getSelectionModel().select(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user