mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-25 05:06:45 +00:00
When entering mnemonic words, don't close dropdown when a prefix is encountered, and move focus to the next field upon completion
This commit is contained in:
parent
3ae63408e6
commit
4cbde7e7aa
1 changed files with 24 additions and 8 deletions
|
@ -36,7 +36,6 @@ import java.security.NoSuchAlgorithmException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
|
@ -159,15 +158,20 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
|
|
||||||
ObservableList<String> wordEntryList = FXCollections.observableArrayList(words);
|
ObservableList<String> wordEntryList = FXCollections.observableArrayList(words);
|
||||||
wordEntriesProperty = new SimpleListProperty<>(wordEntryList);
|
wordEntriesProperty = new SimpleListProperty<>(wordEntryList);
|
||||||
|
List<WordEntry> wordEntries = new ArrayList<>(numWords);
|
||||||
for(int i = 0; i < numWords; i++) {
|
for(int i = 0; i < numWords; i++) {
|
||||||
WordEntry wordEntry = new WordEntry(i, wordEntryList);
|
wordEntries.add(new WordEntry(i, wordEntryList));
|
||||||
wordsPane.getChildren().add(wordEntry);
|
|
||||||
}
|
}
|
||||||
|
for(int i = 0; i < numWords - 1; i++) {
|
||||||
|
wordEntries.get(i).setNext(wordEntries.get(i + 1).getEditor());
|
||||||
|
}
|
||||||
|
wordsPane.getChildren().addAll(wordEntries);
|
||||||
|
|
||||||
vBox.getChildren().add(wordsPane);
|
vBox.getChildren().add(wordsPane);
|
||||||
|
|
||||||
if(!displayWordsOnly) {
|
if(!displayWordsOnly) {
|
||||||
PassphraseEntry passphraseEntry = new PassphraseEntry();
|
PassphraseEntry passphraseEntry = new PassphraseEntry();
|
||||||
|
wordEntries.get(wordEntries.size() - 1).setNext(passphraseEntry.getEditor());
|
||||||
passphraseEntry.setPadding(new Insets(0, 26, 10, 10));
|
passphraseEntry.setPadding(new Insets(0, 26, 10, 10));
|
||||||
vBox.getChildren().add(passphraseEntry);
|
vBox.getChildren().add(passphraseEntry);
|
||||||
|
|
||||||
|
@ -397,6 +401,7 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
private static class WordEntry extends HBox {
|
private static class WordEntry extends HBox {
|
||||||
private static List<String> wordList;
|
private static List<String> wordList;
|
||||||
private final TextField wordField;
|
private final TextField wordField;
|
||||||
|
private Node next;
|
||||||
|
|
||||||
public WordEntry(int wordNumber, ObservableList<String> wordEntryList) {
|
public WordEntry(int wordNumber, ObservableList<String> wordEntryList) {
|
||||||
super();
|
super();
|
||||||
|
@ -425,6 +430,11 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
wordList = Bip39MnemonicCode.INSTANCE.getWordList();
|
wordList = Bip39MnemonicCode.INSTANCE.getWordList();
|
||||||
AutoCompletionBinding<String> autoCompletionBinding = TextFields.bindAutoCompletion(wordField, new WordlistSuggestionProvider(wordList));
|
AutoCompletionBinding<String> autoCompletionBinding = TextFields.bindAutoCompletion(wordField, new WordlistSuggestionProvider(wordList));
|
||||||
autoCompletionBinding.setDelay(50);
|
autoCompletionBinding.setDelay(50);
|
||||||
|
autoCompletionBinding.setOnAutoCompleted(event -> {
|
||||||
|
if (next != null) {
|
||||||
|
next.requestFocus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ValidationSupport validationSupport = new ValidationSupport();
|
ValidationSupport validationSupport = new ValidationSupport();
|
||||||
validationSupport.setValidationDecorator(new StyleClassValidationDecoration());
|
validationSupport.setValidationDecorator(new StyleClassValidationDecoration());
|
||||||
|
@ -444,6 +454,10 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
return wordField;
|
return wordField;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setNext(Node node) {
|
||||||
|
next = node;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isValid(String word) {
|
public static boolean isValid(String word) {
|
||||||
return wordList.contains(word);
|
return wordList.contains(word);
|
||||||
}
|
}
|
||||||
|
@ -461,10 +475,6 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
List<String> suggestions = new ArrayList<>();
|
List<String> suggestions = new ArrayList<>();
|
||||||
if(!request.getUserText().isEmpty()) {
|
if(!request.getUserText().isEmpty()) {
|
||||||
for(String word : wordList) {
|
for(String word : wordList) {
|
||||||
if(word.equals(request.getUserText())) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(word.startsWith(request.getUserText())) {
|
if(word.startsWith(request.getUserText())) {
|
||||||
suggestions.add(word);
|
suggestions.add(word);
|
||||||
}
|
}
|
||||||
|
@ -476,13 +486,15 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class PassphraseEntry extends HBox {
|
private class PassphraseEntry extends HBox {
|
||||||
|
private final CustomTextField passphraseField;
|
||||||
|
|
||||||
public PassphraseEntry() {
|
public PassphraseEntry() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
setAlignment(Pos.CENTER_LEFT);
|
setAlignment(Pos.CENTER_LEFT);
|
||||||
setSpacing(10);
|
setSpacing(10);
|
||||||
Label passphraseLabel = new Label("Passphrase:");
|
Label passphraseLabel = new Label("Passphrase:");
|
||||||
CustomTextField passphraseField = (CustomTextField) TextFields.createClearableTextField();
|
passphraseField = (CustomTextField) TextFields.createClearableTextField();
|
||||||
passphraseProperty.bind(passphraseField.textProperty());
|
passphraseProperty.bind(passphraseField.textProperty());
|
||||||
passphraseField.setPromptText("Leave blank for none");
|
passphraseField.setPromptText("Leave blank for none");
|
||||||
|
|
||||||
|
@ -492,6 +504,10 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
|
||||||
|
|
||||||
getChildren().addAll(passphraseLabel, passphraseField, helpLabel);
|
getChildren().addAll(passphraseLabel, passphraseField, helpLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TextField getEditor() {
|
||||||
|
return passphraseField;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Node getDerivationEntry(List<ChildNumber> derivation) {
|
private Node getDerivationEntry(List<ChildNumber> derivation) {
|
||||||
|
|
Loading…
Reference in a new issue