From a57e8f98643f33c9628aed8f18030d942bd255b5 Mon Sep 17 00:00:00 2001 From: Florian Geyer Date: Sun, 13 May 2012 20:50:41 +0200 Subject: [PATCH] Preserve order of custom icons. Closes #25 --- src/core/Metadata.cpp | 9 +++++++++ src/core/Metadata.h | 2 ++ src/format/KeePass2XmlWriter.cpp | 7 ++++--- src/gui/EditEntryWidget.cpp | 9 ++++++--- src/gui/IconModels.cpp | 29 ++++++++++++----------------- src/gui/IconModels.h | 4 ++-- tests/TestEntryModel.cpp | 13 +++++++++++-- 7 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp index 3a500b837..532398657 100644 --- a/src/core/Metadata.cpp +++ b/src/core/Metadata.cpp @@ -175,6 +175,11 @@ QHash Metadata::customIcons() const return m_customIcons; } +QList Metadata::customIconsOrder() const +{ + return m_customIconsOrder; +} + bool Metadata::recycleBinEnabled() const { return m_recycleBinEnabled; @@ -328,6 +333,8 @@ void Metadata::addCustomIcon(const Uuid& uuid, const QImage& icon) Q_ASSERT(!m_customIcons.contains(uuid)); m_customIcons.insert(uuid, icon); + m_customIconsOrder.append(uuid); + Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count()); Q_EMIT modified(); } @@ -337,6 +344,8 @@ void Metadata::removeCustomIcon(const Uuid& uuid) Q_ASSERT(m_customIcons.contains(uuid)); m_customIcons.remove(uuid); + m_customIconsOrder.removeAll(uuid); + Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count()); Q_EMIT modified(); } diff --git a/src/core/Metadata.h b/src/core/Metadata.h index 6bb85f953..79dbe06b9 100644 --- a/src/core/Metadata.h +++ b/src/core/Metadata.h @@ -54,6 +54,7 @@ public: QImage customIcon(const Uuid& uuid) const; bool containsCustomIcon(const Uuid& uuid) const; QHash customIcons() const; + QList customIconsOrder() const; bool recycleBinEnabled() const; Group* recycleBin(); const Group* recycleBin() const; @@ -134,6 +135,7 @@ private: // bool m_autoEnableVisualHiding; QHash m_customIcons; + QList m_customIconsOrder; bool m_recycleBinEnabled; QPointer m_recycleBin; diff --git a/src/format/KeePass2XmlWriter.cpp b/src/format/KeePass2XmlWriter.cpp index 064db8723..dc4f3e773 100644 --- a/src/format/KeePass2XmlWriter.cpp +++ b/src/format/KeePass2XmlWriter.cpp @@ -129,9 +129,10 @@ void KeePass2XmlWriter::writeCustomIcons() { m_xml.writeStartElement("CustomIcons"); - QHash customIcons = m_meta->customIcons(); - Q_FOREACH (const Uuid& uuid, customIcons.keys()) { - writeIcon(uuid, customIcons.value(uuid)); + QListIterator i(m_meta->customIconsOrder()); + while (i.hasNext()) { + Uuid uuid = i.next(); + writeIcon(uuid, m_meta->customIcon(uuid)); } m_xml.writeEndElement(); diff --git a/src/gui/EditEntryWidget.cpp b/src/gui/EditEntryWidget.cpp index 355035a94..11560aabe 100644 --- a/src/gui/EditEntryWidget.cpp +++ b/src/gui/EditEntryWidget.cpp @@ -171,7 +171,8 @@ void EditEntryWidget::loadEntry(Entry* entry, bool create, const QString& groupN if (database) { m_iconsWidget->setEnabled(true); - m_customIconModel->setIcons(database->metadata()->customIcons()); + m_customIconModel->setIcons(database->metadata()->customIcons(), + database->metadata()->customIconsOrder()); Uuid iconUuid = entry->iconUuid(); if (iconUuid.isNull()) { @@ -436,7 +437,8 @@ void EditEntryWidget::addCustomIcon() QImage image(filename); if (!image.isNull()) { m_database->metadata()->addCustomIcon(Uuid::random(), image.scaled(16, 16)); - m_customIconModel->setIcons(m_database->metadata()->customIcons()); + m_customIconModel->setIcons(m_database->metadata()->customIcons(), + m_database->metadata()->customIconsOrder()); } else { // TODO: show error @@ -473,7 +475,8 @@ void EditEntryWidget::removeCustomIcon() if (iconUsedCount == 0) { m_database->metadata()->removeCustomIcon(iconUuid); - m_customIconModel->setIcons(m_database->metadata()->customIcons()); + m_customIconModel->setIcons(m_database->metadata()->customIcons(), + m_database->metadata()->customIconsOrder()); } else { QMessageBox::information(this, tr("Can't delete icon!"), diff --git a/src/gui/IconModels.cpp b/src/gui/IconModels.cpp index de38b1146..a2a052759 100644 --- a/src/gui/IconModels.cpp +++ b/src/gui/IconModels.cpp @@ -54,19 +54,13 @@ CustomIconModel::CustomIconModel(QObject* parent) : { } -void CustomIconModel::setIcons(QHash icons) +void CustomIconModel::setIcons(QHash icons, QList iconsOrder) { beginResetModel(); m_icons = icons; - m_uuids.clear(); - QHash::const_iterator iter; - int i = 0; - for (iter = m_icons.constBegin(); iter != m_icons.constEnd(); ++iter) { - m_uuids.insert(i, iter.key()); - i++; - } - Q_ASSERT(m_uuids.count() == m_icons.size()); + m_iconsOrder = iconsOrder; + Q_ASSERT(m_icons.count() == m_iconsOrder.count()); endResetModel(); } @@ -88,7 +82,8 @@ QVariant CustomIconModel::data(const QModelIndex& index, int role) const } if (role == Qt::DecorationRole) { - return m_icons.value(uuidFromIndex(index)); + Uuid uuid = m_iconsOrder.value(index.row()); + return m_icons.value(uuid); } return QVariant(); @@ -98,16 +93,16 @@ Uuid CustomIconModel::uuidFromIndex(const QModelIndex& index) const { Q_ASSERT(index.isValid()); - return m_uuids.value(index.row()); + return m_iconsOrder.value(index.row()); } QModelIndex CustomIconModel::indexFromUuid(const Uuid& uuid) const { - QHash::const_iterator iter; - for (iter = m_uuids.constBegin(); iter != m_uuids.constEnd(); ++iter) { - if (iter.value() == uuid) { - return index(iter.key(), 0); - } + int idx = m_iconsOrder.indexOf(uuid); + if (idx > -1) { + return index(idx, 0); + } + else { + return QModelIndex(); } - return QModelIndex(); } diff --git a/src/gui/IconModels.h b/src/gui/IconModels.h index edcfd7e20..7bf903e9a 100644 --- a/src/gui/IconModels.h +++ b/src/gui/IconModels.h @@ -43,13 +43,13 @@ public: virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; - void setIcons(QHash icons); + void setIcons(QHash icons, QList iconsOrder); Uuid uuidFromIndex(const QModelIndex& index) const; QModelIndex indexFromUuid(const Uuid& uuid) const; private: QHash m_icons; - QHash m_uuids; + QList m_iconsOrder; }; #endif // KEEPASSX_ICONMODELS_H diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp index 63a2ada4b..fad81aec5 100644 --- a/tests/TestEntryModel.cpp +++ b/tests/TestEntryModel.cpp @@ -207,12 +207,21 @@ void TestEntryModel::testCustomIconModel() QCOMPARE(model->rowCount(), 0); QHash icons; - Uuid iconUuid = Uuid::random(); + QList iconsOrder; + + Uuid iconUuid(QByteArray(16, '2')); QImage icon; icons.insert(iconUuid, icon); + iconsOrder << iconUuid; - model->setIcons(icons); + Uuid iconUuid2(QByteArray(16, '1')); + QImage icon2; + icons.insert(iconUuid2, icon2); + iconsOrder << iconUuid2; + + model->setIcons(icons, iconsOrder); QCOMPARE(model->uuidFromIndex(model->index(0, 0)), iconUuid); + QCOMPARE(model->uuidFromIndex(model->index(1, 0)), iconUuid2); delete modelTest; delete model;