13#include <config-libkleo.h>
15#include "useridlistmodel.h"
19#include <libkleo/formatting.h>
21#include <KLocalizedString>
27#include <gpgme++/key.h>
39 explicit UIDModelItem(
const UserID::Signature &sig, UIDModelItem *parentItem,
bool showRemarks)
40 : mParentItem{parentItem}
43 const auto name = Formatting::prettyName(sig);
44 const auto email = Formatting::prettyEMail(sig);
46 Formatting::prettyID(sig.signerKeyID()),
49 Formatting::creationDateString(sig),
50 Formatting::expirationDateString(sig),
51 Formatting::validityShort(sig),
52 sig.isExportable() ? QStringLiteral(
"✓") :
QString{},
56 if (showRemarks && parentItem) {
57 for (
const auto ¬ation : sig.notations()) {
58 if (notation.name() && !strcmp(notation.name(),
"rem@gnupg.org")) {
65 const auto trustSignatureDomain = Formatting::trustSignatureDomain(sig);
66 mItemData.
push_back(trustSignatureDomain);
68 Formatting::accessibleHexID(sig.signerKeyID()),
69 name.isEmpty() ?
i18nc(
"text for screen readers for an empty name",
"no name") :
QVariant{},
70 email.isEmpty() ?
i18nc(
"text for screen readers for an empty email address",
"no email") :
QVariant{},
71 Formatting::accessibleDate(Formatting::creationDate(sig)),
72 Formatting::accessibleExpirationDate(sig),
74 sig.isExportable() ?
i18nc(
"yes, is exportable",
"yes") :
i18nc(
"no, is not exportable",
"no"),
75 lastNotation.isEmpty() ?
i18nc(
"accessible text for empty list of tags",
"none") :
QVariant{},
76 trustSignatureDomain.isEmpty() ?
i18n(
"not applicable") :
QVariant{},
78 Q_ASSERT(mAccessibleText.
size() == mItemData.
size());
81 explicit UIDModelItem(
const UserID &uid, UIDModelItem *parentItem)
82 : mParentItem{parentItem}
85 mItemData = {Formatting::prettyUserID(uid)};
104 i18n(
"User ID / Certification Key ID"),
112 i18n(
"Trust Signature For"),
119 qDeleteAll(mChildItems);
122 void appendChild(UIDModelItem *child)
124 mChildItems << child;
127 UIDModelItem *child(
int row)
const
129 return mChildItems.
value(row);
132 const UIDModelItem *constChild(
int row)
const
134 return mChildItems.
value(row);
137 int childCount()
const
139 return mChildItems.
count();
142 int columnCount()
const
148 return constChild(0)->columnCount();
150 return mItemData.
count();
155 return mItemData.
value(column);
158 QVariant accessibleText(
int column)
const
160 return mAccessibleText.
value(column);
165 if (!mSig.isNull()) {
166 if (column ==
static_cast<int>(UserIDListModel::Column::Status)) {
167 return i18n(
"class %1", mSig.certClass());
168 }
else if (column ==
static_cast<int>(UserIDListModel::Column::TrustSignatureDomain)) {
169 return Formatting::trustSignature(mSig);
172 return mItemData.
value(column);
177 if (!mSig.isNull() && column ==
static_cast<int>(UserIDListModel::Column::Status)) {
178 return Formatting::validityIcon(mSig);
186 return mParentItem->mChildItems.
indexOf(
const_cast<UIDModelItem *
>(
this));
191 UIDModelItem *parentItem()
const
196 UserID::Signature signature()
const
210 UIDModelItem *mParentItem =
nullptr;
211 UserID::Signature mSig;
215UserIDListModel::UserIDListModel(
QObject *p)
220UserIDListModel::~UserIDListModel() =
default;
222Key UserIDListModel::key()
const
227void UserIDListModel::setKey(
const Key &key)
232 mRootItem.reset(
new UIDModelItem);
233 for (
int i = 0, ids = key.numUserIDs(); i < ids; ++i) {
234 UserID uid = key.userID(i);
235 auto uidItem =
new UIDModelItem(uid, mRootItem.get());
236 mRootItem->appendChild(uidItem);
237 std::vector<UserID::Signature> sigs = uid.signatures();
238 std::sort(sigs.begin(), sigs.end());
239 for (
const auto &sig : sigs) {
240 auto sigItem =
new UIDModelItem(sig, uidItem, mRemarksEnabled);
241 uidItem->appendChild(sigItem);
248int UserIDListModel::columnCount(
const QModelIndex &parent)
const
251 return static_cast<UIDModelItem *
>(
parent.internalPointer())->columnCount();
258 return mRootItem->columnCount();
261int UserIDListModel::rowCount(
const QModelIndex &parent)
const
263 if (
parent.column() > 0 || !mRootItem) {
267 const UIDModelItem *
const parentItem = !
parent.isValid() ? mRootItem.get() :
static_cast<UIDModelItem *
>(
parent.internalPointer());
268 return parentItem->childCount();
277 const UIDModelItem *
const parentItem = !
parent.isValid() ? mRootItem.get() :
static_cast<UIDModelItem *
>(
parent.internalPointer());
278 UIDModelItem *
const childItem = parentItem->child(row);
292 UIDModelItem *parentItem = childItem->parentItem();
294 if (parentItem == mRootItem.get()) {
298 return createIndex(parentItem->row(), 0, parentItem);
305 return mRootItem->data(section);
307 return mRootItem->accessibleText(section);
324 return item->data(index.
column());
326 return item->accessibleText(index.
column());
328 return item->toolTip(index.
column());
330 return item->icon(index.
column());
337UserID UserIDListModel::userID(
const QModelIndex &index)
const
342 UIDModelItem *item =
static_cast<UIDModelItem *
>(index.
internalPointer());
346QList<UserID> UserIDListModel::userIDs(
const QModelIndexList &indexes)
const
350 if (!idx.isValid()) {
353 auto item =
static_cast<UIDModelItem *
>(idx.internalPointer());
354 if (!item->uid().isNull()) {
361UserID::Signature UserIDListModel::signature(
const QModelIndex &index)
const
364 return UserID::Signature();
366 UIDModelItem *item =
static_cast<UIDModelItem *
>(index.
internalPointer());
367 return item->signature();
374 if (!idx.isValid()) {
377 auto item =
static_cast<UIDModelItem *
>(idx.internalPointer());
378 if (!item->signature().isNull()) {
379 ret << item->signature();
385void UserIDListModel::enableRemarks(
bool value)
387 mRemarksEnabled = value;
390#include "moc_useridlistmodel.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
QModelIndex createIndex(int row, int column, const void *ptr) const const
bool hasIndex(int row, int column, const QModelIndex &parent) const const
qsizetype count() const const
qsizetype indexOf(const AT &value, qsizetype from) const const
void push_back(parameter_type value)
qsizetype size() const const
T value(qsizetype i) const const
void * internalPointer() const const
bool isValid() const const
QObject * parent() const const
QString fromUtf8(QByteArrayView str)