mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 15:04:44 +01:00
qt: Drop buggy TableViewLastColumnResizingFixer class
In Qt 5 the last column resizing with dragging its left edge works out-of-the-box. The current TableViewLastColumnResizingFixer implementation could put the last column content out of the view port and confuse a user.
This commit is contained in:
parent
4c55f92c76
commit
3913d1e8c1
6 changed files with 4 additions and 182 deletions
|
@ -470,120 +470,6 @@ bool LabelOutOfFocusEventFilter::eventFilter(QObject* watched, QEvent* event)
|
||||||
return QObject::eventFilter(watched, event);
|
return QObject::eventFilter(watched, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TableViewLastColumnResizingFixer::connectViewHeadersSignals()
|
|
||||||
{
|
|
||||||
connect(tableView->horizontalHeader(), &QHeaderView::sectionResized, this, &TableViewLastColumnResizingFixer::on_sectionResized);
|
|
||||||
connect(tableView->horizontalHeader(), &QHeaderView::geometriesChanged, this, &TableViewLastColumnResizingFixer::on_geometriesChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need to disconnect these while handling the resize events, otherwise we can enter infinite loops.
|
|
||||||
void TableViewLastColumnResizingFixer::disconnectViewHeadersSignals()
|
|
||||||
{
|
|
||||||
disconnect(tableView->horizontalHeader(), &QHeaderView::sectionResized, this, &TableViewLastColumnResizingFixer::on_sectionResized);
|
|
||||||
disconnect(tableView->horizontalHeader(), &QHeaderView::geometriesChanged, this, &TableViewLastColumnResizingFixer::on_geometriesChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup the resize mode, handles compatibility for Qt5 and below as the method signatures changed.
|
|
||||||
// Refactored here for readability.
|
|
||||||
void TableViewLastColumnResizingFixer::setViewHeaderResizeMode(int logicalIndex, QHeaderView::ResizeMode resizeMode)
|
|
||||||
{
|
|
||||||
tableView->horizontalHeader()->setSectionResizeMode(logicalIndex, resizeMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TableViewLastColumnResizingFixer::resizeColumn(int nColumnIndex, int width)
|
|
||||||
{
|
|
||||||
tableView->setColumnWidth(nColumnIndex, width);
|
|
||||||
tableView->horizontalHeader()->resizeSection(nColumnIndex, width);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TableViewLastColumnResizingFixer::getColumnsWidth()
|
|
||||||
{
|
|
||||||
int nColumnsWidthSum = 0;
|
|
||||||
for (int i = 0; i < columnCount; i++)
|
|
||||||
{
|
|
||||||
nColumnsWidthSum += tableView->horizontalHeader()->sectionSize(i);
|
|
||||||
}
|
|
||||||
return nColumnsWidthSum;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TableViewLastColumnResizingFixer::getAvailableWidthForColumn(int column)
|
|
||||||
{
|
|
||||||
int nResult = lastColumnMinimumWidth;
|
|
||||||
int nTableWidth = tableView->horizontalHeader()->width();
|
|
||||||
|
|
||||||
if (nTableWidth > 0)
|
|
||||||
{
|
|
||||||
int nOtherColsWidth = getColumnsWidth() - tableView->horizontalHeader()->sectionSize(column);
|
|
||||||
nResult = std::max(nResult, nTableWidth - nOtherColsWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
return nResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure we don't make the columns wider than the table's viewport width.
|
|
||||||
void TableViewLastColumnResizingFixer::adjustTableColumnsWidth()
|
|
||||||
{
|
|
||||||
disconnectViewHeadersSignals();
|
|
||||||
resizeColumn(lastColumnIndex, getAvailableWidthForColumn(lastColumnIndex));
|
|
||||||
connectViewHeadersSignals();
|
|
||||||
|
|
||||||
int nTableWidth = tableView->horizontalHeader()->width();
|
|
||||||
int nColsWidth = getColumnsWidth();
|
|
||||||
if (nColsWidth > nTableWidth)
|
|
||||||
{
|
|
||||||
resizeColumn(secondToLastColumnIndex,getAvailableWidthForColumn(secondToLastColumnIndex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make column use all the space available, useful during window resizing.
|
|
||||||
void TableViewLastColumnResizingFixer::stretchColumnWidth(int column)
|
|
||||||
{
|
|
||||||
disconnectViewHeadersSignals();
|
|
||||||
resizeColumn(column, getAvailableWidthForColumn(column));
|
|
||||||
connectViewHeadersSignals();
|
|
||||||
}
|
|
||||||
|
|
||||||
// When a section is resized this is a slot-proxy for ajustAmountColumnWidth().
|
|
||||||
void TableViewLastColumnResizingFixer::on_sectionResized(int logicalIndex, int oldSize, int newSize)
|
|
||||||
{
|
|
||||||
adjustTableColumnsWidth();
|
|
||||||
int remainingWidth = getAvailableWidthForColumn(logicalIndex);
|
|
||||||
if (newSize > remainingWidth)
|
|
||||||
{
|
|
||||||
resizeColumn(logicalIndex, remainingWidth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// When the table's geometry is ready, we manually perform the stretch of the "Message" column,
|
|
||||||
// as the "Stretch" resize mode does not allow for interactive resizing.
|
|
||||||
void TableViewLastColumnResizingFixer::on_geometriesChanged()
|
|
||||||
{
|
|
||||||
if ((getColumnsWidth() - this->tableView->horizontalHeader()->width()) != 0)
|
|
||||||
{
|
|
||||||
disconnectViewHeadersSignals();
|
|
||||||
resizeColumn(secondToLastColumnIndex, getAvailableWidthForColumn(secondToLastColumnIndex));
|
|
||||||
connectViewHeadersSignals();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes all internal variables and prepares the
|
|
||||||
* the resize modes of the last 2 columns of the table and
|
|
||||||
*/
|
|
||||||
TableViewLastColumnResizingFixer::TableViewLastColumnResizingFixer(QTableView* table, int lastColMinimumWidth, int allColsMinimumWidth, QObject *parent) :
|
|
||||||
QObject(parent),
|
|
||||||
tableView(table),
|
|
||||||
lastColumnMinimumWidth(lastColMinimumWidth),
|
|
||||||
allColumnsMinimumWidth(allColsMinimumWidth)
|
|
||||||
{
|
|
||||||
columnCount = tableView->horizontalHeader()->count();
|
|
||||||
lastColumnIndex = columnCount - 1;
|
|
||||||
secondToLastColumnIndex = columnCount - 2;
|
|
||||||
tableView->horizontalHeader()->setMinimumSectionSize(allColumnsMinimumWidth);
|
|
||||||
setViewHeaderResizeMode(secondToLastColumnIndex, QHeaderView::Interactive);
|
|
||||||
setViewHeaderResizeMode(lastColumnIndex, QHeaderView::Interactive);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
fs::path static StartupShortcutPath()
|
fs::path static StartupShortcutPath()
|
||||||
{
|
{
|
||||||
|
|
|
@ -181,45 +181,6 @@ namespace GUIUtil
|
||||||
bool eventFilter(QObject* watched, QEvent* event) override;
|
bool eventFilter(QObject* watched, QEvent* event) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes a QTableView last column feel as if it was being resized from its left border.
|
|
||||||
* Also makes sure the column widths are never larger than the table's viewport.
|
|
||||||
* In Qt, all columns are resizable from the right, but it's not intuitive resizing the last column from the right.
|
|
||||||
* Usually our second to last columns behave as if stretched, and when on stretch mode, columns aren't resizable
|
|
||||||
* interactively or programmatically.
|
|
||||||
*
|
|
||||||
* This helper object takes care of this issue.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class TableViewLastColumnResizingFixer: public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
TableViewLastColumnResizingFixer(QTableView* table, int lastColMinimumWidth, int allColsMinimumWidth, QObject *parent);
|
|
||||||
void stretchColumnWidth(int column);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QTableView* tableView;
|
|
||||||
int lastColumnMinimumWidth;
|
|
||||||
int allColumnsMinimumWidth;
|
|
||||||
int lastColumnIndex;
|
|
||||||
int columnCount;
|
|
||||||
int secondToLastColumnIndex;
|
|
||||||
|
|
||||||
void adjustTableColumnsWidth();
|
|
||||||
int getAvailableWidthForColumn(int column);
|
|
||||||
int getColumnsWidth();
|
|
||||||
void connectViewHeadersSignals();
|
|
||||||
void disconnectViewHeadersSignals();
|
|
||||||
void setViewHeaderResizeMode(int logicalIndex, QHeaderView::ResizeMode resizeMode);
|
|
||||||
void resizeColumn(int nColumnIndex, int width);
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void on_sectionResized(int logicalIndex, int oldSize, int newSize);
|
|
||||||
void on_geometriesChanged();
|
|
||||||
};
|
|
||||||
|
|
||||||
bool GetStartOnSystemStartup();
|
bool GetStartOnSystemStartup();
|
||||||
bool SetStartOnSystemStartup(bool fAutoStart);
|
bool SetStartOnSystemStartup(bool fAutoStart);
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
|
ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
|
||||||
QDialog(parent, GUIUtil::dialog_flags),
|
QDialog(parent, GUIUtil::dialog_flags),
|
||||||
ui(new Ui::ReceiveCoinsDialog),
|
ui(new Ui::ReceiveCoinsDialog),
|
||||||
columnResizingFixer(nullptr),
|
|
||||||
model(nullptr),
|
model(nullptr),
|
||||||
platformStyle(_platformStyle)
|
platformStyle(_platformStyle)
|
||||||
{
|
{
|
||||||
|
@ -78,7 +77,6 @@ void ReceiveCoinsDialog::setModel(WalletModel *_model)
|
||||||
QTableView* tableView = ui->recentRequestsView;
|
QTableView* tableView = ui->recentRequestsView;
|
||||||
|
|
||||||
tableView->verticalHeader()->hide();
|
tableView->verticalHeader()->hide();
|
||||||
tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
||||||
tableView->setModel(_model->getRecentRequestsTableModel());
|
tableView->setModel(_model->getRecentRequestsTableModel());
|
||||||
tableView->setAlternatingRowColors(true);
|
tableView->setAlternatingRowColors(true);
|
||||||
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||||
|
@ -86,12 +84,12 @@ void ReceiveCoinsDialog::setModel(WalletModel *_model)
|
||||||
tableView->setColumnWidth(RecentRequestsTableModel::Date, DATE_COLUMN_WIDTH);
|
tableView->setColumnWidth(RecentRequestsTableModel::Date, DATE_COLUMN_WIDTH);
|
||||||
tableView->setColumnWidth(RecentRequestsTableModel::Label, LABEL_COLUMN_WIDTH);
|
tableView->setColumnWidth(RecentRequestsTableModel::Label, LABEL_COLUMN_WIDTH);
|
||||||
tableView->setColumnWidth(RecentRequestsTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
|
tableView->setColumnWidth(RecentRequestsTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
|
||||||
|
tableView->horizontalHeader()->setMinimumSectionSize(MINIMUM_COLUMN_WIDTH);
|
||||||
|
tableView->horizontalHeader()->setStretchLastSection(true);
|
||||||
|
|
||||||
connect(tableView->selectionModel(),
|
connect(tableView->selectionModel(),
|
||||||
&QItemSelectionModel::selectionChanged, this,
|
&QItemSelectionModel::selectionChanged, this,
|
||||||
&ReceiveCoinsDialog::recentRequestsView_selectionChanged);
|
&ReceiveCoinsDialog::recentRequestsView_selectionChanged);
|
||||||
// Last 2 columns are set by the columnResizingFixer, when the table geometry is ready.
|
|
||||||
columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(tableView, AMOUNT_MINIMUM_COLUMN_WIDTH, DATE_COLUMN_WIDTH, this);
|
|
||||||
|
|
||||||
if (model->wallet().getDefaultAddressType() == OutputType::BECH32) {
|
if (model->wallet().getDefaultAddressType() == OutputType::BECH32) {
|
||||||
ui->useBech32->setCheckState(Qt::Checked);
|
ui->useBech32->setCheckState(Qt::Checked);
|
||||||
|
@ -235,14 +233,6 @@ void ReceiveCoinsDialog::on_removeRequestButton_clicked()
|
||||||
model->getRecentRequestsTableModel()->removeRows(firstIndex.row(), selection.length(), firstIndex.parent());
|
model->getRecentRequestsTableModel()->removeRows(firstIndex.row(), selection.length(), firstIndex.parent());
|
||||||
}
|
}
|
||||||
|
|
||||||
// We override the virtual resizeEvent of the QWidget to adjust tables column
|
|
||||||
// sizes as the tables width is proportional to the dialogs width.
|
|
||||||
void ReceiveCoinsDialog::resizeEvent(QResizeEvent *event)
|
|
||||||
{
|
|
||||||
QWidget::resizeEvent(event);
|
|
||||||
columnResizingFixer->stretchColumnWidth(RecentRequestsTableModel::Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
QModelIndex ReceiveCoinsDialog::selectedRow()
|
QModelIndex ReceiveCoinsDialog::selectedRow()
|
||||||
{
|
{
|
||||||
if(!model || !model->getRecentRequestsTableModel() || !ui->recentRequestsView->selectionModel())
|
if(!model || !model->getRecentRequestsTableModel() || !ui->recentRequestsView->selectionModel())
|
||||||
|
|
|
@ -51,14 +51,12 @@ public Q_SLOTS:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::ReceiveCoinsDialog *ui;
|
Ui::ReceiveCoinsDialog *ui;
|
||||||
GUIUtil::TableViewLastColumnResizingFixer *columnResizingFixer;
|
|
||||||
WalletModel *model;
|
WalletModel *model;
|
||||||
QMenu *contextMenu;
|
QMenu *contextMenu;
|
||||||
const PlatformStyle *platformStyle;
|
const PlatformStyle *platformStyle;
|
||||||
|
|
||||||
QModelIndex selectedRow();
|
QModelIndex selectedRow();
|
||||||
void copyColumnToClipboard(int column);
|
void copyColumnToClipboard(int column);
|
||||||
virtual void resizeEvent(QResizeEvent *event) override;
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void on_receiveButton_clicked();
|
void on_receiveButton_clicked();
|
||||||
|
|
|
@ -217,7 +217,6 @@ void TransactionView::setModel(WalletModel *_model)
|
||||||
|
|
||||||
transactionProxyModel->setSortRole(Qt::EditRole);
|
transactionProxyModel->setSortRole(Qt::EditRole);
|
||||||
|
|
||||||
transactionView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
||||||
transactionView->setModel(transactionProxyModel);
|
transactionView->setModel(transactionProxyModel);
|
||||||
transactionView->setAlternatingRowColors(true);
|
transactionView->setAlternatingRowColors(true);
|
||||||
transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||||
|
@ -231,8 +230,8 @@ void TransactionView::setModel(WalletModel *_model)
|
||||||
transactionView->setColumnWidth(TransactionTableModel::Date, DATE_COLUMN_WIDTH);
|
transactionView->setColumnWidth(TransactionTableModel::Date, DATE_COLUMN_WIDTH);
|
||||||
transactionView->setColumnWidth(TransactionTableModel::Type, TYPE_COLUMN_WIDTH);
|
transactionView->setColumnWidth(TransactionTableModel::Type, TYPE_COLUMN_WIDTH);
|
||||||
transactionView->setColumnWidth(TransactionTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
|
transactionView->setColumnWidth(TransactionTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
|
||||||
|
transactionView->horizontalHeader()->setMinimumSectionSize(MINIMUM_COLUMN_WIDTH);
|
||||||
columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(transactionView, AMOUNT_MINIMUM_COLUMN_WIDTH, MINIMUM_COLUMN_WIDTH, this);
|
transactionView->horizontalHeader()->setStretchLastSection(true);
|
||||||
|
|
||||||
if (_model->getOptionsModel())
|
if (_model->getOptionsModel())
|
||||||
{
|
{
|
||||||
|
@ -623,14 +622,6 @@ void TransactionView::focusTransaction(const uint256& txid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We override the virtual resizeEvent of the QWidget to adjust tables column
|
|
||||||
// sizes as the tables width is proportional to the dialogs width.
|
|
||||||
void TransactionView::resizeEvent(QResizeEvent* event)
|
|
||||||
{
|
|
||||||
QWidget::resizeEvent(event);
|
|
||||||
columnResizingFixer->stretchColumnWidth(TransactionTableModel::ToAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Need to override default Ctrl+C action for amount as default behaviour is just to copy DisplayRole text
|
// Need to override default Ctrl+C action for amount as default behaviour is just to copy DisplayRole text
|
||||||
bool TransactionView::eventFilter(QObject *obj, QEvent *event)
|
bool TransactionView::eventFilter(QObject *obj, QEvent *event)
|
||||||
{
|
{
|
||||||
|
|
|
@ -82,10 +82,6 @@ private:
|
||||||
|
|
||||||
QWidget *createDateRangeWidget();
|
QWidget *createDateRangeWidget();
|
||||||
|
|
||||||
GUIUtil::TableViewLastColumnResizingFixer *columnResizingFixer{nullptr};
|
|
||||||
|
|
||||||
virtual void resizeEvent(QResizeEvent* event) override;
|
|
||||||
|
|
||||||
bool eventFilter(QObject *obj, QEvent *event) override;
|
bool eventFilter(QObject *obj, QEvent *event) override;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
|
|
Loading…
Add table
Reference in a new issue