mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2025-11-05 11:56:37 +00:00
store treetable column sort on adjustment, and restore on wallet load
This commit is contained in:
parent
f9199b65f0
commit
3dfd8210a8
17 changed files with 123 additions and 53 deletions
2
drongo
2
drongo
|
|
@ -1 +1 @@
|
||||||
Subproject commit 1805aeb3740a9b90cff321219f0e60c4a1ccd3a6
|
Subproject commit b2c362d5a71b8c46f8990a6b6b9b96f81ee24c90
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
//Ignore initial resizes during layout
|
||||||
WalletTable walletTable = new WalletTable(tableType, widths);
|
walletTableEvents.skip(3, TimeUnit.SECONDS).subscribe(event -> {
|
||||||
columnResizeSubject.onNext(new WalletTableColumnsResizedEvent(getRoot().getValue().getWallet(), walletTable));
|
event.getWallet().getWalletTables().put(event.getTableType(), event.getWalletTable());
|
||||||
}
|
EventManager.get().post(event);
|
||||||
});
|
});
|
||||||
|
|
||||||
columnResizeEvents.skip(3, TimeUnit.SECONDS).subscribe(event -> 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);
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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<>() {
|
||||||
|
|
|
||||||
|
|
@ -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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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" />
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue