1 /* dialogs/pivcardapplicationadministrationkeyinputdialog.cpp
2
3 This file is part of Kleopatra, the KDE keymanager
4 SPDX-FileCopyrightText: 2020 g10 Code GmbH
5 SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #include "pivcardapplicationadministrationkeyinputdialog.h"
11
12 #include <QDialogButtonBox>
13 #include <QFontDatabase>
14 #include <QLabel>
15 #include <QLineEdit>
16 #include <QPushButton>
17 #include <QVBoxLayout>
18
19
20 #include "kleopatra_debug.h"
21
22 using namespace Kleo;
23 using namespace Kleo::Dialogs;
24
25 class PIVCardApplicationAdministrationKeyInputDialog::Private
26 {
27 friend class ::Kleo::Dialogs::PIVCardApplicationAdministrationKeyInputDialog;
28 public:
29 explicit Private(PIVCardApplicationAdministrationKeyInputDialog *qq);
30
31 void checkAcceptable();
32
33 PIVCardApplicationAdministrationKeyInputDialog *const q;
34 QLabel *mLabel;
35 QLineEdit *mHexEncodedAdminKeyEdit;
36 QPushButton *mOkButton;
37 QByteArray adminKey;
38 };
39
Private(PIVCardApplicationAdministrationKeyInputDialog * qq)40 PIVCardApplicationAdministrationKeyInputDialog::Private::Private(PIVCardApplicationAdministrationKeyInputDialog *qq): q(qq),
41 mLabel(new QLabel(qq)),
42 mHexEncodedAdminKeyEdit(new QLineEdit(qq)),
43 mOkButton(nullptr)
44 {
45 auto vBox = new QVBoxLayout(q);
46
47 {
48 mLabel->setWordWrap(true);
49 vBox->addWidget(mLabel);
50 }
51
52 {
53 const QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
54 mHexEncodedAdminKeyEdit->setInputMask(QStringLiteral("HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH;_"));
55 mHexEncodedAdminKeyEdit->setFont(fixedFont);
56 mHexEncodedAdminKeyEdit->setMinimumWidth(QFontMetrics(fixedFont).horizontalAdvance(QStringLiteral("HH:")) * 24);
57 connect(mHexEncodedAdminKeyEdit, &QLineEdit::textChanged, q, [this] () { checkAcceptable(); });
58
59 vBox->addWidget(mHexEncodedAdminKeyEdit);
60 }
61
62 auto bbox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, qq);
63
64 mOkButton = bbox->button(QDialogButtonBox::Ok);
65
66 mOkButton->setDefault(true);
67 mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return);
68 connect(bbox, &QDialogButtonBox::rejected, q, [this]() {q->reject();});
69 connect(bbox, &QDialogButtonBox::accepted, q, [this]() {q->accept();});
70
71 vBox->addWidget(bbox);
72
73 q->setMinimumWidth(400);
74
75 checkAcceptable();
76 }
77
checkAcceptable()78 void PIVCardApplicationAdministrationKeyInputDialog::Private::checkAcceptable()
79 {
80 mOkButton->setEnabled(mHexEncodedAdminKeyEdit->hasAcceptableInput());
81 }
82
83
PIVCardApplicationAdministrationKeyInputDialog(QWidget * parent)84 PIVCardApplicationAdministrationKeyInputDialog::PIVCardApplicationAdministrationKeyInputDialog(QWidget *parent) : QDialog(parent),
85 d(new Private(this))
86 {
87 }
88
setLabelText(const QString & text)89 void PIVCardApplicationAdministrationKeyInputDialog::setLabelText(const QString& text)
90 {
91 d->mLabel->setText(text);
92 }
93
labelText() const94 QString PIVCardApplicationAdministrationKeyInputDialog::labelText() const
95 {
96 return d->mLabel->text();
97 }
98
adminKey() const99 QByteArray PIVCardApplicationAdministrationKeyInputDialog::adminKey() const
100 {
101 return QByteArray::fromHex(d->mHexEncodedAdminKeyEdit->text().toUtf8());
102 }
103