diff --git a/app/panel/timebased/timebased.cpp b/app/panel/timebased/timebased.cpp index f569fc2ac..f731e0f44 100644 --- a/app/panel/timebased/timebased.cpp +++ b/app/panel/timebased/timebased.cpp @@ -34,6 +34,11 @@ rational TimeBasedPanel::GetTime() return widget_->GetTime(); } +rational TimeBasedPanel::timebase() +{ + return widget_->timebase(); +} + void TimeBasedPanel::GoToStart() { widget_->GoToStart(); diff --git a/app/panel/timebased/timebased.h b/app/panel/timebased/timebased.h index 30b5e208b..5fe4eb49e 100644 --- a/app/panel/timebased/timebased.h +++ b/app/panel/timebased/timebased.h @@ -41,6 +41,8 @@ public: rational GetTime(); + rational timebase(); + ViewerOutput *GetConnectedViewer() const { return widget_->GetConnectedNode(); diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp index 1ccf5f37d..e202f1aec 100644 --- a/app/widget/menu/menushared.cpp +++ b/app/widget/menu/menushared.cpp @@ -21,6 +21,7 @@ #include "menushared.h" #include "core.h" +#include "common/timecodefunctions.h" #include "panel/panelmanager.h" #include "panel/timeline/timeline.h" @@ -159,10 +160,24 @@ void MenuShared::AddItemsForClipEditMenu(Menu *m) m->addAction(clip_nest_item_); } -void MenuShared::AddItemsForTimeRulerMenu(Menu *m) +void MenuShared::AddItemsForTimeRulerMenu(Menu *m, const rational& timebase) { - m->addAction(view_timecode_view_dropframe_item_); - m->addAction(view_timecode_view_nondropframe_item_); + // If menu is already created (such as the view menu) we need to remove the instance + // of dropfram or non-dropframe timecode that is already there to avoid double displays + + if (m->actions().contains(view_timecode_view_dropframe_item_)) { + m->removeAction(view_timecode_view_dropframe_item_); + } + + if (m->actions().contains(view_timecode_view_nondropframe_item_)) { + m->removeAction(view_timecode_view_nondropframe_item_); + } + + if (Timecode::TimebaseIsDropFrame(timebase)) { + m->addAction(view_timecode_view_dropframe_item_); + } else { + 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_); diff --git a/app/widget/menu/menushared.h b/app/widget/menu/menushared.h index ae0707833..5d1cb7a1e 100644 --- a/app/widget/menu/menushared.h +++ b/app/widget/menu/menushared.h @@ -21,6 +21,7 @@ #ifndef MENUSHARED_H #define MENUSHARED_H +#include "common/rational.h" #include "widget/colorlabelmenu/colorlabelmenu.h" #include "widget/menu/menu.h" @@ -45,7 +46,7 @@ public: void AddItemsForInOutMenu(Menu* m); void AddColorCodingMenu(Menu* m); void AddItemsForClipEditMenu(Menu* m); - void AddItemsForTimeRulerMenu(Menu* m); + void AddItemsForTimeRulerMenu(Menu* m, const rational& timebase); void AboutToShowTimeRulerActions(); diff --git a/app/widget/timeruler/timeruler.cpp b/app/widget/timeruler/timeruler.cpp index 3b3f92635..18e1948f6 100644 --- a/app/widget/timeruler/timeruler.cpp +++ b/app/widget/timeruler/timeruler.cpp @@ -306,7 +306,7 @@ void TimeRuler::ShowContextMenu() { Menu m(this); - MenuShared::instance()->AddItemsForTimeRulerMenu(&m); + MenuShared::instance()->AddItemsForTimeRulerMenu(&m, timebase()); MenuShared::instance()->AboutToShowTimeRulerActions(); m.exec(QCursor::pos()); diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index f207adf6f..246dd91ed 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -112,9 +112,6 @@ MainMenu::MainMenu(MainWindow *parent) : view_decrease_track_height_item_ = view_menu_->AddItem("vzoomout", this, &MainMenu::DecreaseTrackHeightTriggered, "Ctrl+-"); view_show_all_item_ = view_menu_->AddItem("showall", this, &MainMenu::ToggleShowAllTriggered, "\\"); view_show_all_item_->setCheckable(true); - view_menu_->addSeparator(); - - MenuShared::instance()->AddItemsForTimeRulerMenu(view_menu_); view_menu_->addSeparator(); @@ -308,6 +305,15 @@ void MainMenu::ViewMenuAboutToShow() // Ensure checked timecode display mode is correct MenuShared::instance()->AboutToShowTimeRulerActions(); + + + TimeBasedPanel* p = PanelManager::instance()->MostRecentlyFocused(); + if (p) { + if (p->timebase().denominator() != 0) { + view_menu_->addSeparator(); + MenuShared::instance()->AddItemsForTimeRulerMenu(view_menu_, p->timebase()); + } + } } void MainMenu::ToolsMenuAboutToShow()