store treetable column sort on adjustment, and restore on wallet load

This commit is contained in:
Craig Raw 2025-01-28 12:53:10 +02:00
parent f9199b65f0
commit 3dfd8210a8
17 changed files with 123 additions and 53 deletions

2
drongo

@ -1 +1 @@
Subproject commit 1805aeb3740a9b90cff321219f0e60c4a1ccd3a6 Subproject commit b2c362d5a71b8c46f8990a6b6b9b96f81ee24c90

View file

@ -1,7 +1,5 @@
package com.sparrowwallet.sparrow.control; package com.sparrowwallet.sparrow.control;
import com.sparrowwallet.drongo.KeyPurpose;
import com.sparrowwallet.drongo.wallet.TableType;
import com.sparrowwallet.drongo.wallet.WalletNode; import com.sparrowwallet.drongo.wallet.WalletNode;
import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.AppServices;
import com.sparrowwallet.sparrow.EventManager; import com.sparrowwallet.sparrow.EventManager;
@ -79,7 +77,7 @@ public class AddressTreeTable extends CoinTreeTable {
getColumns().forEach(col -> col.setContextMenu(contextMenu)); getColumns().forEach(col -> col.setContextMenu(contextMenu));
setEditable(true); setEditable(true);
setupColumnWidths(rootEntry.getNode().getIndex() == KeyPurpose.RECEIVE.getPathIndex().num() ? TableType.RECEIVE_ADDRESSES : TableType.CHANGE_ADDRESSES); setupColumnWidths();
addressCol.setSortType(TreeTableColumn.SortType.ASCENDING); addressCol.setSortType(TreeTableColumn.SortType.ASCENDING);
getSortOrder().add(addressCol); getSortOrder().add(addressCol);

View file

@ -1,6 +1,7 @@
package com.sparrowwallet.sparrow.control; package com.sparrowwallet.sparrow.control;
import com.sparrowwallet.drongo.BitcoinUnit; import com.sparrowwallet.drongo.BitcoinUnit;
import com.sparrowwallet.drongo.wallet.SortDirection;
import com.sparrowwallet.drongo.wallet.TableType; import com.sparrowwallet.drongo.wallet.TableType;
import com.sparrowwallet.drongo.wallet.Wallet; import com.sparrowwallet.drongo.wallet.Wallet;
import com.sparrowwallet.drongo.wallet.WalletTable; import com.sparrowwallet.drongo.wallet.WalletTable;
@ -8,7 +9,7 @@ import com.sparrowwallet.sparrow.CurrencyRate;
import com.sparrowwallet.sparrow.UnitFormat; import com.sparrowwallet.sparrow.UnitFormat;
import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.AppServices;
import com.sparrowwallet.sparrow.EventManager; import com.sparrowwallet.sparrow.EventManager;
import com.sparrowwallet.sparrow.event.WalletTableColumnsResizedEvent; import com.sparrowwallet.sparrow.event.WalletTableChangedEvent;
import com.sparrowwallet.sparrow.event.WalletAddressesChangedEvent; import com.sparrowwallet.sparrow.event.WalletAddressesChangedEvent;
import com.sparrowwallet.sparrow.event.WalletDataChangedEvent; import com.sparrowwallet.sparrow.event.WalletDataChangedEvent;
import com.sparrowwallet.sparrow.event.WalletHistoryStatusEvent; import com.sparrowwallet.sparrow.event.WalletHistoryStatusEvent;
@ -19,6 +20,7 @@ import com.sparrowwallet.sparrow.wallet.Entry;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject; import io.reactivex.subjects.PublishSubject;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.collections.ListChangeListener;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.*; import javafx.scene.control.*;
@ -31,13 +33,22 @@ import java.util.Optional;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class CoinTreeTable extends TreeTableView<Entry> { public class CoinTreeTable extends TreeTableView<Entry> {
private TableType tableType;
private BitcoinUnit bitcoinUnit; private BitcoinUnit bitcoinUnit;
private UnitFormat unitFormat; private UnitFormat unitFormat;
private CurrencyRate currencyRate; private CurrencyRate currencyRate;
protected static final double STANDARD_WIDTH = 100.0; protected static final double STANDARD_WIDTH = 100.0;
private final PublishSubject<WalletTableColumnsResizedEvent> columnResizeSubject = PublishSubject.create(); private final PublishSubject<WalletTableChangedEvent> walletTableSubject = PublishSubject.create();
private final Observable<WalletTableColumnsResizedEvent> columnResizeEvents = columnResizeSubject.debounce(1, TimeUnit.SECONDS); private final Observable<WalletTableChangedEvent> walletTableEvents = walletTableSubject.debounce(1, TimeUnit.SECONDS);
public TableType getTableType() {
return tableType;
}
public void setTableType(TableType tableType) {
this.tableType = tableType;
}
public BitcoinUnit getBitcoinUnit() { public BitcoinUnit getBitcoinUnit() {
return bitcoinUnit; return bitcoinUnit;
@ -143,17 +154,63 @@ public class CoinTreeTable extends TreeTableView<Entry> {
return stackPane; return stackPane;
} }
public void setSortColumn(int columnIndex, TreeTableColumn.SortType sortType) { protected void setupColumnSort(int defaultColumnIndex, TreeTableColumn.SortType defaultSortType) {
if(columnIndex >= 0 && columnIndex < getColumns().size() && getSortOrder().isEmpty() && !getRoot().getChildren().isEmpty()) { WalletTable.Sort columnSort = getSavedColumnSort();
TreeTableColumn<Entry, ?> column = getColumns().get(columnIndex); if(columnSort == null) {
column.setSortType(sortType == null ? TreeTableColumn.SortType.DESCENDING : sortType); columnSort = new WalletTable.Sort(defaultColumnIndex, getSortDirection(defaultSortType));
}
setSortColumn(columnSort);
getSortOrder().addListener((ListChangeListener<? super TreeTableColumn<Entry, ?>>) c -> {
if(c.next()) {
walletTableChanged();
}
});
for(TreeTableColumn<Entry, ?> column : getColumns()) {
column.sortTypeProperty().addListener((_, _, _) -> walletTableChanged());
}
}
protected void resetSortColumn() {
setSortColumn(getColumnSort());
}
protected void setSortColumn(WalletTable.Sort sort) {
if(sort.sortColumn() >= 0 && sort.sortColumn() < getColumns().size() && getSortOrder().isEmpty() && !getRoot().getChildren().isEmpty()) {
TreeTableColumn<Entry, ?> column = getColumns().get(sort.sortColumn());
column.setSortType(sort.sortDirection() == SortDirection.DESCENDING ? TreeTableColumn.SortType.DESCENDING : TreeTableColumn.SortType.ASCENDING);
getSortOrder().add(column); getSortOrder().add(column);
} }
} }
private WalletTable.Sort getColumnSort() {
if(getSortOrder().isEmpty() || !getColumns().contains(getSortOrder().getFirst())) {
return new WalletTable.Sort(tableType == TableType.UTXOS ? getColumns().size() - 1 : 0, SortDirection.DESCENDING);
}
return new WalletTable.Sort(getColumns().indexOf(getSortOrder().getFirst()), getSortDirection(getSortOrder().getFirst().getSortType()));
}
private SortDirection getSortDirection(TreeTableColumn.SortType sortType) {
return sortType == TreeTableColumn.SortType.ASCENDING ? SortDirection.ASCENDING : SortDirection.DESCENDING;
}
private WalletTable.Sort getSavedColumnSort() {
if(getRoot() != null && getRoot().getValue() != null && getRoot().getValue().getWallet() != null) {
Wallet wallet = getRoot().getValue().getWallet();
WalletTable walletTable = wallet.getWalletTable(tableType);
if(walletTable != null) {
return walletTable.getSort();
}
}
return null;
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
protected void setupColumnWidths(TableType tableType) { protected void setupColumnWidths() {
Double[] savedWidths = getSavedColumnWidths(tableType); Double[] savedWidths = getSavedColumnWidths();
for(int i = 0; i < getColumns().size(); i++) { for(int i = 0; i < getColumns().size(); i++) {
TreeTableColumn<Entry, ?> column = getColumns().get(i); TreeTableColumn<Entry, ?> column = getColumns().get(i);
column.setPrefWidth(savedWidths != null && getColumns().size() == savedWidths.length ? savedWidths[i] : STANDARD_WIDTH); column.setPrefWidth(savedWidths != null && getColumns().size() == savedWidths.length ? savedWidths[i] : STANDARD_WIDTH);
@ -162,18 +219,27 @@ public class CoinTreeTable extends TreeTableView<Entry> {
//TODO: Replace with TreeTableView.CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN when JavaFX 20+ has headless support //TODO: Replace with TreeTableView.CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN when JavaFX 20+ has headless support
setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY); setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY);
getColumns().getLast().widthProperty().addListener((_, _, _) -> { getColumns().getLast().widthProperty().addListener((_, _, _) -> walletTableChanged());
if(getRoot() != null && getRoot().getValue() != null && getRoot().getValue().getWallet() != null) {
Double[] widths = getColumns().stream().map(TableColumnBase::getWidth).toArray(Double[]::new);
WalletTable walletTable = new WalletTable(tableType, widths);
columnResizeSubject.onNext(new WalletTableColumnsResizedEvent(getRoot().getValue().getWallet(), walletTable));
}
});
columnResizeEvents.skip(3, TimeUnit.SECONDS).subscribe(event -> EventManager.get().post(event)); //Ignore initial resizes during layout
walletTableEvents.skip(3, TimeUnit.SECONDS).subscribe(event -> {
event.getWallet().getWalletTables().put(event.getTableType(), event.getWalletTable());
EventManager.get().post(event);
});
} }
private Double[] getSavedColumnWidths(TableType tableType) { private void walletTableChanged() {
if(getRoot() != null && getRoot().getValue() != null && getRoot().getValue().getWallet() != null) {
WalletTable walletTable = new WalletTable(tableType, getColumnWidths(), getColumnSort());
walletTableSubject.onNext(new WalletTableChangedEvent(getRoot().getValue().getWallet(), walletTable));
}
}
private Double[] getColumnWidths() {
return getColumns().stream().map(TableColumnBase::getWidth).toArray(Double[]::new);
}
private Double[] getSavedColumnWidths() {
if(getRoot() != null && getRoot().getValue() != null && getRoot().getValue().getWallet() != null) { if(getRoot() != null && getRoot().getValue() != null && getRoot().getValue().getWallet() != null) {
Wallet wallet = getRoot().getValue().getWallet(); Wallet wallet = getRoot().getValue().getWallet();
WalletTable walletTable = wallet.getWalletTable(tableType); WalletTable walletTable = wallet.getWalletTable(tableType);

View file

@ -806,7 +806,7 @@ public class EntryCell extends TreeTableCell<Entry, Entry> implements Confirmati
cell.getStyleClass().remove("utxo-row"); cell.getStyleClass().remove("utxo-row");
cell.getStyleClass().remove("unconfirmed-row"); cell.getStyleClass().remove("unconfirmed-row");
cell.getStyleClass().remove("summary-row"); cell.getStyleClass().remove("summary-row");
cell.getStyleClass().remove("address-cell"); boolean addressCell = cell.getStyleClass().remove("address-cell");
cell.getStyleClass().remove("hashindex-row"); cell.getStyleClass().remove("hashindex-row");
cell.getStyleClass().remove("confirming"); cell.getStyleClass().remove("confirming");
cell.getStyleClass().remove("negative-amount"); cell.getStyleClass().remove("negative-amount");
@ -835,7 +835,7 @@ public class EntryCell extends TreeTableCell<Entry, Entry> implements Confirmati
if(!utxoEntry.isSpendable()) { if(!utxoEntry.isSpendable()) {
cell.getStyleClass().add("unspendable"); cell.getStyleClass().add("unspendable");
} }
if(OsType.getCurrent() == OsType.MACOS && utxoEntry.getHashIndex().getHeight() > 0) { if(OsType.getCurrent() == OsType.MACOS && utxoEntry.getHashIndex().getHeight() > 0 && !addressCell) {
cell.getStyleClass().add("number-field"); cell.getStyleClass().add("number-field");
} }
} else if(entry instanceof HashIndexEntry hashIndexEntry) { } else if(entry instanceof HashIndexEntry hashIndexEntry) {

View file

@ -87,6 +87,7 @@ public class SearchWalletDialog extends Dialog<Entry> {
form.getChildren().add(fieldset); form.getChildren().add(fieldset);
results = new CoinTreeTable(); results = new CoinTreeTable();
results.setTableType(TableType.SEARCH_WALLET);
results.setShowRoot(false); results.setShowRoot(false);
results.setPrefWidth(showWallet || showAccount ? 950 : 850); results.setPrefWidth(showWallet || showAccount ? 950 : 850);
results.setUnitFormat(walletForms.iterator().next().getWallet()); results.setUnitFormat(walletForms.iterator().next().getWallet());
@ -174,7 +175,7 @@ public class SearchWalletDialog extends Dialog<Entry> {
results.setRoot(rootItem); results.setRoot(rootItem);
setResizable(true); setResizable(true);
results.setupColumnWidths(TableType.SEARCH_WALLET); results.setupColumnWidths();
AppServices.moveToActiveWindowScreen(this); AppServices.moveToActiveWindowScreen(this);

View file

@ -49,8 +49,8 @@ public class TransactionsTreeTable extends CoinTreeTable {
setPlaceholder(getDefaultPlaceholder(rootEntry.getWallet())); setPlaceholder(getDefaultPlaceholder(rootEntry.getWallet()));
setEditable(true); setEditable(true);
setupColumnWidths(TableType.TRANSACTIONS); setupColumnWidths();
setSortColumn(0, TreeTableColumn.SortType.DESCENDING); setupColumnSort(0, TreeTableColumn.SortType.DESCENDING);
} }
public void updateAll(WalletTransactionsEntry rootEntry) { public void updateAll(WalletTransactionsEntry rootEntry) {
@ -60,13 +60,13 @@ public class TransactionsTreeTable extends CoinTreeTable {
setRoot(rootItem); setRoot(rootItem);
rootItem.setExpanded(true); rootItem.setExpanded(true);
setSortColumn(0, TreeTableColumn.SortType.DESCENDING); resetSortColumn();
} }
public void updateHistory() { public void updateHistory() {
//Transaction entries should have already been updated using WalletTransactionsEntry.updateHistory, so only a resort required //Transaction entries should have already been updated using WalletTransactionsEntry.updateHistory, so only a resort required
sort(); sort();
setSortColumn(0, TreeTableColumn.SortType.DESCENDING); resetSortColumn();
} }
public void updateLabel(Entry entry) { public void updateLabel(Entry entry) {

View file

@ -82,8 +82,8 @@ public class UtxosTreeTable extends CoinTreeTable {
setPlaceholder(getDefaultPlaceholder(rootEntry.getWallet())); setPlaceholder(getDefaultPlaceholder(rootEntry.getWallet()));
setEditable(true); setEditable(true);
setupColumnWidths(TableType.UTXOS); setupColumnWidths();
setSortColumn(getColumns().size() - 1, TreeTableColumn.SortType.DESCENDING); setupColumnSort(getColumns().size() - 1, TreeTableColumn.SortType.DESCENDING);
getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
} }
@ -95,14 +95,14 @@ public class UtxosTreeTable extends CoinTreeTable {
setRoot(rootItem); setRoot(rootItem);
rootItem.setExpanded(true); rootItem.setExpanded(true);
setSortColumn(getColumns().size() - 1, TreeTableColumn.SortType.DESCENDING); resetSortColumn();
} }
public void updateHistory() { public void updateHistory() {
//Utxo entries should have already been updated, so only a resort required //Utxo entries should have already been updated, so only a resort required
if(!getRoot().getChildren().isEmpty()) { if(!getRoot().getChildren().isEmpty()) {
sort(); sort();
setSortColumn(getColumns().size() - 1, TreeTableColumn.SortType.DESCENDING); resetSortColumn();
} }
} }

View file

@ -55,6 +55,7 @@ public class WalletSummaryDialog extends Dialog<Void> {
HBox hBox = new HBox(40); HBox hBox = new HBox(40);
CoinTreeTable table = new CoinTreeTable(); CoinTreeTable table = new CoinTreeTable();
table.setTableType(TableType.WALLET_SUMMARY);
TreeTableColumn<Entry, String> nameColumn = new TreeTableColumn<>("Wallet"); TreeTableColumn<Entry, String> nameColumn = new TreeTableColumn<>("Wallet");
nameColumn.setCellValueFactory((TreeTableColumn.CellDataFeatures<Entry, String> param) -> { nameColumn.setCellValueFactory((TreeTableColumn.CellDataFeatures<Entry, String> param) -> {
@ -102,7 +103,7 @@ public class WalletSummaryDialog extends Dialog<Void> {
table.setRoot(rootItem); table.setRoot(rootItem);
rootItem.setExpanded(true); rootItem.setExpanded(true);
table.setupColumnWidths(TableType.WALLET_SUMMARY); table.setupColumnWidths();
table.setPrefWidth(450); table.setPrefWidth(450);
VBox vBox = new VBox(); VBox vBox = new VBox();

View file

@ -4,10 +4,10 @@ import com.sparrowwallet.drongo.wallet.TableType;
import com.sparrowwallet.drongo.wallet.Wallet; import com.sparrowwallet.drongo.wallet.Wallet;
import com.sparrowwallet.drongo.wallet.WalletTable; import com.sparrowwallet.drongo.wallet.WalletTable;
public class WalletTableColumnsResizedEvent extends WalletChangedEvent { public class WalletTableChangedEvent extends WalletChangedEvent {
private final WalletTable walletTable; private final WalletTable walletTable;
public WalletTableColumnsResizedEvent(Wallet wallet, WalletTable walletTable) { public WalletTableChangedEvent(Wallet wallet, WalletTable walletTable) {
super(wallet); super(wallet);
this.walletTable = walletTable; this.walletTable = walletTable;
} }

View file

@ -774,7 +774,7 @@ public class DbPersistence implements Persistence {
} }
@Subscribe @Subscribe
public void walletTableColumnsResized(WalletTableColumnsResizedEvent event) { public void walletTableChanged(WalletTableChangedEvent event) {
if(persistsFor(event.getWallet()) && event.getTableType() != null && event.getWallet().getWalletTable(event.getTableType()) != null) { if(persistsFor(event.getWallet()) && event.getTableType() != null && event.getWallet().getWalletTable(event.getTableType()) != null) {
updateExecutor.execute(() -> dirtyPersistablesMap.computeIfAbsent(event.getWallet(), key -> new DirtyPersistables()).walletTable = event.getWalletTable()); updateExecutor.execute(() -> dirtyPersistablesMap.computeIfAbsent(event.getWallet(), key -> new DirtyPersistables()).walletTable = event.getWalletTable());
} }

View file

@ -12,20 +12,20 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
public interface WalletTableDao { public interface WalletTableDao {
@SqlQuery("select id, type, widths from walletTable where wallet = ?") @SqlQuery("select id, type, widths, sortColumn, sortDirection from walletTable where wallet = ?")
@RegisterRowMapper(WalletTableMapper.class) @RegisterRowMapper(WalletTableMapper.class)
Map<TableType, WalletTable> getForWalletId(Long id); Map<TableType, WalletTable> getForWalletId(Long id);
@SqlQuery("select id, type, widths from walletTable where type = ?") @SqlQuery("select id, type, widths, sortColumn, sortDirection from walletTable where type = ?")
@RegisterRowMapper(WalletTableMapper.class) @RegisterRowMapper(WalletTableMapper.class)
Map<TableType, WalletTable> getForTypeId(int tableTypeId); Map<TableType, WalletTable> getForTypeId(int tableTypeId);
@SqlUpdate("insert into walletTable (type, widths, wallet) values (?, ?, ?)") @SqlUpdate("insert into walletTable (type, widths, sortColumn, sortDirection, wallet) values (?, ?, ?, ?, ?)")
@GetGeneratedKeys("id") @GetGeneratedKeys("id")
long insertWalletTable(int tableType, Double[] widths, long wallet); long insertWalletTable(int tableType, Double[] widths, int sortColumn, int sortDirection, long wallet);
@SqlUpdate("update walletTable set type = ?, widths = ?, wallet = ? where id = ?") @SqlUpdate("update walletTable set type = ?, widths = ?, sortColumn = ?, sortDirection = ?, wallet = ? where id = ?")
void updateWalletTable(int tableType, Double[] widths, long wallet, long id); void updateWalletTable(int tableType, Double[] widths, int sortColumn, int sortDirection, long wallet, long id);
default void addWalletTables(Wallet wallet) { default void addWalletTables(Wallet wallet) {
Map<TableType, WalletTable> walletTables = new HashMap<>(wallet.getWalletTables()); Map<TableType, WalletTable> walletTables = new HashMap<>(wallet.getWalletTables());
@ -39,11 +39,13 @@ public interface WalletTableDao {
Map<TableType, WalletTable> existing = getForTypeId(tableType.ordinal()); Map<TableType, WalletTable> existing = getForTypeId(tableType.ordinal());
if(existing.isEmpty() && walletTable.getId() == null) { if(existing.isEmpty() && walletTable.getId() == null) {
long id = insertWalletTable(walletTable.getTableType().ordinal(), walletTable.getWidths(), wallet.getId()); long id = insertWalletTable(walletTable.getTableType().ordinal(), walletTable.getWidths(),
walletTable.getSortColumn(), walletTable.getSortDirection().ordinal(), wallet.getId());
walletTable.setId(id); walletTable.setId(id);
} else { } else {
Long existingId = existing.get(tableType) != null ? existing.get(tableType).getId() : walletTable.getId(); Long existingId = existing.get(tableType) != null ? existing.get(tableType).getId() : walletTable.getId();
updateWalletTable(walletTable.getTableType().ordinal(), walletTable.getWidths(), wallet.getId(), existingId); updateWalletTable(walletTable.getTableType().ordinal(), walletTable.getWidths(),
walletTable.getSortColumn(), walletTable.getSortDirection().ordinal(), wallet.getId(), existingId);
walletTable.setId(existingId); walletTable.setId(existingId);
} }
} }

View file

@ -1,5 +1,6 @@
package com.sparrowwallet.sparrow.io.db; package com.sparrowwallet.sparrow.io.db;
import com.sparrowwallet.drongo.wallet.SortDirection;
import com.sparrowwallet.drongo.wallet.TableType; import com.sparrowwallet.drongo.wallet.TableType;
import com.sparrowwallet.drongo.wallet.WalletTable; import com.sparrowwallet.drongo.wallet.WalletTable;
import org.jdbi.v3.core.mapper.RowMapper; import org.jdbi.v3.core.mapper.RowMapper;
@ -16,8 +17,10 @@ public class WalletTableMapper implements RowMapper<Map.Entry<TableType, WalletT
TableType tableType = TableType.values()[rs.getInt("type")]; TableType tableType = TableType.values()[rs.getInt("type")];
Object[] objWidths = (Object[])rs.getArray("widths").getArray(); Object[] objWidths = (Object[])rs.getArray("widths").getArray();
Double[] widths = Arrays.copyOf(objWidths, objWidths.length, Double[].class); Double[] widths = Arrays.copyOf(objWidths, objWidths.length, Double[].class);
int sortColumn = rs.getInt("sortColumn");
SortDirection sortDirection = SortDirection.values()[rs.getInt("sortDirection")];
WalletTable walletTable = new WalletTable(tableType, widths); WalletTable walletTable = new WalletTable(tableType, widths, sortColumn, sortDirection);
walletTable.setId(rs.getLong("id")); walletTable.setId(rs.getLong("id"));
return new Map.Entry<>() { return new Map.Entry<>() {

View file

@ -594,9 +594,8 @@ public class WalletForm {
} }
@Subscribe @Subscribe
public void walletTableColumnsResized(WalletTableColumnsResizedEvent event) { public void walletTableChanged(WalletTableChangedEvent event) {
if(event.getWallet() == wallet && event.getTableType() != null) { if(event.getWallet() == wallet && event.getTableType() != null) {
wallet.getWalletTables().put(event.getTableType(), event.getWalletTable());
Platform.runLater(() -> EventManager.get().post(new WalletDataChangedEvent(wallet))); Platform.runLater(() -> EventManager.get().post(new WalletDataChangedEvent(wallet)));
} }
} }

View file

@ -1,2 +1,2 @@
create table walletTable (id identity not null, type integer not null, widths double precision array not null, wallet bigint not null); create table walletTable (id identity not null, type integer not null, widths double precision array not null, sortColumn integer not null, sortDirection integer not null, wallet bigint not null);
alter table keystore add column deviceRegistration varbinary(32) after externalPaymentCode; alter table keystore add column deviceRegistration varbinary(32) after externalPaymentCode;

View file

@ -45,7 +45,7 @@
</HBox> </HBox>
</top> </top>
<center> <center>
<AddressTreeTable fx:id="receiveTable" /> <AddressTreeTable fx:id="receiveTable" tableType="RECEIVE_ADDRESSES" />
</center> </center>
</BorderPane> </BorderPane>
<BorderPane GridPane.columnIndex="0" GridPane.rowIndex="1"> <BorderPane GridPane.columnIndex="0" GridPane.rowIndex="1">
@ -63,7 +63,7 @@
</HBox> </HBox>
</top> </top>
<center> <center>
<AddressTreeTable fx:id="changeTable" /> <AddressTreeTable fx:id="changeTable" tableType="CHANGE_ADDRESSES" />
</center> </center>
</BorderPane> </BorderPane>
</GridPane> </GridPane>

View file

@ -64,7 +64,7 @@
</GridPane> </GridPane>
<MasterDetailPane fx:id="transactionsMasterDetail" detailSide="BOTTOM" VBox.vgrow="ALWAYS"> <MasterDetailPane fx:id="transactionsMasterDetail" detailSide="BOTTOM" VBox.vgrow="ALWAYS">
<masterNode> <masterNode>
<TransactionsTreeTable fx:id="transactionsTable" /> <TransactionsTreeTable fx:id="transactionsTable" tableType="TRANSACTIONS" />
</masterNode> </masterNode>
<detailNode> <detailNode>
<TextArea fx:id="loadingLog" styleClass="readonly,fixed-width" /> <TextArea fx:id="loadingLog" styleClass="readonly,fixed-width" />

View file

@ -64,7 +64,7 @@
</GridPane> </GridPane>
<BorderPane VBox.vgrow="ALWAYS"> <BorderPane VBox.vgrow="ALWAYS">
<center> <center>
<UtxosTreeTable fx:id="utxosTable" /> <UtxosTreeTable fx:id="utxosTable" tableType="UTXOS" />
</center> </center>
<bottom> <bottom>
<HBox> <HBox>