Browse Source

add tx tree icons and input descriptions when signing

bwt
Craig Raw 4 years ago
parent
commit
1392199f5c
  1. 11
      src/main/java/com/sparrowwallet/sparrow/control/TransactionDiagram.java
  2. 28
      src/main/java/com/sparrowwallet/sparrow/transaction/InputController.java
  3. 5
      src/main/java/com/sparrowwallet/sparrow/transaction/InputForm.java
  4. 5
      src/main/java/com/sparrowwallet/sparrow/transaction/OutputController.java
  5. 13
      src/main/java/com/sparrowwallet/sparrow/transaction/OutputForm.java
  6. 49
      src/main/java/com/sparrowwallet/sparrow/transaction/TransactionController.java
  7. 2
      src/main/resources/com/sparrowwallet/sparrow/darktheme.css
  8. 5
      src/main/resources/com/sparrowwallet/sparrow/transaction/input.css

11
src/main/java/com/sparrowwallet/sparrow/control/TransactionDiagram.java

@ -431,6 +431,17 @@ public class TransactionDiagram extends GridPane {
return consolidationGlyph;
}
public static Glyph getTxoGlyph() {
return getChangeGlyph();
}
public static Glyph getPayjoinGlyph() {
Glyph payjoinGlyph = new Glyph(FontAwesome5.FONT_NAME, FontAwesome5.Glyph.RANDOM);
payjoinGlyph.getStyleClass().add("payjoin-icon");
payjoinGlyph.setFontSize(12);
return payjoinGlyph;
}
public static Glyph getChangeGlyph() {
Glyph changeGlyph = new Glyph(FontAwesome5.FONT_NAME, FontAwesome5.Glyph.COINS);
changeGlyph.getStyleClass().add("change-icon");

28
src/main/java/com/sparrowwallet/sparrow/transaction/InputController.java

@ -8,6 +8,7 @@ import com.sparrowwallet.drongo.protocol.*;
import com.sparrowwallet.drongo.psbt.PSBTInput;
import com.sparrowwallet.drongo.wallet.BlockTransaction;
import com.sparrowwallet.drongo.wallet.Keystore;
import com.sparrowwallet.drongo.wallet.Wallet;
import com.sparrowwallet.sparrow.EventManager;
import com.sparrowwallet.sparrow.control.*;
import com.sparrowwallet.sparrow.event.*;
@ -120,6 +121,11 @@ public class InputController extends TransactionFormController implements Initia
TransactionInput txInput = inputForm.getTransactionInput();
PSBTInput psbtInput = inputForm.getPsbtInput();
inputForm.signingWalletProperty().addListener((observable, oldValue, signingWallet) -> {
updateInputLegendFromWallet(txInput, signingWallet);
});
updateInputLegendFromWallet(txInput, inputForm.getSigningWallet());
initializeInputFields(txInput, psbtInput);
initializeScriptFields(txInput, psbtInput);
initializeStatusFields(txInput, psbtInput);
@ -132,9 +138,27 @@ public class InputController extends TransactionFormController implements Initia
}
}
private void initializeInputFields(TransactionInput txInput, PSBTInput psbtInput) {
inputFieldset.setText("Input #" + txInput.getIndex());
private String getLegendText(TransactionInput txInput) {
return "Input #" + txInput.getIndex();
}
private void updateInputLegendFromWallet(TransactionInput txInput, Wallet signingWallet) {
String baseText = getLegendText(txInput);
if(signingWallet != null) {
if(inputForm.isWalletTxo()) {
inputFieldset.setText(baseText + " - Wallet");
inputFieldset.setIcon(TransactionDiagram.getTxoGlyph());
} else {
inputFieldset.setText(baseText + " - Payjoin");
inputFieldset.setIcon(TransactionDiagram.getPayjoinGlyph());
}
} else {
inputFieldset.setText(baseText);
inputFieldset.setIcon(null);
}
}
private void initializeInputFields(TransactionInput txInput, PSBTInput psbtInput) {
outpoint.managedProperty().bind(outpoint.visibleProperty());
linkedOutpoint.managedProperty().bind(linkedOutpoint.visibleProperty());

5
src/main/java/com/sparrowwallet/sparrow/transaction/InputForm.java

@ -46,6 +46,11 @@ public class InputForm extends IndexedTransactionForm {
return null;
}
public boolean isWalletTxo() {
TransactionInput txInput = getTransactionInput();
return getSigningWallet() != null && getSigningWallet().getWalletTxos().keySet().stream().anyMatch(ref -> ref.getHash().equals(txInput.getOutpoint().getHash()) && ref.getIndex() == txInput.getOutpoint().getIndex());
}
@Override
public Node getContents() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("input.fxml"));

5
src/main/java/com/sparrowwallet/sparrow/transaction/OutputController.java

@ -1,7 +1,6 @@
package com.sparrowwallet.sparrow.transaction;
import com.google.common.eventbus.Subscribe;
import com.sparrowwallet.drongo.KeyPurpose;
import com.sparrowwallet.drongo.address.Address;
import com.sparrowwallet.drongo.protocol.NonStandardScriptException;
import com.sparrowwallet.drongo.protocol.TransactionInput;
@ -106,10 +105,10 @@ public class OutputController extends TransactionFormController implements Initi
private void updateOutputLegendFromWallet(TransactionOutput txOutput, Wallet signingWallet) {
String baseText = getLegendText(txOutput);
if(signingWallet != null) {
if(signingWallet.getWalletOutputScripts(KeyPurpose.RECEIVE).containsKey(txOutput.getScript())) {
if(outputForm.isWalletConsolidation()) {
outputFieldset.setText(baseText + " - Consolidation");
outputFieldset.setIcon(TransactionDiagram.getConsolidationGlyph());
} else if(signingWallet.getWalletOutputScripts(KeyPurpose.CHANGE).containsKey(txOutput.getScript())) {
} else if(outputForm.isWalletChange()) {
outputFieldset.setText(baseText + " - Change");
outputFieldset.setIcon(TransactionDiagram.getChangeGlyph());
} else {

13
src/main/java/com/sparrowwallet/sparrow/transaction/OutputForm.java

@ -1,5 +1,6 @@
package com.sparrowwallet.sparrow.transaction;
import com.sparrowwallet.drongo.KeyPurpose;
import com.sparrowwallet.drongo.protocol.TransactionOutput;
import com.sparrowwallet.drongo.psbt.PSBTOutput;
import javafx.fxml.FXMLLoader;
@ -30,6 +31,18 @@ public class OutputForm extends IndexedTransactionForm {
return psbtOutput;
}
public boolean isWalletConsolidation() {
return (getSigningWallet() != null && getSigningWallet().getWalletOutputScripts(KeyPurpose.RECEIVE).containsKey(getTransactionOutput().getScript()));
}
public boolean isWalletChange() {
return (getSigningWallet() != null && getSigningWallet().getWalletOutputScripts(KeyPurpose.CHANGE).containsKey(getTransactionOutput().getScript()));
}
public boolean isWalletPayment() {
return getSigningWallet() != null;
}
@Override
public Node getContents() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("output.fxml"));

49
src/main/java/com/sparrowwallet/sparrow/transaction/TransactionController.java

@ -9,6 +9,7 @@ import com.sparrowwallet.drongo.wallet.BlockTransaction;
import com.sparrowwallet.sparrow.AppController;
import com.sparrowwallet.sparrow.EventManager;
import com.sparrowwallet.sparrow.TransactionTabData;
import com.sparrowwallet.sparrow.control.TransactionDiagram;
import com.sparrowwallet.sparrow.control.TransactionHexArea;
import com.sparrowwallet.sparrow.event.*;
import com.sparrowwallet.sparrow.net.ElectrumServer;
@ -17,11 +18,10 @@ import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.TextFieldTreeCell;
import javafx.scene.layout.Pane;
import javafx.util.StringConverter;
import org.controlsfx.control.MasterDetailPane;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -125,17 +125,46 @@ public class TransactionController implements Initializable {
rootItem.getChildren().add(outputsItem);
txtree.setRoot(rootItem);
txtree.setCellFactory(p -> new TextFieldTreeCell<>(new StringConverter<TransactionForm>() {
txtree.setCellFactory(tc -> new TreeCell<>() {
@Override
public String toString(TransactionForm transactionForm) {
return transactionForm.toString();
protected void updateItem(TransactionForm form, boolean empty) {
super.updateItem(form, empty);
setText(null);
setGraphic(null);
setTooltip(null);
setContextMenu(null);
if(form != null) {
setText(form.toString());
if(form.getSigningWallet() != null) {
if(form instanceof InputForm) {
InputForm inputForm = (InputForm)form;
if(inputForm.isWalletTxo()) {
setGraphic(TransactionDiagram.getTxoGlyph());
} else {
setGraphic(TransactionDiagram.getPayjoinGlyph());
}
}
if(form instanceof OutputForm) {
OutputForm outputForm = (OutputForm)form;
if(outputForm.isWalletConsolidation()) {
setGraphic(TransactionDiagram.getConsolidationGlyph());
} else if(outputForm.isWalletChange()) {
setGraphic(TransactionDiagram.getChangeGlyph());
} else {
setGraphic(TransactionDiagram.getPaymentGlyph());
}
}
}
}
}
});
@Override
public TransactionForm fromString(String string) {
throw new IllegalStateException("No editing");
}
}));
txdata.signingWalletProperty().addListener((observable, oldValue, newValue) -> {
txtree.refresh();
});
txtree.getSelectionModel().selectedItemProperty().addListener((observable, old_val, selectedItem) -> {
TransactionForm transactionForm = selectedItem.getValue();

2
src/main/resources/com/sparrowwallet/sparrow/darktheme.css

@ -42,7 +42,7 @@
-fx-base: -fx-accent ;
}
.table-view{
.table-view, .tree-view {
/*-fx-background-color: derive(-fx-base, 10%);*/
-fx-selection-bar-non-focused: derive(-fx-base, 50%);
}

5
src/main/resources/com/sparrowwallet/sparrow/transaction/input.css

@ -24,4 +24,7 @@
.locktime { -fx-fill: color-grey }
.legend {
-fx-content-display: RIGHT;
-fx-graphic-text-gap: 5px;
}

Loading…
Cancel
Save