diff --git a/build.gradle b/build.gradle index e24e6fed..45d5f124 100644 --- a/build.gradle +++ b/build.gradle @@ -169,7 +169,7 @@ application { "--add-reads=org.flywaydb.core=java.desktop"] if(os.macOsX) { - applicationDefaultJvmArgs += ["-Dprism.lcdtext=false", "-Xdock:name=Sparrow", "-Xdock:icon=/Users/scy/git/sparrow/src/main/resources/sparrow-large.png", + applicationDefaultJvmArgs += ["-Dprism.lcdtext=false", "-Xdock:name=Sparrow", "--add-opens=javafx.graphics/com.sun.glass.ui.mac=centerdevice.nsmenufx"] } if(headless) { diff --git a/src/main/java/com/sparrowwallet/sparrow/AppController.java b/src/main/java/com/sparrowwallet/sparrow/AppController.java index fb55503a..baf5c498 100644 --- a/src/main/java/com/sparrowwallet/sparrow/AppController.java +++ b/src/main/java/com/sparrowwallet/sparrow/AppController.java @@ -2634,7 +2634,6 @@ public class AppController implements Initializable { } }); - Image image = new Image("image/sparrow-small.png", 50, 50, false, false); String walletName = event.getWallet().getFullDisplayName(); if(walletName.length() > 40) { walletName = walletName.substring(0, 40) + "..."; @@ -2643,10 +2642,10 @@ public class AppController implements Initializable { Notifications notificationBuilder = Notifications.create() .title("Sparrow - " + walletName) .text(text) - .graphic(new ImageView(image)) + .graphic(new DialogImage(DialogImage.Type.SPARROW)) .hideAfter(Duration.seconds(15)) .position(Pos.TOP_RIGHT) - .threshold(5, Notifications.create().title("Sparrow").text("Multiple new wallet transactions").graphic(new ImageView(image))) + .threshold(5, Notifications.create().title("Sparrow").text("Multiple new wallet transactions").graphic(new DialogImage(DialogImage.Type.SPARROW))) .onAction(e -> selectTab(event.getWallet())); //If controlsfx can't find our window, we must set the window ourselves (unfortunately notification is then shown within this window) diff --git a/src/main/java/com/sparrowwallet/sparrow/AppServices.java b/src/main/java/com/sparrowwallet/sparrow/AppServices.java index b6f27f87..36222a75 100644 --- a/src/main/java/com/sparrowwallet/sparrow/AppServices.java +++ b/src/main/java/com/sparrowwallet/sparrow/AppServices.java @@ -13,6 +13,7 @@ import com.sparrowwallet.drongo.crypto.InvalidPasswordException; import com.sparrowwallet.drongo.crypto.Key; import com.sparrowwallet.drongo.policy.PolicyType; import com.sparrowwallet.drongo.wallet.*; +import com.sparrowwallet.sparrow.control.DialogImage; import com.sparrowwallet.sparrow.control.WalletPasswordDialog; import com.sparrowwallet.sparrow.glyphfont.FontAwesome5; import com.sparrowwallet.sparrow.net.Auth47; @@ -1095,8 +1096,7 @@ public class AppServices { walletChoiceDialog.initOwner(getActiveWindow()); walletChoiceDialog.setTitle("Choose Wallet"); walletChoiceDialog.setHeaderText("Choose a wallet to " + actionDescription); - Image image = new Image("/image/sparrow-small.png"); - walletChoiceDialog.getDialogPane().setGraphic(new ImageView(image)); + walletChoiceDialog.getDialogPane().setGraphic(new DialogImage(DialogImage.Type.SPARROW)); setStageIcon(walletChoiceDialog.getDialogPane().getScene().getWindow()); moveToActiveWindowScreen(walletChoiceDialog); Optional optWallet = walletChoiceDialog.showAndWait(); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/CardImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/CardImportPane.java index fe466794..03ea3994 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/CardImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/CardImportPane.java @@ -48,7 +48,7 @@ public class CardImportPane extends TitledDescriptionPane { private final SimpleStringProperty pin = new SimpleStringProperty(""); public CardImportPane(Wallet wallet, KeystoreCardImport importer, KeyDerivation requiredDerivation) { - super(importer.getName(), "Place card on reader", importer.getKeystoreImportDescription(getAccount(wallet, requiredDerivation)), "image/" + importer.getWalletModel().getType() + ".png"); + super(importer.getName(), "Place card on reader", importer.getKeystoreImportDescription(getAccount(wallet, requiredDerivation)), importer.getWalletModel()); this.importer = importer; this.derivation = requiredDerivation == null ? wallet.getScriptType().getDefaultDerivation() : requiredDerivation.getDerivation(); } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java index 8077c55c..a74d8ce6 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java @@ -75,7 +75,7 @@ public class DevicePane extends TitledDescriptionPane { private boolean defaultDevice; public DevicePane(Wallet wallet, Device device, boolean defaultDevice, KeyDerivation requiredDerivation) { - super(device.getModel().toDisplayString(), "", "", "image/" + device.getType() + ".png"); + super(device.getModel().toDisplayString(), "", "", device.getModel()); this.deviceOperation = DeviceOperation.IMPORT; this.wallet = wallet; this.psbt = null; @@ -102,7 +102,7 @@ public class DevicePane extends TitledDescriptionPane { } public DevicePane(Wallet wallet, PSBT psbt, Device device, boolean defaultDevice) { - super(device.getModel().toDisplayString(), "", "", "image/" + device.getType() + ".png"); + super(device.getModel().toDisplayString(), "", "", device.getModel()); this.deviceOperation = DeviceOperation.SIGN; this.wallet = wallet; this.psbt = psbt; @@ -129,7 +129,7 @@ public class DevicePane extends TitledDescriptionPane { } public DevicePane(Wallet wallet, OutputDescriptor outputDescriptor, Device device, boolean defaultDevice) { - super(device.getModel().toDisplayString(), "", "", "image/" + device.getType() + ".png"); + super(device.getModel().toDisplayString(), "", "", device.getModel()); this.deviceOperation = DeviceOperation.DISPLAY_ADDRESS; this.wallet = wallet; this.psbt = null; @@ -152,7 +152,7 @@ public class DevicePane extends TitledDescriptionPane { } public DevicePane(Wallet wallet, String message, KeyDerivation keyDerivation, Device device, boolean defaultDevice) { - super(device.getModel().toDisplayString(), "", "", "image/" + device.getType() + ".png"); + super(device.getModel().toDisplayString(), "", "", device.getModel()); this.deviceOperation = DeviceOperation.SIGN_MESSAGE; this.wallet = wallet; this.psbt = null; @@ -179,7 +179,7 @@ public class DevicePane extends TitledDescriptionPane { } public DevicePane(Wallet wallet, List availableAccounts, Device device, boolean defaultDevice) { - super(device.getModel().toDisplayString(), "", "", "image/" + device.getType() + ".png"); + super(device.getModel().toDisplayString(), "", "", device.getModel()); this.deviceOperation = DeviceOperation.DISCOVER_KEYSTORES; this.wallet = wallet; this.psbt = null; @@ -202,7 +202,7 @@ public class DevicePane extends TitledDescriptionPane { } public DevicePane(DeviceOperation deviceOperation, Device device, boolean defaultDevice) { - super(device.getModel().toDisplayString(), "", "", "image/" + device.getType() + ".png"); + super(device.getModel().toDisplayString(), "", "", device.getModel()); this.deviceOperation = deviceOperation; this.wallet = null; this.psbt = null; diff --git a/src/main/java/com/sparrowwallet/sparrow/control/DialogImage.java b/src/main/java/com/sparrowwallet/sparrow/control/DialogImage.java new file mode 100644 index 00000000..3f837d05 --- /dev/null +++ b/src/main/java/com/sparrowwallet/sparrow/control/DialogImage.java @@ -0,0 +1,85 @@ +package com.sparrowwallet.sparrow.control; + +import com.sparrowwallet.sparrow.AppServices; +import com.sparrowwallet.sparrow.Theme; +import com.sparrowwallet.sparrow.io.Config; +import javafx.beans.NamedArg; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.layout.StackPane; +import org.girod.javafx.svgimage.SVGImage; +import org.girod.javafx.svgimage.SVGLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; +import java.util.Locale; + +public class DialogImage extends StackPane { + private static final Logger log = LoggerFactory.getLogger(DialogImage.class); + + public static final int WIDTH = 50; + public static final int HEIGHT = 50; + + public ObjectProperty typeProperty = new SimpleObjectProperty<>(); + + public DialogImage() { + setPrefSize(WIDTH, HEIGHT); + this.typeProperty.addListener((observable, oldValue, type) -> { + refresh(type); + }); + } + + public DialogImage(@NamedArg("type") Type type) { + this(); + this.typeProperty.set(type); + } + + public void refresh() { + Type type = getType(); + refresh(type); + } + + protected void refresh(Type type) { + SVGImage svgImage; + if(Config.get().getTheme() == Theme.DARK) { + svgImage = loadSVGImage("/image/dialog/" + type.name().toLowerCase(Locale.ROOT) + "-invert.svg"); + } else { + svgImage = loadSVGImage("/image/dialog/" + type.name().toLowerCase(Locale.ROOT) + ".svg"); + } + + if(svgImage != null) { + getChildren().clear(); + getChildren().add(svgImage); + } + } + + public Type getType() { + return typeProperty.get(); + } + + public ObjectProperty typeProperty() { + return typeProperty; + } + + public void setType(Type type) { + this.typeProperty.set(type); + } + + private SVGImage loadSVGImage(String imageName) { + try { + URL url = AppServices.class.getResource(imageName); + if(url != null) { + return SVGLoader.load(url); + } + } catch(Exception e) { + log.error("Could not find image " + imageName); + } + + return null; + } + + public enum Type { + SPARROW, SEED, PAYNYM, BORDERWALLETS, USERADD, WHIRLPOOL; + } +} diff --git a/src/main/java/com/sparrowwallet/sparrow/control/DownloadVerifierDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/DownloadVerifierDialog.java index 84624c42..968375e9 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/DownloadVerifierDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/DownloadVerifierDialog.java @@ -632,15 +632,8 @@ public class DownloadVerifierDialog extends Dialog { vBox.getChildren().addAll(headerLabel, descriptionLabel); add(vBox, 0, 0); - StackPane graphicContainer = new StackPane(); + StackPane graphicContainer = new DialogImage(DialogImage.Type.SPARROW); graphicContainer.getStyleClass().add("graphic-container"); - Image image = new Image("image/sparrow-small.png", 50, 50, false, false); - if (!image.isError()) { - ImageView imageView = new ImageView(); - imageView.setSmooth(false); - imageView.setImage(image); - graphicContainer.getChildren().add(imageView); - } add(graphicContainer, 1, 0); ColumnConstraints textColumn = new ColumnConstraints(); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileImportPane.java index c0aea821..d165972c 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileImportPane.java @@ -7,6 +7,7 @@ import com.sparrowwallet.drongo.protocol.ScriptType; import com.sparrowwallet.drongo.wallet.Keystore; import com.sparrowwallet.drongo.wallet.KeystoreSource; import com.sparrowwallet.drongo.wallet.Wallet; +import com.sparrowwallet.drongo.wallet.WalletModel; import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.glyphfont.FontAwesome5; import com.sparrowwallet.sparrow.io.FileImport; @@ -44,8 +45,8 @@ public abstract class FileImportPane extends TitledDescriptionPane { private final boolean fileFormatAvailable; protected List wallets; - public FileImportPane(FileImport importer, String title, String description, String content, String imageUrl, boolean scannable, boolean fileFormatAvailable) { - super(title, description, content, imageUrl); + public FileImportPane(FileImport importer, String title, String description, String content, WalletModel walletModel, boolean scannable, boolean fileFormatAvailable) { + super(title, description, content, walletModel); this.importer = importer; this.scannable = scannable; this.fileFormatAvailable = fileFormatAvailable; diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java index 0cd2f562..6eecf0f3 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreExportPane.java @@ -37,7 +37,7 @@ public class FileKeystoreExportPane extends TitledDescriptionPane { private final boolean file; public FileKeystoreExportPane(Keystore keystore, KeystoreFileExport exporter) { - super(exporter.getName(), "Keystore export", exporter.getKeystoreExportDescription(), "image/" + exporter.getWalletModel().getType() + ".png"); + super(exporter.getName(), "Keystore export", exporter.getKeystoreExportDescription(), exporter.getWalletModel()); this.keystore = keystore; this.exporter = exporter; this.scannable = exporter.isKeystoreExportScannable(); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreImportPane.java index 49d2da20..bb1a4d42 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileKeystoreImportPane.java @@ -16,7 +16,7 @@ public class FileKeystoreImportPane extends FileImportPane { private final KeyDerivation requiredDerivation; public FileKeystoreImportPane(Wallet wallet, KeystoreFileImport importer, KeyDerivation requiredDerivation) { - super(importer, importer.getName(), "Key import", importer.getKeystoreImportDescription(getAccount(wallet, requiredDerivation)), "image/" + importer.getWalletModel().getType() + ".png", importer.isKeystoreImportScannable(), importer.isFileFormatAvailable()); + super(importer, importer.getName(), "Key import", importer.getKeystoreImportDescription(getAccount(wallet, requiredDerivation)), importer.getWalletModel(), importer.isKeystoreImportScannable(), importer.isFileFormatAvailable()); this.wallet = wallet; this.importer = importer; this.requiredDerivation = requiredDerivation; diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java index c25aa2f5..4980de8b 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletExportPane.java @@ -41,7 +41,7 @@ public class FileWalletExportPane extends TitledDescriptionPane { private final boolean file; public FileWalletExportPane(Wallet wallet, WalletExport exporter) { - super(exporter.getName(), "Wallet export", exporter.getWalletExportDescription(), "image/" + exporter.getWalletModel().getType() + ".png"); + super(exporter.getName(), "Wallet export", exporter.getWalletExportDescription(), exporter.getWalletModel()); this.wallet = wallet; this.exporter = exporter; this.scannable = exporter.isWalletExportScannable(); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletImportPane.java index 2a581e3d..49328623 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletImportPane.java @@ -12,7 +12,7 @@ public class FileWalletImportPane extends FileImportPane { private final WalletImport importer; public FileWalletImportPane(WalletImport importer) { - super(importer, importer.getName(), "Wallet import", importer.getWalletImportDescription(), "image/" + importer.getWalletModel().getType() + ".png", importer.isWalletImportScannable(), importer.isWalletImportFileFormatAvailable()); + super(importer, importer.getName(), "Wallet import", importer.getWalletImportDescription(), importer.getWalletModel(), importer.isWalletImportScannable(), importer.isWalletImportFileFormatAvailable()); this.importer = importer; } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletKeystoreImportPane.java index 212ae93d..c1a0e1b5 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/FileWalletKeystoreImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/FileWalletKeystoreImportPane.java @@ -42,7 +42,7 @@ public class FileWalletKeystoreImportPane extends FileImportPane { private String password; public FileWalletKeystoreImportPane(KeystoreFileImport importer) { - super(importer, importer.getName(), "Wallet import", importer.getKeystoreImportDescription(), "image/" + importer.getWalletModel().getType() + ".png", importer.isKeystoreImportScannable(), importer.isFileFormatAvailable()); + super(importer, importer.getName(), "Wallet import", importer.getKeystoreImportDescription(), importer.getWalletModel(), importer.isKeystoreImportScannable(), importer.isFileFormatAvailable()); this.importer = importer; } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java index bb036f55..867e702d 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MessageSignDialog.java @@ -118,14 +118,7 @@ public class MessageSignDialog extends Dialog { dialogPane.getStylesheets().add(AppServices.class.getResource("dialog.css").toExternalForm()); AppServices.setStageIcon(dialogPane.getScene().getWindow()); dialogPane.setHeaderText(title == null ? (wallet == null ? "Verify Message" : "Sign/Verify Message") : title); - - Image image = new Image("image/seed.png", 50, 50, false, false); - if (!image.isError()) { - ImageView imageView = new ImageView(); - imageView.setSmooth(false); - imageView.setImage(image); - dialogPane.setGraphic(imageView); - } + dialogPane.setGraphic(new WalletModelImage(WalletModel.SEED)); VBox vBox = new VBox(); vBox.setSpacing(20); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicGridDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicGridDialog.java index b85e6d40..e0cf0c4e 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicGridDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicGridDialog.java @@ -50,8 +50,7 @@ public class MnemonicGridDialog extends Dialog> { dialogPane.getStylesheets().add(AppServices.class.getResource("general.css").toExternalForm()); dialogPane.getStylesheets().add(AppServices.class.getResource("grid.css").toExternalForm()); dialogPane.setHeaderText("Load a Border Wallets PDF, or generate a grid from a BIP39 seed.\nThen select 11 or 23 words in a pattern on the grid.\nThe order of selection is important!"); - javafx.scene.image.Image image = new Image("/image/border-wallets.png"); - dialogPane.setGraphic(new ImageView(image)); + dialogPane.setGraphic(new DialogImage(DialogImage.Type.BORDERWALLETS)); String[][] emptyWordGrid = new String[128][GRID_COLUMN_COUNT]; Grid grid = getGrid(emptyWordGrid); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreDisplayPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreDisplayPane.java index a48e7c18..9b59fc09 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreDisplayPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreDisplayPane.java @@ -19,7 +19,7 @@ public class MnemonicKeystoreDisplayPane extends MnemonicKeystorePane { private final DeterministicSeed.Type type; public MnemonicKeystoreDisplayPane(Keystore keystore) { - super(keystore.getSeed().getType().getName(), keystore.getSeed().needsPassphrase() && (keystore.getSeed().getPassphrase() == null || keystore.getSeed().getPassphrase().length() > 0) ? "Passphrase entered" : "No passphrase", "", "image/" + WalletModel.SEED.getType() + ".png"); + super(keystore.getSeed().getType().getName(), keystore.getSeed().needsPassphrase() && (keystore.getSeed().getPassphrase() == null || keystore.getSeed().getPassphrase().length() > 0) ? "Passphrase entered" : "No passphrase", "", WalletModel.SEED); showHideLink.setVisible(false); buttonBox.getChildren().clear(); this.type = keystore.getSeed().getType(); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreEntryPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreEntryPane.java index de458cab..7b8e29d1 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreEntryPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreEntryPane.java @@ -19,7 +19,7 @@ public class MnemonicKeystoreEntryPane extends MnemonicKeystorePane { private boolean generated; public MnemonicKeystoreEntryPane(String name, int numWords) { - super(name, "Enter seed words", "", "image/" + WalletModel.SEED.getType() + ".png"); + super(name, "Enter seed words", "", WalletModel.SEED); showHideLink.setVisible(false); buttonBox.getChildren().clear(); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java index a4b9deb9..2372ab35 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java @@ -45,7 +45,7 @@ public class MnemonicKeystoreImportPane extends MnemonicKeystorePane { private List generatedMnemonicCode; public MnemonicKeystoreImportPane(Wallet wallet, KeystoreMnemonicImport importer, KeyDerivation defaultDerivation) { - super(importer.getName(), "Create or enter seed", importer.getKeystoreImportDescription(), "image/" + importer.getWalletModel().getType() + ".png"); + super(importer.getName(), "Create or enter seed", importer.getKeystoreImportDescription(), importer.getWalletModel()); this.wallet = wallet; this.importer = importer; this.defaultDerivation = defaultDerivation; diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystorePane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystorePane.java index b17127e7..d3dda2d6 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystorePane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystorePane.java @@ -3,6 +3,7 @@ package com.sparrowwallet.sparrow.control; import com.sparrowwallet.drongo.wallet.Bip39MnemonicCode; import com.sparrowwallet.drongo.wallet.DeterministicSeed; import com.sparrowwallet.drongo.wallet.MnemonicException; +import com.sparrowwallet.drongo.wallet.WalletModel; import com.sparrowwallet.drongo.wallet.slip39.Slip39MnemonicCode; import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.glyphfont.GlyphUtils; @@ -51,8 +52,8 @@ public class MnemonicKeystorePane extends TitledDescriptionPane { protected final SimpleStringProperty passphraseProperty = new SimpleStringProperty(""); protected IntegerProperty defaultWordSizeProperty; - public MnemonicKeystorePane(String title, String description, String content, String imageUrl) { - super(title, description, content, imageUrl); + public MnemonicKeystorePane(String title, String description, String content, WalletModel walletModel) { + super(title, description, content, walletModel); } @Override diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java index 75aff920..906659b8 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java @@ -44,7 +44,7 @@ public class MnemonicShareKeystoreImportPane extends MnemonicKeystorePane { private int currentShare; public MnemonicShareKeystoreImportPane(Wallet wallet, KeystoreMnemonicShareImport importer, KeyDerivation defaultDerivation) { - super(importer.getName(), "Enter seed share", importer.getKeystoreImportDescription(), "image/" + importer.getWalletModel().getType() + ".png"); + super(importer.getName(), "Enter seed share", importer.getKeystoreImportDescription(), importer.getWalletModel()); this.wallet = wallet; this.importer = importer; this.defaultDerivation = defaultDerivation; diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java index ad6e19cb..9aff3134 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java @@ -41,7 +41,7 @@ public class MnemonicWalletKeystoreImportPane extends MnemonicKeystorePane { private Button importButton; public MnemonicWalletKeystoreImportPane(KeystoreMnemonicImport importer) { - super(importer.getName(), "Seed import", importer.getKeystoreImportDescription(), "image/" + importer.getWalletModel().getType() + ".png"); + super(importer.getName(), "Seed import", importer.getKeystoreImportDescription(), importer.getWalletModel()); this.importer = importer; } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/PrivateKeySweepDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/PrivateKeySweepDialog.java index f08c863a..38451a12 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/PrivateKeySweepDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/PrivateKeySweepDialog.java @@ -14,6 +14,7 @@ import com.sparrowwallet.drongo.protocol.*; import com.sparrowwallet.drongo.psbt.PSBT; import com.sparrowwallet.drongo.psbt.PSBTInput; import com.sparrowwallet.drongo.wallet.Wallet; +import com.sparrowwallet.drongo.wallet.WalletModel; import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.EventManager; import com.sparrowwallet.sparrow.UnitFormat; @@ -73,14 +74,7 @@ public class PrivateKeySweepDialog extends Dialog { dialogPane.getStylesheets().add(AppServices.class.getResource("dialog.css").toExternalForm()); AppServices.setStageIcon(dialogPane.getScene().getWindow()); dialogPane.setHeaderText("Sweep Private Key"); - - Image image = new Image("image/seed.png", 50, 50, false, false); - if(!image.isError()) { - ImageView imageView = new ImageView(); - imageView.setSmooth(false); - imageView.setImage(image); - dialogPane.setGraphic(imageView); - } + dialogPane.setGraphic(new WalletModelImage(WalletModel.SEED)); Form form = new Form(); Fieldset fieldset = new Fieldset(); @@ -378,7 +372,7 @@ public class PrivateKeySweepDialog extends Dialog { }); if(Config.get().getServerType() == ServerType.BITCOIN_CORE) { - ServiceProgressDialog serviceProgressDialog = new ServiceProgressDialog("Address Scan", "Scanning address for transactions...", "/image/sparrow.png", addressUtxosService); + ServiceProgressDialog serviceProgressDialog = new ServiceProgressDialog("Address Scan", "Scanning address for transactions...", new DialogImage(DialogImage.Type.SPARROW), addressUtxosService); serviceProgressDialog.initOwner(getDialogPane().getScene().getWindow()); AppServices.moveToActiveWindowScreen(serviceProgressDialog); } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/SearchWalletDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/SearchWalletDialog.java index 3332cb0a..b844567d 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/SearchWalletDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/SearchWalletDialog.java @@ -60,14 +60,7 @@ public class SearchWalletDialog extends Dialog { dialogPane.getStylesheets().add(AppServices.class.getResource("search.css").toExternalForm()); AppServices.setStageIcon(dialogPane.getScene().getWindow()); dialogPane.setHeaderText(showWallet ? "Search All Wallets" : "Search Wallet " + walletForms.get(0).getMasterWallet().getName()); - - Image image = new Image("image/sparrow-small.png", 50, 50, false, false); - if(!image.isError()) { - ImageView imageView = new ImageView(); - imageView.setSmooth(false); - imageView.setImage(image); - dialogPane.setGraphic(imageView); - } + dialogPane.setGraphic(new DialogImage(DialogImage.Type.SPARROW)); VBox vBox = new VBox(); vBox.setSpacing(20); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/SendToManyDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/SendToManyDialog.java index 942b13fa..0899baf8 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/SendToManyDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/SendToManyDialog.java @@ -42,8 +42,7 @@ public class SendToManyDialog extends Dialog> { setTitle("Send to Many"); dialogPane.getStylesheets().add(AppServices.class.getResource("general.css").toExternalForm()); dialogPane.setHeaderText("Send to many recipients by specifying addresses and amounts.\nOnly the first row's label is necessary."); - Image image = new Image("/image/sparrow-small.png"); - dialogPane.setGraphic(new ImageView(image)); + dialogPane.setGraphic(new DialogImage(DialogImage.Type.SPARROW)); List initialPayments = IntStream.range(0, 100).mapToObj(i -> new Payment(null, null, -1, false)).collect(Collectors.toList()); Grid grid = getGrid(initialPayments); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/ServiceProgressDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/ServiceProgressDialog.java index 8586bd8e..289ff7e0 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/ServiceProgressDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/ServiceProgressDialog.java @@ -3,13 +3,12 @@ package com.sparrowwallet.sparrow.control; import com.sparrowwallet.sparrow.AppServices; import javafx.beans.property.*; import javafx.concurrent.Worker; +import javafx.scene.Node; import javafx.scene.control.DialogPane; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; import org.controlsfx.dialog.ProgressDialog; public class ServiceProgressDialog extends ProgressDialog { - public ServiceProgressDialog(String title, String header, String imagePath, Worker worker) { + public ServiceProgressDialog(String title, String header, Node graphic, Worker worker) { super(worker); final DialogPane dialogPane = getDialogPane(); @@ -20,8 +19,7 @@ public class ServiceProgressDialog extends ProgressDialog { setHeaderText(header); dialogPane.getStyleClass().remove("progress-dialog"); - Image image = new Image(imagePath); - dialogPane.setGraphic(new ImageView(image)); + dialogPane.setGraphic(graphic); } public static class ProxyWorker implements Worker { diff --git a/src/main/java/com/sparrowwallet/sparrow/control/TextAreaDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/TextAreaDialog.java index 7aa63174..fd9db165 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/TextAreaDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/TextAreaDialog.java @@ -44,8 +44,7 @@ public class TextAreaDialog extends Dialog { final DialogPane dialogPane = new TextAreaDialogPane(); setDialogPane(dialogPane); - Image image = new Image("/image/sparrow-small.png"); - dialogPane.setGraphic(new ImageView(image)); + dialogPane.setGraphic(new DialogImage(DialogImage.Type.SPARROW)); HBox hbox = new HBox(); this.textArea = new TextArea(defaultValue); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/TextfieldDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/TextfieldDialog.java index 6b4ce7d7..17c3d76e 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/TextfieldDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/TextfieldDialog.java @@ -29,8 +29,7 @@ public class TextfieldDialog extends Dialog { final DialogPane dialogPane = getDialogPane(); setDialogPane(dialogPane); - Image image = new Image("/image/sparrow-small.png"); - dialogPane.setGraphic(new ImageView(image)); + dialogPane.setGraphic(new DialogImage(DialogImage.Type.SPARROW)); HBox hbox = new HBox(); this.textField = new TextField(defaultValue); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java b/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java index f6c542e3..994dd559 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java @@ -2,14 +2,13 @@ package com.sparrowwallet.sparrow.control; import com.sparrowwallet.drongo.KeyDerivation; import com.sparrowwallet.drongo.wallet.Wallet; +import com.sparrowwallet.drongo.wallet.WalletModel; import com.sparrowwallet.sparrow.AppServices; import javafx.application.Platform; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.*; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; @@ -23,17 +22,17 @@ public class TitledDescriptionPane extends TitledPane { protected Hyperlink showHideLink; protected HBox buttonBox; - public TitledDescriptionPane(String title, String description, String content, String imageUrl) { + public TitledDescriptionPane(String title, String description, String content, WalletModel walletModel) { getStylesheets().add(AppServices.class.getResource("general.css").toExternalForm()); getStyleClass().add("titled-description-pane"); setPadding(Insets.EMPTY); - setGraphic(getTitle(title, description, imageUrl)); + setGraphic(getTitle(title, description, walletModel)); setContent(getContentBox(content)); removeArrow(); } - protected Node getTitle(String title, String description, String imageUrl) { + protected Node getTitle(String title, String description, WalletModel walletModel) { HBox listItem = new HBox(); listItem.setPadding(new Insets(10, 20, 10, 10)); listItem.setSpacing(10); @@ -43,12 +42,8 @@ public class TitledDescriptionPane extends TitledPane { imageBox.setMinHeight(50); listItem.getChildren().add(imageBox); - Image image = new Image(imageUrl, 50, 50, true, true); - if (!image.isError()) { - ImageView imageView = new ImageView(); - imageView.setImage(image); - imageBox.getChildren().add(imageView); - } + WalletModelImage walletModelImage = new WalletModelImage(walletModel); + imageBox.getChildren().add(walletModelImage); VBox labelsBox = new VBox(); labelsBox.setSpacing(5); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/WalletIcon.java b/src/main/java/com/sparrowwallet/sparrow/control/WalletIcon.java index 35d0d348..710cb98b 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/WalletIcon.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/WalletIcon.java @@ -74,33 +74,15 @@ public class WalletIcon extends StackPane { SVGImage svgImage; if(Config.get().getTheme() == Theme.DARK) { - svgImage = loadSVGImage("/image/" + walletModel.getType() + "-icon-invert.svg"); + svgImage = loadSVGImage("/image/walletmodel/" + walletModel.getType() + "-icon-invert.svg"); } else { - svgImage = loadSVGImage("/image/" + walletModel.getType() + "-icon.svg"); + svgImage = loadSVGImage("/image/walletmodel/" + walletModel.getType() + "-icon.svg"); } if(svgImage != null) { getChildren().add(svgImage); return; } - - Image image = null; - if(Config.get().getTheme() == Theme.DARK) { - image = loadImage("image/" + walletModel.getType() + "-icon-invert.png"); - } - - if(image == null) { - image = loadImage("image/" + walletModel.getType() + "-icon.png"); - } - - if(image == null) { - image = loadImage("image/" + walletModel.getType() + ".png"); - } - - if(image != null && !image.isError()) { - ImageView imageView = new ImageView(image); - getChildren().add(imageView); - } } } @@ -127,16 +109,6 @@ public class WalletIcon extends StackPane { return null; } - private Image loadImage(String imageName) { - try { - return new Image(imageName, 15, 15, true, true); - } catch(Exception e) { - //ignore - } - - return null; - } - private void addWalletIcon(String walletId) { Image image = new Image(PROTOCOL + ":" + walletId.replaceAll(" ", "%20").replaceAll("#", "%23") + "?" + QUERY, WIDTH, HEIGHT, true, false); getChildren().clear(); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/WalletModelImage.java b/src/main/java/com/sparrowwallet/sparrow/control/WalletModelImage.java new file mode 100644 index 00000000..10263a41 --- /dev/null +++ b/src/main/java/com/sparrowwallet/sparrow/control/WalletModelImage.java @@ -0,0 +1,78 @@ +package com.sparrowwallet.sparrow.control; + +import com.sparrowwallet.drongo.wallet.WalletModel; +import com.sparrowwallet.sparrow.AppServices; +import com.sparrowwallet.sparrow.Theme; +import com.sparrowwallet.sparrow.io.Config; +import javafx.beans.NamedArg; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.image.Image; +import javafx.scene.layout.StackPane; +import org.girod.javafx.svgimage.SVGImage; +import org.girod.javafx.svgimage.SVGLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; + +public class WalletModelImage extends StackPane { + private static final Logger log = LoggerFactory.getLogger(WalletModelImage.class); + + public static final int WIDTH = 50; + public static final int HEIGHT = 50; + + private final ObjectProperty walletModelProperty = new SimpleObjectProperty<>(); + + public WalletModelImage() { + setPrefSize(WIDTH, HEIGHT); + walletModelProperty.addListener((observable, oldValue, walletModel) -> { + refresh(walletModel); + }); + } + + public WalletModelImage(@NamedArg("walletModel") WalletModel walletModel) { + this(); + walletModelProperty.set(walletModel); + } + + public WalletModel getWalletModel() { + return walletModelProperty.get(); + } + + public ObjectProperty walletModelProperty() { + return walletModelProperty; + } + + public void refresh() { + WalletModel walletModel = getWalletModel(); + refresh(walletModel); + } + + protected void refresh(WalletModel walletModel) { + SVGImage svgImage; + if(Config.get().getTheme() == Theme.DARK) { + svgImage = loadSVGImage("/image/walletmodel/" + walletModel.getType() + "-invert.svg"); + } else { + svgImage = loadSVGImage("/image/walletmodel/" + walletModel.getType() + ".svg"); + } + + if(svgImage != null) { + getChildren().clear(); + getChildren().add(svgImage); + } + } + + private SVGImage loadSVGImage(String imageName) { + try { + URL url = AppServices.class.getResource(imageName); + if(url != null) { + return SVGLoader.load(url); + } + } catch(Exception e) { + log.error("Could not find image " + imageName); + } + + return null; + } +} diff --git a/src/main/java/com/sparrowwallet/sparrow/control/WalletSummaryDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/WalletSummaryDialog.java index 7e85a318..78e83566 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/WalletSummaryDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/WalletSummaryDialog.java @@ -43,14 +43,7 @@ public class WalletSummaryDialog extends Dialog { AppServices.setStageIcon(dialogPane.getScene().getWindow()); dialogPane.setHeaderText("Wallet Summary for " + (allOpenWallets ? "All Open Wallets" : masterWallets.get(0).getName())); - - Image image = new Image("image/sparrow-small.png", 50, 50, false, false); - if(!image.isError()) { - ImageView imageView = new ImageView(); - imageView.setSmooth(false); - imageView.setImage(image); - dialogPane.setGraphic(imageView); - } + dialogPane.setGraphic(new DialogImage(DialogImage.Type.SPARROW)); HBox hBox = new HBox(40); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java index 71f5f50f..0a6d2a6e 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java @@ -36,7 +36,7 @@ public class XprvKeystoreImportPane extends TitledDescriptionPane { private ExtendedKey xprv; public XprvKeystoreImportPane(Wallet wallet, KeystoreXprvImport importer, KeyDerivation defaultDerivation) { - super(importer.getName(), "Extended key import", importer.getKeystoreImportDescription(), "image/" + importer.getWalletModel().getType() + ".png"); + super(importer.getName(), "Extended key import", importer.getKeystoreImportDescription(), importer.getWalletModel()); this.wallet = wallet; this.importer = importer; this.defaultDerivation = defaultDerivation; @@ -46,7 +46,7 @@ public class XprvKeystoreImportPane extends TitledDescriptionPane { } public XprvKeystoreImportPane(Keystore keystore) { - super("Master Private Key", "BIP32 key", "", "image/" + WalletModel.SEED.getType() + ".png"); + super("Master Private Key", "BIP32 key", "", WalletModel.SEED); this.wallet = null; this.importer = null; this.defaultDerivation = keystore.getKeyDerivation(); diff --git a/src/main/java/com/sparrowwallet/sparrow/settings/ServerAliasDialog.java b/src/main/java/com/sparrowwallet/sparrow/settings/ServerAliasDialog.java index ca9c26d0..5960bddf 100644 --- a/src/main/java/com/sparrowwallet/sparrow/settings/ServerAliasDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/settings/ServerAliasDialog.java @@ -1,6 +1,7 @@ package com.sparrowwallet.sparrow.settings; import com.sparrowwallet.sparrow.AppServices; +import com.sparrowwallet.sparrow.control.DialogImage; import com.sparrowwallet.sparrow.glyphfont.FontAwesome5; import com.sparrowwallet.sparrow.io.Config; import com.sparrowwallet.sparrow.io.Server; @@ -39,9 +40,7 @@ public class ServerAliasDialog extends Dialog { setTitle("Server Aliases"); dialogPane.getStylesheets().add(AppServices.class.getResource("general.css").toExternalForm()); dialogPane.setHeaderText("Configure aliases for recently connected servers.\nNew servers are added to this list on successful connections."); - - Image image = new Image("/image/sparrow-small.png"); - dialogPane.setGraphic(new ImageView(image)); + dialogPane.setGraphic(new DialogImage(DialogImage.Type.SPARROW)); serverTable = new TableView<>(); serverTable.setPlaceholder(new Label("No servers added yet")); diff --git a/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java b/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java index c2ac5b5c..fb56d111 100644 --- a/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java +++ b/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java @@ -498,7 +498,7 @@ public class KeystoreController extends WalletFormController implements Initiali log.error("Error communicating with card", e); AppServices.showErrorDialog("Error communicating with card", e.getMessage()); }); - ServiceProgressDialog serviceProgressDialog = new ServiceProgressDialog("Authentication Delay", "Waiting for authentication delay to clear...", "/image/" + cardApi.getCardType().getType() + ".png", authDelayService); + ServiceProgressDialog serviceProgressDialog = new ServiceProgressDialog("Authentication Delay", "Waiting for authentication delay to clear...", new WalletModelImage(cardApi.getCardType()), authDelayService); serviceProgressDialog.initOwner(cardServiceButtons.getScene().getWindow()); AppServices.moveToActiveWindowScreen(serviceProgressDialog); authDelayService.start(); diff --git a/src/main/java/com/sparrowwallet/sparrow/wallet/SendController.java b/src/main/java/com/sparrowwallet/sparrow/wallet/SendController.java index 3cb46668..73dc6a0a 100644 --- a/src/main/java/com/sparrowwallet/sparrow/wallet/SendController.java +++ b/src/main/java/com/sparrowwallet/sparrow/wallet/SendController.java @@ -1260,7 +1260,7 @@ public class SendController extends WalletFormController implements Initializabl log.error("Error broadcasting notification transaction", failedEvent.getSource().getException()); AppServices.showErrorDialog("Error broadcasting notification transaction", failedEvent.getSource().getException().getMessage()); }); - ServiceProgressDialog progressDialog = new ServiceProgressDialog("Broadcast", "Broadcast Notification Transaction", "/image/paynym.png", proxyWorker); + ServiceProgressDialog progressDialog = new ServiceProgressDialog("Broadcast", "Broadcast Notification Transaction", new DialogImage(DialogImage.Type.PAYNYM), proxyWorker); progressDialog.initOwner(notificationButton.getScene().getWindow()); AppServices.moveToActiveWindowScreen(progressDialog); proxyWorker.setMessage("Broadcasting notification transaction..."); diff --git a/src/main/resources/com/sparrowwallet/sparrow/about.fxml b/src/main/resources/com/sparrowwallet/sparrow/about.fxml index 1e834ba7..52794707 100644 --- a/src/main/resources/com/sparrowwallet/sparrow/about.fxml +++ b/src/main/resources/com/sparrowwallet/sparrow/about.fxml @@ -5,9 +5,8 @@ + - - @@ -15,9 +14,7 @@ - - - +