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