Qt: ColumnPreferences hide hidden columns

Filter on columns being hidden or not

Change-Id: Ia41f556e00c7de471b1d4b7f9b5f6c099b7ddcf3
Reviewed-on: https://code.wireshark.org/review/34820
Petri-Dish: Roland Knall <rknall@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Roland Knall <rknall@gmail.com>
This commit is contained in:
Roland Knall 2019-10-21 00:19:58 +02:00
parent 6820e3515a
commit 366bd1947d
5 changed files with 68 additions and 14 deletions

View File

@ -38,6 +38,8 @@ ColumnPreferencesFrame::ColumnPreferencesFrame(QWidget *parent) :
ui->setupUi(this);
model_ = new ColumnListModel();
proxyModel_ = new ColumnProxyModel();
proxyModel_->setSourceModel(model_);
int one_em = ui->columnTreeView->fontMetrics().height();
ui->columnTreeView->setColumnWidth(ColumnListModel::COL_FIELDS, one_em * 10);
@ -55,8 +57,9 @@ ColumnPreferencesFrame::ColumnPreferencesFrame(QWidget *parent) :
ui->newToolButton->setStockIcon("list-add");
ui->deleteToolButton->setStockIcon("list-remove");
ui->columnTreeView->setModel(model_);
ui->columnTreeView->setModel(proxyModel_);
ui->columnTreeView->setItemDelegate(new ColumnTypeDelegate());
ui->columnTreeView->setSortingEnabled(false);
ui->columnTreeView->resizeColumnToContents(ColumnListModel::COL_DISPLAYED);
ui->columnTreeView->resizeColumnToContents(ColumnListModel::COL_TITLE);
@ -87,7 +90,7 @@ void ColumnPreferencesFrame::on_deleteToolButton_clicked()
if ( ui->columnTreeView->selectionModel()->selectedIndexes().count() > 0 )
{
QModelIndex selIndex = ui->columnTreeView->selectionModel()->selectedIndexes().at(0);
model_->deleteEntry(selIndex.row());
model_->deleteEntry(proxyModel_->mapToSource(selIndex).row());
}
}
@ -97,6 +100,11 @@ void ColumnPreferencesFrame::selectionChanged(const QItemSelection &/*selected*/
ui->deleteToolButton->setEnabled( ui->columnTreeView->selectionModel()->selectedIndexes().count() > 0 );
}
void ColumnPreferencesFrame::on_chkShowDisplayedOnly_stateChanged(int /*state*/)
{
proxyModel_->setShowDisplayedOnly(ui->chkShowDisplayedOnly->checkState() == Qt::Checked ? true : false);
}
/*
* Editor modelines
*

View File

@ -10,13 +10,10 @@
#ifndef COLUMN_PREFERENCES_FRAME_H
#define COLUMN_PREFERENCES_FRAME_H
#include <QFrame>
#include <ui/qt/models/column_list_model.h>
class QComboBox;
class QLineEdit;
class QTreeWidgetItem;
class ColumnListModel;
class QItemSelection;
#include <QFrame>
#include <QItemSelection>
namespace Ui {
class ColumnPreferencesFrame;
@ -27,7 +24,7 @@ class ColumnPreferencesFrame : public QFrame
Q_OBJECT
public:
explicit ColumnPreferencesFrame(QWidget *parent = 0);
explicit ColumnPreferencesFrame(QWidget *parent = Q_NULLPTR);
~ColumnPreferencesFrame();
void unstash();
@ -35,11 +32,13 @@ public:
private:
Ui::ColumnPreferencesFrame *ui;
ColumnListModel * model_;
ColumnProxyModel * proxyModel_;
private slots:
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void on_newToolButton_clicked();
void on_deleteToolButton_clicked();
void on_chkShowDisplayedOnly_stateChanged(int);
};
#endif // COLUMN_PREFERENCES_FRAME_H

View File

@ -35,10 +35,10 @@
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
<bool>false</bool>
</property>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>true</bool>
<bool>false</bool>
</attribute>
</widget>
</item>
@ -50,6 +50,13 @@
<item>
<widget class="StockIconToolButton" name="deleteToolButton"/>
</item>
<item>
<widget class="QCheckBox" name="chkShowDisplayedOnly">
<property name="text">
<string>Show displayed columns only</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">

View File

@ -37,6 +37,30 @@ struct ListElement
static QList<ListElement> store_;
ColumnProxyModel::ColumnProxyModel(QObject * parent) :
QSortFilterProxyModel(parent),
showDisplayedOnly_(false)
{}
bool ColumnProxyModel::filterAcceptsRow(int source_row, const QModelIndex &/*source_parent*/) const
{
bool displayed = false;
if ( sourceModel() &&
sourceModel()->index(source_row, ColumnListModel::COL_DISPLAYED).data(ColumnListModel::DisplayedState).toBool() )
displayed = true;
if ( showDisplayedOnly_ && ! displayed )
return false;
return true;
}
void ColumnProxyModel::setShowDisplayedOnly(bool set)
{
showDisplayedOnly_ = set;
invalidateFilter();
}
ColumnTypeDelegate::ColumnTypeDelegate(QObject * parent) :
QStyledItemDelegate(parent)
{}
@ -268,9 +292,9 @@ QVariant ColumnListModel::data(const QModelIndex &index, int role) const
}
}
else if ( role == OriginalType )
{
return qVariantFromValue(ne.originalType);
}
else if ( role == DisplayedState )
return qVariantFromValue(ne.displayed);
return QVariant();
}

View File

@ -13,8 +13,23 @@
#include <QAbstractListModel>
#include <QSortFilterProxyModel>
#include <QStyledItemDelegate>
#include <QSortFilterProxyModel>
#include <QMimeData>
class ColumnProxyModel : public QSortFilterProxyModel
{
public:
ColumnProxyModel(QObject *parent = Q_NULLPTR);
void setShowDisplayedOnly(bool set);
protected:
virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
private:
bool showDisplayedOnly_;
};
class ColumnTypeDelegate : public QStyledItemDelegate
{
Q_OBJECT
@ -48,7 +63,8 @@ public:
} Columns;
enum {
OriginalType = Qt::UserRole
OriginalType = Qt::UserRole,
DisplayedState
} UserTypes;
void saveColumns();