diff options
Diffstat (limited to 'src/ui/widgets/KeyTreeView.cpp')
-rw-r--r-- | src/ui/widgets/KeyTreeView.cpp | 87 |
1 files changed, 69 insertions, 18 deletions
diff --git a/src/ui/widgets/KeyTreeView.cpp b/src/ui/widgets/KeyTreeView.cpp index 3dde069a..3df5a440 100644 --- a/src/ui/widgets/KeyTreeView.cpp +++ b/src/ui/widgets/KeyTreeView.cpp @@ -31,10 +31,24 @@ #include <utility> #include "core/function/gpg/GpgKeyGetter.h" -#include "model/GpgKeyTreeProxyModel.h" +#include "core/utils/GpgUtils.h" +#include "ui/dialog/keypair_details/KeyDetailsDialog.h" +#include "ui/model/GpgKeyTreeProxyModel.h" namespace GpgFrontend::UI { +KeyTreeView::KeyTreeView(QWidget* parent) + : QTreeView(parent), + channel_(kGpgFrontendDefaultChannel), + model_(QSharedPointer<GpgKeyTreeModel>::create( + channel_, GpgKeyGetter::GetInstance(channel_).FetchKey(), + [](auto) { return false; }, this)), + proxy_model_( + model_, GpgKeyTreeDisplayMode::kALL, [](auto) { return false; }, + this) { + init(); +} + KeyTreeView::KeyTreeView(int channel, GpgKeyTreeModel::Detector checkable_detector, GpgKeyTreeProxyModel::KeyFilter filter, @@ -42,10 +56,37 @@ KeyTreeView::KeyTreeView(int channel, : QTreeView(parent), channel_(channel), model_(QSharedPointer<GpgKeyTreeModel>::create( - channel, GpgKeyGetter::GetInstance(channel_).FetchKey(), + channel_, GpgKeyGetter::GetInstance(channel_).FetchKey(), checkable_detector, this)), proxy_model_(model_, GpgKeyTreeDisplayMode::kALL, std::move(filter), this) { + init(); +} + +void KeyTreeView::paintEvent(QPaintEvent* event) { + QTreeView::paintEvent(event); + + if (!init_) { + slot_adjust_column_widths(); + init_ = true; + } +} + +void KeyTreeView::slot_adjust_column_widths() { + for (int i = 1; i < model_->columnCount({}); ++i) { + this->resizeColumnToContents(i); + } +} + +auto KeyTreeView::GetAllCheckedKeyIds() -> KeyIdArgsList { + return model_->GetAllCheckedKeyIds(); +} + +auto KeyTreeView::GetAllCheckedSubKey() -> QContainer<GpgSubKey> { + return model_->GetAllCheckedSubKey(); +} + +void KeyTreeView::init() { setModel(&proxy_model_); sortByColumn(2, Qt::AscendingOrder); @@ -64,29 +105,39 @@ KeyTreeView::KeyTreeView(int channel, setFocusPolicy(Qt::NoFocus); setAlternatingRowColors(true); setSortingEnabled(true); -} -void KeyTreeView::paintEvent(QPaintEvent* event) { - QTreeView::paintEvent(event); + connect(this, &QTableView::doubleClicked, this, + [this](const QModelIndex& index) { + if (!index.isValid() || index.column() == 0) return; - if (!init_) { - slot_adjust_column_widths(); - init_ = true; - } -} + QModelIndex source_index = proxy_model_.mapToSource(index); + auto key = + GetGpgKeyByGpgAbstractKey(model_->GetKeyByIndex(source_index)); -void KeyTreeView::slot_adjust_column_widths() { - for (int i = 1; i < model_->columnCount({}); ++i) { - this->resizeColumnToContents(i); - } + if (!key.IsGood()) { + QMessageBox::critical(this, tr("Error"), tr("Key Not Found.")); + return; + } + + new KeyDetailsDialog(model_->GetGpgContextChannel(), key, this); + }); } -auto KeyTreeView::GetAllCheckedKeyIds() -> KeyIdArgsList { - return model_->GetAllCheckedKeyIds(); +void KeyTreeView::SetKeyFilter(const GpgKeyTreeProxyModel::KeyFilter& filter) { + proxy_model_.SetKeyFilter(filter); } -auto KeyTreeView::GetAllCheckedSubKey() -> QContainer<GpgSubKey> { - return model_->GetAllCheckedSubKey(); +void KeyTreeView::SetChannel(int channel) { + if (channel_ == channel) return; + LOG_D() << "new channel for key tree view: " << channel; + + channel_ = channel; + init_ = false; + model_ = QSharedPointer<GpgKeyTreeModel>::create( + channel_, GpgKeyGetter::GetInstance(channel_).FetchKey(), + [](auto) { return false; }, this); + proxy_model_.setSourceModel(model_.get()); + proxy_model_.invalidate(); } } // namespace GpgFrontend::UI |