diff --git a/io/config.cpp b/io/config.cpp index 31d9fddfd..bd0882f68 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -31,7 +31,8 @@ Config::Config() drop_on_media_to_replace(true), autoscroll(AUTOSCROLL_PAGE_SCROLL), audio_rate(48000), - fast_seeking(false) + fast_seeking(false), + hover_focus(false) {} void Config::load(QString path) { @@ -111,6 +112,9 @@ void Config::load(QString path) { } else if (stream.name() == "FastSeeking") { stream.readNext(); fast_seeking = (stream.text() == "1"); + } else if (stream.name() == "HoverFocus") { + stream.readNext(); + hover_focus = (stream.text() == "1"); } } } @@ -158,6 +162,7 @@ void Config::save(QString path) { stream.writeTextElement("Autoscroll", QString::number(autoscroll)); stream.writeTextElement("AudioRate", QString::number(audio_rate)); stream.writeTextElement("FastSeeking", QString::number(fast_seeking)); + stream.writeTextElement("HoverFocus", QString::number(hover_focus)); stream.writeEndElement(); // configuration stream.writeEndDocument(); // doc diff --git a/io/config.h b/io/config.h index 5bcb10447..4092204ff 100644 --- a/io/config.h +++ b/io/config.h @@ -43,6 +43,7 @@ struct Config { int autoscroll; int audio_rate; bool fast_seeking; + bool hover_focus; void load(QString path); void save(QString path); diff --git a/mainwindow.cpp b/mainwindow.cpp index cf3abec0e..7987b1e51 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -311,34 +311,33 @@ void MainWindow::on_actionSequence_triggered() nsd.exec(); } -void MainWindow::on_actionZoom_In_triggered() -{ - if (panel_timeline->focused()) { +void MainWindow::on_actionZoom_In_triggered() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_timeline) { panel_timeline->set_zoom(true); - } else if (panel_effect_controls->keyframe_focus()) { + } else if (focused_panel == panel_effect_controls) { panel_effect_controls->set_zoom(true); - } else if (panel_footage_viewer->is_focused()) { + } else if (focused_panel == panel_footage_viewer) { panel_footage_viewer->set_zoom(true); - } else if (panel_sequence_viewer->is_focused()) { + } else if (focused_panel == panel_sequence_viewer) { panel_sequence_viewer->set_zoom(true); } } -void MainWindow::on_actionZoom_out_triggered() -{ - if (panel_timeline->focused()) { +void MainWindow::on_actionZoom_out_triggered() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_timeline) { panel_timeline->set_zoom(false); - } else if (panel_effect_controls->keyframe_focus()) { + } else if (focused_panel == panel_effect_controls) { panel_effect_controls->set_zoom(false); - } else if (panel_footage_viewer->is_focused()) { + } else if (focused_panel == panel_footage_viewer) { panel_footage_viewer->set_zoom(false); - } else if (panel_sequence_viewer->is_focused()) { + } else if (focused_panel == panel_sequence_viewer) { panel_sequence_viewer->set_zoom(false); } } -void MainWindow::on_actionExport_triggered() -{ +void MainWindow::on_actionExport_triggered() { if (sequence == NULL) { QMessageBox::information(this, "No active sequence", "Please open the sequence you wish to export.", QMessageBox::Ok); } else { @@ -400,9 +399,10 @@ void MainWindow::openSpeedDialog() { void MainWindow::cut() { if (sequence != NULL) { - if (panel_timeline->focused()) { + QDockWidget* focused_panel = get_focused_panel(); + if (panel_timeline == focused_panel) { panel_timeline->copy(true); - } else if (panel_effect_controls->is_focused()) { + } else if (panel_effect_controls == focused_panel) { panel_effect_controls->copy(true); } } @@ -410,16 +410,18 @@ void MainWindow::cut() { void MainWindow::copy() { if (sequence != NULL) { - if (panel_timeline->focused()) { + QDockWidget* focused_panel = get_focused_panel(); + if (panel_timeline == focused_panel) { panel_timeline->copy(false); - } else if (panel_effect_controls->is_focused()) { + } else if (panel_effect_controls == focused_panel) { panel_effect_controls->copy(false); } } } void MainWindow::paste() { - if ((panel_timeline->focused() || panel_effect_controls->is_focused()) && sequence != NULL) { + QDockWidget* focused_panel = get_focused_panel(); + if ((panel_timeline == focused_panel || panel_effect_controls == focused_panel) && sequence != NULL) { panel_timeline->paste(false); } } @@ -708,6 +710,7 @@ void MainWindow::toolMenu_About_To_Be_Shown() { ui->actionEnable_Seek_to_Import->setChecked(config.enable_seek_to_import); ui->actionAudio_Scrubbing->setChecked(config.enable_audio_scrubbing); ui->actionEnable_Drop_on_Media_to_Replace->setChecked(config.drop_on_media_to_replace); + ui->actionEnable_Hover_Focus->setChecked(config.hover_focus); ui->actionNo_autoscroll->setChecked(config.autoscroll == AUTOSCROLL_NO_SCROLL); ui->actionPage_Autoscroll->setChecked(config.autoscroll == AUTOSCROLL_PAGE_SCROLL); @@ -1039,3 +1042,7 @@ void MainWindow::on_actionMilliseconds_triggered() { config.timecode_view = TIMECODE_MILLISECONDS; update_ui(false); } + +void MainWindow::on_actionEnable_Hover_Focus_triggered() { + config.hover_focus = !config.hover_focus; +} diff --git a/mainwindow.h b/mainwindow.h index c2dd7bfb7..5908ccd6b 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -211,6 +211,8 @@ private slots: void on_actionMilliseconds_triggered(); + void on_actionEnable_Hover_Focus_triggered(); + private: Ui::MainWindow *ui; void setup_layout(bool reset); diff --git a/mainwindow.ui b/mainwindow.ui index b444a2a49..9e18008f4 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -187,6 +187,7 @@ + @@ -925,6 +926,14 @@ Milliseconds + + + true + + + Enable Hover Focus for Zooming + + diff --git a/panels/panels.cpp b/panels/panels.cpp index 6f6396b9b..4efe6de21 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -7,6 +7,7 @@ #include "project/sequence.h" #include "project/clip.h" #include "project/transition.h" +#include "io/config.h" #include "debug.h" Project* panel_project = 0; @@ -105,3 +106,34 @@ void update_ui(bool modified) { panel_timeline->repaint_timeline(); panel_sequence_viewer->update_viewer(); } + +QDockWidget *get_focused_panel() { + QDockWidget* w = NULL; + if (config.hover_focus) { + if (panel_project->rect().contains(panel_project->mapFromGlobal(QCursor::pos()))) { + w = panel_project; + } else if (panel_effect_controls->rect().contains(panel_effect_controls->mapFromGlobal(QCursor::pos()))) { + w = panel_effect_controls; + } else if (panel_sequence_viewer->rect().contains(panel_sequence_viewer->mapFromGlobal(QCursor::pos()))) { + w = panel_sequence_viewer; + } else if (panel_footage_viewer->rect().contains(panel_footage_viewer->mapFromGlobal(QCursor::pos()))) { + w = panel_footage_viewer; + } else if (panel_timeline->rect().contains(panel_timeline->mapFromGlobal(QCursor::pos()))) { + w = panel_timeline; + } + } + if (w == NULL) { + if (panel_project->is_focused()) { + w = panel_project; + } else if (panel_effect_controls->keyframe_focus()) { + w = panel_effect_controls; + } else if (panel_sequence_viewer->is_focused()) { + w = panel_sequence_viewer; + } else if (panel_footage_viewer->is_focused()) { + w = panel_footage_viewer; + } else if (panel_timeline->focused()) { + w = panel_timeline; + } + } + return w; +} diff --git a/panels/panels.h b/panels/panels.h index 1be614a5d..042a652d8 100644 --- a/panels/panels.h +++ b/panels/panels.h @@ -5,6 +5,7 @@ class Project; class EffectControls; class Viewer; class Timeline; +class QDockWidget; extern Project* panel_project; extern EffectControls* panel_effect_controls; @@ -13,5 +14,6 @@ extern Viewer* panel_footage_viewer; extern Timeline* panel_timeline; void update_ui(bool modified); +QDockWidget* get_focused_panel(); #endif // PANELS_H diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 6cfc2dc86..755da67a8 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -416,17 +416,19 @@ void Viewer::set_out_point() { } void Viewer::set_zoom(bool in) { - if (in) { - ui->headers->update_zoom(ui->headers->get_zoom()*2); - } else { - ui->headers->update_zoom(qMax(minimum_zoom, ui->headers->get_zoom()*0.5)); + if (seq != NULL) { + if (in) { + ui->headers->update_zoom(ui->headers->get_zoom()*2); + } else { + ui->headers->update_zoom(qMax(minimum_zoom, ui->headers->get_zoom()*0.5)); + } + if (ui->openGLWidget->waveform) { + ui->openGLWidget->waveform_zoom = ui->headers->get_zoom(); + ui->openGLWidget->update(); + } + ui->headers->set_scrollbar_max(ui->horizontalScrollBar, seq->getEndFrame(), ui->headers->width()); + center_scroll_to_playhead(ui->horizontalScrollBar, ui->headers->get_zoom(), seq->playhead); } - if (ui->openGLWidget->waveform) { - ui->openGLWidget->waveform_zoom = ui->headers->get_zoom(); - ui->openGLWidget->update(); - } - ui->headers->set_scrollbar_max(ui->horizontalScrollBar, seq->getEndFrame(), ui->headers->width()); - center_scroll_to_playhead(ui->horizontalScrollBar, ui->headers->get_zoom(), seq->playhead); } void Viewer::set_media(Media* m) {