diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index ec0eb76f5..0eec771e9 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -14,6 +14,11 @@ #include #include #include +#include +#include +#include + +#include "debug.h" KeySequenceEditor::KeySequenceEditor(QWidget* parent, QAction* a) : QKeySequenceEdit(parent), action(a) { @@ -53,6 +58,7 @@ void PreferencesDialog::setup_kbd_shortcut_worker(QMenu* menu, QTreeWidgetItem* if (a->menu() != NULL) { setup_kbd_shortcut_worker(a->menu(), item); } else { + item->setData(0, Qt::UserRole + 1, reinterpret_cast(a)); key_shortcut_items.append(item); key_shortcut_actions.append(a); } @@ -94,6 +100,19 @@ void PreferencesDialog::save() { accept(); } +void PreferencesDialog::reset_default_shortcut() { + QList items = keyboard_tree->selectedItems(); + for (int i=0;iselectedItems().at(i); + const QVariant& data = item->data(0, Qt::UserRole + 1); + if (!data.isNull()) { + QAction* a = reinterpret_cast(data.value()); + QKeySequence ks(a->property("default").toString()); + static_cast(keyboard_tree->itemWidget(item, 1))->setKeySequence(ks); + } + } +} + void PreferencesDialog::setup_ui() { QVBoxLayout* verticalLayout = new QVBoxLayout(this); QTabWidget* tabWidget = new QTabWidget(this); @@ -136,17 +155,27 @@ void PreferencesDialog::setup_ui() { verticalLayout_2->addWidget(groupBox); tabWidget->addTab(tab_4, "Playback"); - QWidget* tab_3 = new QWidget(); - QHBoxLayout* horizontalLayout = new QHBoxLayout(tab_3); - horizontalLayout->setContentsMargins(0, 0, 0, 0); + + QWidget* shortcut_tab = new QWidget(); + + QVBoxLayout* shortcut_layout = new QVBoxLayout(shortcut_tab); keyboard_tree = new QTreeWidget(); QTreeWidgetItem* tree_header = keyboard_tree->headerItem(); tree_header->setText(0, "Action"); tree_header->setText(1, "Shortcut"); - horizontalLayout->addWidget(keyboard_tree); + shortcut_layout->addWidget(keyboard_tree); - tabWidget->addTab(tab_3, "Keyboard"); + QHBoxLayout* reset_shortcut_layout = new QHBoxLayout(); + reset_shortcut_layout->addStretch(); + + reset_shortcut_button = new QPushButton("Reset to Default"); + reset_shortcut_layout->addWidget(reset_shortcut_button); + connect(reset_shortcut_button, SIGNAL(clicked(bool)), this, SLOT(reset_default_shortcut())); + + shortcut_layout->addLayout(reset_shortcut_layout); + + tabWidget->addTab(shortcut_tab, "Keyboard"); verticalLayout->addWidget(tabWidget); diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index b0560a247..510b5dc5a 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -32,6 +32,7 @@ public: private slots: void save(); + void reset_default_shortcut(); private: void setup_ui(); @@ -46,6 +47,8 @@ private: QVector key_shortcut_actions; QVector key_shortcut_items; QVector key_shortcut_fields; + + QPushButton* reset_shortcut_button; }; #endif // PREFERENCESDIALOG_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 2739d0976..53b4bfec4 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -443,6 +443,47 @@ bool MainWindow::can_close_project() { return true; } +void kbd_shortcut_processor(QByteArray& file, QMenu* menu, bool save) { + QList actions = menu->actions(); + for (int i=0;imenu() != NULL) { + kbd_shortcut_processor(file, a->menu(), save); + } else if (!a->isSeparator()) { + if (save) { + // saving custom shortcuts + if (!a->property("default").isNull()) { + QKeySequence defks(a->property("default").toString()); + if (a->shortcut() != defks) { + // custom shortcut + if (!file.isEmpty()) file.append('\n'); + file.append(a->text().replace("&", "")); + file.append('\t'); + file.append(a->shortcut().toString()); + } + } + } else { + // loading custom shortcuts + a->setProperty("default", a->shortcut().toString()); + QString comp_str = a->text().replace("&", ""); + int shortcut_index = file.indexOf(comp_str); + if (shortcut_index == 0 || (shortcut_index > 0 && file.at(shortcut_index-1) == '\n')) { + shortcut_index += comp_str.size() + 1; + QString shortcut; + while (shortcut_index < file.size() && file.at(shortcut_index) != '\n') { + shortcut.append(file.at(shortcut_index)); + shortcut_index++; + } + QKeySequence ks(shortcut); + if (!ks.isEmpty()) { + a->setShortcut(ks); + } + } + } + } + } +} + void MainWindow::setup_menus() { QMenuBar* menuBar = new QMenuBar(this); setMenuBar(menuBar); @@ -756,6 +797,16 @@ void MainWindow::setup_menus() { QMenu* help_menu = menuBar->addMenu("&Help"); help_menu->addAction("&About...", this, SLOT(show_about())); + + QFile shortcut_path(get_config_path() + "/shortcuts"); + if (shortcut_path.exists() && shortcut_path.open(QFile::ReadOnly)) { + QList menus = menuBar->actions(); + QByteArray shortcut_bytes = shortcut_path.readAll(); + for (int i=0;imenu(); + kbd_shortcut_processor(shortcut_bytes, menu, false); + } + } } void MainWindow::set_bool_action_checked(QAction *a) { @@ -807,6 +858,21 @@ void MainWindow::closeEvent(QCloseEvent *e) { } else { dout << "[ERROR] Failed to save layout"; } + + // save main menu actions + QList menus = menuBar()->actions(); + QByteArray shortcut_file; + for (int i=0;imenu(); + kbd_shortcut_processor(shortcut_file, menu, true); + } + QFile shortcut_file_io(config_dir + "/shortcuts"); + if (shortcut_file_io.open(QFile::WriteOnly)) { + shortcut_file_io.write(shortcut_file); + shortcut_file_io.close(); + } else { + dout << "[ERROR] Failed to save shortcut file"; + } } stop_audio(); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 65ff704c3..397364e13 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -506,9 +506,8 @@ void Viewer::setup_ui() { playback_control_layout->addWidget(btnRewind); btnPlay = new QPushButton(playback_controls); - QIcon playIcon; - playIcon.addFile(QStringLiteral(":/icons/play.png"), QSize(), QIcon::Normal, QIcon::Off); - playIcon.addFile(QStringLiteral(":/icons/play-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); + playIcon.addFile(QStringLiteral(":/icons/play.png"), QSize(), QIcon::Normal, QIcon::On); + playIcon.addFile(QStringLiteral(":/icons/play-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); btnPlay->setIcon(playIcon); connect(btnPlay, SIGNAL(clicked(bool)), this, SLOT(toggle_play())); playback_control_layout->addWidget(btnPlay); @@ -725,5 +724,5 @@ void Viewer::set_sequence(bool main, Sequence *s) { } void Viewer::set_playpause_icon(bool play) { - btnPlay->setIcon(QIcon((play) ? ":/icons/play.png" : ":/icons/pause.png")); + btnPlay->setIcon(play ? playIcon : QIcon(":/icons/pause.png")); } diff --git a/panels/viewer.h b/panels/viewer.h index 9cce59418..624d8df8e 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -3,6 +3,7 @@ #include #include +#include class Timeline; class ViewerWidget; @@ -93,6 +94,8 @@ private: void set_zoom_value(double d); void set_sb_max(); + QIcon playIcon; + void setup_ui(); TimelineHeader* headers;