Fix activating entries in database reports when sorted

* Fixes #4855
This commit is contained in:
Jonathan White 2020-06-17 22:24:44 -04:00
parent ac3014378f
commit 5f9bed6a52
4 changed files with 22 additions and 8 deletions

View File

@ -28,6 +28,7 @@
#include <QMenu> #include <QMenu>
#include <QSharedPointer> #include <QSharedPointer>
#include <QSortFilterProxyModel>
#include <QStandardItemModel> #include <QStandardItemModel>
namespace namespace
@ -119,11 +120,13 @@ ReportsWidgetHealthcheck::ReportsWidgetHealthcheck(QWidget* parent)
: QWidget(parent) : QWidget(parent)
, m_ui(new Ui::ReportsWidgetHealthcheck()) , m_ui(new Ui::ReportsWidgetHealthcheck())
, m_errorIcon(Resources::instance()->icon("dialog-error")) , m_errorIcon(Resources::instance()->icon("dialog-error"))
, m_referencesModel(new QStandardItemModel(this))
, m_modelProxy(new QSortFilterProxyModel(this))
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
m_referencesModel.reset(new QStandardItemModel()); m_modelProxy->setSourceModel(m_referencesModel.data());
m_ui->healthcheckTableView->setModel(m_referencesModel.data()); m_ui->healthcheckTableView->setModel(m_modelProxy.data());
m_ui->healthcheckTableView->setSelectionMode(QAbstractItemView::NoSelection); m_ui->healthcheckTableView->setSelectionMode(QAbstractItemView::NoSelection);
m_ui->healthcheckTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); m_ui->healthcheckTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
m_ui->healthcheckTableView->setSortingEnabled(true); m_ui->healthcheckTableView->setSortingEnabled(true);
@ -272,7 +275,8 @@ void ReportsWidgetHealthcheck::emitEntryActivated(const QModelIndex& index)
return; return;
} }
const auto row = m_rowToEntry[index.row()]; auto mappedIndex = m_modelProxy->mapToSource(index);
const auto row = m_rowToEntry[mappedIndex.row()];
const auto group = row.first; const auto group = row.first;
const auto entry = row.second; const auto entry = row.second;
if (group && entry) { if (group && entry) {
@ -288,7 +292,8 @@ void ReportsWidgetHealthcheck::customMenuRequested(QPoint pos)
if (!index.isValid()) { if (!index.isValid()) {
return; return;
} }
m_contextmenuEntry = const_cast<Entry*>(m_rowToEntry[index.row()].second); auto mappedIndex = m_modelProxy->mapToSource(index);
m_contextmenuEntry = const_cast<Entry*>(m_rowToEntry[mappedIndex.row()].second);
if (!m_contextmenuEntry) { if (!m_contextmenuEntry) {
return; return;
} }

View File

@ -28,6 +28,7 @@ class Database;
class Entry; class Entry;
class Group; class Group;
class PasswordHealth; class PasswordHealth;
class QSortFilterProxyModel;
class QStandardItemModel; class QStandardItemModel;
namespace Ui namespace Ui
@ -66,6 +67,7 @@ private:
bool m_healthCalculated = false; bool m_healthCalculated = false;
QIcon m_errorIcon; QIcon m_errorIcon;
QScopedPointer<QStandardItemModel> m_referencesModel; QScopedPointer<QStandardItemModel> m_referencesModel;
QScopedPointer<QSortFilterProxyModel> m_modelProxy;
QSharedPointer<Database> m_db; QSharedPointer<Database> m_db;
QList<QPair<const Group*, const Entry*>> m_rowToEntry; QList<QPair<const Group*, const Entry*>> m_rowToEntry;
Entry* m_contextmenuEntry = nullptr; Entry* m_contextmenuEntry = nullptr;

View File

@ -27,6 +27,7 @@
#include "gui/MessageBox.h" #include "gui/MessageBox.h"
#include <QMenu> #include <QMenu>
#include <QSortFilterProxyModel>
#include <QStandardItemModel> #include <QStandardItemModel>
namespace namespace
@ -49,11 +50,13 @@ namespace
ReportsWidgetHibp::ReportsWidgetHibp(QWidget* parent) ReportsWidgetHibp::ReportsWidgetHibp(QWidget* parent)
: QWidget(parent) : QWidget(parent)
, m_ui(new Ui::ReportsWidgetHibp()) , m_ui(new Ui::ReportsWidgetHibp())
, m_referencesModel(new QStandardItemModel(this))
, m_modelProxy(new QSortFilterProxyModel(this))
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
m_referencesModel.reset(new QStandardItemModel()); m_modelProxy->setSourceModel(m_referencesModel.data());
m_ui->hibpTableView->setModel(m_referencesModel.data()); m_ui->hibpTableView->setModel(m_modelProxy.data());
m_ui->hibpTableView->setSelectionMode(QAbstractItemView::NoSelection); m_ui->hibpTableView->setSelectionMode(QAbstractItemView::NoSelection);
m_ui->hibpTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); m_ui->hibpTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
m_ui->hibpTableView->setSortingEnabled(true); m_ui->hibpTableView->setSortingEnabled(true);
@ -299,7 +302,8 @@ void ReportsWidgetHibp::emitEntryActivated(const QModelIndex& index)
} }
// Find which database entry was double-clicked // Find which database entry was double-clicked
const auto entry = m_rowToEntry[index.row()]; auto mappedIndex = m_modelProxy->mapToSource(index);
const auto entry = m_rowToEntry[mappedIndex.row()];
if (entry) { if (entry) {
// Found it, invoke entry editor // Found it, invoke entry editor
m_editedEntry = entry; m_editedEntry = entry;
@ -350,7 +354,8 @@ void ReportsWidgetHibp::customMenuRequested(QPoint pos)
if (!index.isValid()) { if (!index.isValid()) {
return; return;
} }
m_contextmenuEntry = const_cast<Entry*>(m_rowToEntry[index.row()]); auto mappedIndex = m_modelProxy->mapToSource(index);
m_contextmenuEntry = const_cast<Entry*>(m_rowToEntry[mappedIndex.row()]);
if (!m_contextmenuEntry) { if (!m_contextmenuEntry) {
return; return;
} }

View File

@ -33,6 +33,7 @@
class Database; class Database;
class Entry; class Entry;
class Group; class Group;
class QSortFilterProxyModel;
class QStandardItemModel; class QStandardItemModel;
namespace Ui namespace Ui
@ -69,6 +70,7 @@ private:
QScopedPointer<Ui::ReportsWidgetHibp> m_ui; QScopedPointer<Ui::ReportsWidgetHibp> m_ui;
QScopedPointer<QStandardItemModel> m_referencesModel; QScopedPointer<QStandardItemModel> m_referencesModel;
QScopedPointer<QSortFilterProxyModel> m_modelProxy;
QSharedPointer<Database> m_db; QSharedPointer<Database> m_db;
QMap<QString, int> m_pwndPasswords; // Passwords we found to have been pwned (value is pwn count) QMap<QString, int> m_pwndPasswords; // Passwords we found to have been pwned (value is pwn count)