a bit better drawing of a key fingerprint

This commit is contained in:
Blue 2023-01-08 18:16:41 +03:00
parent 78ef3664f7
commit 2aed8a1209
Signed by untrusted user: blue
GPG Key ID: 9B203B252A63EE38
2 changed files with 77 additions and 9 deletions

View File

@ -22,10 +22,15 @@
constexpr int minHeight = 50; constexpr int minHeight = 50;
constexpr int minWidth = 400; constexpr int minWidth = 400;
constexpr uint8_t margin = 10;
constexpr uint8_t partSize = 8;
constexpr uint8_t maxSingleLineParts = 3;
UI::KeyDelegate::KeyDelegate(QObject* parent): UI::KeyDelegate::KeyDelegate(QObject* parent):
QStyledItemDelegate(parent), QStyledItemDelegate(parent),
fingerPrintFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)) fingerPrintFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)),
fingerPrintMetrics(fingerPrintFont),
spaceWidth(fingerPrintMetrics.horizontalAdvance(" "))
{ {
} }
@ -46,14 +51,31 @@ void UI::KeyDelegate::paint(QPainter* painter, const QStyleOptionViewItem& optio
QVariant fingerPrintV = index.data(UI::KeysModel::FingerPrint); QVariant fingerPrintV = index.data(UI::KeysModel::FingerPrint);
if (fingerPrintV.isValid()) { if (fingerPrintV.isValid()) {
painter->save(); painter->save();
QByteArray fingerPrint = fingerPrintV.toByteArray();
painter->setFont(fingerPrintFont); painter->setFont(fingerPrintFont);
painter->drawText(option.rect, option.displayAlignment | Qt::AlignTop, fingerPrint.toHex()); QByteArray fingerPrint = fingerPrintV.toByteArray();
std::vector<QString> parts = getParts(fingerPrint);
uint8_t partsLength = parts.size();
QRect rect = option.rect;
rect.adjust(margin, margin, 0, 0);
QRect r;
uint8_t firstLine;
if (partsLength > maxSingleLineParts)
firstLine = partsLength / 2 + partsLength % 2;
else
firstLine = partsLength;
for (uint8_t i = 0; i < partsLength; ++i) {
if (i == firstLine) {
rect.setLeft(option.rect.left() + margin);
rect.adjust(0, r.height() + fingerPrintMetrics.leading(), 0, 0);
}
painter->drawText(rect, Qt::AlignLeft | Qt::AlignTop, parts[i], &r);
rect.adjust(r.width() + spaceWidth ,0, 0, 0);
}
painter->restore(); painter->restore();
} }
painter->drawText(option.rect, option.displayAlignment, index.data().toString()); //painter->drawText(option.rect, option.displayAlignment, index.data().toString());
painter->restore(); painter->restore();
} }
@ -61,11 +83,50 @@ void UI::KeyDelegate::paint(QPainter* painter, const QStyleOptionViewItem& optio
QSize UI::KeyDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { QSize UI::KeyDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const {
QSize size = QStyledItemDelegate::sizeHint(option, index); QSize size = QStyledItemDelegate::sizeHint(option, index);
if (size.width() < minWidth) int mh = margin * 2;
size.setWidth(minWidth); int mw = margin * 2;
QVariant fingerPrintV = index.data(UI::KeysModel::FingerPrint);
if (fingerPrintV.isValid()) {
QString hex = fingerPrintV.toByteArray().toHex();
uint8_t parts = hex.size() / partSize;
if (size.height() < minHeight) mh += fingerPrintMetrics.height();
size.setHeight(minHeight); if (parts > maxSingleLineParts) {
mh += fingerPrintMetrics.height() + fingerPrintMetrics.leading();
}
uint8_t firstLine;
if (parts > maxSingleLineParts)
firstLine = parts / 2 + parts % 2;
else
firstLine = parts;
mw += firstLine * partSize * spaceWidth + (firstLine - 1) * spaceWidth;
}
if (size.width() < mw)
size.setWidth(mw);
if (size.height() < mh)
size.setHeight(mh);
return size; return size;
} }
std::vector<QString> UI::KeyDelegate::getParts(const QByteArray& data) {
QString hex = data.toHex();
uint8_t parts = hex.size() / partSize;
std::vector<QString> result(parts);
for (uint8_t i = 0; i < parts; ++i) {
uint16_t index = i * partSize;
uint8_t length = partSize;
if (index + length > hex.size())
length = hex.size() - index;
QStringRef part(&hex, index, length);
result[i] = part.toString();
}
return result;
}

View File

@ -18,6 +18,8 @@
#define UI_KEYDELEGATE_H #define UI_KEYDELEGATE_H
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
#include <QString>
#include <vector>
namespace UI { namespace UI {
@ -32,6 +34,11 @@ public:
private: private:
QFont fingerPrintFont; QFont fingerPrintFont;
QFontMetrics fingerPrintMetrics;
int spaceWidth;
private:
static std::vector<QString> getParts(const QByteArray& data);
}; };
} }