2828#include " QPCSC.h"
2929#include " QSigner.h"
3030#include " SslCertificate.h"
31- #include " Styles.h"
3231#include " TokenData.h"
33- #include " effects/ButtonHoverFilter.h"
3432#include " effects/FadeInNotification.h"
3533#include " effects/Overlay.h"
3634#include " dialogs/FileDialog.h"
4038#include " dialogs/SmartIDProgress.h"
4139#include " dialogs/WaitDialog.h"
4240#include " dialogs/WarningDialog.h"
43- #include " widgets/DropdownButton.h"
4441#include " widgets/CardPopup.h"
4542#include " widgets/WarningItem.h"
4643#include " widgets/WarningList.h"
4946#include < QtCore/QStandardPaths>
5047#include < QtCore/QUrlQuery>
5148#include < QtGui/QDesktopServices>
49+ #include < QtGui/QDragEnterEvent>
5250#include < QtNetwork/QSslKey>
5351#include < QtPrintSupport/QPrinterInfo>
5452#include < QtPrintSupport/QPrintPreviewDialog>
@@ -65,19 +63,8 @@ MainWindow::MainWindow( QWidget *parent )
6563 setAcceptDrops ( true );
6664 ui->setupUi (this );
6765
68- QFont condensed11 = Styles::font ( Styles::Condensed, 11 );
69- QFont condensed14 = Styles::font ( Styles::Condensed, 14 );
70- QFont regular20 = Styles::font ( Styles::Regular, 20 );
71- ui->signIntroLabel ->setFont ( regular20 );
72- ui->signIntroButton ->setFont ( condensed14 );
7366 ui->signIntroButton ->setFocus ();
74- ui->cryptoIntroLabel ->setFont ( regular20 );
75- ui->cryptoIntroButton ->setFont ( condensed14 );
76- ui->noCardInfo ->setFont (condensed14);
77- ui->noReaderInfoText ->setFont (regular20);
7867 ui->noReaderInfoText ->setProperty (" currenttext" , ui->noReaderInfoText ->text ());
79- ui->help ->setFont ( condensed11 );
80- ui->settings ->setFont ( condensed11 );
8168
8269 connect (ui->warnings , &WarningList::warningClicked, this , &MainWindow::warningClicked);
8370
@@ -89,10 +76,7 @@ MainWindow::MainWindow( QWidget *parent )
8976 ui->pageButtonGroup ->setId (ui->crypto , Pages::CryptoIntro);
9077 ui->pageButtonGroup ->setId (ui->myEid , Pages::MyEid);
9178
92- connect (ui->pageButtonGroup , QOverload<QAbstractButton *, bool >::of (&QButtonGroup::buttonToggled), this , &MainWindow::clearPopups);
9379 connect (ui->pageButtonGroup , &QButtonGroup::idToggled, this , &MainWindow::pageSelected);
94- ui->help ->installEventFilter (new ButtonHoverFilter (QStringLiteral (" :/images/icon_Abi.svg" ), QStringLiteral (" :/images/icon_Abi_hover.svg" ), this ));
95- ui->settings ->installEventFilter (new ButtonHoverFilter (QStringLiteral (" :/images/icon_Seaded.svg" ), QStringLiteral (" :/images/icon_Seaded_hover.svg" ), this ));
9680 connect (ui->help , &QToolButton::clicked, qApp, &Application::openHelp);
9781 connect (ui->settings , &QToolButton::clicked, this , [this ] { showSettings (SettingsDialog::GeneralSettings); });
9882
@@ -124,11 +108,6 @@ MainWindow::MainWindow( QWidget *parent )
124108
125109 // Refresh card info on "My EID" page
126110 connect (qApp->signer ()->smartcard (), &QSmartCard::dataChanged, this , &MainWindow::updateMyEid);
127- // Show card pop-up menu
128- connect (ui->selector ->selector , &DropdownButton::dropdown, this , &MainWindow::showCardMenu);
129-
130- connect (this , &MainWindow::clearPopups, ui->signContainerPage , &ContainerPage::clearPopups);
131- connect (this , &MainWindow::clearPopups, this , [this ] { showCardMenu (false ); });
132111
133112 connect (ui->signIntroButton , &QPushButton::clicked, this , [this ] { openContainer (true ); });
134113 connect (ui->cryptoIntroButton , &QPushButton::clicked, this , [this ] { openContainer (false ); });
@@ -152,7 +131,7 @@ MainWindow::MainWindow( QWidget *parent )
152131 connect (ui->accordion , &Accordion::changePin1Clicked, this , &MainWindow::changePin1Clicked);
153132 connect (ui->accordion , &Accordion::changePin2Clicked, this , &MainWindow::changePin2Clicked);
154133 connect (ui->accordion , &Accordion::changePukClicked, this , &MainWindow::changePukClicked);
155- connect (ui->cardInfo , &CardWidget::selected, ui->selector -> selector , &DropdownButton::press );
134+ connect (ui->cardInfo , &CardWidget::selected, ui->selector , &QToolButton::toggle );
156135
157136 updateSelectorData (qApp->signer ()->tokensign ());
158137 updateMyEID (qApp->signer ()->tokensign ());
@@ -199,7 +178,7 @@ void MainWindow::changeEvent(QEvent* event)
199178 ui->noReaderInfoText ->setText (tr (ui->noReaderInfoText ->property (" currenttext" ).toByteArray ()));
200179 ui->version ->setText (QStringLiteral (" %1%2" ).arg (tr (" Ver. " ), Application::applicationVersion ()));
201180 setWindowTitle (windowFilePath ().isEmpty () ? tr (" DigiDoc4 Client" ) : FileDialog::normalized (QFileInfo (windowFilePath ()).fileName ()));
202- showCardMenu (false );
181+ ui-> selector -> setChecked (false );
203182 }
204183 QWidget::changeEvent (event);
205184}
@@ -306,15 +285,10 @@ bool MainWindow::encrypt()
306285
307286void MainWindow::mouseReleaseEvent (QMouseEvent *event)
308287{
309- emit clearPopups ();
310- if (ui->logo ->underMouse ())
311- {
312- resetCryptoDoc ();
313- resetDigiDoc ();
314- selectPage (Pages::SignIntro);
315- }
316- else
317- QWidget::mouseReleaseEvent (event);
288+ if (auto *cardPopup = findChild<CardPopup*>())
289+ cardPopup->deleteLater ();
290+ ui->signContainerPage ->clearPopups ();
291+ QWidget::mouseReleaseEvent (event);
318292}
319293
320294void MainWindow::navigateToPage ( Pages page, const QStringList &files, bool create )
@@ -778,23 +752,6 @@ void MainWindow::selectPage(Pages page)
778752 updateSelector ();
779753}
780754
781- void MainWindow::showCardMenu (bool show)
782- {
783- if (show)
784- {
785- if (ui->selector ->list .isEmpty ())
786- return ;
787- auto *cardPopup = new CardPopup (ui->selector ->list , this );
788- connect (cardPopup, &CardPopup::activated, qApp->signer (), &QSigner::selectCard, Qt::QueuedConnection);
789- connect (cardPopup, &CardPopup::activated, this , [this ] { showCardMenu (false ); }); // .. and hide card popup menu
790- cardPopup->show ();
791- }
792- else if (auto *cardPopup = findChild<CardPopup*>()) {
793- ui->selector ->selector ->init ();
794- cardPopup->deleteLater ();
795- }
796- }
797-
798755void MainWindow::showEvent (QShowEvent * /* event*/ )
799756{
800757 static bool isShown = false ;
@@ -1015,38 +972,72 @@ void MainWindow::updateSelector()
1015972
1016973void MainWindow::updateSelectorData (TokenData data)
1017974{
975+ enum Filter: uint8_t {
976+ Signing,
977+ Decrypting,
978+ MyEID,
979+ } filter = Signing;
1018980 switch (ui->startScreen ->currentIndex ())
1019981 {
1020982 case SignIntro:
1021983 case SignDetails:
1022984 if (data.isNull ()) data = qApp->signer ()->tokensign ();
1023- ui->cardInfo ->update (data, ui->selector ->list .size () > 1 );
1024- ui->selector ->setList (data.card (), IDSelector::Signing);
985+ filter = Signing;
1025986 break ;
1026987 case CryptoIntro:
1027988 case CryptoDetails:
1028989 if (data.isNull ()) data = qApp->signer ()->tokenauth ();
1029- ui->cardInfo ->update (data, ui->selector ->list .size () > 1 );
1030- ui->selector ->setList (data.card (), IDSelector::Decrypting);
990+ filter = Decrypting;
1031991 break ;
1032992 case MyEid:
993+ default :
1033994 if (data.isNull ()) data = qApp->signer ()->smartcard ()->tokenData ();
1034- ui->cardInfo ->update (data, ui->selector ->list .size () > 1 );
1035- ui->selector ->setList (data.card (), IDSelector::MyEID);
995+ filter = MyEID;
1036996 break ;
1037- default : break ;
1038997 }
1039- ui->idSelector ->setHidden (ui->cardInfo ->token ().isNull ());
1040- ui->noCardInfo ->setVisible (ui->idSelector ->isHidden ());
998+ QVector<TokenData> list;
999+ for (const TokenData &token: qApp->signer ()->cache ())
1000+ {
1001+ if (token.card () == data.card ())
1002+ continue ;
1003+ if (std::any_of (list.cbegin (), list.cend (), [token](const TokenData &item) { return token.card () == item.card (); }))
1004+ continue ;
1005+ SslCertificate cert (token.cert ());
1006+ if (filter == Signing && !cert.keyUsage ().contains (SslCertificate::NonRepudiation))
1007+ continue ;
1008+ if (filter == Decrypting && cert.keyUsage ().contains (SslCertificate::NonRepudiation))
1009+ continue ;
1010+ if (filter == MyEID &&
1011+ !(cert.type () & SslCertificate::EstEidType || cert.type () & SslCertificate::DigiIDType || cert.type () & SslCertificate::TempelType))
1012+ continue ;
1013+ list.append (token);
1014+ }
1015+ ui->noCardInfo ->setVisible (ui->cardInfo ->token ().isNull ());
1016+ ui->selector ->setHidden (list.isEmpty ());
1017+ ui->selector ->setChecked (false );
1018+ ui->cardInfo ->setHidden (ui->noCardInfo ->isVisible ());
1019+ ui->cardInfo ->setCursor (ui->selector ->isVisible () ? Qt::PointingHandCursor : Qt::ArrowCursor);
1020+ ui->cardInfo ->update (data, list.size () > 1 );
10411021 if (!QPCSC::instance ().serviceRunning ())
10421022 ui->noCardInfo ->update (NoCardInfo::NoPCSC);
10431023 else if (QPCSC::instance ().readers ().isEmpty ())
10441024 ui->noCardInfo ->update (NoCardInfo::NoReader);
10451025 else
10461026 ui->noCardInfo ->update (NoCardInfo::NoCard);
1047- ui->cardInfo ->setCursor (ui->selector ->selector ->isVisible () ? Qt::PointingHandCursor : Qt::ArrowCursor);
1048- if (ui->selector ->selector ->isHidden ())
1049- showCardMenu (false );
1027+ disconnect (ui->selector , &QToolButton::toggled, this , nullptr );
1028+ if (list.isEmpty ())
1029+ return ;
1030+ connect (ui->selector , &QToolButton::toggled, this , [this , list](bool show) {
1031+ if (show)
1032+ {
1033+ auto *cardPopup = new CardPopup (list, this );
1034+ connect (cardPopup, &CardPopup::activated, qApp->signer (), &QSigner::selectCard, Qt::QueuedConnection);
1035+ connect (cardPopup, &CardPopup::activated, this , [this ] { ui->selector ->setChecked (false ); });
1036+ cardPopup->show ();
1037+ }
1038+ else if (auto *cardPopup = findChild<CardPopup*>())
1039+ cardPopup->deleteLater ();
1040+ });
10501041}
10511042
10521043void MainWindow::containerSummary ()
0 commit comments