diff --git a/src/gpgcardgui/CMakeLists.txt b/src/gpgcardgui/CMakeLists.txt index f461af2..ecfb50f 100644 --- a/src/gpgcardgui/CMakeLists.txt +++ b/src/gpgcardgui/CMakeLists.txt @@ -1,33 +1,34 @@ # Copyright (C) 2018 Intevation GmbH # # This file is Free Software under the GNU GPL (v>=2) # and comes with ABSOLUTELY NO WARRANTY! # See LICENSE.txt for details. set(EXECUTABLE_NAME "gpgcardgui") set(EXECUTABLE_SRC main.cpp gpgcardgui.cpp mainwindow.cpp + tabbedcarddialog.cpp ${CMAKE_SOURCE_DIR}/src/util/strhelp.c ${CMAKE_SOURCE_DIR}/src/util/w32-gettext.c ) add_executable(${EXECUTABLE_NAME} ${_add_executable_params} ${EXECUTABLE_SRC} ) target_link_libraries(${EXECUTABLE_NAME} Qt5::Widgets KF5::Libkleo Gpgmepp QGpgme ) if (WIN32) set_target_properties(${EXECUTABLE_NAME} PROPERTIES LINK_FLAGS "-municode") endif(WIN32) install(TARGETS ${EXECUTABLE_NAME} DESTINATION bin) diff --git a/src/gpgcardgui/mainwindow.cpp b/src/gpgcardgui/mainwindow.cpp index fd5ef4a..25391bf 100644 --- a/src/gpgcardgui/mainwindow.cpp +++ b/src/gpgcardgui/mainwindow.cpp @@ -1,39 +1,24 @@ /* Copyright (C) 2020 by g10 Code GmbH * * This file is free software under the GNU GPL (v>=2) * and comes with ABSOLUTELY NO WARRANTY! * See LICENSE.txt for details. */ #include "mainwindow.h" #include #include #include #include #include #include "w32-gettext.h" MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags): QMainWindow(parent, flags) { - mEdit = new QTextEdit (this); - mEdit->setReadOnly(true); - setCentralWidget(mEdit); - - connect (&mManager, &Kleo::SmartCard::CardManager::cardsMayHaveChanged, this, [this] () { - const auto cards = mManager.cards(); - for (const auto card: cards) { - if (card) { - mEdit->setText(mEdit->toPlainText() + - "\nFound smartcard" + QString::fromStdString(card->serialNumber()) + - "\nIn Reader: " + card->reader()); - } - } - }); - - mManager.startCardList(); + mTabbedCardDialog = new TabbedCardDialog(this); } diff --git a/src/gpgcardgui/mainwindow.h b/src/gpgcardgui/mainwindow.h index ff5ecbd..bb00eef 100644 --- a/src/gpgcardgui/mainwindow.h +++ b/src/gpgcardgui/mainwindow.h @@ -1,26 +1,25 @@ /* Copyright (C) 2020 by g10 Code GmbH * * This file is free software under the GNU GPL (v>=2) * and comes with ABSOLUTELY NO WARRANTY! * See LICENSE.txt for details. */ #pragma once #include - +#include "tabbedcarddialog.h" #include class QTextEdit; /** MainWindow of the application. */ class MainWindow: public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); private: - QTextEdit *mEdit; - Kleo::SmartCard::CardManager mManager; + TabbedCardDialog *mTabbedCardDialog; }; diff --git a/src/gpgcardgui/tabbedcarddialog.cpp b/src/gpgcardgui/tabbedcarddialog.cpp new file mode 100644 index 0000000..e334e81 --- /dev/null +++ b/src/gpgcardgui/tabbedcarddialog.cpp @@ -0,0 +1,62 @@ +#include "tabbedcarddialog.h" + +TabbedCardDialog::TabbedCardDialog(QWidget *parent): + QWidget(parent) +{ + mTabWidget = new QTabWidget(this); + mManager.startCardList(); + connect (&mManager, + &Kleo::SmartCard::CardManager::cardsMayHaveChanged, + this, + [this] () + { + mTabWidget->clear(); + const auto cards = mManager.cards(); + for (const auto card: cards) { + if (card) { + if (!mCards.contains(card->serialNumber())) + setCard(card); + else + updateCard(card); + + } + } + }); + + mManager.startCardList(); +} + +void TabbedCardDialog::setCard(std::shared_ptr card) +{ + int lastTab = mTabWidget->count(); + + for (const auto serialNo: index2SerialNoMap) + { + if (serialNo == card->serialNumber()) + return; + } + if (!card) { + qCDebug(LIBKLEO_LOG) << "No card parsable"; + mTabWidget->addTab(mPlaceHolderWidget); + } + if (card->appType() == Card::OpenPGPApplication) { + mPGPCardWidget->setCard(static_cast (card.get())); + mTabWidget->addTab(mPGPCardWidget); + } else if (card->appType() == Card::NksApplication) { + mNetKeyWidget->setCard(static_cast (card.get())); + mTabWidget->addTab(mNetKeyWidget); + } else { + qCDebug(LIBKLEO_LOG) << "Ignoring unknown card: " << card->serialNumber(); + mTabWidget->addTab(mPlaceHolderWidget); + } + index2SerialNoMap[lastTab] = card->serialNumber(); +} + +void TabbedCardDialog::updateCard(std::shared_ptr card) +{ + for (int i=0; i > index2SerialNoMap.end(); i++) + { + if (index2SerialNoMap[i] == card->serialNumber()) + mTabWidget->insertTab(i, WIDGET, "FIXME"); + } +} diff --git a/src/gpgcardgui/tabbedcarddialog.h b/src/gpgcardgui/tabbedcarddialog.h new file mode 100644 index 0000000..ba7c540 --- /dev/null +++ b/src/gpgcardgui/tabbedcarddialog.h @@ -0,0 +1,31 @@ +/* Copyright (C) 2020 by g10 Code GmbH + * + * This file is free software under the GNU GPL (v>=2) + * and comes with ABSOLUTELY NO WARRANTY! + * See LICENSE.txt for details. + */ + +#pragma once +#include +#include +#include + +#include +#include + + +class TabbedCardDialog : public QWidget +{ + Q_OBJECT + +public: + explicit TabbedCardDialog(QWidget *parent); + +private: + QTabWidget *mTabWidget; + Kleo::SmartCard::CardManager mManager; + QMap mCards; + QMap index2SerialNoMap; + void setCard(std::shared_ptr card); + void updateCard(std::shared_ptr card); +};