diff --git a/client/dialogs/AddRecipients.cpp b/client/dialogs/AddRecipients.cpp index 1fb42a270..cbc505655 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) , ldap_corp(new LdapSearch(Application::confValue(QLatin1String("LDAP-CORP-URL")).toString(QStringLiteral("ldaps://k3.ldap.sk.ee")), this)) { for(const auto list = Application::confValue(QLatin1String("LDAP-PERSON-URLS")).toArray(); auto url: list) { @@ -54,7 +65,43 @@ AddRecipients::AddRecipients(ItemList* itemList, QWidget *parent) } ui->setupUi(this); -#if defined (Q_OS_WIN) + + 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->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 setWindowFlags( Qt::Dialog | Qt::CustomizeWindowHint ); @@ -65,11 +112,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()); + }); + connect(ui->txtFind, &QLineEdit::textChanged, this, [this](const QString &text) { + ui->btnFind->setDisabled(text.trimmed().isEmpty()); }); - for(auto ldap: ldap_person) { + for(auto *ldap: ldap_person) { connect(ldap, &LdapSearch::searchResult, this, &AddRecipients::showResult); connect(ldap, &LdapSearch::error, this, &AddRecipients::showError); } @@ -105,6 +158,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(), {}, diff --git a/client/dialogs/AddRecipients.h b/client/dialogs/AddRecipients.h index e18de0fee..55f29f9c5 100644 --- a/client/dialogs/AddRecipients.h +++ b/client/dialogs/AddRecipients.h @@ -45,17 +45,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/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 - - - - - -