Craig Raw
5 years ago
33 changed files with 885 additions and 76 deletions
@ -1 +1 @@ |
|||
Subproject commit 566aa2e95315291dd7c2092dfc1378bf2fa0d484 |
|||
Subproject commit 7fb5601de38e79d5c0547ebc684ca137aa895134 |
@ -0,0 +1,31 @@ |
|||
package com.craigraw.sparrow; |
|||
|
|||
import com.craigraw.drongo.protocol.Transaction; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
public class EventManager { |
|||
private List<TransactionListener> listenerList = new ArrayList<>(); |
|||
private static EventManager SINGLETON = new EventManager(); |
|||
|
|||
private EventManager() {} |
|||
|
|||
public void subscribe(TransactionListener listener) { |
|||
listenerList.add(listener); |
|||
} |
|||
|
|||
public void unsubscribe(TransactionListener listener) { |
|||
listenerList.remove(listener); |
|||
} |
|||
|
|||
public void notify(Transaction transaction) { |
|||
for (TransactionListener listener : listenerList) { |
|||
listener.updated(transaction); |
|||
} |
|||
} |
|||
|
|||
public static EventManager get() { |
|||
return SINGLETON; |
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
package com.craigraw.sparrow; |
|||
|
|||
import com.craigraw.drongo.protocol.Transaction; |
|||
|
|||
public interface TransactionListener { |
|||
void updated(Transaction transaction); |
|||
} |
@ -0,0 +1,9 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public abstract class Form { |
|||
public abstract Node getContents() throws IOException; |
|||
} |
@ -0,0 +1,157 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.protocol.Transaction; |
|||
import com.craigraw.sparrow.EventManager; |
|||
import com.craigraw.sparrow.TransactionListener; |
|||
import javafx.fxml.FXML; |
|||
import javafx.fxml.Initializable; |
|||
import javafx.scene.control.*; |
|||
import javafx.scene.layout.GridPane; |
|||
import tornadofx.control.DateTimePicker; |
|||
|
|||
import java.net.URL; |
|||
import java.time.*; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class HeadersController implements Initializable, TransactionListener { |
|||
private HeadersForm headersForm; |
|||
|
|||
private static final long MAX_BLOCK_LOCKTIME = 500000000L; |
|||
|
|||
@FXML |
|||
private GridPane layout; |
|||
|
|||
@FXML |
|||
private TextField idField; |
|||
|
|||
@FXML |
|||
private Spinner<Integer> versionField; |
|||
|
|||
@FXML |
|||
private Label segwitField; |
|||
|
|||
@FXML |
|||
private Label segwitVersionLabel; |
|||
|
|||
@FXML |
|||
private Spinner<Integer> segwitVersionField; |
|||
|
|||
@FXML |
|||
private ToggleGroup locktimeTypeField; |
|||
|
|||
@FXML |
|||
private ToggleButton locktimeBlockTypeField; |
|||
|
|||
@FXML |
|||
private ToggleButton locktimeDateTypeField; |
|||
|
|||
@FXML |
|||
private Spinner<Integer> locktimeBlockField; |
|||
|
|||
@FXML |
|||
private DateTimePicker locktimeDateField; |
|||
|
|||
@FXML |
|||
private Label feeField; |
|||
|
|||
@FXML |
|||
private Label sizeField; |
|||
|
|||
@FXML |
|||
private Label virtualSizeField; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
EventManager.get().subscribe(this); |
|||
} |
|||
|
|||
void setModel(HeadersForm form) { |
|||
this.headersForm = form; |
|||
Transaction tx = headersForm.getTransaction(); |
|||
|
|||
updateTxId(); |
|||
|
|||
versionField.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(1, 2, (int)tx.getVersion())); |
|||
versionField.valueProperty().addListener((obs, oldValue, newValue) -> { |
|||
tx.setVersion(newValue); |
|||
EventManager.get().notify(tx); |
|||
}); |
|||
|
|||
segwitField.setText(tx.isSegwit() ? "Segwit" : "Legacy" ); |
|||
if(tx.isSegwit()) { |
|||
segwitVersionField.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(1, 2, tx.getSegwitVersion())); |
|||
segwitVersionField.valueProperty().addListener((obs, oldValue, newValue) -> { |
|||
tx.setSegwitVersion(newValue); |
|||
EventManager.get().notify(tx); |
|||
}); |
|||
} else { |
|||
layout.getChildren().removeAll(segwitVersionLabel, segwitVersionField); |
|||
} |
|||
|
|||
locktimeTypeField.selectedToggleProperty().addListener((ov, old_toggle, new_toggle) -> { |
|||
if(locktimeTypeField.getSelectedToggle() != null) { |
|||
String selection = locktimeTypeField.getSelectedToggle().getUserData().toString(); |
|||
if(selection.equals("block")) { |
|||
locktimeBlockField.setVisible(true); |
|||
locktimeDateField.setVisible(false); |
|||
Integer block = locktimeBlockField.getValue(); |
|||
if(block != null) { |
|||
tx.setLockTime(block); |
|||
EventManager.get().notify(tx); |
|||
} |
|||
} else { |
|||
locktimeBlockField.setVisible(false); |
|||
locktimeDateField.setVisible(true); |
|||
LocalDateTime date = locktimeDateField.getDateTimeValue(); |
|||
if(date != null) { |
|||
tx.setLockTime(date.toEpochSecond(OffsetDateTime.now(ZoneId.systemDefault()).getOffset())); |
|||
EventManager.get().notify(tx); |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
|
|||
if(tx.getLockTime() < MAX_BLOCK_LOCKTIME) { |
|||
locktimeBlockField.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, (int)MAX_BLOCK_LOCKTIME-1, (int)tx.getLockTime())); |
|||
locktimeBlockField.setVisible(true); |
|||
locktimeDateField.setVisible(false); |
|||
locktimeTypeField.selectToggle(locktimeBlockTypeField); |
|||
} else { |
|||
LocalDateTime date = Instant.ofEpochSecond(tx.getLockTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); |
|||
locktimeDateField.setDateTimeValue(date); |
|||
locktimeBlockField.setVisible(false); |
|||
locktimeDateField.setVisible(true); |
|||
locktimeTypeField.selectToggle(locktimeDateTypeField); |
|||
} |
|||
|
|||
locktimeBlockField.valueProperty().addListener((obs, oldValue, newValue) -> { |
|||
tx.setLockTime(newValue); |
|||
EventManager.get().notify(tx); |
|||
}); |
|||
|
|||
locktimeDateField.setFormat("yyyy-MM-dd HH:mm:ss"); |
|||
locktimeDateField.dateTimeValueProperty().addListener((obs, oldValue, newValue) -> { |
|||
tx.setLockTime(newValue.toEpochSecond(OffsetDateTime.now(ZoneId.systemDefault()).getOffset())); |
|||
EventManager.get().notify(tx); |
|||
}); |
|||
|
|||
if(form.getPsbt() != null) { |
|||
feeField.setText(form.getPsbt().getFee().toString() + " sats"); |
|||
} else { |
|||
feeField.setText("Unknown"); |
|||
} |
|||
|
|||
sizeField.setText(tx.getSize() + " B"); |
|||
|
|||
virtualSizeField.setText(tx.getVirtualSize() + " vB"); |
|||
} |
|||
|
|||
private void updateTxId() { |
|||
idField.setText(headersForm.getTransaction().calculateTxId(false).toString()); |
|||
} |
|||
|
|||
@Override |
|||
public void updated(Transaction transaction) { |
|||
updateTxId(); |
|||
} |
|||
} |
@ -0,0 +1,38 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.protocol.Transaction; |
|||
import com.craigraw.drongo.psbt.PSBT; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public class HeadersForm extends Form { |
|||
private Transaction transaction; |
|||
private PSBT psbt; |
|||
|
|||
public HeadersForm(Transaction transaction, PSBT psbt) { |
|||
this.transaction = transaction; |
|||
this.psbt = psbt; |
|||
} |
|||
|
|||
public Transaction getTransaction() { |
|||
return transaction; |
|||
} |
|||
|
|||
public PSBT getPsbt() { |
|||
return psbt; |
|||
} |
|||
|
|||
public Node getContents() throws IOException { |
|||
FXMLLoader loader = new FXMLLoader(getClass().getResource("headers.fxml")); |
|||
Node node = loader.load(); |
|||
HeadersController controller = loader.getController(); |
|||
controller.setModel(this); |
|||
return node; |
|||
} |
|||
|
|||
public String toString() { |
|||
return "Tx [" + transaction.calculateTxId(false).toString().substring(0, 6) + "]"; |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import javafx.fxml.Initializable; |
|||
|
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class InputController implements Initializable { |
|||
private InputForm inputForm; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
public void setModel(InputForm form) { |
|||
this.inputForm = form; |
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.protocol.TransactionInput; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public class InputForm extends Form { |
|||
private TransactionInput transactionInput; |
|||
|
|||
public InputForm(TransactionInput transactionInput) { |
|||
this.transactionInput = transactionInput; |
|||
} |
|||
|
|||
public Node getContents() throws IOException { |
|||
FXMLLoader loader = new FXMLLoader(getClass().getResource("input.fxml")); |
|||
Node node = loader.load(); |
|||
InputController controller = loader.getController(); |
|||
controller.setModel(this); |
|||
return node; |
|||
} |
|||
|
|||
public String toString() { |
|||
return "Input #" + transactionInput.getIndex(); |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import javafx.fxml.Initializable; |
|||
|
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class InputsController implements Initializable { |
|||
private InputsForm inputsForm; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
public void setModel(InputsForm form) { |
|||
this.inputsForm = form; |
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.protocol.Transaction; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public class InputsForm extends Form { |
|||
private Transaction transaction; |
|||
|
|||
public InputsForm(Transaction transaction) { |
|||
this.transaction = transaction; |
|||
} |
|||
|
|||
public Node getContents() throws IOException { |
|||
FXMLLoader loader = new FXMLLoader(getClass().getResource("inputs.fxml")); |
|||
Node node = loader.load(); |
|||
InputsController controller = loader.getController(); |
|||
controller.setModel(this); |
|||
return node; |
|||
} |
|||
|
|||
public String toString() { |
|||
return "Inputs"; |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import javafx.fxml.Initializable; |
|||
|
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class OutputController implements Initializable { |
|||
private OutputForm outputForm; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
public void setModel(OutputForm form) { |
|||
this.outputForm = form; |
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.protocol.TransactionOutput; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public class OutputForm extends Form { |
|||
private TransactionOutput transactionOutput; |
|||
|
|||
public OutputForm(TransactionOutput transactionOutput) { |
|||
this.transactionOutput = transactionOutput; |
|||
} |
|||
|
|||
public Node getContents() throws IOException { |
|||
FXMLLoader loader = new FXMLLoader(getClass().getResource("output.fxml")); |
|||
Node node = loader.load(); |
|||
OutputController controller = loader.getController(); |
|||
controller.setModel(this); |
|||
return node; |
|||
} |
|||
|
|||
public String toString() { |
|||
return "Output #" + transactionOutput.getIndex(); |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import javafx.fxml.Initializable; |
|||
|
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class OutputsController implements Initializable { |
|||
private OutputsForm outputsForm; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
public void setModel(OutputsForm form) { |
|||
this.outputsForm = form; |
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.protocol.Transaction; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public class OutputsForm extends Form { |
|||
private Transaction transaction; |
|||
|
|||
public OutputsForm(Transaction transaction) { |
|||
this.transaction = transaction; |
|||
} |
|||
|
|||
public Node getContents() throws IOException { |
|||
FXMLLoader loader = new FXMLLoader(getClass().getResource("outputs.fxml")); |
|||
Node node = loader.load(); |
|||
OutputsController controller = loader.getController(); |
|||
controller.setModel(this); |
|||
return node; |
|||
} |
|||
|
|||
public String toString() { |
|||
return "Outputs"; |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import javafx.fxml.Initializable; |
|||
|
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class PartialInputController implements Initializable { |
|||
private PartialInputForm partialInputForm; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
public void setModel(PartialInputForm form) { |
|||
this.partialInputForm = form; |
|||
} |
|||
} |
@ -0,0 +1,23 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.psbt.PSBTInput; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public class PartialInputForm extends Form { |
|||
private PSBTInput psbtInput; |
|||
|
|||
public PartialInputForm(PSBTInput psbtInput) { |
|||
this.psbtInput = psbtInput; |
|||
} |
|||
|
|||
public Node getContents() throws IOException { |
|||
FXMLLoader loader = new FXMLLoader(getClass().getResource("partialinput.fxml")); |
|||
Node node = loader.load(); |
|||
PartialInputController controller = loader.getController(); |
|||
controller.setModel(this); |
|||
return node; |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import javafx.fxml.Initializable; |
|||
|
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class PartialOutputController implements Initializable { |
|||
private PartialOutputForm partialOutputForm; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
public void setModel(PartialOutputForm form) { |
|||
this.partialOutputForm = form; |
|||
} |
|||
} |
@ -0,0 +1,23 @@ |
|||
package com.craigraw.sparrow.form; |
|||
|
|||
import com.craigraw.drongo.psbt.PSBTOutput; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Node; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
public class PartialOutputForm extends Form { |
|||
private PSBTOutput psbtOutput; |
|||
|
|||
public PartialOutputForm(PSBTOutput psbtOutput) { |
|||
this.psbtOutput = psbtOutput; |
|||
} |
|||
|
|||
public Node getContents() throws IOException { |
|||
FXMLLoader loader = new FXMLLoader(getClass().getResource("partialoutput.fxml")); |
|||
Node node = loader.load(); |
|||
PartialOutputController controller = loader.getController(); |
|||
controller.setModel(this); |
|||
return node; |
|||
} |
|||
} |
@ -0,0 +1,82 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import javafx.geometry.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
<?import javafx.scene.text.*?> |
|||
<?import javafx.scene.control.Label?> |
|||
<?import javafx.scene.control.TextField?> |
|||
<?import javafx.scene.control.Spinner?> |
|||
<?import javafx.scene.control.ToggleButton?> |
|||
<?import javafx.scene.control.ToggleGroup?> |
|||
<?import javafx.scene.control.Separator?> |
|||
<?import tornadofx.control.DateTimePicker?> |
|||
|
|||
<GridPane fx:id="layout" hgap="10.0" prefHeight="350.0" prefWidth="600.0" vgap="10.0" alignment="CENTER" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.craigraw.sparrow.form.HeadersController" stylesheets="@../general.css"> |
|||
<padding> |
|||
<Insets bottom="25.0" left="25.0" right="25.0" top="25.0" /> |
|||
</padding> |
|||
<columnConstraints> |
|||
<ColumnConstraints minWidth="100" prefWidth="100" |
|||
maxWidth="Infinity" halignment="RIGHT"> |
|||
</ColumnConstraints> |
|||
<ColumnConstraints minWidth="200" prefWidth="200" |
|||
maxWidth="Infinity" hgrow="ALWAYS"> |
|||
</ColumnConstraints> |
|||
</columnConstraints> |
|||
<rowConstraints> |
|||
<RowConstraints /> |
|||
</rowConstraints> |
|||
<!-- Add Header Label --> |
|||
<Label text="Headers" GridPane.columnIndex="0" |
|||
GridPane.rowIndex="0" GridPane.columnSpan="2" |
|||
GridPane.rowSpan="1" GridPane.halignment="LEFT" > |
|||
<font> |
|||
<Font name="Arial" size="24" ></Font> |
|||
</font> |
|||
<GridPane.margin> |
|||
<Insets top="0" right="0" bottom="10" left="0"></Insets> |
|||
</GridPane.margin> |
|||
</Label> |
|||
|
|||
<Label text="Transaction ID: " GridPane.columnIndex="0" GridPane.rowIndex="1" /> |
|||
<TextField fx:id="idField" editable="false" styleClass="copyable-label" prefHeight="40" prefWidth="520" minWidth="520" GridPane.columnIndex="1" GridPane.rowIndex="1"/> |
|||
|
|||
<Label text="Version: " GridPane.columnIndex="0" GridPane.rowIndex="2" /> |
|||
<Spinner fx:id="versionField" prefHeight="40" prefWidth="60" editable="true" GridPane.columnIndex="1" GridPane.rowIndex="2" /> |
|||
|
|||
<Label text="Type: " GridPane.columnIndex="0" GridPane.rowIndex="3" /> |
|||
<Label fx:id="segwitField" prefHeight="40" GridPane.columnIndex="1" GridPane.rowIndex="3"/> |
|||
|
|||
<Label fx:id="segwitVersionLabel" text="Segwit Version: " GridPane.columnIndex="0" GridPane.rowIndex="4" /> |
|||
<Spinner fx:id="segwitVersionField" prefWidth="60" prefHeight="40" GridPane.columnIndex="1" GridPane.rowIndex="4"/> |
|||
|
|||
<Separator GridPane.columnIndex="0" GridPane.rowIndex="5" GridPane.columnSpan="2" GridPane.rowSpan="1" GridPane.halignment="LEFT" /> |
|||
|
|||
<Label text="Locktime Type: " GridPane.columnIndex="0" GridPane.rowIndex="6" /> |
|||
<HBox fillHeight="true" GridPane.columnIndex="1" GridPane.rowIndex="6"> |
|||
<children> |
|||
<ToggleButton fx:id="locktimeBlockTypeField" text="Block" userData="block"> |
|||
<toggleGroup> |
|||
<ToggleGroup fx:id="locktimeTypeField" /> |
|||
</toggleGroup> |
|||
</ToggleButton> |
|||
<ToggleButton fx:id="locktimeDateTypeField" text="Date" toggleGroup="$locktimeTypeField" userData="date" /> |
|||
</children> |
|||
</HBox> |
|||
|
|||
<Label text="Locktime: " GridPane.columnIndex="0" GridPane.rowIndex="7" /> |
|||
<Spinner fx:id="locktimeBlockField" prefHeight="40" prefWidth="120" GridPane.columnIndex="1" GridPane.rowIndex="7"/> |
|||
<DateTimePicker fx:id="locktimeDateField" visible="false" prefHeight="40" GridPane.columnIndex="1" GridPane.rowIndex="7"/> |
|||
|
|||
<Separator GridPane.columnIndex="0" GridPane.rowIndex="8" GridPane.columnSpan="2" GridPane.rowSpan="1" GridPane.halignment="LEFT" /> |
|||
|
|||
<Label text="Size: " GridPane.columnIndex="0" GridPane.rowIndex="9" /> |
|||
<Label fx:id="sizeField" prefHeight="40" prefWidth="120" GridPane.columnIndex="1" GridPane.rowIndex="9"/> |
|||
|
|||
<Label text="Virtual Size: " GridPane.columnIndex="0" GridPane.rowIndex="10" /> |
|||
<Label fx:id="virtualSizeField" prefHeight="40" prefWidth="120" GridPane.columnIndex="1" GridPane.rowIndex="10"/> |
|||
|
|||
<Label text="Fee: " GridPane.columnIndex="0" GridPane.rowIndex="11" /> |
|||
<Label fx:id="feeField" prefHeight="40" prefWidth="120" GridPane.columnIndex="1" GridPane.rowIndex="11"/> |
|||
|
|||
</GridPane> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import java.lang.*?> |
|||
<?import java.util.*?> |
|||
<?import javafx.scene.*?> |
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<AnchorPane xmlns="http://javafx.com/javafx" |
|||
xmlns:fx="http://javafx.com/fxml" |
|||
fx:controller="com.craigraw.sparrow.form.InputController" |
|||
prefHeight="400.0" prefWidth="600.0"> |
|||
|
|||
</AnchorPane> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import java.lang.*?> |
|||
<?import java.util.*?> |
|||
<?import javafx.scene.*?> |
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<AnchorPane xmlns="http://javafx.com/javafx" |
|||
xmlns:fx="http://javafx.com/fxml" |
|||
fx:controller="com.craigraw.sparrow.form.InputsController" |
|||
prefHeight="400.0" prefWidth="600.0"> |
|||
|
|||
</AnchorPane> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import java.lang.*?> |
|||
<?import java.util.*?> |
|||
<?import javafx.scene.*?> |
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<AnchorPane xmlns="http://javafx.com/javafx" |
|||
xmlns:fx="http://javafx.com/fxml" |
|||
fx:controller="com.craigraw.sparrow.form.OutputController" |
|||
prefHeight="400.0" prefWidth="600.0"> |
|||
|
|||
</AnchorPane> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import java.lang.*?> |
|||
<?import java.util.*?> |
|||
<?import javafx.scene.*?> |
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<AnchorPane xmlns="http://javafx.com/javafx" |
|||
xmlns:fx="http://javafx.com/fxml" |
|||
fx:controller="com.craigraw.sparrow.form.OutputsController" |
|||
prefHeight="400.0" prefWidth="600.0"> |
|||
|
|||
</AnchorPane> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import java.lang.*?> |
|||
<?import java.util.*?> |
|||
<?import javafx.scene.*?> |
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<AnchorPane xmlns="http://javafx.com/javafx" |
|||
xmlns:fx="http://javafx.com/fxml" |
|||
fx:controller="com.craigraw.sparrow.form.PartialInputController" |
|||
prefHeight="400.0" prefWidth="600.0"> |
|||
|
|||
</AnchorPane> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import java.lang.*?> |
|||
<?import java.util.*?> |
|||
<?import javafx.scene.*?> |
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<AnchorPane xmlns="http://javafx.com/javafx" |
|||
xmlns:fx="http://javafx.com/fxml" |
|||
fx:controller="com.craigraw.sparrow.form.PartialOutputController" |
|||
prefHeight="400.0" prefWidth="600.0"> |
|||
|
|||
</AnchorPane> |
@ -0,0 +1,6 @@ |
|||
.copyable-label, .copyable-label:focused { |
|||
-fx-background-color: transparent ; |
|||
-fx-background-insets: 0px ; |
|||
-fx-border :none; |
|||
-fx-padding: 0; |
|||
} |
@ -0,0 +1,27 @@ |
|||
#txhex { |
|||
-fx-background-color: #ffffff; |
|||
-fx-font: 14px Courier; |
|||
-fx-padding: 2; |
|||
} |
|||
|
|||
.version-color { -fx-fill: #986801 } |
|||
.segwit-marker-color { -fx-fill: #000000 } |
|||
.segwit-flag-color { -fx-fill: #4078f2 } |
|||
.num-inputs-color { -fx-fill: #ca1243 } |
|||
.inputs-color { -fx-fill: #0184bc } |
|||
.num-outputs-color { -fx-fill: #ca1243 } |
|||
.outputs-color { -fx-fill: #50a14f } |
|||
.witnesses-color { -fx-fill: #a626a4 } |
|||
.locktime-color { -fx-fill: #986801 } |
|||
|
|||
.color-0 { -fx-fill: #ca1243 } |
|||
.color-1 { -fx-fill: #d75f00 } |
|||
.color-2 { -fx-fill: #c18401 } |
|||
.color-3 { -fx-fill: #50a14f } |
|||
.color-4 { -fx-fill: #0184bc } |
|||
.color-5 { -fx-fill: #4078f2 } |
|||
.color-6 { -fx-fill: #a626a4 } |
|||
.color-7 { -fx-fill: #986801 } |
|||
.color-8 { -fx-fill: #000000 } |
|||
|
|||
.color-grey { -fx-fill: #e5e5e6 } |
Loading…
Reference in new issue