output pane

This commit is contained in:
Craig Raw 2020-04-07 15:14:11 +02:00
parent 924e7d6b45
commit 5ad85eb154
8 changed files with 128 additions and 42 deletions

View file

@ -1,9 +1,11 @@
# Sparrow # Sparrow
Bitcoin Transaction Editor Bitcoin Wallet & Transaction Editor
To clone this project, use `git clone --recursive git@github.com:craigraw/sparrow.git` To clone this project, use `git clone --recursive git@github.com:craigraw/sparrow.git`
## Various ways to hex dump a file without spaces: ## Various ways to hex dump a file without spaces:
xxd -p file | tr -d '\n' `xxd -p file | tr -d '\n'`
hexdump -ve '1/1 "%.2x"'
od -t x1 -An file | tr -d '\n ' `hexdump -ve '1/1 "%.2x"'`
`od -t x1 -An file | tr -d '\n '`

View file

@ -108,12 +108,12 @@ public class InputController extends TransactionFormController implements Initia
//TODO: Enable select outpoint when wallet present //TODO: Enable select outpoint when wallet present
outpointSelect.setDisable(true); outpointSelect.setDisable(true);
initializeScriptFields(txInput); initializeScriptFields(txInput, psbtInput);
initializeStatusFields(txInput); initializeStatusFields(txInput);
initializeLocktimeFields(txInput); initializeLocktimeFields(txInput);
} }
private void initializeScriptFields(TransactionInput txInput) { private void initializeScriptFields(TransactionInput txInput, PSBTInput psbtInput) {
//TODO: Is this safe? //TODO: Is this safe?
Script redeemScript = txInput.getScriptSig().getFirstNestedScript(); Script redeemScript = txInput.getScriptSig().getFirstNestedScript();

View file

@ -1,6 +1,11 @@
package com.sparrowwallet.sparrow.transaction; package com.sparrowwallet.sparrow.transaction;
import com.sparrowwallet.drongo.protocol.TransactionOutput;
import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import org.fxmisc.richtext.CodeArea;
import tornadofx.control.Fieldset;
import java.net.URL; import java.net.URL;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@ -8,12 +13,32 @@ import java.util.ResourceBundle;
public class OutputController extends TransactionFormController implements Initializable { public class OutputController extends TransactionFormController implements Initializable {
private OutputForm outputForm; private OutputForm outputForm;
@FXML
private Fieldset outputFieldset;
@FXML
private TextField value;
@FXML
private CodeArea scriptPubKeyArea;
@Override @Override
public void initialize(URL location, ResourceBundle resources) { public void initialize(URL location, ResourceBundle resources) {
} }
public void initializeView() {
TransactionOutput txOutput = outputForm.getTransactionOutput();
outputFieldset.setText("Output #" + txOutput.getIndex());
value.setText(txOutput.getValue() + " sats");
scriptPubKeyArea.clear();
appendScript(scriptPubKeyArea, txOutput.getScript(), null, null);
}
public void setModel(OutputForm form) { public void setModel(OutputForm form) {
this.outputForm = form; this.outputForm = form;
initializeView();
} }
} }

View file

@ -57,7 +57,23 @@ public abstract class TransactionFormController {
} }
protected void appendScript(CodeArea codeArea, Script script, Script redeemScript, Script witnessScript) { protected void appendScript(CodeArea codeArea, Script script, Script redeemScript, Script witnessScript) {
if(ScriptPattern.isP2WPKH(script)) { if(ScriptPattern.isP2PKH(script)) {
codeArea.append(script.getChunks().get(0).toString(), "script-opcode");
codeArea.append(" ", "");
codeArea.append(script.getChunks().get(1).toString(), "script-opcode");
codeArea.append(" ", "");
codeArea.append("<pkh>", "script-hash");
codeArea.append(" ", "");
codeArea.append(script.getChunks().get(3).toString(), "script-opcode");
codeArea.append(" ", "");
codeArea.append(script.getChunks().get(4).toString(), "script-opcode");
} else if(ScriptPattern.isP2SH(script)) {
codeArea.append(script.getChunks().get(0).toString(), "script-opcode");
codeArea.append(" ", "");
codeArea.append("<sh>", "script-hash");
codeArea.append(" ", "");
codeArea.append(script.getChunks().get(2).toString(), "script-opcode");
} else if(ScriptPattern.isP2WPKH(script)) {
codeArea.append(script.getChunks().get(0).toString(), "script-opcode"); codeArea.append(script.getChunks().get(0).toString(), "script-opcode");
codeArea.append(" ", ""); codeArea.append(" ", "");
codeArea.append("<wpkh>", "script-hash"); codeArea.append("<wpkh>", "script-hash");

View file

@ -24,37 +24,4 @@
.locktime { -fx-fill: #e5e5e6 } .locktime { -fx-fill: #e5e5e6 }
.script-nest { -fx-fill: #000000 }
.script-opcode { -fx-fill: #0184bc; }
.script-hash { -fx-fill: #986801; }
.script-signature { -fx-fill: #50a14f }
.script-pubkey { -fx-fill: #a626a4 }
.script-redeem { -fx-fill: #ca1243 }
.script-other { -fx-fill: #a0a1a7 }
.uneditable-codearea {
-fx-font: 14px Courier;
-fx-padding: 4;
}
.virtualized-scroll-pane {
-fx-background-color: linear-gradient(to bottom, derive(-fx-text-box-border, -10%), -fx-text-box-border), linear-gradient(from 0px 0px to 0px 5px, derive(-fx-control-inner-background, -9%), -fx-control-inner-background);
-fx-background-insets: 0, 1;
-fx-background-radius: 3, 2;
}
.virtualized-scroll-pane:disabled {
-fx-opacity: 0.5;
}
.virtualized-scroll-pane .styled-text-area {
-fx-background-insets: 0px;
-fx-background-color: transparent;
}
.virtualized-scroll-pane .scroll-bar:vertical {
-fx-background-radius: 0 2 2 0;
-fx-padding: 0.08333325em 0.08333325em 0.08333325em 0;
-fx-border-insets: 0.08333325em 0.08333325em 0.08333325em 0;
-fx-background-insets: 0.08333325em 0.08333325em 0.08333325em 0;
}

View file

@ -13,7 +13,7 @@
<?import org.controlsfx.control.ToggleSwitch?> <?import org.controlsfx.control.ToggleSwitch?>
<?import com.sparrowwallet.sparrow.control.RelativeTimelockSpinner?> <?import com.sparrowwallet.sparrow.control.RelativeTimelockSpinner?>
<GridPane alignment="TOP_CENTER" hgap="10.0" prefHeight="500.0" prefWidth="620.0" stylesheets="@input.css, @../general.css" vgap="10.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.sparrowwallet.sparrow.transaction.InputController"> <GridPane alignment="TOP_CENTER" hgap="10.0" prefHeight="500.0" prefWidth="620.0" stylesheets="@input.css, @script.css, @../general.css" vgap="10.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.sparrowwallet.sparrow.transaction.InputController">
<padding> <padding>
<Insets bottom="25.0" left="25.0" right="25.0" top="25.0" /> <Insets bottom="25.0" left="25.0" right="25.0" top="25.0" />
</padding> </padding>

View file

@ -5,6 +5,48 @@
<?import javafx.scene.*?> <?import javafx.scene.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import org.fxmisc.richtext.CodeArea?>
<?import org.fxmisc.flowless.VirtualizedScrollPane?>
<?import tornadofx.control.Field?>
<?import tornadofx.control.Fieldset?>
<?import tornadofx.control.Form?>
<?import javafx.geometry.Insets?>
<GridPane alignment="TOP_CENTER" hgap="10.0" prefHeight="500.0" prefWidth="600.0" stylesheets="@output.css, @../general.css" vgap="10.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.sparrowwallet.sparrow.transaction.OutputController"> <GridPane alignment="TOP_CENTER" hgap="10.0" prefHeight="500.0" prefWidth="600.0" stylesheets="@output.css, @script.css, @../general.css" vgap="10.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.sparrowwallet.sparrow.transaction.OutputController">
<padding>
<Insets bottom="25.0" left="25.0" right="25.0" top="25.0" />
</padding>
<columnConstraints>
<ColumnConstraints maxWidth="Infinity" minWidth="340" prefWidth="340">
</ColumnConstraints>
<ColumnConstraints maxWidth="Infinity" minWidth="340" prefWidth="340">
</ColumnConstraints>
</columnConstraints>
<rowConstraints>
<RowConstraints />
<RowConstraints />
</rowConstraints>
<Form GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="0">
<Fieldset fx:id="outputFieldset" inputGrow="SOMETIMES" text="Output">
<Field text="Value:">
<TextField fx:id="value" editable="false" styleClass="copyable-label" />
</Field>
</Fieldset>
</Form>
<Separator styleClass="form-separator" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="1" />
<Form GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="2">
<Fieldset inputGrow="SOMETIMES" text="Script">
<Field text="ScriptPubKey:">
<HBox prefHeight="42">
<VirtualizedScrollPane>
<content>
<CodeArea fx:id="scriptPubKeyArea" editable="false" minWidth="570" prefWidth="570" wrapText="true" styleClass="uneditable-codearea" />
</content>
</VirtualizedScrollPane>
</HBox>
</Field>
</Fieldset>
</Form>
</GridPane> </GridPane>

View file

@ -0,0 +1,34 @@
.script-nest { -fx-fill: #000000 }
.script-opcode { -fx-fill: #0184bc }
.script-hash { -fx-fill: #986801 }
.script-signature { -fx-fill: #50a14f }
.script-pubkey { -fx-fill: #a626a4 }
.script-redeem { -fx-fill: #ca1243 }
.script-other { -fx-fill: #a0a1a7 }
.uneditable-codearea {
-fx-font: 14px Courier;
-fx-padding: 4;
}
.virtualized-scroll-pane {
-fx-background-color: linear-gradient(to bottom, derive(-fx-text-box-border, -10%), -fx-text-box-border), linear-gradient(from 0px 0px to 0px 5px, derive(-fx-control-inner-background, -9%), -fx-control-inner-background);
-fx-background-insets: 0, 1;
-fx-background-radius: 3, 2;
}
.virtualized-scroll-pane:disabled {
-fx-opacity: 0.5;
}
.virtualized-scroll-pane .styled-text-area {
-fx-background-insets: 0px;
-fx-background-color: transparent;
}
.virtualized-scroll-pane .scroll-bar:vertical {
-fx-background-radius: 0 2 2 0;
-fx-padding: 0.08333325em 0.08333325em 0.08333325em 0;
-fx-border-insets: 0.08333325em 0.08333325em 0.08333325em 0;
-fx-background-insets: 0.08333325em 0.08333325em 0.08333325em 0;
}