[Qt] Optionally add third party links to transaction context menu
This commit is contained in:
parent
4765b8c116
commit
40c5b939f2
8 changed files with 87 additions and 0 deletions
|
@ -471,6 +471,30 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3_Display">
|
||||
<item>
|
||||
<widget class="QLabel" name="thirdPartyTxUrlsLabel">
|
||||
<property name="toolTip">
|
||||
<string>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Third party transaction URLs</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>thirdPartyTxUrls</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="thirdPartyTxUrls">
|
||||
<property name="toolTip">
|
||||
<string>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_Display">
|
||||
<property name="orientation">
|
||||
|
|
|
@ -96,6 +96,9 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
|
|||
#endif
|
||||
}
|
||||
}
|
||||
#if QT_VERSION >= 0x040700
|
||||
ui->thirdPartyTxUrls->setPlaceholderText("https://example.com/tx/%s");
|
||||
#endif
|
||||
|
||||
ui->unit->setModel(new BitcoinUnits(this));
|
||||
ui->transactionFee->setSingleStep(CTransaction::nMinTxFee);
|
||||
|
@ -151,6 +154,7 @@ void OptionsDialog::setModel(OptionsModel *model)
|
|||
connect(ui->connectSocks, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning()));
|
||||
/* Display */
|
||||
connect(ui->lang, SIGNAL(valueChanged()), this, SLOT(showRestartWarning()));
|
||||
connect(ui->thirdPartyTxUrls, SIGNAL(textChanged(const QString &)), this, SLOT(showRestartWarning()));
|
||||
}
|
||||
|
||||
void OptionsDialog::setMapper()
|
||||
|
@ -183,6 +187,7 @@ void OptionsDialog::setMapper()
|
|||
mapper->addMapping(ui->lang, OptionsModel::Language);
|
||||
mapper->addMapping(ui->unit, OptionsModel::DisplayUnit);
|
||||
mapper->addMapping(ui->displayAddresses, OptionsModel::DisplayAddresses);
|
||||
mapper->addMapping(ui->thirdPartyTxUrls, OptionsModel::ThirdPartyTxUrls);
|
||||
}
|
||||
|
||||
void OptionsDialog::enableOkButton()
|
||||
|
|
|
@ -63,6 +63,10 @@ void OptionsModel::Init()
|
|||
settings.setValue("bDisplayAddresses", false);
|
||||
bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
|
||||
|
||||
if (!settings.contains("strThirdPartyTxUrls"))
|
||||
settings.setValue("strThirdPartyTxUrls", "");
|
||||
strThirdPartyTxUrls = settings.value("strThirdPartyTxUrls", "").toString();
|
||||
|
||||
if (!settings.contains("fCoinControlFeatures"))
|
||||
settings.setValue("fCoinControlFeatures", false);
|
||||
fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool();
|
||||
|
@ -203,6 +207,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
|
|||
return nDisplayUnit;
|
||||
case DisplayAddresses:
|
||||
return bDisplayAddresses;
|
||||
case ThirdPartyTxUrls:
|
||||
return strThirdPartyTxUrls;
|
||||
case Language:
|
||||
return settings.value("language");
|
||||
case CoinControlFeatures:
|
||||
|
@ -304,6 +310,13 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
|
|||
bDisplayAddresses = value.toBool();
|
||||
settings.setValue("bDisplayAddresses", bDisplayAddresses);
|
||||
break;
|
||||
case ThirdPartyTxUrls:
|
||||
if (strThirdPartyTxUrls != value.toString()) {
|
||||
strThirdPartyTxUrls = value.toString();
|
||||
settings.setValue("strThirdPartyTxUrls", strThirdPartyTxUrls);
|
||||
setRestartRequired(true);
|
||||
}
|
||||
break;
|
||||
case Language:
|
||||
if (settings.value("language") != value) {
|
||||
settings.setValue("language", value);
|
||||
|
|
|
@ -36,6 +36,7 @@ public:
|
|||
Fee, // qint64
|
||||
DisplayUnit, // BitcoinUnits::Unit
|
||||
DisplayAddresses, // bool
|
||||
ThirdPartyTxUrls, // QString
|
||||
Language, // QString
|
||||
CoinControlFeatures, // bool
|
||||
ThreadsScriptVerif, // int
|
||||
|
@ -56,6 +57,7 @@ public:
|
|||
bool getMinimizeOnClose() { return fMinimizeOnClose; }
|
||||
int getDisplayUnit() { return nDisplayUnit; }
|
||||
bool getDisplayAddresses() { return bDisplayAddresses; }
|
||||
QString getThirdPartyTxUrls() { return strThirdPartyTxUrls; }
|
||||
bool getProxySettings(QNetworkProxy& proxy) const;
|
||||
bool getCoinControlFeatures() { return fCoinControlFeatures; }
|
||||
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
|
||||
|
@ -71,6 +73,7 @@ private:
|
|||
QString language;
|
||||
int nDisplayUnit;
|
||||
bool bDisplayAddresses;
|
||||
QString strThirdPartyTxUrls;
|
||||
bool fCoinControlFeatures;
|
||||
/* settings that were overriden by command-line */
|
||||
QString strOverriddenByCommandLine;
|
||||
|
|
|
@ -564,6 +564,8 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
|
|||
return rec->credit + rec->debit;
|
||||
case TxIDRole:
|
||||
return rec->getTxID();
|
||||
case TxHashRole:
|
||||
return QString::fromStdString(rec->hash.ToString());
|
||||
case ConfirmedRole:
|
||||
return rec->status.countsForBalance;
|
||||
case FormattedAmountRole:
|
||||
|
|
|
@ -50,6 +50,8 @@ public:
|
|||
AmountRole,
|
||||
/** Unique identifier */
|
||||
TxIDRole,
|
||||
/** Transaction hash */
|
||||
TxHashRole,
|
||||
/** Is transaction confirmed? */
|
||||
ConfirmedRole,
|
||||
/** Formatted amount, without brackets when unconfirmed */
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <QComboBox>
|
||||
#include <QDateTimeEdit>
|
||||
#include <QDesktopServices>
|
||||
#include <QDoubleValidator>
|
||||
#include <QHBoxLayout>
|
||||
#include <QHeaderView>
|
||||
|
@ -28,7 +29,9 @@
|
|||
#include <QMenu>
|
||||
#include <QPoint>
|
||||
#include <QScrollBar>
|
||||
#include <QSignalMapper>
|
||||
#include <QTableView>
|
||||
#include <QUrl>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
TransactionView::TransactionView(QWidget *parent) :
|
||||
|
@ -138,7 +141,11 @@ TransactionView::TransactionView(QWidget *parent) :
|
|||
contextMenu->addAction(editLabelAction);
|
||||
contextMenu->addAction(showDetailsAction);
|
||||
|
||||
mapperThirdPartyTxUrls = new QSignalMapper(this);
|
||||
|
||||
// Connect actions
|
||||
connect(mapperThirdPartyTxUrls, SIGNAL(mapped(QString)), this, SLOT(openThirdPartyTxUrl(QString)));
|
||||
|
||||
connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int)));
|
||||
connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int)));
|
||||
connect(addressWidget, SIGNAL(textChanged(QString)), this, SLOT(changedPrefix(QString)));
|
||||
|
@ -183,6 +190,25 @@ void TransactionView::setModel(WalletModel *model)
|
|||
transactionView->setColumnWidth(TransactionTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
|
||||
|
||||
columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(transactionView, AMOUNT_MINIMUM_COLUMN_WIDTH, MINIMUM_COLUMN_WIDTH);
|
||||
|
||||
if (model->getOptionsModel())
|
||||
{
|
||||
// Add third party transaction URLs to context menu
|
||||
QStringList listUrls = model->getOptionsModel()->getThirdPartyTxUrls().split("|", QString::SkipEmptyParts);
|
||||
for (int i = 0; i < listUrls.size(); ++i)
|
||||
{
|
||||
QString host = QUrl(listUrls[i].trimmed(), QUrl::StrictMode).host();
|
||||
if (!host.isEmpty())
|
||||
{
|
||||
QAction *thirdPartyTxUrlAction = new QAction(host, this); // use host as menu item label
|
||||
if (i == 0)
|
||||
contextMenu->addSeparator();
|
||||
contextMenu->addAction(thirdPartyTxUrlAction);
|
||||
connect(thirdPartyTxUrlAction, SIGNAL(triggered()), mapperThirdPartyTxUrls, SLOT(map()));
|
||||
mapperThirdPartyTxUrls->setMapping(thirdPartyTxUrlAction, listUrls[i].trimmed());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -383,6 +409,15 @@ void TransactionView::showDetails()
|
|||
}
|
||||
}
|
||||
|
||||
void TransactionView::openThirdPartyTxUrl(QString url)
|
||||
{
|
||||
if(!transactionView || !transactionView->selectionModel())
|
||||
return;
|
||||
QModelIndexList selection = transactionView->selectionModel()->selectedRows(0);
|
||||
if(!selection.isEmpty())
|
||||
QDesktopServices::openUrl(QUrl::fromUserInput(url.replace("%s", selection.at(0).data(TransactionTableModel::TxHashRole).toString())));
|
||||
}
|
||||
|
||||
QWidget *TransactionView::createDateRangeWidget()
|
||||
{
|
||||
dateRangeWidget = new QFrame();
|
||||
|
|
|
@ -19,6 +19,7 @@ class QFrame;
|
|||
class QLineEdit;
|
||||
class QMenu;
|
||||
class QModelIndex;
|
||||
class QSignalMapper;
|
||||
class QTableView;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
@ -65,6 +66,7 @@ private:
|
|||
QLineEdit *amountWidget;
|
||||
|
||||
QMenu *contextMenu;
|
||||
QSignalMapper *mapperThirdPartyTxUrls;
|
||||
|
||||
QFrame *dateRangeWidget;
|
||||
QDateTimeEdit *dateFrom;
|
||||
|
@ -85,6 +87,7 @@ private slots:
|
|||
void copyLabel();
|
||||
void copyAmount();
|
||||
void copyTxID();
|
||||
void openThirdPartyTxUrl(QString url);
|
||||
|
||||
signals:
|
||||
void doubleClicked(const QModelIndex&);
|
||||
|
|
Loading…
Reference in a new issue