mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-25 05:06:45 +00:00
various minor ui improvements
This commit is contained in:
parent
4078c61d6b
commit
211e5952aa
10 changed files with 60 additions and 10 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) }
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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." />
|
||||||
|
|
Loading…
Reference in a new issue