diff --git a/drongo b/drongo index 1f7be6c7..d2582c04 160000 --- a/drongo +++ b/drongo @@ -1 +1 @@ -Subproject commit 1f7be6c7d5f1cdfda58617b212630575066e5496 +Subproject commit d2582c041479704d609c20ed13195c3f92ced999 diff --git a/src/main/java/com/sparrowwallet/sparrow/AppController.java b/src/main/java/com/sparrowwallet/sparrow/AppController.java index ce34e0d8..c38c5748 100644 --- a/src/main/java/com/sparrowwallet/sparrow/AppController.java +++ b/src/main/java/com/sparrowwallet/sparrow/AppController.java @@ -168,19 +168,9 @@ public class AppController implements Initializable { if(selectedTab != null) { TabData tabData = (TabData)selectedTab.getUserData(); if(tabData.getType() == TabData.TabType.TRANSACTION) { - TransactionTabData transactionTabData = (TransactionTabData)tabData; EventManager.get().post(new TransactionTabSelectedEvent(selectedTab)); - saveTransaction.setDisable(false); - saveTransaction.setText("Save " + (transactionTabData.getPsbt() == null || transactionTabData.getPsbt().isFinalized() ? "Transaction..." : "PSBT...")); - exportWallet.setDisable(true); - showTxHex.setDisable(false); } else if(tabData.getType() == TabData.TabType.WALLET) { - WalletTabData walletTabData = (WalletTabData)tabData; EventManager.get().post(new WalletTabSelectedEvent(selectedTab)); - saveTransaction.setDisable(true); - saveTransaction.setText("Save Transaction..."); - exportWallet.setDisable(walletTabData.getWallet() == null || !walletTabData.getWallet().isValid()); - showTxHex.setDisable(true); } } }); @@ -492,6 +482,12 @@ public class AppController implements Initializable { String fileName = selectedTab.getText(); if(fileName != null && !fileName.isEmpty()) { + if(transactionTabData.getPsbt() != null && !fileName.endsWith(".psbt")) { + fileName += ".psbt"; + } else if(!fileName.endsWith(".txn")) { + fileName += ".txn"; + } + if(saveTx && fileName.endsWith(".psbt")) { fileName = fileName.replace(".psbt", "") + ".txn"; } @@ -919,13 +915,40 @@ public class AppController implements Initializable { @Subscribe public void tabSelected(TabSelectedEvent event) { - Tab selectedTab = event.getTab(); - - String tabName = selectedTab.getText(); + String tabName = event.getTabName(); if(tabs.getScene() != null) { Stage tabStage = (Stage)tabs.getScene().getWindow(); tabStage.setTitle("Sparrow - " + tabName); } + + if(event instanceof TransactionTabSelectedEvent) { + TransactionTabSelectedEvent txTabEvent = (TransactionTabSelectedEvent)event; + TransactionTabData transactionTabData = txTabEvent.getTransactionTabData(); + saveTransaction.setDisable(false); + saveTransaction.setText("Save " + (transactionTabData.getPsbt() == null || transactionTabData.getPsbt().isFinalized() ? "Transaction..." : "PSBT...")); + exportWallet.setDisable(true); + showTxHex.setDisable(false); + } else if(event instanceof WalletTabSelectedEvent) { + WalletTabSelectedEvent walletTabEvent = (WalletTabSelectedEvent)event; + WalletTabData walletTabData = walletTabEvent.getWalletTabData(); + saveTransaction.setDisable(true); + saveTransaction.setText("Save Transaction..."); + exportWallet.setDisable(walletTabData.getWallet() == null || !walletTabData.getWallet().isValid()); + showTxHex.setDisable(true); + } + } + + @Subscribe + public void psbtFinalizedEvent(PSBTFinalizedEvent event) { + for(Tab tab : tabs.getTabs()) { + TabData tabData = (TabData) tab.getUserData(); + if(tabData instanceof TransactionTabData) { + TransactionTabData transactionTabData = (TransactionTabData)tabData; + if(Arrays.equals(transactionTabData.getTransaction().bitcoinSerialize(), event.getPsbt().getTransaction().bitcoinSerialize())) { + saveTransaction.setText("Save Transaction..."); + } + } + } } @Subscribe @@ -1113,6 +1136,8 @@ public class AppController implements Initializable { if(!deviceEnumerateService.isRunning()) { deviceEnumerateService.start(); } + + break; } } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java index cd26d2a4..8d37a9e8 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java @@ -399,7 +399,7 @@ public class DevicePane extends TitledDescriptionPane { EventManager.get().post(new KeystoreImportEvent(keystore)); }); getXpubService.setOnFailed(workerStateEvent -> { - setError(getXpubService.getException().getMessage(), null); + setError("Could not retrieve xpub", getXpubService.getException().getMessage()); importButton.setDisable(false); }); setDescription("Importing..."); @@ -414,7 +414,7 @@ public class DevicePane extends TitledDescriptionPane { EventManager.get().post(new PSBTSignedEvent(psbt, signedPsbt)); }); signPSBTService.setOnFailed(workerStateEvent -> { - setError(signPSBTService.getException().getMessage(), null); + setError("Signing Error", signPSBTService.getException().getMessage()); signButton.setDisable(false); }); setDescription("Signing..."); @@ -429,7 +429,7 @@ public class DevicePane extends TitledDescriptionPane { EventManager.get().post(new AddressDisplayedEvent(address)); }); displayAddressService.setOnFailed(failedEvent -> { - setError(displayAddressService.getException().getMessage(), null); + setError("Could not display address", displayAddressService.getException().getMessage()); displayAddressButton.setDisable(false); }); setDescription("Check device for address"); diff --git a/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java b/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java index be40ab0c..654002fe 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java @@ -12,6 +12,9 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; +import java.util.Arrays; +import java.util.OptionalDouble; + public class TitledDescriptionPane extends TitledPane { private Label descriptionLabel; protected Hyperlink showHideLink; @@ -123,6 +126,13 @@ public class TitledDescriptionPane extends TitledPane { double width = TextUtils.computeTextWidth(details.getFont(), message, 0.0D); double numLines = Math.max(1, width / 400); + + //Handle long words like txids + OptionalDouble maxWordLength = Arrays.stream(message.split(" ")).mapToDouble(word -> TextUtils.computeTextWidth(details.getFont(), message, 0.0D)).max(); + if(maxWordLength.isPresent() && maxWordLength.getAsDouble() > 300.0) { + numLines += 1.0; + } + double height = Math.max(60, numLines * 40); contentBox.setPrefHeight(height); diff --git a/src/main/java/com/sparrowwallet/sparrow/event/TabEvent.java b/src/main/java/com/sparrowwallet/sparrow/event/TabEvent.java index 680c7203..dfbc3e72 100644 --- a/src/main/java/com/sparrowwallet/sparrow/event/TabEvent.java +++ b/src/main/java/com/sparrowwallet/sparrow/event/TabEvent.java @@ -1,9 +1,10 @@ package com.sparrowwallet.sparrow.event; +import com.sparrowwallet.sparrow.TabData; import javafx.scene.control.Tab; public class TabEvent { - private Tab tab; + private final Tab tab; public TabEvent(Tab tab) { this.tab = tab; @@ -12,4 +13,12 @@ public class TabEvent { public Tab getTab() { return tab; } + + public String getTabName() { + return tab.getText(); + } + + public TabData getTabData() { + return (TabData)tab.getUserData(); + } } diff --git a/src/main/java/com/sparrowwallet/sparrow/event/TransactionTabSelectedEvent.java b/src/main/java/com/sparrowwallet/sparrow/event/TransactionTabSelectedEvent.java index 3810fc39..58127a5e 100644 --- a/src/main/java/com/sparrowwallet/sparrow/event/TransactionTabSelectedEvent.java +++ b/src/main/java/com/sparrowwallet/sparrow/event/TransactionTabSelectedEvent.java @@ -1,9 +1,14 @@ package com.sparrowwallet.sparrow.event; +import com.sparrowwallet.sparrow.TransactionTabData; import javafx.scene.control.Tab; public class TransactionTabSelectedEvent extends TabSelectedEvent { public TransactionTabSelectedEvent(Tab tab) { super(tab); } + + public TransactionTabData getTransactionTabData() { + return (TransactionTabData)getTabData(); + } } diff --git a/src/main/java/com/sparrowwallet/sparrow/event/WalletTabSelectedEvent.java b/src/main/java/com/sparrowwallet/sparrow/event/WalletTabSelectedEvent.java index 67460b92..e5ff2081 100644 --- a/src/main/java/com/sparrowwallet/sparrow/event/WalletTabSelectedEvent.java +++ b/src/main/java/com/sparrowwallet/sparrow/event/WalletTabSelectedEvent.java @@ -1,9 +1,14 @@ package com.sparrowwallet.sparrow.event; +import com.sparrowwallet.sparrow.WalletTabData; import javafx.scene.control.Tab; public class WalletTabSelectedEvent extends TabSelectedEvent { public WalletTabSelectedEvent(Tab tab) { super(tab); } + + public WalletTabData getWalletTabData() { + return (WalletTabData)getTabData(); + } } diff --git a/src/main/java/com/sparrowwallet/sparrow/transaction/InputForm.java b/src/main/java/com/sparrowwallet/sparrow/transaction/InputForm.java index d065c59c..e010c2b4 100644 --- a/src/main/java/com/sparrowwallet/sparrow/transaction/InputForm.java +++ b/src/main/java/com/sparrowwallet/sparrow/transaction/InputForm.java @@ -20,11 +20,19 @@ public class InputForm extends IndexedTransactionForm { } public TransactionInput getTransactionInput() { - return txdata.getTransaction().getInputs().get(getIndex()); + if(txdata.getTransaction() != null) { + return txdata.getTransaction().getInputs().get(getIndex()); + } + + return null; } public PSBTInput getPsbtInput() { - return txdata.getPsbt().getPsbtInputs().get(getIndex()); + if(txdata.getPsbt() != null) { + return txdata.getPsbt().getPsbtInputs().get(getIndex()); + } + + return null; } public TransactionOutput getReferencedTransactionOutput() {