mainmenu/menushared: rewrote convenience functions to use new qt signal/slot syntax

Code improvement
This commit is contained in:
itsmattkc
2020-04-17 00:20:46 +10:00
parent a5c1de6df3
commit 42905d1d51
7 changed files with 299 additions and 221 deletions
+10 -48
View File
@@ -24,28 +24,18 @@
OLIVE_NAMESPACE_ENTER
Menu::Menu(QMenuBar *bar, const QObject* receiver, const char* member) :
QMenu(bar)
Menu::Menu(QMenuBar *bar)
{
StyleManager::UseNativeWindowsStyling(this);
bar->addMenu(this);
if (receiver != nullptr) {
connect(this, SIGNAL(aboutToShow()), receiver, member);
}
Init();
}
Menu::Menu(Menu *menu, const QObject *receiver, const char *member) :
QMenu(menu)
Menu::Menu(Menu *menu)
{
StyleManager::UseNativeWindowsStyling(this);
menu->addMenu(this);
if (receiver != nullptr) {
connect(this, SIGNAL(aboutToShow()), receiver, member);
}
Init();
}
Menu::Menu(QWidget *parent) :
@@ -60,18 +50,6 @@ Menu::Menu(const QString &s, QWidget *parent) :
StyleManager::UseNativeWindowsStyling(this);
}
QAction *Menu::AddItem(const QString &id,
const QObject *receiver,
const char *member,
const QString &key)
{
QAction* a = CreateItem(this, id, receiver, member, key);
addAction(a);
return a;
}
QAction* Menu::InsertAlphabetically(const QString &s)
{
QAction* action = new QAction(s);
@@ -100,24 +78,7 @@ void Menu::InsertAlphabetically(Menu *menu)
InsertAlphabetically(action);
}
QAction *Menu::CreateItem(QObject* parent,
const QString &id,
const QObject *receiver,
const char *member,
const QString &key)
{
QAction* a = new QAction(parent);
ConformItem(a,
id,
receiver,
member,
key);
return a;
}
void Menu::ConformItem(QAction* a, const QString &id, const QObject *receiver, const char *member, const QString &key)
void Menu::ConformItem(QAction *a, const QString &id, const QString &key)
{
a->setProperty("id", id);
@@ -128,10 +89,6 @@ void Menu::ConformItem(QAction* a, const QString &id, const QObject *receiver, c
// Set to application context so that ViewerWindows still trigger shortcuts
a->setShortcutContext(Qt::ApplicationShortcut);
}
if (receiver != nullptr) {
connect(a, SIGNAL(triggered(bool)), receiver, member);
}
}
void Menu::SetBooleanAction(QAction *a, bool* boolean)
@@ -142,4 +99,9 @@ void Menu::SetBooleanAction(QAction *a, bool* boolean)
a->setProperty("boolptr", reinterpret_cast<quintptr>(boolean));
}
void Menu::Init()
{
StyleManager::UseNativeWindowsStyling(this);
}
OLIVE_NAMESPACE_EXIT
+70 -10
View File
@@ -23,6 +23,7 @@
#include <QMenuBar>
#include <QMenu>
#include <QMetaMethod>
#include "common/define.h"
@@ -46,21 +47,43 @@ OLIVE_NAMESPACE_ENTER
class Menu : public QMenu
{
public:
Menu(QMenuBar* bar);
template <typename Func>
/**
* @brief Construct a Menu and add it to a QMenuBar
*
* This Menu can be connected to a slot that's triggered when the Menu is "about to show". Use `receiver` and
* `member` to connect this (same syntax as QObject::connect) or leave as nullptr to not.
*/
Menu(QMenuBar* bar, const QObject* receiver = nullptr, const char* member = nullptr);
Menu(QMenuBar* bar,
const typename QtPrivate::FunctionPointer<Func>::Object *receiver,
Func member)
{
bar->addMenu(this);
Init();
ConnectAboutToShow(receiver, member);
}
Menu(Menu* menu);
template <typename Func>
/**
* @brief Construct a Menu and add it as a submenu to another Menu
*
* This Menu can be connected to a slot that's triggered when the Menu is "about to show". Use `receiver` and
* `member` to connect this (same syntax as QObject::connect) or leave as nullptr to not.
*/
Menu(Menu* bar, const QObject* receiver = nullptr, const char* member = nullptr);
Menu(Menu* menu,
const typename QtPrivate::FunctionPointer<Func>::Object *receiver,
Func member)
{
menu->addMenu(this);
Init();
ConnectAboutToShow(receiver, member);
}
/**
* @brief Construct a popup menu
@@ -72,6 +95,7 @@ public:
*/
Menu(const QString& s, QWidget* parent = nullptr);
template <typename Func>
/**
* @brief Create a menu item and add it to this menu
*
@@ -96,14 +120,22 @@ public:
* The QAction that was created and added to this Menu
*/
QAction* AddItem(const QString& id,
const QObject* receiver,
const char* member,
const QString &key = QString());
const typename QtPrivate::FunctionPointer<Func>::Object *receiver,
Func member,
const QString &key = QString())
{
QAction* a = CreateItem(this, id, receiver, member, key);
addAction(a);
return a;
}
QAction *InsertAlphabetically(const QString& s);
void InsertAlphabetically(QAction* entry);
void InsertAlphabetically(Menu* menu);
template <typename Func>
/**
* @brief Create a menu item
*
@@ -133,10 +165,22 @@ public:
*/
static QAction* CreateItem(QObject* parent,
const QString& id,
const QObject* receiver,
const char* member,
const QString& key = QString());
const typename QtPrivate::FunctionPointer<Func>::Object *receiver,
Func member,
const QString& key = QString())
{
QAction* a = new QAction(parent);
ConformItem(a,
id,
receiver,
member,
key);
return a;
}
template <typename Func>
/**
* @brief Conform a QAction to Olive's ID/keydefault system
*
@@ -165,13 +209,29 @@ public:
*/
static void ConformItem(QAction *a,
const QString& id,
const QObject* receiver,
const char* member,
const typename QtPrivate::FunctionPointer<Func>::Object *receiver,
Func member,
const QString& key = QString())
{
ConformItem(a, id, key);
connect(a, &QAction::triggered, receiver, member);
}
static void ConformItem(QAction *a,
const QString& id,
const QString& key = QString());
static void SetBooleanAction(QAction* a, bool *boolean);
private:
void Init();
template <typename Func>
void ConnectAboutToShow(const typename QtPrivate::FunctionPointer<Func>::Object *receiver, Func member)
{
connect(this, &Menu::aboutToShow, receiver, member);
}
};
+45 -20
View File
@@ -31,32 +31,32 @@ MenuShared* MenuShared::instance_ = nullptr;
MenuShared::MenuShared()
{
// "New" menu shared items
new_project_item_ = Menu::CreateItem(this, "newproj", nullptr, nullptr, "Ctrl+N");
new_sequence_item_ = Menu::CreateItem(this, "newseq", Core::instance(), SLOT(CreateNewSequence()), "Ctrl+Shift+N");
new_folder_item_ = Menu::CreateItem(this, "newfolder", Core::instance(), SLOT(CreateNewFolder()));
new_project_item_ = Menu::CreateItem(this, "newproj", this, &MenuShared::NewProjectTriggered, "Ctrl+N");
new_sequence_item_ = Menu::CreateItem(this, "newseq", Core::instance(), &Core::CreateNewSequence, "Ctrl+Shift+N");
new_folder_item_ = Menu::CreateItem(this, "newfolder", Core::instance(), &Core::CreateNewFolder);
// "Edit" menu shared items
edit_cut_item_ = Menu::CreateItem(this, "cut", this, SLOT(CutTriggered()), "Ctrl+X");
edit_copy_item_ = Menu::CreateItem(this, "copy", this, SLOT(CopyTriggered()), "Ctrl+C");
edit_paste_item_ = Menu::CreateItem(this, "paste", this, SLOT(PasteTriggered()), "Ctrl+V");
edit_paste_insert_item_ = Menu::CreateItem(this, "pasteinsert", this, SLOT(PasteInsertTriggered()), "Ctrl+Shift+V");
edit_duplicate_item_ = Menu::CreateItem(this, "duplicate", nullptr, nullptr, "Ctrl+D");
edit_delete_item_ = Menu::CreateItem(this, "delete", this, SLOT(DeleteSelectedTriggered()), "Del");
edit_ripple_delete_item_ = Menu::CreateItem(this, "rippledelete", this, SLOT(RippleDeleteTriggered()), "Shift+Del");
edit_split_item_ = Menu::CreateItem(this, "split", this, SLOT(SplitAtPlayheadTriggered()), "Ctrl+K");
edit_cut_item_ = Menu::CreateItem(this, "cut", this, &MenuShared::CutTriggered, "Ctrl+X");
edit_copy_item_ = Menu::CreateItem(this, "copy", this, &MenuShared::CopyTriggered, "Ctrl+C");
edit_paste_item_ = Menu::CreateItem(this, "paste", this, &MenuShared::PasteTriggered, "Ctrl+V");
edit_paste_insert_item_ = Menu::CreateItem(this, "pasteinsert", this, &MenuShared::PasteInsertTriggered, "Ctrl+Shift+V");
edit_duplicate_item_ = Menu::CreateItem(this, "duplicate", this, &MenuShared::DuplicateTriggered, "Ctrl+D");
edit_delete_item_ = Menu::CreateItem(this, "delete", this, &MenuShared::DeleteSelectedTriggered, "Del");
edit_ripple_delete_item_ = Menu::CreateItem(this, "rippledelete", this, &MenuShared::RippleDeleteTriggered, "Shift+Del");
edit_split_item_ = Menu::CreateItem(this, "split", this, &MenuShared::SplitAtPlayheadTriggered, "Ctrl+K");
// "In/Out" menu shared items
inout_set_in_item_ = Menu::CreateItem(this, "setinpoint", this, SLOT(SetInTriggered()), "I");
inout_set_out_item_ = Menu::CreateItem(this, "setoutpoint", this, SLOT(SetOutTriggered()), "O");
inout_reset_in_item_ = Menu::CreateItem(this, "resetin", this, SLOT(ResetInTriggered()));
inout_reset_out_item_ = Menu::CreateItem(this, "resetout", this, SLOT(ResetOutTriggered()));
inout_clear_inout_item_ = Menu::CreateItem(this, "clearinout", this, SLOT(ClearInOutTriggered()), "G");
inout_set_in_item_ = Menu::CreateItem(this, "setinpoint", this, &MenuShared::SetInTriggered, "I");
inout_set_out_item_ = Menu::CreateItem(this, "setoutpoint", this, &MenuShared::SetOutTriggered, "O");
inout_reset_in_item_ = Menu::CreateItem(this, "resetin", this, &MenuShared::ResetInTriggered);
inout_reset_out_item_ = Menu::CreateItem(this, "resetout", this, &MenuShared::ResetOutTriggered);
inout_clear_inout_item_ = Menu::CreateItem(this, "clearinout", this, &MenuShared::ClearInOutTriggered, "G");
// "Clip Edit" menu shared items
clip_add_default_transition_item_ = Menu::CreateItem(this, "deftransition", nullptr, nullptr, "Ctrl+Shift+D");
clip_link_unlink_item_ = Menu::CreateItem(this, "linkunlink", this, SLOT(ToggleLinksTriggered()), "Ctrl+L");
clip_enable_disable_item_ = Menu::CreateItem(this, "enabledisable", nullptr, nullptr, "Shift+E");
clip_nest_item_ = Menu::CreateItem(this, "nest", nullptr, nullptr);
clip_add_default_transition_item_ = Menu::CreateItem(this, "deftransition", this, &MenuShared::DefaultTransitionTriggered, "Ctrl+Shift+D");
clip_link_unlink_item_ = Menu::CreateItem(this, "linkunlink", this, &MenuShared::ToggleLinksTriggered, "Ctrl+L");
clip_enable_disable_item_ = Menu::CreateItem(this, "enabledisable", this, &MenuShared::EnableDisableTriggered, "Shift+E");
clip_nest_item_ = Menu::CreateItem(this, "nest", this, &MenuShared::NestTriggered);
Retranslate();
}
@@ -114,6 +114,11 @@ MenuShared *MenuShared::instance()
return instance_;
}
void MenuShared::NewProjectTriggered()
{
qDebug() << "FIXME: Stub";
}
void MenuShared::SplitAtPlayheadTriggered()
{
TimelinePanel* timeline = PanelManager::instance()->MostRecentlyFocused<TimelinePanel>();
@@ -183,6 +188,26 @@ void MenuShared::PasteInsertTriggered()
PanelManager::instance()->CurrentlyFocused()->PasteInsert();
}
void MenuShared::DuplicateTriggered()
{
qDebug() << "FIXME: Stub";
}
void MenuShared::EnableDisableTriggered()
{
qDebug() << "FIXME: Stub";
}
void MenuShared::NestTriggered()
{
qDebug() << "FIXME: Stub";
}
void MenuShared::DefaultTransitionTriggered()
{
qDebug() << "FIXME: Stub";
}
void MenuShared::Retranslate()
{
// "New" menu shared items
+10
View File
@@ -77,6 +77,8 @@ private:
static MenuShared* instance_;
private slots:
void NewProjectTriggered();
void SplitAtPlayheadTriggered();
void DeleteSelectedTriggered();
@@ -103,6 +105,14 @@ private slots:
void PasteInsertTriggered();
void DuplicateTriggered();
void EnableDisableTriggered();
void NestTriggered();
void DefaultTransitionTriggered();
};
OLIVE_NAMESPACE_EXIT
+111 -116
View File
@@ -35,7 +35,7 @@
OLIVE_NAMESPACE_ENTER
MainMenu::MainMenu(QMainWindow *parent) :
MainMenu::MainMenu(MainWindow *parent) :
QMenuBar(parent)
{
StyleManager::UseNativeWindowsStyling(this);
@@ -43,22 +43,22 @@ MainMenu::MainMenu(QMainWindow *parent) :
//
// FILE MENU
//
file_menu_ = new Menu(this, this, SLOT(FileMenuAboutToShow()));
file_menu_ = new Menu(this, this, &MainMenu::FileMenuAboutToShow);
file_new_menu_ = new Menu(file_menu_);
MenuShared::instance()->AddItemsForNewMenu(file_new_menu_);
file_open_item_ = file_menu_->AddItem("openproj", Core::instance(), SLOT(OpenProject()), "Ctrl+O");
file_open_item_ = file_menu_->AddItem("openproj", Core::instance(), &Core::OpenProject, "Ctrl+O");
file_open_recent_menu_ = new Menu(file_menu_);
file_open_recent_clear_item_ = file_open_recent_menu_->AddItem("clearopenrecent", nullptr, nullptr);
file_save_item_ = file_menu_->AddItem("saveproj", Core::instance(), SLOT(SaveActiveProject()), "Ctrl+S");
file_save_as_item_ = file_menu_->AddItem("saveprojas", Core::instance(), SLOT(SaveActiveProjectAs()), "Ctrl+Shift+S");
file_open_recent_clear_item_ = file_open_recent_menu_->AddItem("clearopenrecent", this, &MainMenu::ClearOpenRecentTriggered);
file_save_item_ = file_menu_->AddItem("saveproj", Core::instance(), &Core::SaveActiveProject, "Ctrl+S");
file_save_as_item_ = file_menu_->AddItem("saveprojas", Core::instance(), &Core::SaveActiveProjectAs, "Ctrl+Shift+S");
file_menu_->addSeparator();
file_import_item_ = file_menu_->AddItem("import", Core::instance(), SLOT(DialogImportShow()), "Ctrl+I");
file_import_item_ = file_menu_->AddItem("import", Core::instance(), &Core::DialogImportShow, "Ctrl+I");
file_menu_->addSeparator();
file_export_item_ = file_menu_->AddItem("export", Core::instance(), SLOT(DialogExportShow()), "Ctrl+M");
file_export_item_ = file_menu_->AddItem("export", Core::instance(), &Core::DialogExportShow, "Ctrl+M");
file_menu_->addSeparator();
file_project_properties_item_ = file_menu_->AddItem("projectproperties", Core::instance(), SLOT(DialogProjectPropertiesShow()));
file_project_properties_item_ = file_menu_->AddItem("projectproperties", Core::instance(), &Core::DialogProjectPropertiesShow);
file_menu_->addSeparator();
file_exit_item_ = file_menu_->AddItem("exit", parent, SLOT(close()), "Ctrl+Q");
file_exit_item_ = file_menu_->AddItem("exit", parent, &MainWindow::close, "Ctrl+Q");
//
// EDIT MENU
@@ -66,236 +66,200 @@ MainMenu::MainMenu(QMainWindow *parent) :
edit_menu_ = new Menu(this);
edit_undo_item_ = Core::instance()->undo_stack()->createUndoAction(this);
Menu::ConformItem(edit_undo_item_, "undo", nullptr, nullptr, "Ctrl+Z");
Menu::ConformItem(edit_undo_item_, "undo", "Ctrl+Z");
edit_menu_->addAction(edit_undo_item_);
edit_redo_item_ = Core::instance()->undo_stack()->createRedoAction(this);
Menu::ConformItem(edit_redo_item_, "redo", nullptr, nullptr, "Ctrl+Shift+Z");
Menu::ConformItem(edit_redo_item_, "redo", "Ctrl+Shift+Z");
edit_menu_->addAction(edit_redo_item_);
edit_menu_->addSeparator();
MenuShared::instance()->AddItemsForEditMenu(edit_menu_);
edit_menu_->addSeparator();
edit_select_all_item_ = edit_menu_->AddItem("selectall", this, SLOT(SelectAllTriggered()), "Ctrl+A");
edit_deselect_all_item_ = edit_menu_->AddItem("deselectall", this, SLOT(DeselectAllTriggered()), "Ctrl+Shift+A");
edit_select_all_item_ = edit_menu_->AddItem("selectall", this, &MainMenu::SelectAllTriggered, "Ctrl+A");
edit_deselect_all_item_ = edit_menu_->AddItem("deselectall", this, &MainMenu::DeselectAllTriggered, "Ctrl+Shift+A");
edit_menu_->addSeparator();
MenuShared::instance()->AddItemsForClipEditMenu(edit_menu_);
edit_menu_->addSeparator();
edit_insert_item_ = edit_menu_->AddItem("insert", this, SLOT(InsertTriggered()), ",");
edit_overwrite_item_ = edit_menu_->AddItem("overwrite", this, SLOT(OverwriteTriggered()), ".");
edit_insert_item_ = edit_menu_->AddItem("insert", this, &MainMenu::InsertTriggered, ",");
edit_overwrite_item_ = edit_menu_->AddItem("overwrite", this, &MainMenu::OverwriteTriggered, ".");
edit_menu_->addSeparator();
edit_ripple_to_in_item_ = edit_menu_->AddItem("rippletoin", this, SLOT(RippleToInTriggered()), "Q");
edit_ripple_to_out_item_ = edit_menu_->AddItem("rippletoout", this, SLOT(RippleToOutTriggered()), "W");
edit_edit_to_in_item_ = edit_menu_->AddItem("edittoin", this, SLOT(EditToInTriggered()), "Ctrl+Alt+Q");
edit_edit_to_out_item_ = edit_menu_->AddItem("edittoout", this, SLOT(EditToOutTriggered()), "Ctrl+Alt+W");
edit_ripple_to_in_item_ = edit_menu_->AddItem("rippletoin", this, &MainMenu::RippleToInTriggered, "Q");
edit_ripple_to_out_item_ = edit_menu_->AddItem("rippletoout", this, &MainMenu::RippleToOutTriggered, "W");
edit_edit_to_in_item_ = edit_menu_->AddItem("edittoin", this, &MainMenu::EditToInTriggered, "Ctrl+Alt+Q");
edit_edit_to_out_item_ = edit_menu_->AddItem("edittoout", this, &MainMenu::EditToOutTriggered, "Ctrl+Alt+W");
edit_menu_->addSeparator();
MenuShared::instance()->AddItemsForInOutMenu(edit_menu_);
edit_delete_inout_item_ = edit_menu_->AddItem("deleteinout", nullptr, nullptr, ";");
edit_ripple_delete_inout_item_ = edit_menu_->AddItem("rippledeleteinout", nullptr, nullptr, "'");
edit_delete_inout_item_ = edit_menu_->AddItem("deleteinout", this, &MainMenu::DeleteInOutTriggered, ";");
edit_ripple_delete_inout_item_ = edit_menu_->AddItem("rippledeleteinout", this, &MainMenu::RippleDeleteInOutTriggered, "'");
edit_menu_->addSeparator();
edit_set_marker_item_ = edit_menu_->AddItem("marker", this, SLOT(SetMarkerTriggered()), "M");
edit_set_marker_item_ = edit_menu_->AddItem("marker", this, &MainMenu::SetMarkerTriggered, "M");
//
// VIEW MENU
//
view_menu_ = new Menu(this, this, SLOT(ViewMenuAboutToShow()));
view_zoom_in_item_ = view_menu_->AddItem("zoomin", this, SLOT(ZoomInTriggered()), "=");
view_zoom_out_item_ = view_menu_->AddItem("zoomout", this, SLOT(ZoomOutTriggered()), "-");
view_increase_track_height_item_ = view_menu_->AddItem("vzoomin", this, SLOT(IncreaseTrackHeightTriggered()), "Ctrl+=");
view_decrease_track_height_item_ = view_menu_->AddItem("vzoomout", this, SLOT(DecreaseTrackHeightTriggered()), "Ctrl+-");
view_show_all_item_ = view_menu_->AddItem("showall", this, SLOT(ToggleShowAllTriggered()), "\\");
view_menu_ = new Menu(this, this, &MainMenu::ViewMenuAboutToShow);
view_zoom_in_item_ = view_menu_->AddItem("zoomin", this, &MainMenu::ZoomInTriggered, "=");
view_zoom_out_item_ = view_menu_->AddItem("zoomout", this, &MainMenu::ZoomOutTriggered, "-");
view_increase_track_height_item_ = view_menu_->AddItem("vzoomin", this, &MainMenu::IncreaseTrackHeightTriggered, "Ctrl+=");
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();
frame_view_mode_group_ = new QActionGroup(this);
view_timecode_view_dropframe_item_ = view_menu_->AddItem("modedropframe", this, SLOT(TimecodeDisplayTriggered()));
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, SLOT(TimecodeDisplayTriggered()));
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, SLOT(TimecodeDisplayTriggered()));
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, SLOT(TimecodeDisplayTriggered()));
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, SLOT(TimecodeDisplayTriggered()));
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_);
view_menu_->addSeparator();
view_title_safe_area_menu_ = new Menu(view_menu_);
QActionGroup* title_safe_group = new QActionGroup(this);
title_safe_off_item_ = view_title_safe_area_menu_->AddItem("titlesafeoff", nullptr, nullptr);
title_safe_off_item_->setCheckable(true);
title_safe_off_item_->setData(qSNaN());
title_safe_group->addAction(title_safe_off_item_);
title_safe_default_item_ = view_title_safe_area_menu_->AddItem("titlesafedefault", nullptr, nullptr);
title_safe_default_item_->setCheckable(true);
title_safe_default_item_->setData(0.0);
title_safe_group->addAction(title_safe_default_item_);
title_safe_43_item_ = view_title_safe_area_menu_->AddItem("titlesafe43", nullptr, nullptr);
title_safe_43_item_->setCheckable(true);
title_safe_43_item_->setData(4.0/3.0);
title_safe_group->addAction(title_safe_43_item_);
title_safe_169_item_ = view_title_safe_area_menu_->AddItem("titlesafe169", nullptr, nullptr);
title_safe_169_item_->setCheckable(true);
title_safe_169_item_->setData(16.0/9.0);
title_safe_group->addAction(title_safe_169_item_);
title_safe_custom_item_ = view_title_safe_area_menu_->AddItem("titlesafecustom", nullptr, nullptr);
title_safe_custom_item_->setCheckable(true);
title_safe_custom_item_->setData(-1.0);
title_safe_group->addAction(title_safe_custom_item_);
view_menu_->addSeparator();
view_full_screen_item_ = view_menu_->AddItem("fullscreen", parent, SLOT(SetFullscreen(bool)), "F11");
view_full_screen_item_ = view_menu_->AddItem("fullscreen", parent, &MainWindow::SetFullscreen, "F11");
view_full_screen_item_->setCheckable(true);
view_full_screen_viewer_item_ = view_menu_->AddItem("fullscreenviewer", this, SLOT(FullScreenViewerTriggered()));
view_full_screen_viewer_item_ = view_menu_->AddItem("fullscreenviewer", this, &MainMenu::FullScreenViewerTriggered);
//
// PLAYBACK MENU
//
playback_menu_ = new Menu(this);
playback_gotostart_item_ = playback_menu_->AddItem("gotostart", this, SLOT(GoToStartTriggered()), "Home");
playback_prevframe_item_ = playback_menu_->AddItem("prevframe", this, SLOT(PrevFrameTriggered()), "Left");
playback_playpause_item_ = playback_menu_->AddItem("playpause", this, SLOT(PlayPauseTriggered()), "Space");
playback_playinout_item_ = playback_menu_->AddItem("playintoout", nullptr, nullptr, "Shift+Space");
playback_nextframe_item_ = playback_menu_->AddItem("nextframe", this, SLOT(NextFrameTriggered()), "Right");
playback_gotoend_item_ = playback_menu_->AddItem("gotoend", this, SLOT(GoToEndTriggered()), "End");
playback_gotostart_item_ = playback_menu_->AddItem("gotostart", this, &MainMenu::GoToStartTriggered, "Home");
playback_prevframe_item_ = playback_menu_->AddItem("prevframe", this, &MainMenu::PrevFrameTriggered, "Left");
playback_playpause_item_ = playback_menu_->AddItem("playpause", this, &MainMenu::PlayPauseTriggered, "Space");
playback_playinout_item_ = playback_menu_->AddItem("playintoout", this, &MainMenu::PlayInToOutTriggered, "Shift+Space");
playback_nextframe_item_ = playback_menu_->AddItem("nextframe", this, &MainMenu::NextFrameTriggered, "Right");
playback_gotoend_item_ = playback_menu_->AddItem("gotoend", this, &MainMenu::GoToEndTriggered, "End");
playback_menu_->addSeparator();
playback_prevcut_item_ = playback_menu_->AddItem("prevcut", this, SLOT(GoToPrevCutTriggered()), "Up");
playback_nextcut_item_ = playback_menu_->AddItem("nextcut", this, SLOT(GoToNextCutTriggered()), "Down");
playback_prevcut_item_ = playback_menu_->AddItem("prevcut", this, &MainMenu::GoToPrevCutTriggered, "Up");
playback_nextcut_item_ = playback_menu_->AddItem("nextcut", this, &MainMenu::GoToNextCutTriggered, "Down");
playback_menu_->addSeparator();
playback_gotoin_item_ = playback_menu_->AddItem("gotoin", nullptr, nullptr, "Shift+I");
playback_gotoout_item_ = playback_menu_->AddItem("gotoout", nullptr, nullptr, "Shift+O");
playback_gotoin_item_ = playback_menu_->AddItem("gotoin", this, &MainMenu::GoToInTriggered, "Shift+I");
playback_gotoout_item_ = playback_menu_->AddItem("gotoout", this, &MainMenu::GoToOutTriggered, "Shift+O");
playback_menu_->addSeparator();
playback_shuttleleft_item_ = playback_menu_->AddItem("decspeed", this, SLOT(ShuttleLeftTriggered()), "J");
playback_shuttlestop_item_ = playback_menu_->AddItem("pause", this, SLOT(ShuttleStopTriggered()), "K");
playback_shuttleright_item_ = playback_menu_->AddItem("incspeed", this, SLOT(ShuttleRightTriggered()), "L");
playback_shuttleleft_item_ = playback_menu_->AddItem("decspeed", this, &MainMenu::ShuttleLeftTriggered, "J");
playback_shuttlestop_item_ = playback_menu_->AddItem("pause", this, &MainMenu::ShuttleStopTriggered, "K");
playback_shuttleright_item_ = playback_menu_->AddItem("incspeed", this, &MainMenu::ShuttleRightTriggered, "L");
playback_menu_->addSeparator();
playback_loop_item_ = playback_menu_->AddItem("loop", nullptr, nullptr);
playback_loop_item_ = playback_menu_->AddItem("loop", this, &MainMenu::LoopTriggered);
//Menu::SetBooleanAction(playback_loop_item_, &olive::config.loop);
//
// WINDOW MENU
//
window_menu_ = new Menu(this, this, SLOT(WindowMenuAboutToShow()));
connect(window_menu_, SIGNAL(aboutToHide()), this, SLOT(WindowMenuAboutToHide()));
window_menu_ = new Menu(this, this, &MainMenu::WindowMenuAboutToShow);
connect(window_menu_, &Menu::aboutToHide, this, &MainMenu::WindowMenuAboutToHide);
window_menu_separator_ = window_menu_->addSeparator();
window_maximize_panel_item_ = window_menu_->AddItem("maximizepanel", parent, SLOT(ToggleMaximizedPanel()), "`");
window_lock_layout_item_ = window_menu_->AddItem("lockpanels", PanelManager::instance(), SLOT(SetPanelsLocked(bool)));
window_maximize_panel_item_ = window_menu_->AddItem("maximizepanel", parent, &MainWindow::ToggleMaximizedPanel, "`");
window_lock_layout_item_ = window_menu_->AddItem("lockpanels", PanelManager::instance(), &PanelManager::SetPanelsLocked);
window_lock_layout_item_->setCheckable(true);
window_menu_->addSeparator();
window_reset_layout_item_ = window_menu_->AddItem("resetdefaultlayout", Core::instance()->main_window(), SLOT(SetDefaultLayout()));
window_reset_layout_item_ = window_menu_->AddItem("resetdefaultlayout", parent, &MainWindow::SetDefaultLayout);
//
// TOOLS MENU
//
tools_menu_ = new Menu(this, this, SLOT(ToolsMenuAboutToShow()));
tools_menu_ = new Menu(this, this, &MainMenu::ToolsMenuAboutToShow);
tools_menu_->setToolTipsVisible(true);
tools_group_ = new QActionGroup(this);
tools_pointer_item_ = tools_menu_->AddItem("pointertool", this, SLOT(ToolItemTriggered()), "V");
tools_pointer_item_ = tools_menu_->AddItem("pointertool", this, &MainMenu::ToolItemTriggered, "V");
tools_pointer_item_->setCheckable(true);
tools_pointer_item_->setData(Tool::kPointer);
tools_group_->addAction(tools_pointer_item_);
tools_edit_item_ = tools_menu_->AddItem("edittool", this, SLOT(ToolItemTriggered()), "X");
tools_edit_item_ = tools_menu_->AddItem("edittool", this, &MainMenu::ToolItemTriggered, "X");
tools_edit_item_->setCheckable(true);
tools_edit_item_->setData(Tool::kEdit);
tools_group_->addAction(tools_edit_item_);
tools_ripple_item_ = tools_menu_->AddItem("rippletool", this, SLOT(ToolItemTriggered()), "B");
tools_ripple_item_ = tools_menu_->AddItem("rippletool", this, &MainMenu::ToolItemTriggered, "B");
tools_ripple_item_->setCheckable(true);
tools_ripple_item_->setData(Tool::kRipple);
tools_group_->addAction(tools_ripple_item_);
tools_rolling_item_ = tools_menu_->AddItem("rollingtool", this, SLOT(ToolItemTriggered()), "N");
tools_rolling_item_ = tools_menu_->AddItem("rollingtool", this, &MainMenu::ToolItemTriggered, "N");
tools_rolling_item_->setCheckable(true);
tools_rolling_item_->setData(Tool::kRolling);
tools_group_->addAction(tools_rolling_item_);
tools_razor_item_ = tools_menu_->AddItem("razortool", this, SLOT(ToolItemTriggered()), "C");
tools_razor_item_ = tools_menu_->AddItem("razortool", this, &MainMenu::ToolItemTriggered, "C");
tools_razor_item_->setCheckable(true);
tools_razor_item_->setData(Tool::kRazor);
tools_group_->addAction(tools_razor_item_);
tools_slip_item_ = tools_menu_->AddItem("sliptool", this, SLOT(ToolItemTriggered()), "Y");
tools_slip_item_ = tools_menu_->AddItem("sliptool", this, &MainMenu::ToolItemTriggered, "Y");
tools_slip_item_->setCheckable(true);
tools_slip_item_->setData(Tool::kSlip);
tools_group_->addAction(tools_slip_item_);
tools_slide_item_ = tools_menu_->AddItem("slidetool", this, SLOT(ToolItemTriggered()), "U");
tools_slide_item_ = tools_menu_->AddItem("slidetool", this, &MainMenu::ToolItemTriggered, "U");
tools_slide_item_->setCheckable(true);
tools_slide_item_->setData(Tool::kSlide);
tools_group_->addAction(tools_slide_item_);
tools_hand_item_ = tools_menu_->AddItem("handtool", this, SLOT(ToolItemTriggered()), "H");
tools_hand_item_ = tools_menu_->AddItem("handtool", this, &MainMenu::ToolItemTriggered, "H");
tools_hand_item_->setCheckable(true);
tools_hand_item_->setData(Tool::kHand);
tools_group_->addAction(tools_hand_item_);
tools_zoom_item_ = tools_menu_->AddItem("zoomtool", this, SLOT(ToolItemTriggered()), "Z");
tools_zoom_item_ = tools_menu_->AddItem("zoomtool", this, &MainMenu::ToolItemTriggered, "Z");
tools_zoom_item_->setCheckable(true);
tools_zoom_item_->setData(Tool::kZoom);
tools_group_->addAction(tools_zoom_item_);
tools_transition_item_ = tools_menu_->AddItem("transitiontool", this, SLOT(ToolItemTriggered()), "T");
tools_transition_item_ = tools_menu_->AddItem("transitiontool", this, &MainMenu::ToolItemTriggered, "T");
tools_transition_item_->setCheckable(true);
tools_transition_item_->setData(Tool::kTransition);
tools_group_->addAction(tools_transition_item_);
tools_menu_->addSeparator();
tools_snapping_item_ = tools_menu_->AddItem("snapping", nullptr, nullptr, "S");
tools_snapping_item_ = tools_menu_->AddItem("snapping", Core::instance(), &Core::SetSnapping, "S");
tools_snapping_item_->setCheckable(true);
connect(tools_snapping_item_, SIGNAL(triggered(bool)), Core::instance(), SLOT(SetSnapping(bool)));
tools_menu_->addSeparator();
tools_autocut_silence_item_ = tools_menu_->AddItem("autocutsilence", nullptr, nullptr);
tools_menu_->addSeparator();
tools_preferences_item_ = tools_menu_->AddItem("prefs", Core::instance(), SLOT(DialogPreferencesShow()), "Ctrl+,");
tools_preferences_item_ = tools_menu_->AddItem("prefs", Core::instance(), &Core::DialogPreferencesShow, "Ctrl+,");
//
// HELP MENU
//
help_menu_ = new Menu(this);
help_action_search_item_ = help_menu_->AddItem("actionsearch", this, SLOT(ActionSearchTriggered()), "/");
help_action_search_item_ = help_menu_->AddItem("actionsearch", this, &MainMenu::ActionSearchTriggered, "/");
help_menu_->addSeparator();
help_debug_log_item_ = help_menu_->AddItem("debuglog", nullptr, nullptr);
help_debug_log_item_ = help_menu_->AddItem("debuglog", this, &MainMenu::DebugLogTriggered);
help_menu_->addSeparator();
help_about_item_ = help_menu_->AddItem("about", Core::instance(), SLOT(DialogAboutShow()));
help_about_item_ = help_menu_->AddItem("about", Core::instance(), &Core::DialogAboutShow);
Retranslate();
}
@@ -427,6 +391,16 @@ void MainMenu::PlayPauseTriggered()
PanelManager::instance()->CurrentlyFocused()->PlayPause();
}
void MainMenu::PlayInToOutTriggered()
{
qDebug() << "FIXME: Stub";
}
void MainMenu::LoopTriggered()
{
qDebug() << "FIXME: Stub";
}
void MainMenu::NextFrameTriggered()
{
PanelManager::instance()->CurrentlyFocused()->NextFrame();
@@ -524,6 +498,36 @@ void MainMenu::ToggleShowAllTriggered()
PanelManager::instance()->CurrentlyFocused()->ToggleShowAll();
}
void MainMenu::ClearOpenRecentTriggered()
{
qDebug() << "FIXME: Stub";
}
void MainMenu::DeleteInOutTriggered()
{
qDebug() << "FIXME: Stub";
}
void MainMenu::RippleDeleteInOutTriggered()
{
qDebug() << "FIXME: Stub";
}
void MainMenu::GoToInTriggered()
{
PanelManager::instance()->CurrentlyFocused()->GoToIn();
}
void MainMenu::GoToOutTriggered()
{
PanelManager::instance()->CurrentlyFocused()->GoToOut();
}
void MainMenu::DebugLogTriggered()
{
qDebug() << "FIXME: Stub";
}
void MainMenu::Retranslate()
{
// MenuShared is not a QWidget and therefore does not receive a LanguageEvent, we use MainMenu's to update it
@@ -571,14 +575,6 @@ void MainMenu::Retranslate()
view_timecode_view_milliseconds_item_->setText(tr("Milliseconds"));
view_timecode_view_seconds_item_->setText(tr("Seconds"));
// View->Title/Action Safe Area Menu
view_title_safe_area_menu_->setTitle(tr("Title/Action Safe Area"));
title_safe_off_item_->setText(tr("Off"));
title_safe_default_item_->setText(tr("Default"));
title_safe_43_item_->setText(tr("4:3"));
title_safe_169_item_->setText(tr("16:9"));
title_safe_custom_item_->setText(tr("Custom"));
// View menu (cont'd)
view_full_screen_item_->setText(tr("Full Screen"));
view_full_screen_viewer_item_->setText(tr("Full Screen Viewer"));
@@ -619,7 +615,6 @@ void MainMenu::Retranslate()
tools_zoom_item_->setText(tr("Zoom Tool"));
tools_transition_item_->setText(tr("Transition Tool"));
tools_snapping_item_->setText(tr("Enable Snapping"));
tools_autocut_silence_item_->setText(tr("Auto-Cut Silence"));
tools_preferences_item_->setText(tr("Preferences"));
// Help menu
+17 -8
View File
@@ -29,6 +29,8 @@
OLIVE_NAMESPACE_ENTER
class MainWindow;
/**
* @brief Olive's main menubar attached to its main window.
*
@@ -38,7 +40,7 @@ class MainMenu : public QMenuBar
{
Q_OBJECT
public:
MainMenu(QMainWindow* parent);
MainMenu(MainWindow *parent);
protected:
/**
@@ -119,6 +121,10 @@ private slots:
*/
void PlayPauseTriggered();
void PlayInToOutTriggered();
void LoopTriggered();
void NextFrameTriggered();
void GoToEndTriggered();
@@ -148,6 +154,16 @@ private slots:
void ToggleShowAllTriggered();
void ClearOpenRecentTriggered();
void DeleteInOutTriggered();
void RippleDeleteInOutTriggered();
void GoToInTriggered();
void GoToOutTriggered();
void DebugLogTriggered();
private:
/**
* @brief Set strings based on the current application language.
@@ -193,12 +209,6 @@ private:
QAction* view_timecode_view_seconds_item_;
QAction* view_timecode_view_frames_item_;
QAction* view_timecode_view_milliseconds_item_;
Menu* view_title_safe_area_menu_;
QAction* title_safe_off_item_;
QAction* title_safe_default_item_;
QAction* title_safe_43_item_;
QAction* title_safe_169_item_;
QAction* title_safe_custom_item_;
QAction* view_full_screen_item_;
QAction* view_full_screen_viewer_item_;
@@ -237,7 +247,6 @@ private:
QAction* tools_zoom_item_;
QAction* tools_transition_item_;
QAction* tools_snapping_item_;
QAction* tools_autocut_silence_item_;
QAction* tools_preferences_item_;
Menu* help_menu_;
+36 -19
View File
@@ -66,27 +66,16 @@ MainWindow::MainWindow(QWidget *parent) :
// Create standard panels
node_panel_ = PanelManager::instance()->CreatePanel<NodePanel>(this);
addDockWidget(Qt::TopDockWidgetArea, node_panel_);
footage_viewer_panel_ = PanelManager::instance()->CreatePanel<FootageViewerPanel>(this);
addDockWidget(Qt::TopDockWidgetArea, footage_viewer_panel_);
param_panel_ = PanelManager::instance()->CreatePanel<ParamPanel>(this);
tabifyDockWidget(footage_viewer_panel_, param_panel_);
footage_viewer_panel_->raise();
sequence_viewer_panel_ = PanelManager::instance()->CreatePanel<SequenceViewerPanel>(this);
addDockWidget(Qt::TopDockWidgetArea, sequence_viewer_panel_);
pixel_sampler_panel_ = PanelManager::instance()->CreatePanel<PixelSamplerPanel>(this);
addDockWidget(Qt::TopDockWidgetArea, pixel_sampler_panel_);
project_panel_ = PanelManager::instance()->CreatePanel<ProjectPanel>(this);
addDockWidget(Qt::BottomDockWidgetArea, project_panel_);
tool_panel_ = PanelManager::instance()->CreatePanel<ToolPanel>(this);
addDockWidget(Qt::BottomDockWidgetArea, tool_panel_);
task_man_panel_ = PanelManager::instance()->CreatePanel<TaskManagerPanel>(this);
addDockWidget(Qt::BottomDockWidgetArea, task_man_panel_);
curve_panel_ = PanelManager::instance()->CreatePanel<CurvePanel>(this);
addDockWidget(Qt::BottomDockWidgetArea, curve_panel_);
AppendTimelinePanel();
audio_monitor_panel_ = PanelManager::instance()->CreatePanel<AudioMonitorPanel>(this);
addDockWidget(Qt::BottomDockWidgetArea, audio_monitor_panel_);
// Make connections to sequence viewer
connect(node_panel_, &NodePanel::SelectionChanged, param_panel_, &ParamPanel::SetNodes);
@@ -321,9 +310,7 @@ TimelinePanel* MainWindow::AppendTimelinePanel()
{
TimelinePanel* panel = PanelManager::instance()->CreatePanel<TimelinePanel>(this);;
if (timeline_panels_.isEmpty()) {
addDockWidget(Qt::BottomDockWidgetArea, panel);
} else {
if (!timeline_panels_.isEmpty()) {
tabifyDockWidget(timeline_panels_.last(), panel);
// For some reason raise() on its own doesn't do anything, we need both
@@ -390,12 +377,42 @@ void MainWindow::FocusedPanelChanged(PanelWidget *panel)
void MainWindow::SetDefaultLayout()
{
task_man_panel_->close();
task_man_panel_->setFloating(true);
curve_panel_->close();
curve_panel_->setFloating(true);
pixel_sampler_panel_->close();
node_panel_->show();
addDockWidget(Qt::TopDockWidgetArea, node_panel_);
footage_viewer_panel_->show();
addDockWidget(Qt::TopDockWidgetArea, footage_viewer_panel_);
param_panel_->show();
tabifyDockWidget(footage_viewer_panel_, param_panel_);
footage_viewer_panel_->raise();
sequence_viewer_panel_->show();
addDockWidget(Qt::TopDockWidgetArea, sequence_viewer_panel_);
pixel_sampler_panel_->hide();
pixel_sampler_panel_->setFloating(true);
addDockWidget(Qt::TopDockWidgetArea, pixel_sampler_panel_);
project_panel_->show();
addDockWidget(Qt::BottomDockWidgetArea, project_panel_);
tool_panel_->show();
addDockWidget(Qt::BottomDockWidgetArea, tool_panel_);
timeline_panels_.first()->show();
addDockWidget(Qt::BottomDockWidgetArea, timeline_panels_.first());
curve_panel_->hide();
curve_panel_->setFloating(true);
addDockWidget(Qt::BottomDockWidgetArea, curve_panel_);
task_man_panel_->hide();
task_man_panel_->setFloating(true);
addDockWidget(Qt::BottomDockWidgetArea, task_man_panel_);
audio_monitor_panel_->show();
addDockWidget(Qt::BottomDockWidgetArea, audio_monitor_panel_);
resizeDocks({node_panel_, param_panel_, sequence_viewer_panel_},
{width()/3, width()/3, width()/3},