various minor ui improvements

This commit is contained in:
Craig Raw 2021-03-17 11:39:46 +02:00
parent 4078c61d6b
commit 211e5952aa
10 changed files with 60 additions and 10 deletions

View file

@ -75,6 +75,7 @@ public class AppController implements Initializable {
public static final String DRAG_OVER_CLASS = "drag-over"; public static final String DRAG_OVER_CLASS = "drag-over";
public static final double TAB_LABEL_GRAPHIC_OPACITY_INACTIVE = 0.8; public static final double TAB_LABEL_GRAPHIC_OPACITY_INACTIVE = 0.8;
public static final double TAB_LABEL_GRAPHIC_OPACITY_ACTIVE = 0.95; public static final double TAB_LABEL_GRAPHIC_OPACITY_ACTIVE = 0.95;
public static final String LOADING_TRANSACTIONS_MESSAGE = "Loading wallet, select Transactions tab to view...";
@FXML @FXML
private MenuItem saveTransaction; private MenuItem saveTransaction;
@ -1356,6 +1357,7 @@ public class AppController implements Initializable {
@Subscribe @Subscribe
public void versionUpdated(VersionUpdatedEvent event) { public void versionUpdated(VersionUpdatedEvent event) {
Hyperlink versionUpdateLabel = new Hyperlink("Sparrow " + event.getVersion() + " available"); Hyperlink versionUpdateLabel = new Hyperlink("Sparrow " + event.getVersion() + " available");
versionUpdateLabel.getStyleClass().add("version-hyperlink");
versionUpdateLabel.setOnAction(event1 -> { versionUpdateLabel.setOnAction(event1 -> {
AppServices.get().getApplication().getHostServices().showDocument("https://www.sparrowwallet.com/download"); AppServices.get().getApplication().getHostServices().showDocument("https://www.sparrowwallet.com/download");
}); });
@ -1449,7 +1451,7 @@ public class AppController implements Initializable {
@Subscribe @Subscribe
public void walletTabsClosed(WalletTabsClosedEvent event) { public void walletTabsClosed(WalletTabsClosedEvent event) {
if(event.getClosedWalletTabData().stream().map(WalletTabData::getWallet).anyMatch(loadingWallets::remove) && loadingWallets.isEmpty()) { if(event.getClosedWalletTabData().stream().map(WalletTabData::getWallet).anyMatch(loadingWallets::remove) && loadingWallets.isEmpty()) {
if(statusBar.getText().equals("Loading transactions...")) { if(statusBar.getText().equals(LOADING_TRANSACTIONS_MESSAGE)) {
statusBar.setText(""); statusBar.setText("");
} }
if(statusTimeline == null || statusTimeline.getStatus() != Animation.Status.RUNNING) { if(statusTimeline == null || statusTimeline.getStatus() != Animation.Status.RUNNING) {
@ -1471,7 +1473,7 @@ public class AppController implements Initializable {
public void walletHistoryStarted(WalletHistoryStartedEvent event) { public void walletHistoryStarted(WalletHistoryStartedEvent event) {
if(AppServices.isConnected() && getOpenWallets().containsKey(event.getWallet())) { if(AppServices.isConnected() && getOpenWallets().containsKey(event.getWallet())) {
if(event.getWalletNode() == null && event.getWallet().getTransactions().isEmpty()) { if(event.getWalletNode() == null && event.getWallet().getTransactions().isEmpty()) {
statusUpdated(new StatusEvent("Loading transactions...", 120)); statusUpdated(new StatusEvent(LOADING_TRANSACTIONS_MESSAGE, 120));
if(statusTimeline == null || statusTimeline.getStatus() != Animation.Status.RUNNING) { if(statusTimeline == null || statusTimeline.getStatus() != Animation.Status.RUNNING) {
statusBar.setProgress(-1); statusBar.setProgress(-1);
loadingWallets.add(event.getWallet()); loadingWallets.add(event.getWallet());
@ -1484,7 +1486,7 @@ public class AppController implements Initializable {
@Subscribe @Subscribe
public void walletHistoryFinished(WalletHistoryFinishedEvent event) { public void walletHistoryFinished(WalletHistoryFinishedEvent event) {
if(getOpenWallets().containsKey(event.getWallet())) { if(getOpenWallets().containsKey(event.getWallet())) {
if(statusBar.getText().equals("Loading transactions...")) { if(statusBar.getText().equals(LOADING_TRANSACTIONS_MESSAGE)) {
statusBar.setText(""); statusBar.setText("");
} }
if(statusTimeline == null || statusTimeline.getStatus() != Animation.Status.RUNNING) { if(statusTimeline == null || statusTimeline.getStatus() != Animation.Status.RUNNING) {

View file

@ -392,6 +392,19 @@ public class MnemonicKeystoreImportPane extends TitledDescriptionPane {
label.setAlignment(Pos.CENTER_RIGHT); label.setAlignment(Pos.CENTER_RIGHT);
wordField = new TextField(); wordField = new TextField();
wordField.setMaxWidth(100); wordField.setMaxWidth(100);
TextFormatter<?> formatter = new TextFormatter<>((TextFormatter.Change change) -> {
String text = change.getText();
// if text was added, fix the text to fit the requirements
if(!text.isEmpty()) {
String newText = text.replace(" ", "").toLowerCase();
int carretPos = change.getCaretPosition() - text.length() + newText.length();
change.setText(newText);
// fix caret position based on difference in originally added text and fixed text
change.selectRange(carretPos, carretPos);
}
return change;
});
wordField.setTextFormatter(formatter);
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));

View file

@ -4,6 +4,8 @@ import com.sparrowwallet.sparrow.AppServices;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.NamedArg; import javafx.beans.NamedArg;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority; import javafx.scene.layout.Priority;
@ -18,6 +20,9 @@ public class TextAreaDialog extends Dialog<String> {
public TextAreaDialog(@NamedArg("defaultValue") String defaultValue) { public TextAreaDialog(@NamedArg("defaultValue") String defaultValue) {
final DialogPane dialogPane = getDialogPane(); final DialogPane dialogPane = getDialogPane();
Image image = new Image("/image/sparrow-small.png");
dialogPane.setGraphic(new ImageView(image));
HBox hbox = new HBox(); HBox hbox = new HBox();
this.textArea = new TextArea(defaultValue); this.textArea = new TextArea(defaultValue);
this.textArea.setMaxWidth(Double.MAX_VALUE); this.textArea.setMaxWidth(Double.MAX_VALUE);

View file

@ -252,12 +252,21 @@ public class KeystoreController extends WalletFormController implements Initiali
importButton.setTooltip(new Tooltip(keystore.getSource() == KeystoreSource.SW_WATCH ? "Import a keystore from an external source" : "Replace this keystore with another source")); importButton.setTooltip(new Tooltip(keystore.getSource() == KeystoreSource.SW_WATCH ? "Import a keystore from an external source" : "Replace this keystore with another source"));
boolean editable = (keystore.getSource() == KeystoreSource.SW_WATCH); boolean editable = (keystore.getSource() == KeystoreSource.SW_WATCH);
fingerprint.setEditable(editable); setEditable(fingerprint, editable);
derivation.setEditable(editable); setEditable(derivation, editable);
xpub.setEditable(editable); setEditable(xpub, editable);
scanXpubQR.setVisible(editable); scanXpubQR.setVisible(editable);
} }
private void setEditable(TextInputControl textInputControl, boolean editable) {
textInputControl.setEditable(editable);
if(!editable && !textInputControl.getStyleClass().contains("readonly")) {
textInputControl.getStyleClass().add("readonly");
} else if(editable) {
textInputControl.getStyleClass().remove("readonly");
}
}
private String getTypeLabel(Keystore keystore) { private String getTypeLabel(Keystore keystore) {
switch (keystore.getSource()) { switch (keystore.getSource()) {
case HW_USB: case HW_USB:

View file

@ -276,7 +276,7 @@ public class SettingsController extends WalletFormController implements Initiali
TextAreaDialog dialog = new TextAreaDialog(outputDescriptorString); TextAreaDialog dialog = new TextAreaDialog(outputDescriptorString);
dialog.setTitle("Edit wallet output descriptor"); dialog.setTitle("Edit wallet output descriptor");
dialog.getDialogPane().setHeaderText("Wallet output descriptor:"); dialog.getDialogPane().setHeaderText("The wallet configuration is specified in the output descriptor.\nChanges to the output descriptor will modify the wallet configuration.");
Optional<String> text = dialog.showAndWait(); Optional<String> text = dialog.showAndWait();
if(text.isPresent() && !text.get().isEmpty() && !text.get().equals(outputDescriptorString)) { if(text.isPresent() && !text.get().isEmpty() && !text.get().equals(outputDescriptorString)) {
setDescriptorText(text.get()); setDescriptorText(text.get());

View file

@ -34,6 +34,15 @@
-fx-spacing: 10; -fx-spacing: 10;
} }
.version-hyperlink {
-fx-border-color: transparent;
-fx-text-fill: #1e88cf;
}
.version-hyperlink:visited {
-fx-underline: false;
}
.core-server.toggle-switch:selected .thumb-area { .core-server.toggle-switch:selected .thumb-area {
-fx-background-color: linear-gradient(to bottom, derive(-fx-text-box-border, -20%), derive(-fx-text-box-border, -30%)), linear-gradient(to bottom, derive(#50a14f, 30%), #50a14f); -fx-background-color: linear-gradient(to bottom, derive(-fx-text-box-border, -20%), derive(-fx-text-box-border, -30%)), linear-gradient(to bottom, derive(#50a14f, 30%), #50a14f);
-fx-background-insets: 0, 1; -fx-background-insets: 0, 1;

View file

@ -152,6 +152,14 @@
color-grey: #3e4451; color-grey: #3e4451;
} }
.root .readonly.text-input {
-fx-text-fill: lightgray;
}
.root .descriptor-text {
-fx-fill: lightgray;
}
.root .success { .root .success {
-fx-text-fill: #98c379; -fx-text-fill: #98c379;
} }

View file

@ -1,3 +1,3 @@
.descriptor-text { -fx-fill: -fx-text-inner-color } .descriptor-text { -fx-fill: derive(-fx-text-inner-color, 40%) }
.descriptor-error { -fx-fill: #ca1243 } .descriptor-error { -fx-fill: rgba(202, 18, 67, 0.8) }

View file

@ -128,6 +128,10 @@
-fx-background-color: #116a8d; -fx-background-color: #116a8d;
} }
.readonly.text-input {
-fx-text-fill: derive(-fx-text-inner-color, 40%);
}
.help-label { .help-label {
-fx-padding: 0 0 0 10; -fx-padding: 0 0 0 10;
} }

View file

@ -41,7 +41,7 @@
<TextField fx:id="label" maxWidth="160"/> <TextField fx:id="label" maxWidth="160"/>
</Field> </Field>
<Field text="Master fingerprint:"> <Field text="Master fingerprint:">
<TextField fx:id="fingerprint" maxWidth="80" promptText="00000000"/> <HelpLabel helpText="A master fingerprint is the first 4 bytes of the master public key hash.\nIt is safe to use any valid value (00000000) for Watch Only Wallets." /> <TextField fx:id="fingerprint" maxWidth="80" promptText="00000000"/> <HelpLabel helpText="The master fingerprint uniquely identifies this keystore using the first 4 bytes of the master public key hash.\nIt is safe to use any valid value (00000000) for Watch Only Wallets." />
</Field> </Field>
<Field text="Derivation:"> <Field text="Derivation:">
<TextField fx:id="derivation" maxWidth="200"/> <HelpLabel helpText="The derivation path to the xpub from the master private key.\nFor safety, derivations that match defaults for other script types are not valid." /> <TextField fx:id="derivation" maxWidth="200"/> <HelpLabel helpText="The derivation path to the xpub from the master private key.\nFor safety, derivations that match defaults for other script types are not valid." />