diff --git a/client/dialogs/AddRecipients.cpp b/client/dialogs/AddRecipients.cpp index a81ecbfd5..d49c5b38b 100644 --- a/client/dialogs/AddRecipients.cpp +++ b/client/dialogs/AddRecipients.cpp @@ -35,14 +35,25 @@ #include #include +#include #include #include #include +#include +#include +#include #include +#include + +struct AddRecipients::Private: public Ui::AddRecipients +{ + QLineEdit *txtFind; + QPushButton *btnFind; +}; AddRecipients::AddRecipients(ItemList* itemList, QWidget *parent) : QDialog(parent) - , ui(new Ui::AddRecipients) + , ui(new Private) { #ifndef Q_OS_WIN if(const auto list = Application::confValue(QLatin1String("LDAP-CERTS")).toArray(); @@ -62,6 +73,43 @@ AddRecipients::AddRecipients(ItemList* itemList, QWidget *parent) } ui->setupUi(this); + + auto *findGroup = new QWidget(ui->leftPane); + auto *findLayout = new QGridLayout(findGroup); + findLayout->setContentsMargins(0, 8, 0, 16); + findLayout->setHorizontalSpacing(24); + findLayout->setVerticalSpacing(6); + auto *lblFind = new QLabel(tr("Enter the personal code, institution or registry code"), findGroup); + ui->txtFind = new QLineEdit(findGroup); + ui->txtFind->setAttribute(Qt::WA_MacShowFocusRect, false); + ui->txtFind->setStyleSheet(QStringLiteral("QLineEdit {" + "padding: 10px 14px;" + "border: 1px solid #C4CBD8;" + "border-radius: 4px;" + "background-color: white;" + "placeholder-text-color: #607496;" + "font-size: 16px;}" + )); + ui->btnFind = new QPushButton(tr("Search"), findGroup); + ui->btnFind->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + ui->btnFind->setCursor(Qt::PointingHandCursor); + ui->btnFind->setAutoDefault(false); + ui->btnFind->setStyleSheet(QStringLiteral("QPushButton {" + "padding: 12px 12px;" + "border-radius: 4px;" + "color: #ffffff;" + "font-weight: 700;" + "background-color: #2F70B6;}" + "QPushButton:hover, QPushButton:focus {background-color: #2B66A6;}" + "QPushButton:pressed {background-color: #215081;}" + "QPushButton:disabled {background-color: #82A9D3;}" + )); + lblFind->setBuddy(ui->txtFind); + findLayout->addWidget(lblFind, 0, 0, 1, 2); + findLayout->addWidget(ui->txtFind, 1, 0); + findLayout->addWidget(ui->btnFind, 1, 1); + ui->leftPane->addTopWidget(findGroup, ui->txtFind, ui->btnFind); + setTabOrder(ui->txtFind, ui->btnFind); #ifdef Q_OS_WIN ui->actionLayout->setDirection(QBoxLayout::RightToLeft); #endif @@ -73,11 +121,17 @@ AddRecipients::AddRecipients(ItemList* itemList, QWidget *parent) connect(ui->confirm, &QPushButton::clicked, this, &AddRecipients::accept); connect(ui->cancel, &QPushButton::clicked, this, &AddRecipients::reject); - connect(ui->leftPane, &ItemList::search, this, [&](const QString &term) { + ui->btnFind->setDisabled(true); + ui->txtFind->installEventFilter(this); + ui->btnFind->installEventFilter(this); + connect(ui->btnFind, &QPushButton::clicked, this, [this] { ui->leftPane->clear(); - search(term); + search(ui->txtFind->text()); }); - for(auto ldap: ldap_person) { + connect(ui->txtFind, &QLineEdit::textChanged, this, [this](const QString &text) { + ui->btnFind->setDisabled(text.trimmed().isEmpty()); + }); + for(auto *ldap: ldap_person) { connect(ldap, &LdapSearch::searchResult, this, &AddRecipients::showResult); connect(ldap, &LdapSearch::error, this, &AddRecipients::showError); } @@ -113,6 +167,18 @@ AddRecipients::~AddRecipients() delete ui; } +bool AddRecipients::eventFilter(QObject *o, QEvent *e) +{ + if ((o == ui->txtFind || o == ui->btnFind) && e->type() == QEvent::KeyPress) { + const auto *key = static_cast(e); + if (key->key() == Qt::Key_Return || key->key() == Qt::Key_Enter) { + ui->btnFind->click(); + return true; + } + } + return QDialog::eventFilter(o, e); +} + void AddRecipients::addRecipientFromFile() { QString file = FileDialog::getOpenFileName(this, windowTitle(), {}, @@ -235,6 +301,7 @@ void AddRecipients::addRecipientToRightPane(Item *item, bool update) }); ui->rightPane->addWidget(rightItem); ui->confirm->setEnabled(true); + ui->confirm->setDefault(true); historyCertData.addAndSave(key.rcpt_cert); if(auto *leftItem = itemListValue(ui->leftPane, key)) leftItem->setDisabled(true); diff --git a/client/dialogs/AddRecipients.h b/client/dialogs/AddRecipients.h index 3c0b6b339..b94382494 100644 --- a/client/dialogs/AddRecipients.h +++ b/client/dialogs/AddRecipients.h @@ -46,17 +46,19 @@ class AddRecipients final : public QDialog bool isUpdated() const; private: + bool eventFilter(QObject *o, QEvent *e) override; void addRecipientFromFile(); void addRecipientFromHistory(); void addRecipient(const QSslCertificate& cert, bool select = true); void addRecipientToRightPane(Item *item, bool update = true); - AddressItem* itemListValue(ItemList *list, const CKey &key); + static AddressItem* itemListValue(ItemList *list, const CKey &key); void search(const QString &term, bool select = false, const QString &type = {}); void showError(const QString &title, const QString &details); void showResult(const QList &result, int resultCount, const QVariantMap &userData); - Ui::AddRecipients *ui; + struct Private; + Private *ui; QList rightList; QList ldap_person; LdapSearch *ldap_corp; diff --git a/client/dialogs/AddRecipients.ui b/client/dialogs/AddRecipients.ui index 92c521200..d36c33a56 100644 --- a/client/dialogs/AddRecipients.ui +++ b/client/dialogs/AddRecipients.ui @@ -90,20 +90,21 @@ background-color: #BFD3E8; QPushButton:disabled { color: #82A9D3; } -QPushButton:default { +#confirm { color: #ffffff; border-color: #2F70B6; background-color: #2F70B6; } -QPushButton:default:hover, QPushButton:default:focus { +#confirm:hover, #confirm:focus { border-color: #2B66A6; background-color: #2B66A6; } -QPushButton:default:pressed { +#confirm:pressed { border-color: #215081; background-color: #215081; } -QPushButton:default:disabled { +#confirm:disabled { +color: #ffffff; border-color: #82A9D3; background-color: #82A9D3; } diff --git a/client/translations/en.ts b/client/translations/en.ts index e0ee8edf5..c2ccd8025 100644 --- a/client/translations/en.ts +++ b/client/translations/en.ts @@ -42,6 +42,14 @@ Certificates (*.cer *.crt *.pem) Certificates (*.cer *.crt *.pem) + + Enter the personal code, institution or registry code + Enter the personal code, institution or registry code + + + Search + Search + Are you sure that you want use certificate for encrypting, which expired on %1?<br />When decrypter has updated certificates then decrypting is impossible. Are you sure that you want use certificate for encrypting, which expired on %1?<br /><br />When decrypter has updated certificates then decrypting is impossible. @@ -1177,10 +1185,6 @@ ItemList - - Enter the personal code, institution or registry code - Enter the personal code, institution or registry code - Container is not signed Container's signatures are missing @@ -1218,10 +1222,6 @@ Added recipients Added recipients - - Search - Search - Download all files Download all files diff --git a/client/translations/et.ts b/client/translations/et.ts index b8052a14a..98249b9a0 100644 --- a/client/translations/et.ts +++ b/client/translations/et.ts @@ -42,6 +42,14 @@ Certificates (*.cer *.crt *.pem) Sertifikaadid (*.cer *.crt *.pem) + + Enter the personal code, institution or registry code + Sisesta isikukood, asutus või registrikood + + + Search + Otsi + Are you sure that you want use certificate for encrypting, which expired on %1?<br />When decrypter has updated certificates then decrypting is impossible. Kas oled kindel, et soovid kasutada krüpteerimiseks sertifikaati, mis aegus %1?<br /><br />Juhul, kui dekrüpteerija on oma sertifikaate uuendanud, ei ole dekrüpteerimine võimalik. @@ -1177,10 +1185,6 @@ ItemList - - Enter the personal code, institution or registry code - Sisesta isikukood, asutus või registrikood - Container is not signed Ümbrikul puuduvad allkirjad @@ -1218,10 +1222,6 @@ Added recipients Lisatud adressaadid - - Search - Otsi - Download all files Laadi kõik failid alla diff --git a/client/widgets/ItemList.cpp b/client/widgets/ItemList.cpp index 395bc5be4..42f7b305a 100644 --- a/client/widgets/ItemList.cpp +++ b/client/widgets/ItemList.cpp @@ -22,25 +22,19 @@ #include "Item.h" -#include - using namespace ria::qdigidoc4; - ItemList::ItemList(QWidget *parent) : QScrollArea(parent) , ui(new Ui::ItemList) { ui->setupUi(this); - ui->findGroup->hide(); ui->download->hide(); 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); } ItemList::~ItemList() @@ -59,6 +53,13 @@ void ItemList::addHeader(const char *label) setTabOrder(header, ui->header); } +void ItemList::addTopWidget(QWidget *widget, QWidget *firstTab, QWidget *lastTab) +{ + topWidget = lastTab ? lastTab : widget; + ui->itemLayout->insertWidget(1, widget); + setTabOrder(ui->listHeader, firstTab ? firstTab : widget); +} + void ItemList::addHeaderWidget(Item *widget) { addWidget(widget, ui->itemLayout->indexOf(ui->header), header); @@ -72,7 +73,7 @@ void ItemList::addWidget(Item *widget, int index, QWidget *tabIndex) if(Item *prev = qobject_cast(ui->itemLayout->itemAt(index - 1)->widget())) tabIndex = prev->lastTabWidget(); else - tabIndex = ui->btnFind; + tabIndex = topWidget ? topWidget : ui->listHeader; } ui->itemLayout->insertWidget(index, widget); connect(widget, &Item::remove, this, &ItemList::remove); @@ -118,21 +119,6 @@ void ItemList::clear() (*it)->deleteLater(); } -bool ItemList::eventFilter(QObject *o, QEvent *e) -{ - if (o == ui->txtFind && e->type() == QEvent::KeyPress) - { - QKeyEvent *keyEvent = static_cast(e); - // To avoid dialog default button trigger - if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) - { - ui->btnFind->click(); - return true; - } - } - return QScrollArea::eventFilter(o, e); -} - int ItemList::index(Item *item) const { return items.indexOf(item); @@ -148,19 +134,6 @@ void ItemList::init(ListType item, const char *header) break; case ToAddAdresses: addTitle = QT_TR_NOOP("Add all"); - ui->findGroup->show(); - 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){ - const auto isEmpty = text.trimmed().isEmpty(); - ui->btnFind->setDisabled(isEmpty); - ui->btnFind->setDefault(isEmpty); - ui->btnFind->setAutoDefault(isEmpty); - }); break; case ItemAddress: addTitle = QT_TR_NOOP("+ Add recipient"); diff --git a/client/widgets/ItemList.h b/client/widgets/ItemList.h index 51bc701a5..fa595c492 100644 --- a/client/widgets/ItemList.h +++ b/client/widgets/ItemList.h @@ -51,6 +51,7 @@ class ItemList : public QScrollArea void init(ListType itemType, const char *header); void addHeader(const char *label); void addHeaderWidget(Item *widget); + void addTopWidget(QWidget *widget, QWidget *firstTab = {}, QWidget *lastTab = {}); void addWidget(Item *widget); virtual void clear(); virtual void removeItem(int row); @@ -62,11 +63,9 @@ class ItemList : public QScrollArea void idChanged(const SslCertificate &cert); void keysSelected(QList keys); void removed(int row); - void search(const QString &term); protected: void changeEvent(QEvent* event) override; - bool eventFilter(QObject *o, QEvent *e) override; int index(Item *item) const; virtual void remove(Item *item); @@ -79,6 +78,7 @@ class ItemList : public QScrollArea QList items; QLabel *header = nullptr; + QWidget *topWidget = nullptr; const char *title = ""; const char *addTitle = ""; const char *headerText = ""; diff --git a/client/widgets/ItemList.ui b/client/widgets/ItemList.ui index b815b2252..1e10cf4ee 100644 --- a/client/widgets/ItemList.ui +++ b/client/widgets/ItemList.ui @@ -16,14 +16,6 @@ color: #07142A; font-family: Roboto, Helvetica; font-size: 14px; } -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; @@ -149,7 +141,7 @@ icon: url(:/images/icon_download_clicked.svg); Qt::TabFocus - + Add recipient + Add recipients @@ -243,77 +235,6 @@ padding: 5px; - - - - - 0 - - - 8 - - - 0 - - - 16 - - - 24 - - - 6 - - - - - Enter the personal code, institution or registry code - - - txtFind - - - - - - - - - - - 0 - 0 - - - - PointingHandCursor - - - QPushButton { -padding: 12px 12px; -border-radius: 4px; -color: #ffffff; -font-weight: 700; -background-color: #2F70B6; -} -QPushButton:hover, QPushButton:focus { -background-color: #2B66A6; -} -QPushButton:pressed { -background-color: #215081; -} -QPushButton:disabled { -background-color: #82A9D3; -} - - - Search - - - - - -