diff --git a/share/icons/application/16x16/actions/paperclip.png b/share/icons/application/16x16/actions/paperclip.png new file mode 100644 index 00000000..cd61805e Binary files /dev/null and b/share/icons/application/16x16/actions/paperclip.png differ diff --git a/share/icons/application/22x22/actions/paperclip.png b/share/icons/application/22x22/actions/paperclip.png new file mode 100644 index 00000000..99d0eb82 Binary files /dev/null and b/share/icons/application/22x22/actions/paperclip.png differ diff --git a/share/icons/application/32x32/actions/paperclip.png b/share/icons/application/32x32/actions/paperclip.png new file mode 100644 index 00000000..cb57d137 Binary files /dev/null and b/share/icons/application/32x32/actions/paperclip.png differ diff --git a/share/icons/svg/paperclip.svgz b/share/icons/svg/paperclip.svgz new file mode 100644 index 00000000..f82480bc Binary files /dev/null and b/share/icons/svg/paperclip.svgz differ diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index 71828c6e..ab2a8114 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -22,12 +22,14 @@ #include #include #include +#include #include "core/DatabaseIcons.h" #include "core/Entry.h" #include "core/Global.h" #include "core/Group.h" #include "core/Metadata.h" +#include "core/FilePath.h" // String being displayed when hiding content const QString EntryModel::HiddenContentDisplay(QString("\u25cf").repeated(6)); @@ -35,15 +37,17 @@ const QString EntryModel::HiddenContentDisplay(QString("\u25cf").repeated(6)); // Format used to display dates const Qt::DateFormat EntryModel::DateFormat = Qt::DefaultLocaleShortDate; -// Paperclip symbol -const QString EntryModel::PaperClipDisplay("\U0001f4ce"); - EntryModel::EntryModel(QObject* parent) : QAbstractTableModel(parent) , m_group(nullptr) , m_hideUsernames(false) , m_hidePasswords(true) + , m_paperClipPixmap(FilePath::instance()->icon("actions", "paperclip").pixmap(16)) + , m_paperClipPixmapCentered(24, 16) { + m_paperClipPixmapCentered.fill(Qt::transparent); + QPainter painter(&m_paperClipPixmapCentered); + painter.drawPixmap(8, 0, m_paperClipPixmap); } Entry* EntryModel::entryFromIndex(const QModelIndex& index) const @@ -205,9 +209,6 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Accessed: result = entry->timeInfo().lastAccessTime().toLocalTime().toString(EntryModel::DateFormat); return result; - case Paperclip: - result = entry->attachments()->keys().isEmpty() ? QString() : EntryModel::PaperClipDisplay; - return result; case Attachments: // Display comma-separated list of attachments QList attachments = entry->attachments()->keys(); @@ -238,7 +239,7 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Paperclip: // Display entries with attachments above those without when // sorting ascendingly (and vice versa when sorting descendingly) - return entry->attachments()->keys().isEmpty() ? 1 : 0; + return entry->attachments()->isEmpty() ? 1 : 0; default: // For all other columns, simply use data provided by Qt::Display- // Role for sorting @@ -257,6 +258,10 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } else { return entry->iconScaledPixmap(); } + case Paperclip: + if (!entry->attachments()->isEmpty()) { + return m_paperClipPixmapCentered; + } } } else if (role == Qt::FontRole) { QFont font; @@ -279,12 +284,6 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const if (index.column() == Paperclip) { return Qt::AlignCenter; } - } else if (role == Qt::SizeHintRole) { - if (index.column() == Paperclip) { - QFont font; - QFontMetrics fm(font); - return fm.width(PaperClipDisplay) / 2; - } } return QVariant(); @@ -316,15 +315,12 @@ QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int ro return tr("Modified"); case Accessed: return tr("Accessed"); - case Paperclip: - return EntryModel::PaperClipDisplay; case Attachments: return tr("Attachments"); } - } else if (role == Qt::TextAlignmentRole) { - switch (section) { - case Paperclip: - return Qt::AlignCenter; + } else if (role == Qt::DecorationRole) { + if (section == Paperclip) { + return m_paperClipPixmap; } } diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index 7c668a5f..a2323c64 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -19,6 +19,7 @@ #define KEEPASSX_ENTRYMODEL_H #include +#include class Entry; class Group; @@ -95,9 +96,11 @@ private: bool m_hideUsernames; bool m_hidePasswords; + QPixmap m_paperClipPixmap; + QPixmap m_paperClipPixmapCentered; + static const QString HiddenContentDisplay; static const Qt::DateFormat DateFormat; - static const QString PaperClipDisplay; }; #endif // KEEPASSX_ENTRYMODEL_H diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 67169d27..dbbdd144 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -72,6 +72,10 @@ EntryView::EntryView(QWidget* parent) m_columnActions->setExclusive(false); for (int columnIndex = 1; columnIndex < header()->count(); ++columnIndex) { QString caption = m_model->headerData(columnIndex, Qt::Horizontal, Qt::DisplayRole).toString(); + if (columnIndex == EntryModel::Paperclip) { + caption = tr("Attachments (icon)"); + } + QAction* action = m_headerMenu->addAction(caption); action->setCheckable(true); action->setData(columnIndex);