From 77e22ba03ed8501a5f38cc09fe6e4af135b66782 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Wed, 29 Oct 2025 10:23:21 +0200 Subject: [PATCH 1/2] Update text fields with new UI guidlines IB-7972 Signed-off-by: Raul Metsma --- client/MainWindow.cpp | 10 +- client/MainWindow.h | 2 +- client/Styles.cpp | 6 - client/Styles.h | 2 - client/dialogs/AddRecipients.cpp | 2 +- client/dialogs/MobileDialog.cpp | 4 +- client/dialogs/MobileDialog.ui | 11 +- client/dialogs/PinPopup.ui | 15 +- client/dialogs/PinUnblock.cpp | 27 ++-- client/dialogs/PinUnblock.ui | 25 +++- client/dialogs/SettingsDialog.ui | 50 +++---- client/dialogs/SignatureDialog.ui | 29 ++-- client/dialogs/SmartIDDialog.cpp | 4 +- client/dialogs/SmartIDDialog.ui | 6 + client/images/icon_error.svg | 3 + client/images/images.qrc | 1 + client/translations/en.ts | 4 - client/translations/et.ts | 4 - client/translations/ru.ts | 4 - client/widgets/AddressItem.ui | 3 - client/widgets/ContainerPage.cpp | 145 ++++++++------------ client/widgets/ContainerPage.h | 10 +- client/widgets/FileItem.cpp | 2 - client/widgets/FileItem.ui | 28 ++-- client/widgets/FileList.cpp | 4 +- client/widgets/ItemList.cpp | 91 ++++-------- client/widgets/ItemList.h | 14 +- client/widgets/ItemList.ui | 220 +++++++++++++----------------- client/widgets/Label.cpp | 2 + client/widgets/LineEdit.cpp | 26 +++- client/widgets/LineEdit.h | 6 + client/widgets/SignatureItem.cpp | 4 +- client/widgets/SignatureItem.h | 2 +- 33 files changed, 356 insertions(+), 410 deletions(-) create mode 100644 client/images/icon_error.svg diff --git a/client/MainWindow.cpp b/client/MainWindow.cpp index f2e56c49c..efa5dc94e 100644 --- a/client/MainWindow.cpp +++ b/client/MainWindow.cpp @@ -331,7 +331,7 @@ void MainWindow::navigateToPage( Pages page, const QStringList &files, bool crea selectPage(page); } -void MainWindow::onSignAction(int action, const QString &info1, const QString &info2) +void MainWindow::onSignAction(int action, const QString &idCode, const QString &info2) { switch(action) { @@ -342,16 +342,16 @@ void MainWindow::onSignAction(int action, const QString &info1, const QString &i }); break; case SignatureMobile: - sign([this, info1, info2](const QString &city, const QString &state, const QString &zip, const QString &country, const QString &role) { + sign([this, idCode, info2](const QString &city, const QString &state, const QString &zip, const QString &country, const QString &role) { MobileProgress m(this); - return m.init(info1, info2) && + return m.init(idCode, info2) && digiDoc->sign(city, state, zip, country, role, &m); }); break; case SignatureSmartID: - sign([this, info1, info2](const QString &city, const QString &state, const QString &zip, const QString &country, const QString &role) { + sign([this, idCode, info2](const QString &city, const QString &state, const QString &zip, const QString &country, const QString &role) { SmartIDProgress s(this); - return s.init(info1, info2, digiDoc->fileName()) && + return s.init(info2, idCode, digiDoc->fileName()) && digiDoc->sign(city, state, zip, country, role, &s); }); break; diff --git a/client/MainWindow.h b/client/MainWindow.h index 38782dc23..4dd9e0d92 100644 --- a/client/MainWindow.h +++ b/client/MainWindow.h @@ -70,7 +70,7 @@ class MainWindow final : public QWidget void moveSignatureContainer(); void navigateToPage( ria::qdigidoc4::Pages page, const QStringList &files = QStringList(), bool create = true ); void onCryptoAction(int action, const QString &id, const QString &phone); - void onSignAction(int action, const QString &info1, const QString &info2); + void onSignAction(int action, const QString &idCode, const QString &info2); void openContainer(bool signature); void pageSelected(int page, bool checked = true); void resetDigiDoc(DigiDoc *doc = nullptr, bool warnOnChange = true); diff --git a/client/Styles.cpp b/client/Styles.cpp index ef0b03251..c04f41dff 100644 --- a/client/Styles.cpp +++ b/client/Styles.cpp @@ -82,9 +82,7 @@ class FontDatabase { switch( font ) { - case Styles::Bold: return bold; case Styles::Condensed: return condensed; - case Styles::CondensedBold: return condensedBold; default: return regular; } } @@ -129,12 +127,8 @@ class FontDatabase }; #endif - QString bold = QFontDatabase::applicationFontFamilies( - QFontDatabase::addApplicationFont(QStringLiteral(":/fonts/Roboto-Bold.ttf"))).at(0); QString condensed = QFontDatabase::applicationFontFamilies( QFontDatabase::addApplicationFont(QStringLiteral(":/fonts/RobotoCondensed-Regular.ttf"))).at(0); - QString condensedBold = QFontDatabase::applicationFontFamilies( - QFontDatabase::addApplicationFont(QStringLiteral(":/fonts/RobotoCondensed-Bold.ttf"))).at(0); QString regular = QFontDatabase::applicationFontFamilies( QFontDatabase::addApplicationFont(QStringLiteral(":/fonts/Roboto-Regular.ttf"))).at(0); #ifndef Q_OS_MAC diff --git a/client/Styles.h b/client/Styles.h index 5b12348b9..0f68483a7 100644 --- a/client/Styles.h +++ b/client/Styles.h @@ -25,9 +25,7 @@ class Styles { public: enum Font { - Bold, Condensed, - CondensedBold, Regular }; diff --git a/client/dialogs/AddRecipients.cpp b/client/dialogs/AddRecipients.cpp index c23904199..69f910383 100644 --- a/client/dialogs/AddRecipients.cpp +++ b/client/dialogs/AddRecipients.cpp @@ -77,7 +77,7 @@ AddRecipients::AddRecipients(ItemList* itemList, QWidget *parent) connect(ldap_corp, &LdapSearch::error, this, &AddRecipients::showError); connect(this, &AddRecipients::finished, this, &AddRecipients::close); - connect(ui->leftPane, &ItemList::addAll, this, [this] { + connect(ui->leftPane, &ItemList::add, this, [this] { for(Item *item: ui->leftPane->items) addRecipientToRightPane(item); }); diff --git a/client/dialogs/MobileDialog.cpp b/client/dialogs/MobileDialog.cpp index 9492836bf..1b2c3edf4 100644 --- a/client/dialogs/MobileDialog.cpp +++ b/client/dialogs/MobileDialog.cpp @@ -55,8 +55,8 @@ MobileDialog::MobileDialog(QWidget *parent) Settings::MOBILEID_CODE = checked ? ui->idCode->text() : QString(); Settings::MOBILEID_NUMBER = checked ? ui->phoneNo->text() : QString(); }; - auto setError = [](QLineEdit *input, QLabel *error, const QString &msg) { - input->setStyleSheet(msg.isEmpty() ? QString() : QStringLiteral("border-color: #BE7884")); + auto setError = [](LineEdit *input, QLabel *error, const QString &msg) { + input->setLabel(msg.isEmpty() ? QString() : QStringLiteral("error")); error->setText(msg); error->setHidden(msg.isEmpty()); }; diff --git a/client/dialogs/MobileDialog.ui b/client/dialogs/MobileDialog.ui index 4817dd2f4..97b48fbf6 100644 --- a/client/dialogs/MobileDialog.ui +++ b/client/dialogs/MobileDialog.ui @@ -42,9 +42,12 @@ background-color: white; placeholder-text-color: #607496; font-size: 16px; } +QLineEdit[label="error"] { +border-color: #BE7884; +} QCheckBox { spacing: 8px; -border: none; /*Workaround for right padding*/ +border-right: none; /*Workaround for right padding*/ } QCheckBox:disabled { color: #C4CBD8; @@ -174,6 +177,9 @@ background-color: #82A9D3; 37254321 + + + @@ -217,6 +223,9 @@ background-color: #82A9D3; 47101010033 + + + diff --git a/client/dialogs/PinPopup.ui b/client/dialogs/PinPopup.ui index c155e6579..848833789 100644 --- a/client/dialogs/PinPopup.ui +++ b/client/dialogs/PinPopup.ui @@ -39,6 +39,9 @@ background-color: white; placeholder-text-color: #607496; font-size: 16px; } +QLineEdit[label="error"] { +border-color: #BE7884; +} QPushButton { padding: 12px 12px; border-radius: 4px; @@ -148,10 +151,13 @@ background-color: #82A9D3; - + QLineEdit::Password + + + @@ -234,6 +240,13 @@ background-color: #82A9D3; + + + LineEdit + QLineEdit +
widgets/LineEdit.h
+
+
diff --git a/client/dialogs/PinUnblock.cpp b/client/dialogs/PinUnblock.cpp index 228763353..0173b5298 100644 --- a/client/dialogs/PinUnblock.cpp +++ b/client/dialogs/PinUnblock.cpp @@ -58,18 +58,19 @@ PinUnblock::PinUnblock(QSmartCardData::PinType type, QSmartCard::PinAction actio regexpValidateCode = pattern(QSmartCardData::PukType); ui->line1_text->setText(tr("To unblock the certificate you have to enter the PUK code.")); ui->line2_text->setText(tr("You can find your PUK code inside the ID-card codes envelope.")); - ui->line3_text->setText(isPUKReplacable ? tr("If you have forgotten the PUK code for your ID card, please visit " - "the Police and Border Guard Board service center to obtain new PIN codes.") : - tr("If you have forgotten the PUK code of your ID-card then you can view it from the Police and Border Guard Board portal. " - "Additional information")); + ui->line3_text->setText(isPUKReplacable + ? tr("If you have forgotten the PUK code for your ID card, please visit " + "the Police and Border Guard Board service center to obtain new PIN codes.") + : tr("If you have forgotten the PUK code of your ID-card then you can view it from the Police and Border Guard Board portal. " + "Additional information")); break; case QSmartCard::ActivateWithPuk: case QSmartCard::ChangeWithPuk: ui->label->setText(tr("%1 code change").arg(QSmartCardData::typeString(type))); regexpValidateCode = pattern(QSmartCardData::PukType); ui->line1_text->setText(type == QSmartCardData::Pin2Type - ? tr("PIN2 code is used to digitally sign documents.") - : tr("PIN1 code is used for confirming the identity of a person.")); + ? tr("PIN2 code is used to digitally sign documents.") + : tr("PIN1 code is used for confirming the identity of a person.")); ui->line2_text->setText(tr("If you have forgotten PIN%1, but know PUK, then here you can enter new PIN%1.").arg(type)); ui->line3_text->setText(tr("PUK code is written in the envelope, that is given with the ID-card.")); break; @@ -86,8 +87,8 @@ PinUnblock::PinUnblock(QSmartCardData::PinType type, QSmartCard::PinAction actio break; } ui->line1_text->setText(type == QSmartCardData::Pin2Type - ? tr("PIN2 code is used to digitally sign documents.") - : tr("PIN1 code is used for confirming the identity of a person.")); + ? tr("PIN2 code is used to digitally sign documents.") + : tr("PIN1 code is used for confirming the identity of a person.")); ui->line2_text->setText( tr("If %1 is inserted incorrectly 3 times the %2 certificate will be blocked and it will be impossible to use ID-card to %3, until it is unblocked via the PUK code.").arg( QSmartCardData::typeString(type), @@ -102,16 +103,16 @@ PinUnblock::PinUnblock(QSmartCardData::PinType type, QSmartCard::PinAction actio ui->repeat->setValidator(new QRegularExpressionValidator(regexpNewCode, ui->repeat)); ui->puk->setValidator(new QRegularExpressionValidator(regexpValidateCode, ui->puk)); - auto setError = [](QLineEdit *input, QLabel *error, const QString &msg) { - input->setStyleSheet(msg.isEmpty() ? QString() : QStringLiteral("border-color: #BE7884")); + auto setError = [this](LineEdit *input, QLabel *error, const QString &msg) { + input->setLabel(msg.isEmpty() ? QString() : QStringLiteral("error")); error->setFocusPolicy(msg.isEmpty() ? Qt::NoFocus : Qt::TabFocus); error->setText(msg); error->setHidden(msg.isEmpty()); }; if(leftAttempts < 3) - setError(ui->puk, ui->errorPuk, action == QSmartCard::ChangeWithPin || action == QSmartCard::ActivateWithPin ? - tr("Remaining attempts: %1").arg(leftAttempts) : - tr("PUK remaining attempts: %1").arg(leftAttempts)); + setError(ui->puk, ui->errorPuk, action == QSmartCard::ChangeWithPin || action == QSmartCard::ActivateWithPin + ? tr("Remaining attempts: %1").arg(leftAttempts) + : tr("PUK remaining attempts: %1").arg(leftAttempts)); for(int i = 1; i < 4; i++) { diff --git a/client/dialogs/PinUnblock.ui b/client/dialogs/PinUnblock.ui index f91e948db..8c866470b 100644 --- a/client/dialogs/PinUnblock.ui +++ b/client/dialogs/PinUnblock.ui @@ -39,6 +39,9 @@ background-color: white; placeholder-text-color: #607496; font-size: 16px; } +QLineEdit[label="error"] { +border-color: #BE7884; +} QPushButton { padding: 12px 12px; border-radius: 4px; @@ -259,10 +262,13 @@ background-color: #82A9D3; - + QLineEdit::Password + + + @@ -296,10 +302,13 @@ background-color: #82A9D3; - + QLineEdit::Password + + + @@ -333,10 +342,13 @@ background-color: #82A9D3; - + QLineEdit::Password + + + @@ -404,6 +416,13 @@ background-color: #82A9D3; + + + LineEdit + QLineEdit +
widgets/LineEdit.h
+
+
diff --git a/client/dialogs/SettingsDialog.ui b/client/dialogs/SettingsDialog.ui index 75703b445..f160ef9a3 100644 --- a/client/dialogs/SettingsDialog.ui +++ b/client/dialogs/SettingsDialog.ui @@ -89,7 +89,7 @@ color: transparent; selection-color: transparent; } QRadioButton:checked { -background-color: #E9ECF3; +background-color: #EAF1F8; } @@ -417,7 +417,7 @@ border: 2px solid transparent; border-radius: 4px; } QCheckBox:disabled, QRadioButton:disabled { -color: #BDBDBD; +color: #C4CBD8; } QCheckBox::indicator, QRadioButton::indicator { width: 16px; @@ -1608,22 +1608,22 @@ max-height: 22px; QTextEdit { - color: #363739; - background: #FFFFFF; - border-bottom: 1px solid #E7EAEF; +color: #07142A; +background: #FFFFFF; +border-bottom: 1px solid #E7EAEF; } QScrollBar { - width: 10px; - padding: 5px 5px 5px 0; - margin: 2px 0px 2px 0; - border: none; - background: #FFFFFF; +width: 10px; +padding: 5px 5px 5px 0px; +margin: 2px 0px 2px 0px; +border: none; +background: #FFFFFF; } QScrollBar::handle:vertical { -background-color: #8E969D; - margin: 0 0 0 0; - border-radius: 2px; - height: 145px; +background-color: #C4CBD8; +margin: 0px; +border-radius: 2px; +height: 145px; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { @@ -1712,21 +1712,21 @@ Additional licenses and components QTextEdit { - color: #363739; - background: #FFFFFF; +color: #07142A; +background: #FFFFFF; } QScrollBar { - width: 10px; - padding: 5px 5px 5px 0; - margin: 2px 0px 2px 0; - border: none; - background: #FFFFFF; +width: 10px; +padding: 5px 5px 5px 0px; +margin: 2px 0px 2px 0px; +border: none; +background: #FFFFFF; } QScrollBar::handle:vertical { -background-color: #8E969D; - margin: 0 0 0 0; - border-radius: 2px; - height: 145px; +background-color: #C4CBD8; +margin: 0px; +border-radius: 2px; +height: 145px; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { diff --git a/client/dialogs/SignatureDialog.ui b/client/dialogs/SignatureDialog.ui index 59f467fdb..2204228d6 100644 --- a/client/dialogs/SignatureDialog.ui +++ b/client/dialogs/SignatureDialog.ui @@ -179,25 +179,22 @@ padding: 10px 14px; QScrollBar { - width: 10px; - padding: 5px 5px 5px 0; - margin: 2px 0px 2px 0; - border: none; - background: #FFFFFF; -} -QScrollBar::handle:vertical{ - background-color: #8E969D; - margin: 0 0 0 0; - border-radius: 2px; - height: 145px; +width: 10px; +padding: 5px 5px 5px 0px; +margin: 2px 0px 2px 0; +border: none; +background: #FFFFFF; } -QScrollBar::add-line:vertical { - border: none; - background: none; +QScrollBar::handle:vertical { +background-color: #C4CBD8; +margin: 0px; +border-radius: 2px; +height: 145px; } +QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { - border: none; - background: none; +border: none; +background: none; } diff --git a/client/dialogs/SmartIDDialog.cpp b/client/dialogs/SmartIDDialog.cpp index 9f6f79422..eea9c1251 100644 --- a/client/dialogs/SmartIDDialog.cpp +++ b/client/dialogs/SmartIDDialog.cpp @@ -55,8 +55,8 @@ SmartIDDialog::SmartIDDialog(QWidget *parent) Settings::SMARTID_CODE = checked ? idCode() : QString(); Settings::SMARTID_COUNTRY = checked ? country() : EE; }; - auto setError = [](QLineEdit *input, QLabel *error, const QString &msg) { - input->setStyleSheet(msg.isEmpty() ? QString() : QStringLiteral("border-color: #BE7884")); + auto setError = [](LineEdit *input, QLabel *error, const QString &msg) { + input->setLabel(msg.isEmpty() ? QString() : QStringLiteral("error")); error->setText(msg); error->setHidden(msg.isEmpty()); }; diff --git a/client/dialogs/SmartIDDialog.ui b/client/dialogs/SmartIDDialog.ui index 5901977c5..1ae29b961 100644 --- a/client/dialogs/SmartIDDialog.ui +++ b/client/dialogs/SmartIDDialog.ui @@ -42,6 +42,9 @@ background-color: white; placeholder-text-color: #607496; font-size: 16px; } +QLineEdit[label="error"] { +border-color: #BE7884; +} QComboBox QWidget#popup { background-color: transparent; } @@ -252,6 +255,9 @@ background-color: #82A9D3; 47101010033 + + + diff --git a/client/images/icon_error.svg b/client/images/icon_error.svg new file mode 100644 index 000000000..24a3f658d --- /dev/null +++ b/client/images/icon_error.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/client/images/images.qrc b/client/images/images.qrc index e859563ef..b3697a6a9 100644 --- a/client/images/images.qrc +++ b/client/images/images.qrc @@ -30,6 +30,7 @@ icon_digitempel.svg icon_download.svg icon_Edit.svg + icon_error.svg icon_help.svg icon_IDkaart_red.svg icon_IDkaart_green.svg diff --git a/client/translations/en.ts b/client/translations/en.ts index 964bf09db..e14d18cdf 100644 --- a/client/translations/en.ts +++ b/client/translations/en.ts @@ -1122,10 +1122,6 @@ <p align=center>Who is recipient?</p> <p align=center>The recipient is a physical person or legal entity for whom the document can be encrypted. If the document is encrypted, only the specified recipient can see its content.</p> - - Enter personal code, company or registry code - Enter personal code, company or registry code - Add recipients Add recipients diff --git a/client/translations/et.ts b/client/translations/et.ts index 080a07453..149425e29 100644 --- a/client/translations/et.ts +++ b/client/translations/et.ts @@ -1122,10 +1122,6 @@ <p align=center>Kes on adressaat?</p> <p align=center>Adressaat on füüsiline või juriidiline isik või asutus, kelle jaoks saab dokumendi krüpteerida. Kui dokument on krüpteeritud, siis saab ainult konkreetne adressaat selle sisu näha.</p> - - Enter personal code, company or registry code - Sisesta isikukood, asutus või registrikood - Add recipients Lisa adressaadid diff --git a/client/translations/ru.ts b/client/translations/ru.ts index a149f54b9..c57243163 100644 --- a/client/translations/ru.ts +++ b/client/translations/ru.ts @@ -1122,10 +1122,6 @@ <p align=center>Кто является получателем?</p> <p align=center>Получатель - физическое или юридическое лицо, для которого документ может быть зашифрован. Если документ зашифрован, только указанный получатель может видеть его содержимое.</p> - - Enter personal code, company or registry code - Введите личный код, учреждение или код регистра - Add recipients Добавьте получателей diff --git a/client/widgets/AddressItem.ui b/client/widgets/AddressItem.ui index bf640996b..2682309ff 100644 --- a/client/widgets/AddressItem.ui +++ b/client/widgets/AddressItem.ui @@ -60,9 +60,6 @@ background-color: #EAF1F8; } #add:pressed { background-color: #BFD3E8; -} -#add:disabled { -color: #727679; } diff --git a/client/widgets/ContainerPage.cpp b/client/widgets/ContainerPage.cpp index 99ba77c50..00f85af67 100644 --- a/client/widgets/ContainerPage.cpp +++ b/client/widgets/ContainerPage.cpp @@ -56,22 +56,24 @@ ContainerPage::ContainerPage(QWidget *parent) ui->containerFile->installEventFilter(this); ui->summary->hide(); - mobileCode = Settings::MOBILEID_CODE; - auto connectCode = [this](QAbstractButton *btn, int code) { - connect(btn, &QAbstractButton::clicked, this, [this,code] { emit forward(code); }); + connect(btn, &QAbstractButton::clicked, this, [this,code] { emit action(code); }); }; connect(this, &ContainerPage::moved,this, &ContainerPage::setHeader); connectCode(ui->changeLocation, Actions::ContainerLocation); - connectCode(ui->cancel, Actions::ContainerCancel); + connect(ui->cancel, &QPushButton::clicked, this, [this] { + window()->setWindowFilePath({}); + window()->setWindowTitle(tr("DigiDoc4 Client")); + emit action(Actions::ContainerCancel); + }); connectCode(ui->convert, Actions::ContainerConvert); connectCode(ui->saveAs, Actions::ContainerSaveAs); connectCode(ui->save, Actions::ContainerSave); connect(ui->leftPane, &FileList::addFiles, this, &ContainerPage::addFiles); connect(ui->leftPane, &ItemList::removed, this, &ContainerPage::fileRemoved); - connect(ui->leftPane, &ItemList::addItem, this, &ContainerPage::forward); - connect(ui->rightPane, &ItemList::addItem, this, &ContainerPage::forward); + connect(ui->leftPane, &ItemList::addItem, this, [this](int code) { emit action(code); }); + connect(ui->rightPane, &ItemList::addItem, this, [this](int code) { emit action(code); }); connect(ui->rightPane, &ItemList::removed, this, &ContainerPage::removed); connect(ui->email, &QAbstractButton::clicked, this, [this] { if(!QFileInfo::exists(fileName)) @@ -104,36 +106,10 @@ void ContainerPage::cardChanged(const SslCertificate &cert, bool isBlocked) isSeal = cert.type() & SslCertificate::TempelType; isExpired = !cert.isValid(); this->isBlocked = isBlocked; - cardInReader = cert.personalCode(); + idCode = cert.personalCode(); emit certChanged(cert); } -bool ContainerPage::checkAction(int code, const QString& selectedCard, const QString& selectedMobile) -{ - switch(code) - { - case SignatureAdd: - case SignatureToken: - case SignatureMobile: - case SignatureSmartID: - if(ui->rightPane->hasItem( - [selectedCard, selectedMobile, code](Item* const item) -> bool - { - auto *signatureItem = qobject_cast(item); - return signatureItem && signatureItem->isSelfSigned(selectedCard, (code == SignatureMobile) ? selectedMobile: QString()); - } - )) - { - auto *dlg = new WarningDialog(tr("The document has already been signed by you."), this); - dlg->addButton(tr("Continue signing"), QMessageBox::Ok); - return dlg->exec() == QMessageBox::Ok; - } - break; - default: break; - } - return true; -} - void ContainerPage::clear() { ui->leftPane->clear(); @@ -149,7 +125,8 @@ void ContainerPage::clearPopups() void ContainerPage::elideFileName() { ui->containerFile->setText(QStringLiteral("%1") - .arg(ui->containerFile->fontMetrics().elidedText(FileDialog::normalized(fileName).toHtmlEscaped(), Qt::ElideMiddle, ui->containerFile->width()))); + .arg(ui->containerFile->fontMetrics().elidedText( + FileDialog::normalized(fileName).toHtmlEscaped(), Qt::ElideMiddle, ui->containerFile->width()))); } bool ContainerPage::eventFilter(QObject *o, QEvent *e) @@ -166,50 +143,49 @@ bool ContainerPage::eventFilter(QObject *o, QEvent *e) return QWidget::eventFilter(o, e); } -void ContainerPage::forward(int code) +void ContainerPage::handleAction(int type) { - switch (code) + QString code; + QString info2; + switch(type) { + case SignatureAdd: + case SignatureToken: + code = idCode; + break; case SignatureMobile: { - if(MobileDialog dlg(this); dlg.exec() == QDialog::Accepted) - { - if(checkAction(SignatureMobile, dlg.idCode(), dlg.phoneNo())) - emit action(SignatureMobile, dlg.idCode(), dlg.phoneNo()); - } - - if(QString newCode = Settings::MOBILEID_CODE; newCode != mobileCode) - { - mobileCode = std::move(newCode); - showSigningButton(); - } + MobileDialog dlg(this); + if(dlg.exec() != QDialog::Accepted) + return; + code = dlg.idCode(); + info2 = dlg.phoneNo(); break; } case SignatureSmartID: { - if(SmartIDDialog dlg(this); dlg.exec() == QDialog::Accepted) - { - if(checkAction(SignatureMobile, dlg.idCode(), {})) - emit action(SignatureSmartID, dlg.country(), dlg.idCode()); - } - - if(QString newCode = Settings::SMARTID_CODE; newCode != mobileCode) - { - mobileCode = std::move(newCode); - showSigningButton(); - } + SmartIDDialog dlg(this); + if(dlg.exec() != QDialog::Accepted) + return; + code = dlg.idCode(); + info2 = dlg.country(); break; } - case ContainerCancel: - window()->setWindowFilePath({}); - window()->setWindowTitle(tr("DigiDoc4 Client")); - emit action(code); - break; default: - if(checkAction(code, cardInReader, mobileCode)) - emit action(code); - break; + emit action(type, code, info2); + return; + } + if(auto items = ui->rightPane->findChildren(); + std::any_of(items.cbegin(), items.cend(), [code](auto *signatureItem) { + return signatureItem->isSelfSigned(code); + })) + { + auto *dlg = new WarningDialog(tr("The document has already been signed by you."), this); + dlg->addButton(tr("Continue signing"), QMessageBox::Ok); + if(dlg->exec() != QMessageBox::Ok) + return; } + emit action(type, code, info2); } void ContainerPage::changeEvent(QEvent* event) @@ -236,7 +212,7 @@ void ContainerPage::showMainAction(const QList &actions) if(!mainAction) { mainAction = std::make_unique(this); - connect(mainAction.get(), &MainAction::action, this, &ContainerPage::forward); + connect(mainAction.get(), &MainAction::action, this, &ContainerPage::handleAction); } mainAction->showActions(actions); bool isSignCard = actions.contains(SignatureAdd) || actions.contains(SignatureToken); @@ -258,7 +234,7 @@ void ContainerPage::showSigningButton() ui->mainActionSpacer->changeSize(1, 20, QSizePolicy::Fixed); ui->navigationArea->layout()->invalidate(); } - else if(cardInReader.isEmpty()) + else if(idCode.isEmpty()) showMainAction({ SignatureMobile, SignatureSmartID }); else if(isSeal) showMainAction({ SignatureToken, SignatureMobile, SignatureSmartID }); @@ -268,8 +244,8 @@ void ContainerPage::showSigningButton() void ContainerPage::transition(CryptoDoc *container, const QSslCertificate &cert) { - disconnect(ui->rightPane, &ItemList::addressSearch, container, nullptr); - connect(ui->rightPane, &ItemList::addressSearch, container, [this, container] { + disconnect(ui->rightPane, &ItemList::add, container, nullptr); + connect(ui->rightPane, &ItemList::add, container, [this, container] { AddRecipients dlg(ui->rightPane, this); if(!dlg.exec() || !dlg.isUpdated()) return; @@ -292,7 +268,7 @@ void ContainerPage::transition(CryptoDoc *container, const QSslCertificate &cert disconnect(this, &ContainerPage::certChanged, container, nullptr); connect(this, &ContainerPage::certChanged, container, [this, container](const SslCertificate &cert) { isSupported = container->state() & UnencryptedContainer || container->canDecrypt(cert); - if(ui->leftPane->getState() & EncryptedContainer) + if(container->state() & EncryptedContainer) updateDecryptionButton(); }); disconnect(container, &CryptoDoc::destroyed, this, &ContainerPage::clear); @@ -305,6 +281,8 @@ void ContainerPage::transition(CryptoDoc *container, const QSslCertificate &cert emit action(ClearCryptoWarning); isSupported = container->state() & UnencryptedContainer || container->canDecrypt(cert); setHeader(container->fileName()); + ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Encrypted files")); + ui->rightPane->init(ItemAddress, QT_TRANSLATE_NOOP("ItemList", "Recipients")); bool hasUnsupported = false; for(CKey &key: container->keys()) { @@ -313,29 +291,23 @@ void ContainerPage::transition(CryptoDoc *container, const QSslCertificate &cert } if(hasUnsupported) emit warning({UnsupportedCDocWarning}); - updatePanes(container->state()); ui->leftPane->setModel(container->documentModel()); + updatePanes(container->state()); } void ContainerPage::transition(DigiDoc* container) { - clear(); - emit action(ClearSignatureWarning); - std::map errors; - setHeader(container->fileName()); - disconnect(this, &ContainerPage::certChanged, container, nullptr); - connect(this, &ContainerPage::certChanged, container, [this, container](const SslCertificate &) { + connect(this, &ContainerPage::certChanged, container, [this](const SslCertificate &) { showSigningButton(); }); - disconnect(ui->summary, &QAbstractButton::clicked, container, nullptr); connect(ui->summary, &QAbstractButton::clicked, container, [this,container] { #ifdef Q_OS_WIN if( QPrinterInfo::availablePrinterNames().isEmpty() ) { WarningDialog::show(this, - tr("In order to view Validity Confirmation Sheet there has to be at least one printer installed!")); + tr("In order to view Validity Confirmation Sheet there has to be at least one printer installed!")); return; } #endif @@ -350,6 +322,12 @@ void ContainerPage::transition(DigiDoc* container) dialog->deleteLater(); }); + clear(); + emit action(ClearSignatureWarning); + std::map errors; + setHeader(container->fileName()); + ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Container files")); + if(!container->timestamps().isEmpty()) { ui->rightPane->addHeader(QT_TRANSLATE_NOOP("ItemList", "Container timestamps")); @@ -419,7 +397,6 @@ void ContainerPage::updatePanes(ContainerState state) ui->changeLocation->show(); ui->rightPane->clear(); - ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Container files")); showSigningButton(); setButtonsVisible({ ui->saveAs, ui->email, ui->summary }, false); break; @@ -427,7 +404,6 @@ void ContainerPage::updatePanes(ContainerState state) cancelText = QT_TR_NOOP("Start"); ui->changeLocation->show(); - ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Container files")); ui->rightPane->init(ItemSignature, QT_TRANSLATE_NOOP("ItemList", "Container is not signed")); ui->summary->setVisible(Settings::SHOW_PRINT_SUMMARY); setButtonsVisible({ ui->saveAs, ui->email }, true); @@ -436,7 +412,6 @@ void ContainerPage::updatePanes(ContainerState state) cancelText = QT_TR_NOOP("Start"); ui->changeLocation->hide(); - ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Container files")); ui->rightPane->init(ItemSignature, QT_TRANSLATE_NOOP("ItemList", "Container signatures")); ui->summary->setVisible(Settings::SHOW_PRINT_SUMMARY); setButtonsVisible({ ui->saveAs, ui->email }, true); @@ -446,8 +421,6 @@ void ContainerPage::updatePanes(ContainerState state) convertText = QT_TR_NOOP("Sign"); ui->changeLocation->show(); - ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Encrypted files")); - ui->rightPane->init(ItemAddress, QT_TRANSLATE_NOOP("ItemList", "Recipients")); showMainAction({ EncryptContainer }); setButtonsVisible({ ui->saveAs, ui->email }, false); break; @@ -456,8 +429,6 @@ void ContainerPage::updatePanes(ContainerState state) convertText = QT_TR_NOOP("Sign"); ui->changeLocation->hide(); - ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Encrypted files")); - ui->rightPane->init(ItemAddress, QT_TRANSLATE_NOOP("ItemList", "Recipients")); updateDecryptionButton(); setButtonsVisible({ ui->saveAs, ui->email }, true); break; diff --git a/client/widgets/ContainerPage.h b/client/widgets/ContainerPage.h index 47ba67afc..52b56a635 100644 --- a/client/widgets/ContainerPage.h +++ b/client/widgets/ContainerPage.h @@ -47,13 +47,12 @@ class ContainerPage final : public QWidget void cardChanged(const SslCertificate &cert, bool isBlocked = false); void clear(); void clearPopups(); - void setHeader(const QString &file); void togglePrinting(bool enable); void transition(CryptoDoc *container, const QSslCertificate &cert); void transition(DigiDoc* container); signals: - void action(int code, const QString &info1 = {}, const QString &info2 = {}); + void action(int code, const QString &idCode = {}, const QString &info2 = {}); void addFiles(const QStringList &files); void certChanged(const SslCertificate &cert); void fileRemoved(int row); @@ -63,21 +62,20 @@ class ContainerPage final : public QWidget private: void changeEvent(QEvent* event) final; - bool checkAction(int code, const QString& selectedCard, const QString& selectedMobile); void elideFileName(); bool eventFilter(QObject *o, QEvent *e) final; - void forward(int code); + void setHeader(const QString &file); void showMainAction(const QList &actions); void showSigningButton(); + void handleAction(int type); void updateDecryptionButton(); void updatePanes(ria::qdigidoc4::ContainerState state); void translateLabels(); Ui::ContainerPage *ui; std::unique_ptr mainAction; - QString cardInReader; + QString idCode; QString fileName; - QString mobileCode; const char *cancelText = QT_TR_NOOP("Cancel"); const char *convertText = QT_TR_NOOP("Encrypt"); diff --git a/client/widgets/FileItem.cpp b/client/widgets/FileItem.cpp index 8864ab362..cc23e8d8a 100644 --- a/client/widgets/FileItem.cpp +++ b/client/widgets/FileItem.cpp @@ -19,7 +19,6 @@ #include "FileItem.h" #include "ui_FileItem.h" -#include "Styles.h" using namespace ria::qdigidoc4; @@ -29,7 +28,6 @@ FileItem::FileItem(QString file, ContainerState state, QWidget *parent) , fileName(std::move(file)) { ui->setupUi(this); - ui->fileName->setFont(Styles::font(Styles::Regular, 14)); stateChange(state); diff --git a/client/widgets/FileItem.ui b/client/widgets/FileItem.ui index 20b5c146c..00b99c764 100644 --- a/client/widgets/FileItem.ui +++ b/client/widgets/FileItem.ui @@ -6,20 +6,20 @@ 0 0 - 457 - 44 + 181 + 53 415 - 44 + 53 16777215 - 44 + 53 @@ -30,33 +30,29 @@ background-color: #ffffff; - 2 + 10 - 0 + 8 - 1 + 15 - 0 + 8 - 1 + 15 - - - Roboto - 14 - - PointingHandCursor - color: #363739; + color: #07142A; +font-family: Roboto, Helvetica; +font-size: 14px; border: 0px; text-align: left; diff --git a/client/widgets/FileList.cpp b/client/widgets/FileList.cpp index 4d6cdee70..0600f87d2 100644 --- a/client/widgets/FileList.cpp +++ b/client/widgets/FileList.cpp @@ -38,7 +38,7 @@ using namespace ria::qdigidoc4; FileList::FileList(QWidget *parent) : ItemList(parent) { - connect(ui->add, &QToolButton::clicked, this, &FileList::selectFile); + connect(this, &FileList::add, this, &FileList::selectFile); connect(ui->download, &QToolButton::clicked, this, &FileList::saveAll); } @@ -50,7 +50,7 @@ void FileList::addFile( const QString& file ) connect(item, &FileItem::open, this, &FileList::open); connect(item, &FileItem::download, this, &FileList::save); - + connect(item, &FileItem::destroyed, this, &FileList::updateDownload); updateDownload(); } diff --git a/client/widgets/ItemList.cpp b/client/widgets/ItemList.cpp index ddff6b0b0..67b2d124e 100644 --- a/client/widgets/ItemList.cpp +++ b/client/widgets/ItemList.cpp @@ -20,7 +20,7 @@ #include "ItemList.h" #include "ui_ItemList.h" -#include "Styles.h" +#include "Item.h" #include @@ -34,10 +34,11 @@ ItemList::ItemList(QWidget *parent) ui->setupUi(this); ui->findGroup->hide(); ui->download->hide(); - ui->count->setFont(Styles::font(Styles::Condensed, 12)); ui->count->hide(); ui->infoIcon->hide(); + ui->add->hide(); ui->txtFind->setAttribute(Qt::WA_MacShowFocusRect, false); + connect(ui->add, &QToolButton::clicked, this, &ItemList::add); connect(this, &ItemList::idChanged, this, [this](const SslCertificate &cert){ this->cert = cert; }); ui->txtFind->installEventFilter(this); } @@ -57,8 +58,7 @@ void ItemList::addHeader(const char *label) header->setFocusPolicy(Qt::TabFocus); header->resize(415, 64); header->setFixedHeight(64); - header->setFont( Styles::font(Styles::Regular, 20)); - header->setStyleSheet(QStringLiteral("border-bottom: 1px solid #E7EAEF; color: #041E42;")); + header->setStyleSheet(QStringLiteral("border-bottom: 1px solid #E7EAEF; color: #003168;")); ui->itemLayout->insertWidget(0, header); setTabOrder(this, header); setTabOrder(header, ui->header); @@ -70,17 +70,6 @@ void ItemList::addHeaderWidget(Item *widget) setTabOrder(widget->lastTabWidget(), ui->header); } -QString ItemList::addLabel() -{ - switch(itemType) - { - case ItemFile: return tr("+ Add more files"); - case ItemAddress: return tr("+ Add recipient"); - case ToAddAdresses: return tr("Add all"); - default: return {}; - } -} - void ItemList::addWidget(Item *widget, int index, QWidget *tabIndex) { if(!tabIndex) @@ -110,17 +99,11 @@ void ItemList::changeEvent(QEvent* event) if (event->type() == QEvent::LanguageChange) { ui->retranslateUi(this); - - ui->listHeader->setText(tr(listText)); - ui->txtFind->setPlaceholderText(tr("Enter the personal code, institution or registry code")); - ui->txtFind->setAccessibleName(ui->txtFind->placeholderText()); - + ui->listHeader->setText(tr(title)); + ui->add->setText(tr(addTitle)); if(header) header->setText(tr(headerText)); - - ui->add->setText(addLabel()); - - if(itemType == ItemAddress) + if(!ui->infoIcon->toolTip().isEmpty()) setRecipientTooltip(); } @@ -137,7 +120,7 @@ void ItemList::clear() header = nullptr; for(auto it = items.begin(); it != items.end(); it = items.erase(it)) - delete *it; + (*it)->deleteLater(); } bool ItemList::eventFilter(QObject *o, QEvent *e) @@ -155,36 +138,24 @@ bool ItemList::eventFilter(QObject *o, QEvent *e) return QScrollArea::eventFilter(o, e); } -ContainerState ItemList::getState() const { return state; } - int ItemList::index(Item *item) const { return items.indexOf(item); } -bool ItemList::hasItem(const std::function &cb) -{ - return std::any_of(items.cbegin(), items.cend(), cb); -} - void ItemList::init(ItemType item, const char *header) { - itemType = item; - ui->listHeader->setText(tr(header)); - listText = header; - ui->listHeader->setFont( Styles::font(Styles::Regular, 20)); + ui->listHeader->setText(tr(title = header)); - if(item != ToAddAdresses) - { - ui->findGroup->hide(); - } - else + switch(item) { - ui->btnFind->setFont(Styles::font(Styles::Condensed, 14)); - ui->txtFind->setFont(Styles::font(Styles::Regular, 12)); + case ToAddAdresses: + addTitle = QT_TR_NOOP("Add all"); ui->findGroup->show(); - ui->txtFind->setPlaceholderText(tr("Enter personal code, company or registry code")); - connect(ui->txtFind, &QLineEdit::returnPressed, this, [this]{ if(!ui->txtFind->text().trimmed().isEmpty()) emit search(ui->txtFind->text()); }); + connect(ui->txtFind, &QLineEdit::returnPressed, this, [this]{ + if(!ui->txtFind->text().trimmed().isEmpty()) + emit search(ui->txtFind->text()); + }); connect(ui->btnFind, &QPushButton::clicked, this, [this]{ emit search(ui->txtFind->text()); }); ui->btnFind->setDisabled(ui->txtFind->text().trimmed().isEmpty()); connect(ui->txtFind, &QLineEdit::textChanged, this, [this](const QString &text){ @@ -193,27 +164,23 @@ void ItemList::init(ItemType item, const char *header) ui->btnFind->setDefault(isEmpty); ui->btnFind->setAutoDefault(isEmpty); }); - } - - if (itemType == ItemSignature || item == AddedAdresses || this->state == SignedContainer) - ui->add->hide(); - else - ui->add->setText(addLabel()); - - if(itemType == ItemAddress) - { - ui->add->disconnect(); + break; + case ItemAddress: + addTitle = QT_TR_NOOP("+ Add recipient"); ui->infoIcon->load(QStringLiteral(":/images/icon_info.svg")); ui->infoIcon->show(); setRecipientTooltip(); - - connect(ui->add, &QToolButton::clicked, this, &ItemList::addressSearch); - } - else if(itemType == ToAddAdresses) - { + break; + case ItemFile: + addTitle = QT_TR_NOOP("+ Add more files"); + break; + case ItemSignature: ui->add->hide(); - connect(ui->add, &QToolButton::clicked, this, &ItemList::addAll); + break; + default: + break; } + ui->add->setText(tr(addTitle)); } void ItemList::remove(Item *item) @@ -225,7 +192,7 @@ void ItemList::remove(Item *item) void ItemList::removeItem(int row) { if(row < items.size()) - delete items.takeAt(row); + items.takeAt(row)->deleteLater(); } void ItemList::setRecipientTooltip() diff --git a/client/widgets/ItemList.h b/client/widgets/ItemList.h index 06bc89008..bd533de57 100644 --- a/client/widgets/ItemList.h +++ b/client/widgets/ItemList.h @@ -20,19 +20,17 @@ #pragma once #include "common_enums.h" -#include "widgets/Item.h" #include "SslCertificate.h" -#include #include namespace Ui { class ItemList; } +class Item; class QLabel; -class QSvgWidget; class ItemList : public QScrollArea { @@ -47,15 +45,12 @@ class ItemList : public QScrollArea void addHeaderWidget(Item *widget); void addWidget(Item *widget); virtual void clear(); - ria::qdigidoc4::ContainerState getState() const; - bool hasItem(const std::function &cb); virtual void removeItem(int row); virtual void stateChange(ria::qdigidoc4::ContainerState state); signals: - void addAll(); + void add(); void addItem(int code); - void addressSearch(); void idChanged(const SslCertificate &cert); void keysSelected(QList keys); void removed(int row); @@ -71,15 +66,14 @@ class ItemList : public QScrollArea ria::qdigidoc4::ContainerState state = ria::qdigidoc4::UnencryptedContainer; private: - QString addLabel(); void addWidget(Item *widget, int index, QWidget *tabIndex = {}); void setRecipientTooltip(); QList items; QLabel *header = nullptr; - ria::qdigidoc4::ItemType itemType = ria::qdigidoc4::ItemAddress; + const char *title = ""; + const char *addTitle = ""; const char *headerText = ""; - const char *listText = ""; SslCertificate cert; friend class AddRecipients; diff --git a/client/widgets/ItemList.ui b/client/widgets/ItemList.ui index db1044761..0ba5f67b5 100644 --- a/client/widgets/ItemList.ui +++ b/client/widgets/ItemList.ui @@ -11,20 +11,33 @@ - QScrollBar{ - width: 10px; - padding: 5px 5px 5px 0; + QWidget { +color: #07142A; +font-family: Roboto, Helvetica; +font-size: 14px; } -QScrollBar::handle:vertical{ - background-color: #8E969D; - margin: 0 0 0 0; - border-radius: 2px; - height: 145px; +QLineEdit { +padding: 10px 14px; +border: 1px solid #C4CBD8; +border-radius: 4px; +background-color: white; +placeholder-text-color: #607496; +font-size: 16px; +} +QScrollBar { +width: 10px; +padding: 5px 5px 5px 0px; +} +QScrollBar::handle:vertical { +background-color: #C4CBD8; +margin: 0px; +border-radius: 2px; +height: 145px; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { - border: none; - background: none; +border: none; +background: none; } #items { background-color: #ffffff; @@ -34,19 +47,26 @@ border-bottom: 1px solid #E7EAEF; } #add { font-family: Roboto, Helvetica; -margin: 6px 0px; -padding: 9px 8px; +margin-top: 32px; +padding: 10px 12px; font-size: 12px; font-weight: 700; border-radius: 4px; border: none; color: #2F70B6; +border: 1px solid #2F70B6; } #add:hover { background-color: #EAF1F8; +border-color: #EAF1F8; } #add:pressed { background-color: #BFD3E8; +border-color: #BFD3E8; +} +#listHeader { +color: #003168; +font-size: 22px; } @@ -75,43 +95,34 @@ background-color: #BFD3E8; 0 - 20 + 24 + + + 32 - 20 + 24 22 - - - 0 - 64 - - - - - 16777215 - 64 - - - - color: #041E42; - + + 4 + - 0 + 8 1 - 0 + 8 - 1 + 16 @@ -121,27 +132,18 @@ background-color: #BFD3E8; 40 - 20 + 0 - - - Roboto - 20 - - Qt::TabFocus - - color: #003168; - - - Qt::AlignCenter + + + Add recipient @@ -171,7 +173,7 @@ background-color: #BFD3E8; border-radius: 2px; text-align: center; font-weight: 400; - text-decoration: none solid rgb(252, 252, 252); + text-decoration: none solid #fcfcfc; padding: 5px; font-size: 13px; } @@ -192,25 +194,8 @@ background-color: #BFD3E8; - - - 15 - 19 - - - - - 15 - 19 - - - - - 12 - - - color: #006EB5; + color: #2F70B6; 1 @@ -231,12 +216,12 @@ background-color: #BFD3E8; PointingHandCursor - - Download all files - border: none; + + Download all files + :/images/icon_download.svg:/images/icon_download.svg @@ -256,10 +241,7 @@ background-color: #BFD3E8; - - - 4 - + 0 @@ -270,65 +252,54 @@ background-color: #BFD3E8; 0 - 8 + 16 - - - - - 0 - 35 - - - - - 16777215 - 35 - - - + + 24 + + + 6 + + + + Enter the personal code, institution or registry code - - #txtFind -{ -border: 1px solid #8E969D; -border-radius: 2px; -background-color: #FFFFFF; -padding: 0px 10px; -} - - - Enter the personal code, institution or registry code + + txtFind - + + + + - - - 80 - 34 - + + + 0 + 0 + PointingHandCursor QPushButton { - border-radius: 2px; - border: none; - color: #ffffff; - background-color: #006EB5; +padding: 12px 12px; +border-radius: 4px; +color: #ffffff; +font-weight: 700; +background-color: #2F70B6; } -QPushButton:pressed { - background-color: #41B6E6; +QPushButton:hover { +background-color: #2B66A6; } -QPushButton:hover:!pressed { - background-color: #008DCF; +QPushButton:pressed { +background-color: #215081; } QPushButton:disabled { - background-color: #BEDBED; +background-color: #82A9D3; } @@ -350,29 +321,22 @@ QPushButton:disabled { - - - - 0 - 0 - + + + Qt::Vertical - - QWidget#widget { background-image: url(:/images/bg_lovid.svg); -background-repeat: repeat-x; -background-position: left bottom; } + + + 20 + 0 + - + - - LineEdit - QLineEdit -
widgets/LineEdit.h
-
QSvgWidget QWidget diff --git a/client/widgets/Label.cpp b/client/widgets/Label.cpp index 5b8cf3df7..75cc4f432 100644 --- a/client/widgets/Label.cpp +++ b/client/widgets/Label.cpp @@ -32,6 +32,8 @@ QString Label::label() const void Label::setLabel(QString label) { + if (label == _label) + return; _label = std::move(label); parentWidget()->style()->unpolish(this); parentWidget()->style()->polish(this); diff --git a/client/widgets/LineEdit.cpp b/client/widgets/LineEdit.cpp index 6e4beddf5..a75135f1c 100644 --- a/client/widgets/LineEdit.cpp +++ b/client/widgets/LineEdit.cpp @@ -51,7 +51,31 @@ void LineEdit::paintEvent(QPaintEvent *event) p.drawText(lineRect, Qt::AlignVCenter, fontMetrics().elidedText(placeholder, Qt::ElideRight, lineRect.width())); return; - } + } else #endif QLineEdit::paintEvent(event); + if(_label == QStringLiteral("error")) + { + QStyleOptionFrame opt; + initStyleOption(&opt); + QRect rect = style()->subElementRect(QStyle::SE_LineEditContents, &opt, this); + auto adjust = (rect.height() - 17) / 2; + rect.adjust(rect.width() - adjust - 17, adjust, -adjust, -adjust); + QPainter p(this); + p.drawImage(rect, QImage(QStringLiteral(":/images/icon_error.svg"))); + } +} + +QString LineEdit::label() const +{ + return _label; +} + +void LineEdit::setLabel(QString label) +{ + if (label == _label) + return; + _label = std::move(label); + parentWidget()->style()->unpolish(this); + parentWidget()->style()->polish(this); } diff --git a/client/widgets/LineEdit.h b/client/widgets/LineEdit.h index 8cf7d6970..ce74aa521 100644 --- a/client/widgets/LineEdit.h +++ b/client/widgets/LineEdit.h @@ -25,10 +25,16 @@ class LineEdit: public QLineEdit { Q_OBJECT public: + Q_PROPERTY(QString label READ label WRITE setLabel FINAL) + explicit LineEdit(QWidget *parent = nullptr); + QString label() const; + void setLabel(QString _label); + private: void paintEvent(QPaintEvent *event) override; + QString _label; QString placeholder; }; diff --git a/client/widgets/SignatureItem.cpp b/client/widgets/SignatureItem.cpp index 2d633a61b..1ffcacf83 100644 --- a/client/widgets/SignatureItem.cpp +++ b/client/widgets/SignatureItem.cpp @@ -193,9 +193,9 @@ void SignatureItem::initTabOrder(QWidget *item) setTabOrder(ui->name, lastTabWidget()); } -bool SignatureItem::isSelfSigned(const QString& cardCode, const QString& mobileCode) const +bool SignatureItem::isSelfSigned(const QString& cardCode) const { - return !ui->serial.isEmpty() && (ui->serial == cardCode || ui->serial == mobileCode); + return !ui->serial.isEmpty() && ui->serial == cardCode; } QWidget* SignatureItem::lastTabWidget() diff --git a/client/widgets/SignatureItem.h b/client/widgets/SignatureItem.h index 4fbbd184c..cd3f88906 100644 --- a/client/widgets/SignatureItem.h +++ b/client/widgets/SignatureItem.h @@ -33,7 +33,7 @@ class SignatureItem final : public Item ria::qdigidoc4::WarningType getError() const; void initTabOrder(QWidget *item) final; - bool isSelfSigned(const QString& cardCode, const QString& mobileCode) const; + bool isSelfSigned(const QString& cardCode) const; QWidget* lastTabWidget() final; private: From 12fed2899439e008cc6a87e2e4368739020e3a09 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Tue, 9 Dec 2025 16:36:09 +0200 Subject: [PATCH 2/2] Do not allow to sign encrypted documents IB-8763 Signed-off-by: Raul Metsma --- client/CryptoDoc.cpp | 11 +-- client/MainWindow.cpp | 138 ++++++++++--------------------- client/MainWindow.h | 11 +-- client/common_enums.h | 2 - client/translations/en.ts | 20 ++--- client/translations/et.ts | 20 ++--- client/translations/ru.ts | 20 ++--- client/widgets/ContainerPage.cpp | 50 +++++++---- client/widgets/ContainerPage.h | 7 +- client/widgets/FileList.cpp | 4 +- 10 files changed, 113 insertions(+), 170 deletions(-) diff --git a/client/CryptoDoc.cpp b/client/CryptoDoc.cpp index 585ffd4c0..3da60461d 100644 --- a/client/CryptoDoc.cpp +++ b/client/CryptoDoc.cpp @@ -447,13 +447,10 @@ QList CryptoDoc::keys() const bool CryptoDoc::move(const QString &to) { - if(!d->isEncrypted) - { - d->fileName = to; - return true; - } - - return false; + if(d->isEncrypted) + return false; + d->fileName = to; + return true; } bool CryptoDoc::open( const QString &file ) diff --git a/client/MainWindow.cpp b/client/MainWindow.cpp index efa5dc94e..1a1b83866 100644 --- a/client/MainWindow.cpp +++ b/client/MainWindow.cpp @@ -131,6 +131,7 @@ MainWindow::MainWindow( QWidget *parent ) MainWindow::~MainWindow() { + digiDoc.reset(); cryptoDoc.reset(); delete ui; } @@ -167,7 +168,7 @@ void MainWindow::changeEvent(QEvent* event) void MainWindow::closeEvent(QCloseEvent * /*event*/) { cryptoDoc.reset(); - resetDigiDoc(); + resetDigiDoc({}); ui->startScreen->setCurrentIndex(SignIntro); } @@ -248,15 +249,17 @@ bool MainWindow::encrypt() if(!cryptoDoc) return false; - if(!FileDialog::fileIsWritable(cryptoDoc->fileName())) { + while (!FileDialog::fileIsWritable(cryptoDoc->fileName())) + { auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?") .arg(FileDialog::normalized(cryptoDoc->fileName())), this); dlg->addButton(WarningDialog::YES, QMessageBox::Yes); - if(dlg->exec() == QMessageBox::Yes) { - moveCryptoContainer(); - return encrypt(); - } - return false; + if(dlg->exec() != QMessageBox::Yes) + return false; + QString to = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), cryptoDoc->fileName()); + if(to.isNull() || !cryptoDoc->move(to)) + return false; + ui->cryptoContainerPage->setHeader(to); } WaitDialogHolder waitDialog(this, tr("Encrypting")); @@ -296,8 +299,8 @@ void MainWindow::navigateToPage( Pages page, const QStringList &files, bool crea navigate = signatureContainer->open(files[0]); if(navigate) { - resetDigiDoc(signatureContainer.release()); - ui->signContainerPage->transition(digiDoc); + resetDigiDoc(std::move(signatureContainer)); + ui->signContainerPage->transition(digiDoc.get()); } } else if(page == CryptoDetails) @@ -358,9 +361,10 @@ void MainWindow::onSignAction(int action, const QString &idCode, const QString & case ClearSignatureWarning: ui->signature->warningIcon(false); ui->warnings->closeWarnings(SignDetails); + ui->warnings->closeWarning(EmptyFileWarning); break; case ContainerCancel: - resetDigiDoc(); + resetDigiDoc({}); selectPage(Pages::SignIntro); break; case ContainerConvert: @@ -369,26 +373,13 @@ void MainWindow::onSignAction(int action, const QString &idCode, const QString & break; case ContainerSave: save(); - ui->signContainerPage->transition(digiDoc); - break; - case ContainerSaveAs: - save(true); - break; - case ContainerLocation: - if(digiDoc) - moveSignatureContainer(); + ui->signContainerPage->transition(digiDoc.get()); break; default: break; } } -void MainWindow::convertToBDoc() -{ - if(wrap(cryptoDoc->fileName(), cryptoDoc->state() == EncryptedContainer)) - FadeInNotification::success(ui->topBar, tr("Converted to signed document!")); -} - void MainWindow::convertToCDoc() { QString filename = FileDialog::createNewFileName(digiDoc->fileName(), false, this); @@ -409,27 +400,13 @@ void MainWindow::convertToCDoc() cryptoContainer->addKey(CKey(cardData.cert())); cryptoDoc = std::move(cryptoContainer); - resetDigiDoc(nullptr, false); + digiDoc.reset(); ui->cryptoContainerPage->transition(cryptoDoc.get(), qApp->signer()->tokenauth().cert()); selectPage(CryptoDetails); FadeInNotification::success(ui->topBar, tr("Converted to crypto container!")); } -void MainWindow::moveCryptoContainer() -{ - QString to = FileDialog::getSaveFileName(this, tr("Move file"), cryptoDoc->fileName()); - if(!to.isNull() && cryptoDoc->move(to)) - emit ui->cryptoContainerPage->moved(to); -} - -void MainWindow::moveSignatureContainer() -{ - QString to = FileDialog::getSaveFileName(this, tr("Move file"), digiDoc->fileName()); - if(!to.isNull() && digiDoc->move(to)) - emit ui->signContainerPage->moved(to); -} - void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString &/*phone*/) { switch(action) @@ -439,8 +416,8 @@ void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString selectPage(Pages::CryptoIntro); break; case ContainerConvert: - if(cryptoDoc) - convertToBDoc(); + if(cryptoDoc && wrap(cryptoDoc->fileName(), false)) + FadeInNotification::success(ui->topBar, tr("Converted to signed document!")); break; case DecryptContainer: case DecryptToken: @@ -457,33 +434,11 @@ void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString FadeInNotification::success(ui->topBar, tr("Encryption succeeded!")); } break; - case ContainerSaveAs: - { - if(!cryptoDoc) - break; - QString target = FileDialog::getSaveFileName(this, tr("Save file"), cryptoDoc->fileName()); - if(target.isEmpty()) - break; - if( !FileDialog::fileIsWritable(target)) - { - auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this); - dlg->addButton(WarningDialog::YES, QMessageBox::Yes); - if(dlg->exec() == QMessageBox::Yes) { - QString file = FileDialog::getSaveFileName(this, tr("Save file"), target); - if(!file.isEmpty()) - cryptoDoc->saveCopy(file); - } - } - cryptoDoc->saveCopy(target); - break; - } case ClearCryptoWarning: ui->crypto->warningIcon(false); ui->warnings->closeWarnings(CryptoDetails); break; - case ContainerLocation: - if(cryptoDoc) - moveCryptoContainer(); + default: break; } } @@ -588,9 +543,9 @@ void MainWindow::openContainer(bool signature) openFiles(files); } -void MainWindow::resetDigiDoc(DigiDoc *doc, bool warnOnChange) +void MainWindow::resetDigiDoc(std::unique_ptr &&doc) { - if(warnOnChange && digiDoc && digiDoc->isModified()) + if(digiDoc && digiDoc->isModified()) { QString warning, cancelTxt, saveTxt; if(digiDoc->state() == UnsignedContainer) @@ -612,37 +567,28 @@ void MainWindow::resetDigiDoc(DigiDoc *doc, bool warnOnChange) if(dlg->exec() == QMessageBox::Save) save(); } - - ui->signature->warningIcon(false); - - ui->signContainerPage->clear(); - delete digiDoc; - ui->warnings->closeWarnings(SignDetails); - ui->warnings->closeWarning(EmptyFileWarning); - digiDoc = doc; + digiDoc = std::move(doc); } -bool MainWindow::save(bool saveAs) +bool MainWindow::save() { if(!digiDoc) return false; QString target = digiDoc->fileName(); - if(saveAs) - target = FileDialog::getSaveFileName(this, tr("Save file"), target); - if(target.isEmpty()) - return false; - - if(!FileDialog::fileIsWritable(target)) + while(!FileDialog::fileIsWritable(target)) { auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this); dlg->addButton(WarningDialog::YES, QMessageBox::Yes); - if(dlg->exec() == QMessageBox::Yes) { - if(QString file = FileDialog::getSaveFileName(this, tr("Save file"), target); !file.isEmpty()) - return saveAs ? digiDoc->saveAs(file) : digiDoc->save(file); - } + if(dlg->exec() != QMessageBox::Yes) + return false; + if(target = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), target); target.isEmpty()) + return false; } - return saveAs ? digiDoc->saveAs(target) : digiDoc->save(target); + bool result = digiDoc->save(target); + if(result) + ui->signContainerPage->setHeader(target); + return result; } void MainWindow::selectPage(Pages page) @@ -705,7 +651,7 @@ void MainWindow::sign(F &&sign) if(!sign(city, state, zip, country, role)) { - resetDigiDoc(nullptr, false); + digiDoc.reset(); navigateToPage(SignDetails, {std::move(wrappedFile)}, false); return; } @@ -716,7 +662,7 @@ void MainWindow::sign(F &&sign) if(!save()) return; - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); FadeInNotification::success(ui->topBar, tr("The container has been successfully signed!")); adjustDrops(); @@ -761,7 +707,7 @@ bool MainWindow::removeFile(DocumentModel *model, int index) continue; ui->warnings->closeWarning(EmptyFileWarning); if(digiDoc) - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); break; } @@ -775,7 +721,7 @@ void MainWindow::removeSignature(int index) WaitDialogHolder waitDialog(this, tr("Removing signature")); digiDoc->removeSignature(unsigned(index)); save(); - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); adjustDrops(); } @@ -788,7 +734,7 @@ void MainWindow::removeSignatureFile(int index) { if(QFile::exists(digiDoc->fileName())) QFile::remove(digiDoc->fileName()); - resetDigiDoc(nullptr, false); + digiDoc.reset(); selectPage(Pages::SignIntro); } } @@ -807,7 +753,7 @@ bool MainWindow::validateFiles(const QString &container, const QStringList &file return false; } -bool MainWindow::wrap(const QString& wrappedFile, bool enclose) +bool MainWindow::wrap(const QString& wrappedFile, bool pdf) { QString filename = FileDialog::createNewFileName(wrappedFile, true, this); if(filename.isNull()) @@ -816,16 +762,16 @@ bool MainWindow::wrap(const QString& wrappedFile, bool enclose) std::unique_ptr signatureContainer(new DigiDoc(this)); signatureContainer->create(filename); - // If encrypted container or pdf, add whole file to signature container; otherwise content only - if(enclose) + // If pdf, add whole file to signature container; otherwise content only + if(pdf) signatureContainer->documentModel()->addFile(wrappedFile); else signatureContainer->documentModel()->addTempFiles(cryptoDoc->documentModel()->tempFiles()); cryptoDoc.reset(); - resetDigiDoc(signatureContainer.release()); + resetDigiDoc(std::move(signatureContainer)); - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); selectPage(SignDetails); return true; diff --git a/client/MainWindow.h b/client/MainWindow.h index 4dd9e0d92..1ff103ea4 100644 --- a/client/MainWindow.h +++ b/client/MainWindow.h @@ -60,37 +60,34 @@ class MainWindow final : public QWidget private: void adjustDrops(); void changePinClicked(QSmartCardData::PinType type, QSmartCard::PinAction action); - void convertToBDoc(); void convertToCDoc(); ria::qdigidoc4::ContainerState currentState(); bool decrypt(); bool encrypt(); void loadPicture(); - void moveCryptoContainer(); - void moveSignatureContainer(); void navigateToPage( ria::qdigidoc4::Pages page, const QStringList &files = QStringList(), bool create = true ); void onCryptoAction(int action, const QString &id, const QString &phone); void onSignAction(int action, const QString &idCode, const QString &info2); void openContainer(bool signature); void pageSelected(int page, bool checked = true); - void resetDigiDoc(DigiDoc *doc = nullptr, bool warnOnChange = true); + void resetDigiDoc(std::unique_ptr &&doc); void removeCryptoFile(int index); bool removeFile(DocumentModel *model, int index); void removeSignature(int index); void removeSignatureFile(int index); - bool save(bool saveAs = false); + bool save(); template void sign(F &&sign); bool validateFiles(const QString &container, const QStringList &files); void updateSelector(); void updateMyEID(const TokenData &t); void updateMyEid(const QSmartCardData &data); - bool wrap(const QString& wrappedFile, bool enclose); + bool wrap(const QString& wrappedFile, bool pdf); bool wrapContainer(bool signing); static QStringList dropEventFiles(QDropEvent *event); std::unique_ptr cryptoDoc; - DigiDoc* digiDoc = nullptr; + std::unique_ptr digiDoc; Ui::MainWindow *ui; }; diff --git a/client/common_enums.h b/client/common_enums.h index 6d7721126..0d02eee69 100644 --- a/client/common_enums.h +++ b/client/common_enums.h @@ -39,9 +39,7 @@ enum Actions : unsigned char { ContainerCancel, ContainerConvert, ContainerEncrypt, - ContainerLocation, ContainerSave, - ContainerSaveAs, EncryptContainer, DecryptContainer, diff --git a/client/translations/en.ts b/client/translations/en.ts index e14d18cdf..253e1faa5 100644 --- a/client/translations/en.ts +++ b/client/translations/en.ts @@ -836,6 +836,14 @@ Documents (%1) Documents (%1) + + Save file + Save file + + + Move file + Move file + FileItem @@ -852,10 +860,6 @@ FileList - - Save file - Save file - Add files Add files @@ -1337,10 +1341,6 @@ ID-Card Cannot alter container %1. Save different location? Cannot alter container %1. Save to different location? - - Save file - Save file - The container has been successfully signed! The container has been successfully signed! @@ -1365,10 +1365,6 @@ ID-Card Converted to crypto container! Converted to crypto container! - - Move file - Move file - You are about to delete the last file in the container, it is removed along with the container. You are about to delete the last file in the container, it is removed along with the container. diff --git a/client/translations/et.ts b/client/translations/et.ts index 149425e29..88fa85d1a 100644 --- a/client/translations/et.ts +++ b/client/translations/et.ts @@ -836,6 +836,14 @@ Documents (%1) Dokumendid (%1) + + Save file + Salvesta fail + + + Move file + Liiguta fail + FileItem @@ -852,10 +860,6 @@ FileList - - Save file - Salvesta fail - Add files Lisa faile @@ -1337,10 +1341,6 @@ ID-kaardiga Cannot alter container %1. Save different location? Ümbriku %1 salvestamine ebaõnnestus. Salvestada teise asukohta? - - Save file - Salvesta fail - The container has been successfully signed! Ümbrik on edukalt allkirjastatud! @@ -1365,10 +1365,6 @@ ID-kaardiga Converted to crypto container! Konverteeritud turvaümbrikuks! - - Move file - Liiguta fail - You are about to delete the last file in the container, it is removed along with the container. Oled kustutamas viimast faili ümbrikus, koos sellega eemaldatakse ka ümbrik. diff --git a/client/translations/ru.ts b/client/translations/ru.ts index c57243163..bd3487d43 100644 --- a/client/translations/ru.ts +++ b/client/translations/ru.ts @@ -836,6 +836,14 @@ Documents (%1) Документы (%1) + + Save file + Сохранить файл + + + Move file + Переместить файл + FileItem @@ -852,10 +860,6 @@ FileList - - Save file - Сохранить файл - Add files Добавить файлы @@ -1337,10 +1341,6 @@ ID-картой Cannot alter container %1. Save different location? Сохранение контейнера %1 не удалось. Сохранить в другой каталог? - - Save file - Сохранить файл - The container has been successfully signed! Контейнер успешно подписан! @@ -1365,10 +1365,6 @@ ID-картой Converted to crypto container! Переделан в контейнер для зашифровывания! - - Move file - Переместить файл - You are about to delete the last file in the container, it is removed along with the container. Вы собираетесь удалить последний файл в контейнере, он удаляется вместе с контейнером. diff --git a/client/widgets/ContainerPage.cpp b/client/widgets/ContainerPage.cpp index 00f85af67..bb1e37cd5 100644 --- a/client/widgets/ContainerPage.cpp +++ b/client/widgets/ContainerPage.cpp @@ -60,15 +60,12 @@ ContainerPage::ContainerPage(QWidget *parent) connect(btn, &QAbstractButton::clicked, this, [this,code] { emit action(code); }); }; - connect(this, &ContainerPage::moved,this, &ContainerPage::setHeader); - connectCode(ui->changeLocation, Actions::ContainerLocation); connect(ui->cancel, &QPushButton::clicked, this, [this] { window()->setWindowFilePath({}); window()->setWindowTitle(tr("DigiDoc4 Client")); emit action(Actions::ContainerCancel); }); connectCode(ui->convert, Actions::ContainerConvert); - connectCode(ui->saveAs, Actions::ContainerSaveAs); connectCode(ui->save, Actions::ContainerSave); connect(ui->leftPane, &FileList::addFiles, this, &ContainerPage::addFiles); connect(ui->leftPane, &ItemList::removed, this, &ContainerPage::fileRemoved); @@ -110,11 +107,11 @@ void ContainerPage::cardChanged(const SslCertificate &cert, bool isBlocked) emit certChanged(cert); } -void ContainerPage::clear() +void ContainerPage::clear(int code) { ui->leftPane->clear(); ui->rightPane->clear(); - isSupported = false; + emit action(code); } void ContainerPage::clearPopups() @@ -271,14 +268,23 @@ void ContainerPage::transition(CryptoDoc *container, const QSslCertificate &cert if(container->state() & EncryptedContainer) updateDecryptionButton(); }); - disconnect(container, &CryptoDoc::destroyed, this, &ContainerPage::clear); + disconnect(ui->changeLocation, &QPushButton::clicked, container, nullptr); + connect(ui->changeLocation, &QPushButton::clicked, container, [container, this] { + QString to = FileDialog::getSaveFileName(this, FileDialog::tr("Move file"), container->fileName()); + if(!to.isNull() && container->move(to)) + setHeader(to); + }); + disconnect(ui->saveAs, &QPushButton::clicked, container, nullptr); + connect(ui->saveAs, &QPushButton::clicked, container, [container, this] { + if(QString target = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), container->fileName()); !target.isEmpty()) + container->saveCopy(target); + }); + disconnect(container, &CryptoDoc::destroyed, this, nullptr); connect(container, &CryptoDoc::destroyed, this, [this] { - clear(); - emit action(ClearCryptoWarning); + clear(ClearCryptoWarning); }); - clear(); - emit action(ClearCryptoWarning); + clear(ClearCryptoWarning); isSupported = container->state() & UnencryptedContainer || container->canDecrypt(cert); setHeader(container->fileName()); ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Encrypted files")); @@ -321,9 +327,23 @@ void ContainerPage::transition(DigiDoc* container) dialog->exec(); dialog->deleteLater(); }); + disconnect(ui->changeLocation, &QPushButton::clicked, container, nullptr); + connect(ui->changeLocation, &QPushButton::clicked, container, [container, this] { + QString to = FileDialog::getSaveFileName(this, FileDialog::tr("Move file"), container->fileName()); + if(!to.isNull() && container->move(to)) + setHeader(to); + }); + disconnect(ui->saveAs, &QPushButton::clicked, container, nullptr); + connect(ui->saveAs, &QPushButton::clicked, container, [container, this] { + if(QString target = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), container->fileName()); !target.isEmpty()) + container->saveAs(target); + }); + disconnect(container, &DigiDoc::destroyed, this, nullptr); + connect(container, &DigiDoc::destroyed, this, [this] { + clear(ClearSignatureWarning); + }); - clear(); - emit action(ClearSignatureWarning); + clear(ClearSignatureWarning); std::map errors; setHeader(container->fileName()); ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Container files")); @@ -419,17 +439,15 @@ void ContainerPage::updatePanes(ContainerState state) case UnencryptedContainer: cancelText = QT_TR_NOOP("Start"); convertText = QT_TR_NOOP("Sign"); - - ui->changeLocation->show(); showMainAction({ EncryptContainer }); + setButtonsVisible({ ui->changeLocation, ui->convert }, true); setButtonsVisible({ ui->saveAs, ui->email }, false); break; case EncryptedContainer: cancelText = QT_TR_NOOP("Start"); convertText = QT_TR_NOOP("Sign"); - - ui->changeLocation->hide(); updateDecryptionButton(); + setButtonsVisible({ ui->changeLocation, ui->convert }, false); setButtonsVisible({ ui->saveAs, ui->email }, true); break; default: diff --git a/client/widgets/ContainerPage.h b/client/widgets/ContainerPage.h index 52b56a635..b88be81ea 100644 --- a/client/widgets/ContainerPage.h +++ b/client/widgets/ContainerPage.h @@ -45,26 +45,25 @@ class ContainerPage final : public QWidget ~ContainerPage() final; void cardChanged(const SslCertificate &cert, bool isBlocked = false); - void clear(); void clearPopups(); + void setHeader(const QString &file); void togglePrinting(bool enable); void transition(CryptoDoc *container, const QSslCertificate &cert); void transition(DigiDoc* container); -signals: +Q_SIGNALS: void action(int code, const QString &idCode = {}, const QString &info2 = {}); void addFiles(const QStringList &files); void certChanged(const SslCertificate &cert); void fileRemoved(int row); - void moved(const QString &to); void removed(int row); void warning(const WarningText &warningText); private: void changeEvent(QEvent* event) final; + void clear(int code); void elideFileName(); bool eventFilter(QObject *o, QEvent *e) final; - void setHeader(const QString &file); void showMainAction(const QList &actions); void showSigningButton(); void handleAction(int type); diff --git a/client/widgets/FileList.cpp b/client/widgets/FileList.cpp index 0600f87d2..b6c8d5eea 100644 --- a/client/widgets/FileList.cpp +++ b/client/widgets/FileList.cpp @@ -128,7 +128,7 @@ void FileList::save(FileItem *item) { QString extension = QFileInfo(item->getFile()).suffix(); QString capitalized = extension[0].toUpper() + extension.mid(1); - QString dest = FileDialog::getSaveFileName(this, tr("Save file"), + QString dest = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), QFileInfo(container).dir().absolutePath() + QDir::separator() + FileDialog::safeName(item->getFile()), QStringLiteral("%1 (*%2)").arg(capitalized, extension)); @@ -174,7 +174,7 @@ void FileList::saveAll() continue; if(b == QMessageBox::Save) { - dest = FileDialog::getSaveFileName( this, tr("Save file"), dest ); + dest = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), dest); if( dest.isEmpty() ) continue; }