From 637334ba36d44239d501f13310dc4aa61fc45216 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Thu, 29 Sep 2022 23:53:42 -0400 Subject: Customizable shortcuts, maybe. --- qdeduper/preferencedialog.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'qdeduper/preferencedialog.cpp') diff --git a/qdeduper/preferencedialog.cpp b/qdeduper/preferencedialog.cpp index 6851634..28ccbea 100644 --- a/qdeduper/preferencedialog.cpp +++ b/qdeduper/preferencedialog.cpp @@ -1,3 +1,6 @@ +#include + +#include #include #include #include @@ -6,6 +9,10 @@ #include #include #include +#include +#include +#include +#include #include "preferencedialog.hpp" #include "settings.hpp" @@ -99,6 +106,19 @@ void PreferenceDialog::setup_widgets() } } +void PreferenceDialog::set_hkactions(int tab, std::map defmap, std::map actmap) +{ + this->defmap = defmap; + this->actmap = actmap; + this->hktv = new QTableView(); + this->hkim = new QStandardItemModel(); + this->tabs[tab]->addWidget(hktv, 0, 0); + this->hktv->setModel(hkim); + this->hktv->setSortingEnabled(false); + this->hktv->setSelectionMode(QAbstractItemView::SelectionMode::NoSelection); + this->hktv->setItemDelegateForColumn(1, new ShortcutEditorDelegate); +} + void PreferenceDialog::load_widget_status() { for (auto &k : sr->klist) @@ -132,6 +152,24 @@ void PreferenceDialog::load_widget_status() break; } } + this->hkim->clear(); + this->hkim->setHorizontalHeaderLabels({"Menu Item", "Hotkey"}); + for (auto &hkp : this->defmap) + { + std::string actn = hkp.first.substr(3); + QKeySequence ks = sr->get_option_keyseq("hotkey/" + actn); + if (this->actmap.find(actn) == this->actmap.end()) + continue; + QAction *act = this->actmap[actn]; + QStandardItem *itma = new QStandardItem(act->text()); + QStandardItem *itmk = new QStandardItem(act->shortcut().toString()); + itma->setIcon(act->icon()); + itma->setEditable(false); + itma->setData(QString::fromStdString(actn), Qt::ItemDataRole::UserRole); + itmk->setData(QVariant::fromValue(ks), Qt::ItemDataRole::UserRole); + this->hkim->appendRow({itma, itmk}); + } + this->hktv->resizeColumnsToContents(); } void PreferenceDialog::save_widget_status() @@ -167,4 +205,34 @@ void PreferenceDialog::save_widget_status() break; } } + for (int i = 0; i < hkim->rowCount(); ++i) + { + std::string actn = hkim->item(i, 0)->data(Qt::ItemDataRole::UserRole).toString().toStdString(); + QKeySequence ks = hkim->item(i, 1)->data(Qt::ItemDataRole::UserRole).value(); + sr->set_option_keyseq("hotkey/" + actn, ks); + } +} +QWidget* ShortcutEditorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(option); + Q_UNUSED(index); + QKeySequenceEdit *kse = new QKeySequenceEdit(parent); + QObject::connect(kse, &QKeySequenceEdit::editingFinished, [this, kse] { + Q_EMIT const_cast(this)->commitData(kse); + Q_EMIT const_cast(this)->closeEditor(kse); + }); + return kse; +} + +void ShortcutEditorDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + QKeySequenceEdit *kse = qobject_cast(editor); + kse->setKeySequence(index.data(Qt::ItemDataRole::UserRole).value()); +} + +void ShortcutEditorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +{ + QKeySequenceEdit *kse = qobject_cast(editor); + model->setData(index, QVariant::fromValue(kse->keySequence()), Qt::ItemDataRole::UserRole); + model->setData(index, kse->keySequence().toString(), Qt::ItemDataRole::DisplayRole); } -- cgit v1.2.3