Qt: Speed up selection handling

Improve the speed for selection checks in PacketList and MainWindow

Change-Id: Ic3a413624463a798b5d13102965f75c7b1347b5f
Reviewed-on: https://code.wireshark.org/review/35160
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-11-20 16:34:18 +01:00
parent b7ce4e3f7a
commit 0d534873dc
4 changed files with 30 additions and 21 deletions

View File

@ -2889,6 +2889,13 @@ void MainWindow::setMwFileName(QString fileName)
return;
}
bool MainWindow::hasSelection()
{
if (packet_list_)
return packet_list_->multiSelectActive();
return false;
}
QList<int> MainWindow::selectedRows(bool useFrameNum)
{
if (packet_list_)

View File

@ -133,6 +133,7 @@ public:
void insertColumn(QString name, QString abbrev, gint pos = -1);
bool hasSelection();
QList<int> selectedRows(bool useFrameNum = false);
frame_data * frameDataForRow(int row) const;

View File

@ -45,7 +45,7 @@ void RelatedPacketDelegate::paint(QPainter *painter, const QStyleOptionViewItem
if (wsApp && wsApp->mainWindow())
{
MainWindow * mw = qobject_cast<MainWindow *>(wsApp->mainWindow());
if (mw && mw->selectedRows().count() > 1)
if (mw && mw->hasSelection())
{
QStyledItemDelegate::paint(painter, option, index);
return;

View File

@ -412,30 +412,28 @@ void PacketList::setProtoTree (ProtoTree *proto_tree) {
bool PacketList::multiSelectActive()
{
return selectedRows().count() > 1 ? true : false;
return selectionModel()->selectedRows(0).count() > 1 ? true : false;
}
QList<int> PacketList::selectedRows(bool useFrameNum)
{
QList<int> rows;
if (selectionModel() && selectionModel()->selectedIndexes().count() > 0)
if (selectionModel() && selectionModel()->hasSelection())
{
foreach (QModelIndex idx, selectionModel()->selectedIndexes())
foreach (QModelIndex idx, selectionModel()->selectedRows(0))
{
if (idx.isValid())
{
if (! useFrameNum && ! rows.contains(idx.row()))
if (! useFrameNum)
rows << idx.row();
else if (useFrameNum)
{
frame_data * frame = getFDataForRow(idx.row());
if (frame && ! rows.contains(frame->num))
if (frame)
rows << frame->num;
}
}
}
std::sort(rows.begin(), rows.end(), std::less<int>());
}
else if (currentIndex().isValid())
{
@ -467,12 +465,13 @@ void PacketList::selectionChanged (const QItemSelection & selected, const QItemS
if (selectionModel())
{
if (selectionModel()->selectedRows(0).count() > 1)
QModelIndexList selRows = selectionModel()->selectedRows(0);
if (selRows.count() > 1)
{
QList<int> rows;
foreach (QModelIndex idx, selectionModel()->selectedRows(0))
foreach (QModelIndex idx, selRows)
{
if (idx.isValid() && ! rows.contains(idx.row()))
if (idx.isValid())
rows << idx.row();
}
@ -492,14 +491,14 @@ void PacketList::selectionChanged (const QItemSelection & selected, const QItemS
return;
}
else if (selectionModel()->selectedIndexes().count() > 0 && selectionModel()->selectedIndexes().at(0).isValid())
else if (selRows.count() > 0 && selRows.at(0).isValid())
{
multiSelect = false;
row = selectionModel()->selectedIndexes().at(0).row();
row = selRows.at(0).row();
}
/* Handling empty selection */
if (selectionModel()->selectedIndexes().count() <= 0)
if (selRows.count() <= 0)
{
/* Nothing selected, but multiSelect is still active */
if (multiSelect)
@ -872,10 +871,11 @@ void PacketList::keyPressEvent(QKeyEvent *event)
if (event->matches(QKeySequence::Copy))
{
QStringList content;
if (model() && selectionModel() && selectionModel()->selectedRows(0).count() > 0)
if (model() && selectionModel() && selectionModel()->hasSelection())
{
QList<int> rows;
foreach(QModelIndex row, selectionModel()->selectedRows(0))
QModelIndexList selRows = selectionModel()->selectedRows(0);
foreach(QModelIndex row, selRows)
rows.append(row.row());
foreach(int row, rows)
@ -1546,12 +1546,13 @@ void PacketList::markFrame()
QModelIndexList frames;
if (selectionModel() && selectionModel()->selectedRows(0).count() > 1)
if (selectionModel() && selectionModel()->hasSelection())
{
QList<int> rows;
foreach (QModelIndex idx, selectionModel()->selectedRows(0))
QModelIndexList selRows = selectionModel()->selectedRows(0);
foreach (QModelIndex idx, selRows)
{
if (idx.isValid() && ! rows.contains(idx.row()))
if (idx.isValid())
{
frames << idx;
rows << idx.row();
@ -1581,12 +1582,12 @@ void PacketList::ignoreFrame()
QModelIndexList frames;
if (selectionModel() && selectionModel()->selectedRows(0).count() > 1)
if (selectionModel() && selectionModel()->hasSelection())
{
QList<int> rows;
foreach (QModelIndex idx, selectionModel()->selectedRows(0))
{
if (idx.isValid() && ! rows.contains(idx.row()))
if (idx.isValid())
{
frames << idx;
rows << idx.row();