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) {