Add robustness against null models
This commit is contained in:
parent
0fb0a38339
commit
dead0ff8cd
11 changed files with 172 additions and 99 deletions
|
@ -11,9 +11,12 @@ AboutDialog::AboutDialog(QWidget *parent) :
|
|||
}
|
||||
|
||||
void AboutDialog::setModel(ClientModel *model)
|
||||
{
|
||||
if(model)
|
||||
{
|
||||
ui->versionLabel->setText(model->formatFullVersion());
|
||||
}
|
||||
}
|
||||
|
||||
AboutDialog::~AboutDialog()
|
||||
{
|
||||
|
|
|
@ -57,6 +57,8 @@ AddressBookPage::~AddressBookPage()
|
|||
void AddressBookPage::setModel(AddressTableModel *model)
|
||||
{
|
||||
this->model = model;
|
||||
if(!model)
|
||||
return;
|
||||
// Refresh list from core
|
||||
model->updateList();
|
||||
|
||||
|
@ -96,16 +98,13 @@ void AddressBookPage::setModel(AddressTableModel *model)
|
|||
selectionChanged();
|
||||
}
|
||||
|
||||
QTableView *AddressBookPage::getCurrentTable()
|
||||
{
|
||||
return ui->tableView;
|
||||
}
|
||||
|
||||
void AddressBookPage::on_copyToClipboard_clicked()
|
||||
{
|
||||
// Copy currently selected address to clipboard
|
||||
// (or nothing, if nothing selected)
|
||||
QTableView *table = getCurrentTable();
|
||||
QTableView *table = ui->tableView;
|
||||
if(!table->selectionModel())
|
||||
return;
|
||||
QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
|
||||
|
||||
foreach (QModelIndex index, indexes)
|
||||
|
@ -117,6 +116,8 @@ void AddressBookPage::on_copyToClipboard_clicked()
|
|||
|
||||
void AddressBookPage::on_newAddressButton_clicked()
|
||||
{
|
||||
if(!model)
|
||||
return;
|
||||
EditAddressDialog dlg(
|
||||
tab == SendingTab ?
|
||||
EditAddressDialog::NewSendingAddress :
|
||||
|
@ -139,7 +140,9 @@ void AddressBookPage::on_newAddressButton_clicked()
|
|||
|
||||
void AddressBookPage::on_deleteButton_clicked()
|
||||
{
|
||||
QTableView *table = getCurrentTable();
|
||||
QTableView *table = ui->tableView;
|
||||
if(!table->selectionModel())
|
||||
return;
|
||||
QModelIndexList indexes = table->selectionModel()->selectedRows();
|
||||
if(!indexes.isEmpty())
|
||||
{
|
||||
|
@ -150,7 +153,9 @@ void AddressBookPage::on_deleteButton_clicked()
|
|||
void AddressBookPage::selectionChanged()
|
||||
{
|
||||
// Set button states based on selected tab and selection
|
||||
QTableView *table = getCurrentTable();
|
||||
QTableView *table = ui->tableView;
|
||||
if(!table->selectionModel())
|
||||
return;
|
||||
|
||||
if(table->selectionModel()->hasSelection())
|
||||
{
|
||||
|
@ -174,12 +179,14 @@ void AddressBookPage::selectionChanged()
|
|||
|
||||
void AddressBookPage::done(int retval)
|
||||
{
|
||||
QTableView *table = ui->tableView;
|
||||
if(!table->selectionModel() || !table->model())
|
||||
return;
|
||||
// When this is a tab/widget and not a model dialog, ignore "done"
|
||||
if(mode == ForEditing)
|
||||
return;
|
||||
|
||||
// Figure out which address was selected, and return it
|
||||
QTableView *table = getCurrentTable();
|
||||
QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
|
||||
|
||||
foreach (QModelIndex index, indexes)
|
||||
|
|
|
@ -47,8 +47,6 @@ private:
|
|||
QString returnValue;
|
||||
QSortFilterProxyModel *proxyModel;
|
||||
|
||||
QTableView *getCurrentTable();
|
||||
|
||||
private slots:
|
||||
void on_deleteButton_clicked();
|
||||
void on_newAddressButton_clicked();
|
||||
|
|
|
@ -72,6 +72,8 @@ void AskPassphraseDialog::setModel(WalletModel *model)
|
|||
void AskPassphraseDialog::accept()
|
||||
{
|
||||
std::string oldpass, newpass1, newpass2;
|
||||
if(!model)
|
||||
return;
|
||||
// TODO: mlock memory / munlock on return so they will not be swapped out, really need "mlockedstring" wrapper class to do this safely
|
||||
oldpass.reserve(MAX_PASSPHRASE_SIZE);
|
||||
newpass1.reserve(MAX_PASSPHRASE_SIZE);
|
||||
|
|
|
@ -267,7 +267,8 @@ void BitcoinGUI::createToolBars()
|
|||
void BitcoinGUI::setClientModel(ClientModel *clientModel)
|
||||
{
|
||||
this->clientModel = clientModel;
|
||||
|
||||
if(clientModel)
|
||||
{
|
||||
if(clientModel->isTestNet())
|
||||
{
|
||||
QString title_testnet = windowTitle() + QString(" ") + tr("[testnet]");
|
||||
|
@ -294,11 +295,13 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
|
|||
// Report errors from network/worker thread
|
||||
connect(clientModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
|
||||
}
|
||||
}
|
||||
|
||||
void BitcoinGUI::setWalletModel(WalletModel *walletModel)
|
||||
{
|
||||
this->walletModel = walletModel;
|
||||
|
||||
if(walletModel)
|
||||
{
|
||||
// Report errors from wallet thread
|
||||
connect(walletModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
|
||||
|
||||
|
@ -320,6 +323,7 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel)
|
|||
// Ask for passphrase if needed
|
||||
connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
|
||||
}
|
||||
}
|
||||
|
||||
void BitcoinGUI::createTrayIcon()
|
||||
{
|
||||
|
@ -369,6 +373,8 @@ void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason)
|
|||
|
||||
void BitcoinGUI::optionsClicked()
|
||||
{
|
||||
if(!clientModel || !clientModel->getOptionsModel())
|
||||
return;
|
||||
OptionsDialog dlg;
|
||||
dlg.setModel(clientModel->getOptionsModel());
|
||||
dlg.exec();
|
||||
|
@ -398,6 +404,8 @@ void BitcoinGUI::setNumConnections(int count)
|
|||
|
||||
void BitcoinGUI::setNumBlocks(int count)
|
||||
{
|
||||
if(!clientModel)
|
||||
return;
|
||||
int initTotal = clientModel->getNumBlocksAtStartup();
|
||||
int total = clientModel->getNumBlocksOfPeers();
|
||||
QString tooltip;
|
||||
|
@ -491,6 +499,8 @@ void BitcoinGUI::changeEvent(QEvent *e)
|
|||
}
|
||||
|
||||
void BitcoinGUI::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
if(clientModel)
|
||||
{
|
||||
#ifndef Q_WS_MAC // Ignored on Mac
|
||||
if(!clientModel->getOptionsModel()->getMinimizeToTray() &&
|
||||
|
@ -499,6 +509,7 @@ void BitcoinGUI::closeEvent(QCloseEvent *event)
|
|||
qApp->quit();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
QMainWindow::closeEvent(event);
|
||||
}
|
||||
|
||||
|
@ -517,6 +528,8 @@ void BitcoinGUI::askFee(qint64 nFeeRequired, bool *payFee)
|
|||
|
||||
void BitcoinGUI::incomingTransaction(const QModelIndex & parent, int start, int end)
|
||||
{
|
||||
if(!walletModel || !clientModel)
|
||||
return;
|
||||
TransactionTableModel *ttm = walletModel->getTransactionTableModel();
|
||||
qint64 amount = ttm->index(start, TransactionTableModel::Amount, parent)
|
||||
.data(Qt::EditRole).toULongLong();
|
||||
|
@ -654,6 +667,8 @@ void BitcoinGUI::setEncryptionStatus(int status)
|
|||
|
||||
void BitcoinGUI::encryptWallet(bool status)
|
||||
{
|
||||
if(!walletModel)
|
||||
return;
|
||||
AskPassphraseDialog dlg(status ? AskPassphraseDialog::Encrypt:
|
||||
AskPassphraseDialog::Decrypt, this);
|
||||
dlg.setModel(walletModel);
|
||||
|
@ -671,6 +686,8 @@ void BitcoinGUI::changePassphrase()
|
|||
|
||||
void BitcoinGUI::unlockWallet()
|
||||
{
|
||||
if(!walletModel)
|
||||
return;
|
||||
// Unlock wallet when requested by wallet model
|
||||
if(walletModel->getEncryptionStatus() == WalletModel::Locked)
|
||||
{
|
||||
|
|
|
@ -48,7 +48,11 @@ bool CSVModelWriter::write()
|
|||
return false;
|
||||
QTextStream out(&file);
|
||||
|
||||
int numRows = model->rowCount();
|
||||
int numRows = 0;
|
||||
if(model)
|
||||
{
|
||||
numRows = model->rowCount();
|
||||
}
|
||||
|
||||
// Header row
|
||||
for(int i=0; i<columns.size(); ++i)
|
||||
|
|
|
@ -56,6 +56,8 @@ void EditAddressDialog::loadRow(int row)
|
|||
|
||||
bool EditAddressDialog::saveCurrentRow()
|
||||
{
|
||||
if(!model)
|
||||
return false;
|
||||
switch(mode)
|
||||
{
|
||||
case NewReceivingAddress:
|
||||
|
@ -78,6 +80,8 @@ bool EditAddressDialog::saveCurrentRow()
|
|||
|
||||
void EditAddressDialog::accept()
|
||||
{
|
||||
if(!model)
|
||||
return;
|
||||
if(!saveCurrentRow())
|
||||
{
|
||||
switch(model->getEditStatus())
|
||||
|
|
|
@ -143,7 +143,8 @@ void OverviewPage::setNumTransactions(int count)
|
|||
void OverviewPage::setModel(WalletModel *model)
|
||||
{
|
||||
this->model = model;
|
||||
|
||||
if(model)
|
||||
{
|
||||
// Set up transaction list
|
||||
TransactionFilterProxy *filter = new TransactionFilterProxy();
|
||||
filter->setSourceModel(model->getTransactionTableModel());
|
||||
|
@ -164,9 +165,12 @@ void OverviewPage::setModel(WalletModel *model)
|
|||
|
||||
connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(displayUnitChanged()));
|
||||
}
|
||||
}
|
||||
|
||||
void OverviewPage::displayUnitChanged()
|
||||
{
|
||||
if(!model || !model->getOptionsModel())
|
||||
return;
|
||||
if(currentBalance != -1)
|
||||
setBalance(currentBalance, currentUnconfirmedBalance);
|
||||
|
||||
|
|
|
@ -43,10 +43,12 @@ void SendCoinsDialog::setModel(WalletModel *model)
|
|||
entry->setModel(model);
|
||||
}
|
||||
}
|
||||
|
||||
if(model)
|
||||
{
|
||||
setBalance(model->getBalance(), model->getUnconfirmedBalance());
|
||||
connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64)));
|
||||
}
|
||||
}
|
||||
|
||||
SendCoinsDialog::~SendCoinsDialog()
|
||||
{
|
||||
|
@ -57,6 +59,10 @@ void SendCoinsDialog::on_sendButton_clicked()
|
|||
{
|
||||
QList<SendCoinsRecipient> recipients;
|
||||
bool valid = true;
|
||||
|
||||
if(!model)
|
||||
return;
|
||||
|
||||
for(int i = 0; i < ui->entries->count(); ++i)
|
||||
{
|
||||
SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
|
||||
|
@ -255,6 +261,9 @@ void SendCoinsDialog::handleURL(const QUrl *url)
|
|||
void SendCoinsDialog::setBalance(qint64 balance, qint64 unconfirmedBalance)
|
||||
{
|
||||
Q_UNUSED(unconfirmedBalance);
|
||||
if(!model || !model->getOptionsModel())
|
||||
return;
|
||||
|
||||
int unit = model->getOptionsModel()->getDisplayUnit();
|
||||
ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balance));
|
||||
}
|
||||
|
|
|
@ -44,6 +44,8 @@ void SendCoinsEntry::on_pasteButton_clicked()
|
|||
|
||||
void SendCoinsEntry::on_addressBookButton_clicked()
|
||||
{
|
||||
if(!model)
|
||||
return;
|
||||
AddressBookPage dlg(AddressBookPage::ForSending, AddressBookPage::SendingTab, this);
|
||||
dlg.setModel(model->getAddressTableModel());
|
||||
if(dlg.exec())
|
||||
|
@ -55,6 +57,8 @@ void SendCoinsEntry::on_addressBookButton_clicked()
|
|||
|
||||
void SendCoinsEntry::on_payTo_textChanged(const QString &address)
|
||||
{
|
||||
if(!model)
|
||||
return;
|
||||
ui->addAsLabel->setText(model->getAddressTableModel()->labelForAddress(address));
|
||||
}
|
||||
|
||||
|
@ -74,7 +78,7 @@ void SendCoinsEntry::clear()
|
|||
ui->addAsLabel->clear();
|
||||
ui->payAmount->clear();
|
||||
ui->payTo->setFocus();
|
||||
if(model)
|
||||
if(model && model->getOptionsModel())
|
||||
{
|
||||
ui->payAmount->setDisplayUnit(model->getOptionsModel()->getDisplayUnit());
|
||||
}
|
||||
|
|
|
@ -155,7 +155,8 @@ TransactionView::TransactionView(QWidget *parent) :
|
|||
void TransactionView::setModel(WalletModel *model)
|
||||
{
|
||||
this->model = model;
|
||||
|
||||
if(model)
|
||||
{
|
||||
transactionProxyModel = new TransactionFilterProxy(this);
|
||||
transactionProxyModel->setSourceModel(model->getTransactionTableModel());
|
||||
transactionProxyModel->setDynamicSortFilter(true);
|
||||
|
@ -180,11 +181,13 @@ void TransactionView::setModel(WalletModel *model)
|
|||
TransactionTableModel::ToAddress, QHeaderView::Stretch);
|
||||
transactionView->horizontalHeader()->resizeSection(
|
||||
TransactionTableModel::Amount, 100);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void TransactionView::chooseDate(int idx)
|
||||
{
|
||||
if(!transactionProxyModel)
|
||||
return;
|
||||
QDate current = QDate::currentDate();
|
||||
dateRangeWidget->setVisible(false);
|
||||
switch(dateWidget->itemData(idx).toInt())
|
||||
|
@ -231,17 +234,23 @@ void TransactionView::chooseDate(int idx)
|
|||
|
||||
void TransactionView::chooseType(int idx)
|
||||
{
|
||||
if(!transactionProxyModel)
|
||||
return;
|
||||
transactionProxyModel->setTypeFilter(
|
||||
typeWidget->itemData(idx).toInt());
|
||||
}
|
||||
|
||||
void TransactionView::changedPrefix(const QString &prefix)
|
||||
{
|
||||
if(!transactionProxyModel)
|
||||
return;
|
||||
transactionProxyModel->setAddressPrefix(prefix);
|
||||
}
|
||||
|
||||
void TransactionView::changedAmount(const QString &amount)
|
||||
{
|
||||
if(!transactionProxyModel)
|
||||
return;
|
||||
qint64 amount_parsed = 0;
|
||||
if(BitcoinUnits::parse(model->getOptionsModel()->getDisplayUnit(), amount, &amount_parsed))
|
||||
{
|
||||
|
@ -294,6 +303,8 @@ void TransactionView::contextualMenu(const QPoint &point)
|
|||
|
||||
void TransactionView::copyAddress()
|
||||
{
|
||||
if(!transactionView->selectionModel())
|
||||
return;
|
||||
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
|
||||
if(!selection.isEmpty())
|
||||
{
|
||||
|
@ -303,6 +314,8 @@ void TransactionView::copyAddress()
|
|||
|
||||
void TransactionView::copyLabel()
|
||||
{
|
||||
if(!transactionView->selectionModel())
|
||||
return;
|
||||
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
|
||||
if(!selection.isEmpty())
|
||||
{
|
||||
|
@ -312,10 +325,14 @@ void TransactionView::copyLabel()
|
|||
|
||||
void TransactionView::editLabel()
|
||||
{
|
||||
if(!transactionView->selectionModel() ||!model)
|
||||
return;
|
||||
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
|
||||
if(!selection.isEmpty())
|
||||
{
|
||||
AddressTableModel *addressBook = model->getAddressTableModel();
|
||||
if(!addressBook)
|
||||
return;
|
||||
QString address = selection.at(0).data(TransactionTableModel::AddressRole).toString();
|
||||
if(address.isEmpty())
|
||||
{
|
||||
|
@ -354,6 +371,8 @@ void TransactionView::editLabel()
|
|||
|
||||
void TransactionView::showDetails()
|
||||
{
|
||||
if(!transactionView->selectionModel())
|
||||
return;
|
||||
QModelIndexList selection = transactionView->selectionModel()->selectedRows();
|
||||
if(!selection.isEmpty())
|
||||
{
|
||||
|
@ -400,6 +419,8 @@ QWidget *TransactionView::createDateRangeWidget()
|
|||
|
||||
void TransactionView::dateRangeChanged()
|
||||
{
|
||||
if(!transactionProxyModel)
|
||||
return;
|
||||
transactionProxyModel->setDateRange(
|
||||
QDateTime(dateFrom->date()),
|
||||
QDateTime(dateTo->date()).addDays(1));
|
||||
|
|
Loading…
Reference in a new issue