From 5b69137edfff55b2a9116751eda60734c6275706 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 12 Oct 2020 00:19:01 +1100 Subject: [PATCH] timeruler: add context menu Should have more stuff in it, this is a basic implementation --- app/widget/menu/menushared.cpp | 67 +++++++++++++++++++++++++ app/widget/menu/menushared.h | 19 +++++++ app/widget/timeruler/seekablewidget.cpp | 6 ++- app/widget/timeruler/timeruler.cpp | 15 ++++++ app/widget/timeruler/timeruler.h | 3 ++ app/window/mainwindow/mainmenu.cpp | 52 +------------------ app/window/mainwindow/mainmenu.h | 14 ------ 7 files changed, 111 insertions(+), 65 deletions(-) diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp index 4e6a377d7..a63e22fb3 100644 --- a/app/widget/menu/menushared.cpp +++ b/app/widget/menu/menushared.cpp @@ -58,6 +58,34 @@ MenuShared::MenuShared() clip_enable_disable_item_ = Menu::CreateItem(this, "enabledisable", this, &MenuShared::EnableDisableTriggered, "Shift+E"); clip_nest_item_ = Menu::CreateItem(this, "nest", this, &MenuShared::NestTriggered); + // TimeRuler menu shared items + frame_view_mode_group_ = new QActionGroup(this); + + view_timecode_view_dropframe_item_ = Menu::CreateItem(this, "modedropframe", this, &MenuShared::TimecodeDisplayTriggered); + view_timecode_view_dropframe_item_->setData(Timecode::kTimecodeDropFrame); + view_timecode_view_dropframe_item_->setCheckable(true); + frame_view_mode_group_->addAction(view_timecode_view_dropframe_item_); + + view_timecode_view_nondropframe_item_ = Menu::CreateItem(this, "modenondropframe", this, &MenuShared::TimecodeDisplayTriggered); + view_timecode_view_nondropframe_item_->setData(Timecode::kTimecodeNonDropFrame); + view_timecode_view_nondropframe_item_->setCheckable(true); + frame_view_mode_group_->addAction(view_timecode_view_nondropframe_item_); + + view_timecode_view_seconds_item_ = Menu::CreateItem(this, "modeseconds", this, &MenuShared::TimecodeDisplayTriggered); + view_timecode_view_seconds_item_->setData(Timecode::kTimecodeSeconds); + view_timecode_view_seconds_item_->setCheckable(true); + frame_view_mode_group_->addAction(view_timecode_view_seconds_item_); + + view_timecode_view_frames_item_ = Menu::CreateItem(this, "modeframes", this, &MenuShared::TimecodeDisplayTriggered); + view_timecode_view_frames_item_->setData(Timecode::kFrames); + view_timecode_view_frames_item_->setCheckable(true); + frame_view_mode_group_->addAction(view_timecode_view_frames_item_); + + view_timecode_view_milliseconds_item_ = Menu::CreateItem(this, "milliseconds", this, &MenuShared::TimecodeDisplayTriggered); + view_timecode_view_milliseconds_item_->setData(Timecode::kMilliseconds); + view_timecode_view_milliseconds_item_->setCheckable(true); + frame_view_mode_group_->addAction(view_timecode_view_milliseconds_item_); + Retranslate(); } @@ -117,6 +145,26 @@ void MenuShared::AddItemsForClipEditMenu(Menu *m) m->addAction(clip_nest_item_); } +void MenuShared::AddItemsForTimeRulerMenu(Menu *m) +{ + m->addAction(view_timecode_view_dropframe_item_); + m->addAction(view_timecode_view_nondropframe_item_); + m->addAction(view_timecode_view_seconds_item_); + m->addAction(view_timecode_view_frames_item_); + m->addAction(view_timecode_view_milliseconds_item_); +} + +void MenuShared::AboutToShowTimeRulerActions() +{ + QList timecode_display_actions = frame_view_mode_group_->actions(); + foreach (QAction* a, timecode_display_actions) { + if (a->data() == Core::instance()->GetTimecodeDisplay()) { + a->setChecked(true); + break; + } + } +} + MenuShared *MenuShared::instance() { return instance_; @@ -211,6 +259,18 @@ void MenuShared::DefaultTransitionTriggered() qDebug() << "FIXME: Stub"; } +void MenuShared::TimecodeDisplayTriggered() +{ + // Assume the sender is a QAction + QAction* action = static_cast(sender()); + + // Assume its data() is a member of Timecode::Display + Timecode::Display display = static_cast(action->data().toInt()); + + // Set the current display mode + Core::instance()->SetTimecodeDisplay(display); +} + void MenuShared::Retranslate() { // "New" menu shared items @@ -240,6 +300,13 @@ void MenuShared::Retranslate() clip_link_unlink_item_->setText(tr("Link/Unlink")); clip_enable_disable_item_->setText(tr("Enable/Disable")); clip_nest_item_->setText(tr("Nest")); + + // TimeRuler menu shared items + view_timecode_view_frames_item_->setText(tr("Frames")); + view_timecode_view_dropframe_item_->setText(tr("Drop Frame")); + view_timecode_view_nondropframe_item_->setText(tr("Non-Drop Frame")); + view_timecode_view_milliseconds_item_->setText(tr("Milliseconds")); + view_timecode_view_seconds_item_->setText(tr("Seconds")); } OLIVE_NAMESPACE_EXIT diff --git a/app/widget/menu/menushared.h b/app/widget/menu/menushared.h index 684616610..414be8985 100644 --- a/app/widget/menu/menushared.h +++ b/app/widget/menu/menushared.h @@ -42,6 +42,9 @@ public: void AddItemsForEditMenu(Menu* m, bool for_clips); void AddItemsForInOutMenu(Menu* m); void AddItemsForClipEditMenu(Menu* m); + void AddItemsForTimeRulerMenu(Menu* m); + + void AboutToShowTimeRulerActions(); static MenuShared* instance(); @@ -74,6 +77,14 @@ private: QAction* clip_enable_disable_item_; QAction* clip_nest_item_; + // TimeRuler menu shared items + QActionGroup* frame_view_mode_group_; + QAction* view_timecode_view_dropframe_item_; + QAction* view_timecode_view_nondropframe_item_; + QAction* view_timecode_view_seconds_item_; + QAction* view_timecode_view_frames_item_; + QAction* view_timecode_view_milliseconds_item_; + static MenuShared* instance_; private slots: @@ -111,6 +122,14 @@ private slots: void DefaultTransitionTriggered(); + /** + * @brief A slot for the timecode display menu items + * + * Assumes a QAction* sender() and its data() is a member of enum Timecode::Display. Uses the data() to signal a + * timecode change throughout the rest of the application. + */ + void TimecodeDisplayTriggered(); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index af83be884..9c066acf1 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -42,6 +42,8 @@ SeekableWidget::SeekableWidget(QWidget* parent) : // Set width of playhead marker playhead_width_ = QFontMetricsWidth(fm, "H"); + + setContextMenuPolicy(Qt::CustomContextMenu); } void SeekableWidget::ConnectTimelinePoints(TimelinePoints *points) @@ -78,7 +80,9 @@ const int &SeekableWidget::GetScroll() const void SeekableWidget::mousePressEvent(QMouseEvent *event) { - SeekToScreenPoint(event->pos().x()); + if (event->button() == Qt::LeftButton) { + SeekToScreenPoint(event->pos().x()); + } } void SeekableWidget::mouseMoveEvent(QMouseEvent *event) diff --git a/app/widget/timeruler/timeruler.cpp b/app/widget/timeruler/timeruler.cpp index a95e82582..c9f3d03bd 100644 --- a/app/widget/timeruler/timeruler.cpp +++ b/app/widget/timeruler/timeruler.cpp @@ -27,6 +27,8 @@ #include "common/qtutils.h" #include "config/config.h" #include "core.h" +#include "widget/menu/menu.h" +#include "widget/menu/menushared.h" OLIVE_NAMESPACE_ENTER @@ -53,6 +55,9 @@ TimeRuler::TimeRuler(bool text_visible, bool cache_status_visible, QWidget* pare // Force update if the default timecode display mode changes connect(Core::instance(), &Core::TimecodeDisplayChanged, this, static_cast(&TimeRuler::update)); + + // Connect context menu + connect(this, &TimeRuler::customContextMenuRequested, this, &TimeRuler::ShowContextMenu); } void TimeRuler::SetPlaybackCache(PlaybackCache *cache) @@ -297,6 +302,16 @@ int TimeRuler::CacheStatusHeight() const return fontMetrics().height() / 4; } +void TimeRuler::ShowContextMenu() +{ + Menu m(this); + + MenuShared::instance()->AddItemsForTimeRulerMenu(&m); + MenuShared::instance()->AboutToShowTimeRulerActions(); + + m.exec(QCursor::pos()); +} + void TimeRuler::UpdateHeight() { int height = text_height(); diff --git a/app/widget/timeruler/timeruler.h b/app/widget/timeruler/timeruler.h index 0708bca73..131a3c6cc 100644 --- a/app/widget/timeruler/timeruler.h +++ b/app/widget/timeruler/timeruler.h @@ -64,6 +64,9 @@ private: PlaybackCache* playback_cache_; +private slots: + void ShowContextMenu(); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index 8b6a0d6a0..f01f0afd8 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -116,32 +116,7 @@ MainMenu::MainMenu(MainWindow *parent) : view_show_all_item_->setCheckable(true); view_menu_->addSeparator(); - frame_view_mode_group_ = new QActionGroup(this); - - view_timecode_view_dropframe_item_ = view_menu_->AddItem("modedropframe", this, &MainMenu::TimecodeDisplayTriggered); - view_timecode_view_dropframe_item_->setData(Timecode::kTimecodeDropFrame); - view_timecode_view_dropframe_item_->setCheckable(true); - frame_view_mode_group_->addAction(view_timecode_view_dropframe_item_); - - view_timecode_view_nondropframe_item_ = view_menu_->AddItem("modenondropframe", this, &MainMenu::TimecodeDisplayTriggered); - view_timecode_view_nondropframe_item_->setData(Timecode::kTimecodeNonDropFrame); - view_timecode_view_nondropframe_item_->setCheckable(true); - frame_view_mode_group_->addAction(view_timecode_view_nondropframe_item_); - - view_timecode_view_seconds_item_ = view_menu_->AddItem("modeseconds", this, &MainMenu::TimecodeDisplayTriggered); - view_timecode_view_seconds_item_->setData(Timecode::kTimecodeSeconds); - view_timecode_view_seconds_item_->setCheckable(true); - frame_view_mode_group_->addAction(view_timecode_view_seconds_item_); - - view_timecode_view_frames_item_ = view_menu_->AddItem("modeframes", this, &MainMenu::TimecodeDisplayTriggered); - view_timecode_view_frames_item_->setData(Timecode::kFrames); - view_timecode_view_frames_item_->setCheckable(true); - frame_view_mode_group_->addAction(view_timecode_view_frames_item_); - - view_timecode_view_milliseconds_item_ = view_menu_->AddItem("milliseconds", this, &MainMenu::TimecodeDisplayTriggered); - view_timecode_view_milliseconds_item_->setData(Timecode::kMilliseconds); - view_timecode_view_milliseconds_item_->setCheckable(true); - frame_view_mode_group_->addAction(view_timecode_view_milliseconds_item_); + MenuShared::instance()->AddItemsForTimeRulerMenu(view_menu_); view_menu_->addSeparator(); @@ -302,18 +277,6 @@ void MainMenu::ToolItemTriggered() Core::instance()->SetTool(tool); } -void MainMenu::TimecodeDisplayTriggered() -{ - // Assume the sender is a QAction - QAction* action = static_cast(sender()); - - // Assume its data() is a member of Timecode::Display - Timecode::Display display = static_cast(action->data().toInt()); - - // Set the current display mode - Core::instance()->SetTimecodeDisplay(display); -} - void MainMenu::FileMenuAboutToShow() { Project* active_project = Core::instance()->GetActiveProject().get(); @@ -344,13 +307,7 @@ void MainMenu::ViewMenuAboutToShow() view_full_screen_item_->setChecked(parentWidget()->isFullScreen()); // Ensure checked timecode display mode is correct - QList timecode_display_actions = frame_view_mode_group_->actions(); - foreach (QAction* a, timecode_display_actions) { - if (a->data() == Core::instance()->GetTimecodeDisplay()) { - a->setChecked(true); - break; - } - } + MenuShared::instance()->AboutToShowTimeRulerActions(); } void MainMenu::ToolsMenuAboutToShow() @@ -670,11 +627,6 @@ void MainMenu::Retranslate() view_increase_track_height_item_->setText(tr("Increase Track Height")); view_decrease_track_height_item_->setText(tr("Decrease Track Height")); view_show_all_item_->setText(tr("Toggle Show All")); - view_timecode_view_frames_item_->setText(tr("Frames")); - view_timecode_view_dropframe_item_->setText(tr("Drop Frame")); - view_timecode_view_nondropframe_item_->setText(tr("Non-Drop Frame")); - view_timecode_view_milliseconds_item_->setText(tr("Milliseconds")); - view_timecode_view_seconds_item_->setText(tr("Seconds")); // View menu (cont'd) view_full_screen_item_->setText(tr("Full Screen")); diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h index f7b4c0ad3..961431886 100644 --- a/app/window/mainwindow/mainmenu.h +++ b/app/window/mainwindow/mainmenu.h @@ -61,14 +61,6 @@ private slots: */ void ToolItemTriggered(); - /** - * @brief A slot for the timecode display menu items - * - * Assumes a QAction* sender() and its data() is a member of enum Timecode::Display. Uses the data() to signal a - * timecode change throughout the rest of the application. - */ - void TimecodeDisplayTriggered(); - /** * @brief Slot triggered just before the File menu shows */ @@ -226,12 +218,6 @@ private: QAction* view_increase_track_height_item_; QAction* view_decrease_track_height_item_; QAction* view_show_all_item_; - QActionGroup* frame_view_mode_group_; - QAction* view_timecode_view_dropframe_item_; - QAction* view_timecode_view_nondropframe_item_; - QAction* view_timecode_view_seconds_item_; - QAction* view_timecode_view_frames_item_; - QAction* view_timecode_view_milliseconds_item_; QAction* view_full_screen_item_; QAction* view_full_screen_viewer_item_;