// // Created by eric on 2021/5/22. // #include "ui/keypair_details/KeyPairUIDTab.h" KeyPairUIDTab::KeyPairUIDTab(GpgME::GpgContext *ctx, const GpgKey &key, QWidget *parent) : QWidget(parent), mKey(key) { mCtx = ctx; createUIDList(); createSignList(); createManageUIDMenu(); auto uidButtonsLayout = new QGridLayout(); auto addUIDButton = new QPushButton(tr("New UID")); auto manageUIDButton = new QPushButton(tr("UID Management")); manageUIDButton->setMenu(manageUIDMenu); uidButtonsLayout->addWidget(addUIDButton, 0, 1); uidButtonsLayout->addWidget(manageUIDButton, 0, 2); auto gridLayout = new QGridLayout(); gridLayout->addWidget(uidList, 0, 0); gridLayout->addLayout(uidButtonsLayout, 1, 0); gridLayout->addWidget(sigList, 2, 0); setLayout(gridLayout); connect(addUIDButton, SIGNAL(clicked(bool)), this, SLOT(slotAddUID())); connect(mCtx, SIGNAL(signalKeyInfoChanged()), this, SLOT(slotRefreshUIDList())); connect(uidList, SIGNAL(itemSelectionChanged()), this, SLOT(slotRefreshSigList())); slotRefreshUIDList(); setAttribute(Qt::WA_DeleteOnClose, true); } void KeyPairUIDTab::createUIDList() { uidList = new QTableWidget(this); uidList->setColumnCount(4); uidList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); uidList->verticalHeader()->hide(); uidList->setShowGrid(false); uidList->setSelectionBehavior(QAbstractItemView::SelectRows); uidList->setSelectionMode( QAbstractItemView::SingleSelection ); // tableitems not editable uidList->setEditTriggers(QAbstractItemView::NoEditTriggers); // no focus (rectangle around tableitems) // may be it should focus on whole row uidList->setFocusPolicy(Qt::NoFocus); uidList->setAlternatingRowColors(true); QStringList labels; labels << tr("Select") << tr("Name") << tr("Email") << tr("Comment"); uidList->setHorizontalHeaderLabels(labels); uidList->horizontalHeader()->setStretchLastSection(true); } void KeyPairUIDTab::createSignList() { sigList = new QTableWidget(this); sigList->setColumnCount(5); sigList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); sigList->verticalHeader()->hide(); sigList->setShowGrid(false); sigList->setSelectionBehavior(QAbstractItemView::SelectRows); // tableitems not editable sigList->setEditTriggers(QAbstractItemView::NoEditTriggers); // no focus (rectangle around tableitems) // may be it should focus on whole row sigList->setFocusPolicy(Qt::NoFocus); sigList->setAlternatingRowColors(true); QStringList labels; labels << tr("Type") << tr("Name") << tr("Email") << tr("Create Time") << tr("Valid Time"); sigList->setHorizontalHeaderLabels(labels); sigList->horizontalHeader()->setStretchLastSection(true); } void KeyPairUIDTab::slotRefreshUIDList() { int row = 0; uidList->setRowCount(mKey.uids.size()); uidList->setSelectionMode(QAbstractItemView::SingleSelection); for(const auto& uid : mKey.uids) { auto *tmp0 = new QTableWidgetItem(uid.name); uidList->setItem(row, 1, tmp0); auto *tmp1 = new QTableWidgetItem(uid.email); uidList->setItem(row, 2, tmp1); auto *tmp2 = new QTableWidgetItem(uid.comment); uidList->setItem(row, 3, tmp2); auto *tmp3 = new QTableWidgetItem(QString::number(row)); tmp3->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); tmp3->setTextAlignment(Qt::AlignCenter); tmp3->setCheckState(Qt::Unchecked); uidList->setItem(row, 0, tmp3); row++; } slotRefreshSigList(); } void KeyPairUIDTab::slotRefreshSigList() { int uidRow = 0, sigRow = 0; for(const auto& uid : mKey.uids) { // Only Show Selected UID's Signatures if(!uidList->item(uidRow++, 0)->isSelected()) { continue; } sigList->setRowCount(uid.signatures.size()); for(const auto &sig : uid.signatures) { auto *tmp0 = new QTableWidgetItem(sig.pubkey_algo); sigList->setItem(sigRow, 0, tmp0); auto *tmp2 = new QTableWidgetItem(sig.name); sigList->setItem(sigRow, 1, tmp2); auto *tmp3 = new QTableWidgetItem(sig.email); sigList->setItem(sigRow, 2, tmp3); auto *tmp4 = new QTableWidgetItem(sig.create_time.toString()); sigList->setItem(sigRow, 3, tmp4); auto *tmp5 = new QTableWidgetItem(sig.expire_time.toString()); sigList->setItem(sigRow, 4, tmp5); sigRow++; } break; } } void KeyPairUIDTab::slotAddSign() { QVector selected_uids; getUIDChecked(selected_uids); if(selected_uids.isEmpty()) { auto emptyUIDMsg = new QMessageBox(); emptyUIDMsg->setText("Please select one or more UIDs before doing this operation."); emptyUIDMsg->exec(); return; } auto keySignDialog = new KeyUIDSignDialog(mCtx, mKey, selected_uids, this); keySignDialog->show(); } void KeyPairUIDTab::getUIDChecked(QVector &selected_uids) { auto &uids = mKey.uids; for (int i = 0; i < uidList->rowCount(); i++) { if (uidList->item(i, 0)->checkState() == Qt::Checked) { selected_uids.push_back(uids[i]); } } } void KeyPairUIDTab::createManageUIDMenu() { manageUIDMenu = new QMenu(this); auto *signUIDAct = new QAction(tr("Sign Selected UID(s)"), this); connect(signUIDAct, SIGNAL(triggered()), this, SLOT(slotAddSign())); manageUIDMenu->addAction(signUIDAct); } void KeyPairUIDTab::slotAddUID() { auto keyNewUIDDialog = new KeyNewUIDDialog(mCtx, mKey, this); connect(keyNewUIDDialog, SIGNAL(finished(int)), this, SLOT(slotAddUIDResult(int))); connect(keyNewUIDDialog, SIGNAL(finished(int)), keyNewUIDDialog, SLOT(deleteLater())); keyNewUIDDialog->show(); } void KeyPairUIDTab::slotAddUIDResult(int result) { if(result) { QMessageBox::information(nullptr, tr("Successful Operation"), tr("Successfully added a new UID.")); } else { QMessageBox::critical(nullptr, tr("Operation Failed"), tr("An error occurred during the operation.")); } }