diff --git a/app/core.cpp b/app/core.cpp
index 472a8f368..21c2de974 100644
--- a/app/core.cpp
+++ b/app/core.cpp
@@ -1,3 +1,23 @@
+/***
+
+ Olive - Non-Linear Video Editor
+ Copyright (C) 2019 Olive Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+***/
+
#include "core.h"
#include
@@ -46,7 +66,7 @@ void Core::Start()
//
- // Start GUI
+ // Start GUI (TODO CLI mode)
//
// Load all icons
diff --git a/app/core.h b/app/core.h
index 1e1cd6bd0..21e8cc4ac 100644
--- a/app/core.h
+++ b/app/core.h
@@ -1,26 +1,88 @@
+/***
+
+ Olive - Non-Linear Video Editor
+ Copyright (C) 2019 Olive Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+***/
+
#ifndef CORE_H
#define CORE_H
#include "window/mainwindow/mainwindow.h"
+/**
+ * @brief The Core class
+ *
+ * The main Olive application instance. This runs both in GUI and CLI modes (and handles what to init based on that).
+ * It also contains various global functions/variables for use throughout Olive.
+ */
class Core : public QObject
{
Q_OBJECT
public:
+ /**
+ * @brief Core Constructor
+ *
+ * Currently empty
+ */
Core();
+ /**
+ * @brief Start Olive Core
+ *
+ * Main application launcher. Parses command line arguments and constructs main window (if entering a GUI mode).
+ */
void Start();
- void StartGUI();
+
+ /**
+ * @brief Stop Olive Core
+ *
+ * Ends all threads and frees all memory ready for the application to exit.
+ */
void Stop();
+ /**
+ * @brief Retrieve main window instance
+ *
+ * @return
+ *
+ * Pointer to the olive::MainWindow object, or nullptr if running in CLI mode.
+ */
olive::MainWindow* main_window();
private:
+ /**
+ * @brief Internal main window object
+ */
olive::MainWindow* main_window_;
+ /**
+ * @brief Internal startup project object
+ *
+ * If the user specifies a project file on the command line, the command line parser in Start() will write the
+ * project URL here to be loaded once Olive has finished initializing.
+ */
QString startup_project_;
};
namespace olive {
+/**
+ * @brief Core object accessible from anywhere in the code
+ *
+ * Use this to access Core functions.
+ */
extern Core core;
}
diff --git a/app/main.cpp b/app/main.cpp
index 21d275c1c..5327dafc5 100644
--- a/app/main.cpp
+++ b/app/main.cpp
@@ -1,7 +1,7 @@
/***
Olive - Non-Linear Video Editor
- Copyright (C) 2019 Olive Team
+ Copyright (C) 2019 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -43,10 +43,13 @@ int main(int argc, char *argv[]) {
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
+ // Start core
olive::core.Start();
+ // Run application loop and receive exit code
int exit_code = a.exec();
+ // Clear core memory
olive::core.Stop();
return exit_code;
diff --git a/app/widget/menu/menu.cpp b/app/widget/menu/menu.cpp
index c20aad277..880326f93 100644
--- a/app/widget/menu/menu.cpp
+++ b/app/widget/menu/menu.cpp
@@ -57,6 +57,14 @@ QAction *Menu::CreateItem(QObject* parent,
return a;
}
+void Menu::SetBooleanAction(QAction *a, bool* boolean)
+{
+ // FIXME: Connect to some boolean function
+ a->setCheckable(true);
+ a->setChecked(*boolean);
+ a->setProperty("boolptr", reinterpret_cast(boolean));
+}
+
void Menu::SetStyling()
{
//if (olive::config.use_native_menu_styling) {
diff --git a/app/widget/menu/menu.h b/app/widget/menu/menu.h
index ccbe4e3e3..079ec5e42 100644
--- a/app/widget/menu/menu.h
+++ b/app/widget/menu/menu.h
@@ -21,6 +21,8 @@ public:
const char* member,
const QString& key = QString());
+ static void SetBooleanAction(QAction* a, bool *boolean);
+
private:
void SetStyling();
};
diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp
index 6bb0416bd..5624737e2 100644
--- a/app/widget/menu/menushared.cpp
+++ b/app/widget/menu/menushared.cpp
@@ -8,10 +8,34 @@ MenuShared::MenuShared()
void MenuShared::Initialize()
{
+ // "New" menu shared items
new_project_item_ = Menu::CreateItem(this, "newproj", nullptr, nullptr, "Ctrl+N");
new_sequence_item_ = Menu::CreateItem(this, "newseq", nullptr, nullptr, "Ctrl+Shift+N");
new_folder_item_ = Menu::CreateItem(this, "newfolder", nullptr, nullptr);
+ // "Edit" menu shared items
+ edit_cut_item_ = Menu::CreateItem(this, "cut", nullptr, nullptr, "Ctrl+X");
+ edit_copy_item_ = Menu::CreateItem(this, "copy", nullptr, nullptr, "Ctrl+C");
+ edit_paste_item_ = Menu::CreateItem(this, "paste", nullptr, nullptr, "Ctrl+V");
+ edit_paste_insert_item_ = Menu::CreateItem(this, "pasteinsert", nullptr, nullptr, "Ctrl+Shift+V");
+ edit_duplicate_item_ = Menu::CreateItem(this, "duplicate", nullptr, nullptr, "Ctrl+D");
+ edit_delete_item_ = Menu::CreateItem(this, "delete", nullptr, nullptr, "Del");
+ edit_ripple_delete_item_ = Menu::CreateItem(this, "rippledelete", nullptr, nullptr, "Shift+Del");
+ edit_split_item_ = Menu::CreateItem(this, "split", nullptr, nullptr, "Ctrl+K");
+
+ // "In/Out" menu shared items
+ inout_set_in_item_ = Menu::CreateItem(this, "setinpoint", nullptr, nullptr, "I");
+ inout_set_out_item_ = Menu::CreateItem(this, "setoutpoint", nullptr, nullptr, "O");
+ inout_reset_in_item_ = Menu::CreateItem(this, "resetin", nullptr, nullptr);
+ inout_reset_out_item_ = Menu::CreateItem(this, "resetout", nullptr, nullptr);
+ inout_clear_inout_item_ = Menu::CreateItem(this, "clearinout", nullptr, nullptr, "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", nullptr, nullptr, "Ctrl+L");
+ clip_enable_disable_item_ = Menu::CreateItem(this, "enabledisable", nullptr, nullptr, "Shift+E");
+ clip_nest_item_ = Menu::CreateItem(this, "nest", nullptr, nullptr);
+
Retranslate();
}
@@ -23,9 +47,63 @@ void MenuShared::AddItemsForNewMenu(Menu *m)
m->addAction(new_folder_item_);
}
+void MenuShared::AddItemsForEditMenu(Menu *m)
+{
+ m->addAction(edit_cut_item_);
+ m->addAction(edit_copy_item_);
+ m->addAction(edit_paste_item_);
+ m->addAction(edit_paste_insert_item_);
+ m->addAction(edit_duplicate_item_);
+ m->addAction(edit_delete_item_);
+ m->addAction(edit_ripple_delete_item_);
+ m->addAction(edit_split_item_);
+}
+
+void MenuShared::AddItemsForInOutMenu(Menu *m)
+{
+ m->addAction(inout_set_in_item_);
+ m->addAction(inout_set_out_item_);
+ m->addSeparator();
+ m->addAction(inout_reset_in_item_);
+ m->addAction(inout_reset_out_item_);
+ m->addAction(inout_clear_inout_item_);
+}
+
+void MenuShared::AddItemsForClipEditMenu(Menu *m)
+{
+ m->addAction(clip_add_default_transition_item_);
+ m->addAction(clip_link_unlink_item_);
+ m->addAction(clip_enable_disable_item_);
+ m->addAction(clip_nest_item_);
+}
+
void MenuShared::Retranslate()
{
+ // "New" menu shared items
new_project_item_->setText(tr("&Project"));
new_sequence_item_->setText(tr("&Sequence"));
new_folder_item_->setText(tr("&Folder"));
+
+ // "Edit" menu shared items
+ edit_cut_item_->setText(tr("Cu&t"));
+ edit_copy_item_->setText(tr("Cop&y"));
+ edit_paste_item_->setText(tr("&Paste"));
+ edit_paste_insert_item_->setText(tr("Paste Insert"));
+ edit_duplicate_item_->setText(tr("Duplicate"));
+ edit_delete_item_->setText(tr("Delete"));
+ edit_ripple_delete_item_->setText(tr("Ripple Delete"));
+ edit_split_item_->setText(tr("Split"));
+
+ // "In/Out" menu shared items
+ inout_set_in_item_->setText(tr("Set In Point"));
+ inout_set_out_item_->setText(tr("Set Out Point"));
+ inout_reset_in_item_->setText(tr("Reset In Point"));
+ inout_reset_out_item_->setText(tr("Reset Out Point"));
+ inout_clear_inout_item_->setText(tr("Clear In/Out Point"));
+
+ // "Clip Edit" menu shared items
+ clip_add_default_transition_item_->setText(tr("Add Default Transition"));
+ clip_link_unlink_item_->setText(tr("Link/Unlink"));
+ clip_enable_disable_item_->setText(tr("Enable/Disable"));
+ clip_nest_item_->setText(tr("Nest"));
}
diff --git a/app/widget/menu/menushared.h b/app/widget/menu/menushared.h
index da361c79e..8e5fc00e5 100644
--- a/app/widget/menu/menushared.h
+++ b/app/widget/menu/menushared.h
@@ -8,15 +8,41 @@ public:
MenuShared();
void Initialize();
-
- void AddItemsForNewMenu(Menu* m);
-
-private:
void Retranslate();
+ void AddItemsForNewMenu(Menu* m);
+ void AddItemsForEditMenu(Menu* m);
+ void AddItemsForInOutMenu(Menu* m);
+ void AddItemsForClipEditMenu(Menu* m);
+
+private:
+ // "New" menu shared items
QAction* new_project_item_;
QAction* new_sequence_item_;
QAction* new_folder_item_;
+
+ // "Edit" menu shared items
+ QAction* edit_cut_item_;
+ QAction* edit_copy_item_;
+ QAction* edit_paste_item_;
+ QAction* edit_paste_insert_item_;
+ QAction* edit_duplicate_item_;
+ QAction* edit_delete_item_;
+ QAction* edit_ripple_delete_item_;
+ QAction* edit_split_item_;
+
+ // "In/Out" menu shared items
+ QAction* inout_set_in_item_;
+ QAction* inout_set_out_item_;
+ QAction* inout_reset_in_item_;
+ QAction* inout_reset_out_item_;
+ QAction* inout_clear_inout_item_;
+
+ // "Clip Edit" menu shared items
+ QAction* clip_add_default_transition_item_;
+ QAction* clip_link_unlink_item_;
+ QAction* clip_enable_disable_item_;
+ QAction* clip_nest_item_;
};
namespace olive {
diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp
index 589379f0d..4cc4f8e4f 100644
--- a/app/window/mainwindow/mainmenu.cpp
+++ b/app/window/mainwindow/mainmenu.cpp
@@ -1,3 +1,23 @@
+/***
+
+ Olive - Non-Linear Video Editor
+ Copyright (C) 2019 Olive Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+***/
+
#include "mainmenu.h"
#include
@@ -31,31 +51,234 @@ MainMenu::MainMenu(QWidget *parent) :
edit_menu_ = new Menu(this);
edit_undo_item_ = edit_menu_->AddItem("undo", nullptr, nullptr, "Ctrl+Z");
edit_redo_item_ = edit_menu_->AddItem("redo", nullptr, nullptr, "Ctrl+Shift+Z");
+ edit_menu_->addSeparator();
+ olive::menu_shared.AddItemsForEditMenu(edit_menu_);
+ edit_menu_->addSeparator();
+ edit_select_all_item_ = edit_menu_->AddItem("selectall", nullptr, nullptr, "Ctrl+A");
+ edit_deselect_all_item_ = edit_menu_->AddItem("deselectall", nullptr, nullptr, "Ctrl+Shift+A");
+ edit_menu_->addSeparator();
+ olive::menu_shared.AddItemsForClipEditMenu(edit_menu_);
+ edit_menu_->addSeparator();
+ edit_ripple_to_in_item_ = edit_menu_->AddItem("rippletoin", nullptr, nullptr, "Q");
+ edit_ripple_to_out_item_ = edit_menu_->AddItem("rippletoout", nullptr, nullptr, "W");
+ edit_edit_to_in_item_ = edit_menu_->AddItem("edittoin", nullptr, nullptr, "Ctrl+Alt+Q");
+ edit_edit_to_out_item_ = edit_menu_->AddItem("edittoout", nullptr, nullptr, "Ctrl+Alt+W");
+ edit_menu_->addSeparator();
+ olive::menu_shared.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_menu_->addSeparator();
+ edit_set_marker_item_ = edit_menu_->AddItem("marker", nullptr, nullptr, "M");
//
// VIEW MENU
//
view_menu_ = new Menu(this);
+ view_zoom_in_item_ = view_menu_->AddItem("zoomin", nullptr, nullptr, "=");
+ view_zoom_out_item_ = view_menu_->AddItem("zoomout", nullptr, nullptr, "-");
+ view_increase_track_height_item_ = view_menu_->AddItem("vzoomin", nullptr, nullptr, "Ctrl+=");
+ view_decrease_track_height_item_ = view_menu_->AddItem("vzoomout", nullptr, nullptr, "Ctrl+-");
+ view_show_all_item_ = view_menu_->AddItem("showall", nullptr, nullptr, "\\");
+ view_show_all_item_->setCheckable(true);
+ view_menu_->addSeparator();
+ view_rectified_waveforms_item_ = view_menu_->AddItem("rectifiedwaveforms", nullptr, nullptr);
+ view_rectified_waveforms_item_->setCheckable(true);
+ view_menu_->addSeparator();
+
+ QActionGroup* frame_view_mode_group = new QActionGroup(this);
+
+ view_timecode_view_frames_item_ = view_menu_->AddItem("modeframes", nullptr, nullptr);
+ //view_timecode_view_frames_item_->setData(olive::kTimecodeFrames);
+ view_timecode_view_frames_item_->setCheckable(true);
+ frame_view_mode_group->addAction(view_timecode_view_frames_item_);
+
+ view_timecode_view_dropframe_item_ = view_menu_->AddItem("modedropframe", nullptr, nullptr);
+ //view_timecode_view_dropframe_item_->setData(olive::kTimecodeDrop);
+ 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", nullptr, nullptr);
+ //view_timecode_view_nondropframe_item_->setData(olive::kTimecodeNonDrop);
+ view_timecode_view_nondropframe_item_->setCheckable(true);
+ frame_view_mode_group->addAction(view_timecode_view_nondropframe_item_);
+
+ view_timecode_view_milliseconds_item_ = view_menu_->AddItem("milliseconds", nullptr, nullptr);
+ //view_timecode_view_milliseconds_item_->setData(olive::kTimecodeMilliseconds);
+ 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", nullptr, nullptr, "F11");
+ view_full_screen_item_->setCheckable(true);
+
+ view_full_screen_viewer_item_ = view_menu_->AddItem("fullscreenviewer", nullptr, nullptr);
//
// PLAYBACK MENU
//
playback_menu_ = new Menu(this);
+ playback_gotostart_item_ = playback_menu_->AddItem("gotostart", nullptr, nullptr, "Home");
+ playback_prevframe_item_ = playback_menu_->AddItem("prevframe", nullptr, nullptr, "Left");
+ playback_playpause_item_ = playback_menu_->AddItem("playpause", nullptr, nullptr, "Space");
+ playback_playinout_item_ = playback_menu_->AddItem("playintoout", nullptr, nullptr, "Shift+Space");
+ playback_nextframe_item_ = playback_menu_->AddItem("nextframe", nullptr, nullptr, "Right");
+ playback_gotoend_item_ = playback_menu_->AddItem("gotoend", nullptr, nullptr, "End");
+
+ playback_menu_->addSeparator();
+
+ playback_prevcut_item_ = playback_menu_->AddItem("prevcut", nullptr, nullptr, "Up");
+ playback_nextcut_item_ = playback_menu_->AddItem("nextcut", nullptr, nullptr, "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_menu_->addSeparator();
+
+ playback_shuttleleft_item_ = playback_menu_->AddItem("decspeed", nullptr, nullptr, "J");
+ playback_shuttlestop_item_ = playback_menu_->AddItem("pause", nullptr, nullptr, "K");
+ playback_shuttleright_item_ = playback_menu_->AddItem("incspeed", nullptr, nullptr, "L");
+
+ playback_menu_->addSeparator();
+
+ playback_loop_item_ = playback_menu_->AddItem("loop", nullptr, nullptr);
+ //Menu::SetBooleanAction(playback_loop_item_, &olive::config.loop);
//
// WINDOW MENU
//
window_menu_ = new Menu(this);
+ window_menu_->addAction("No window support");
+ window_menu_->addSeparator();
+ window_maximize_panel_item_ = window_menu_->AddItem("maximizepanel", nullptr, nullptr, "`");
+ window_lock_layout_item_ = window_menu_->AddItem("lockpanels", nullptr, nullptr);
+ window_lock_layout_item_->setCheckable(true);
+ window_menu_->addSeparator();
+ window_reset_layout_item_ = window_menu_->AddItem("resetdefaultlayout", nullptr, nullptr);
+
+ //
+ // TOOLS MENU
+ //
+ tools_menu_ = new Menu(this);
+ tools_menu_->setToolTipsVisible(true);
+
+ QActionGroup* tools_group = new QActionGroup(this);
+
+ tools_pointer_item_ = tools_menu_->AddItem("pointertool", nullptr, nullptr, "V");
+ tools_pointer_item_->setCheckable(true);
+ //tools_pointer_item_->setData(reinterpret_cast(panel_timeline.first()->toolArrowButton));
+ tools_group->addAction(tools_pointer_item_);
+
+ tools_edit_item_ = tools_menu_->AddItem("edittool", nullptr, nullptr, "X");
+ tools_edit_item_->setCheckable(true);
+ //tools_edit_item_->setData(reinterpret_cast(panel_timeline.first()->toolEditButton));
+ tools_group->addAction(tools_edit_item_);
+
+ tools_ripple_item_ = tools_menu_->AddItem("rippletool", nullptr, nullptr, "B");
+ tools_ripple_item_->setCheckable(true);
+ //tools_ripple_item_->setData(reinterpret_cast(panel_timeline.first()->toolRippleButton));
+ tools_group->addAction(tools_ripple_item_);
+
+ tools_razor_item_ = tools_menu_->AddItem("razortool", nullptr, nullptr, "C");
+ tools_razor_item_->setCheckable(true);
+ //tools_razor_item_->setData(reinterpret_cast(panel_timeline.first()->toolRazorButton));
+ tools_group->addAction(tools_razor_item_);
+
+ tools_slip_item_ = tools_menu_->AddItem("sliptool", nullptr, nullptr, "Y");
+ tools_slip_item_->setCheckable(true);
+ //tools_slip_item_->setData(reinterpret_cast(panel_timeline.first()->toolSlipButton));
+ tools_group->addAction(tools_slip_item_);
+
+ tools_slide_item_ = tools_menu_->AddItem("slidetool", nullptr, nullptr, "U");
+ tools_slide_item_->setCheckable(true);
+ //tools_slide_item_->setData(reinterpret_cast(panel_timeline.first()->toolSlideButton));
+ tools_group->addAction(tools_slide_item_);
+
+ tools_hand_item_ = tools_menu_->AddItem("handtool", nullptr, nullptr, "H");
+ tools_hand_item_->setCheckable(true);
+ //tools_hand_item_->setData(reinterpret_cast(panel_timeline.first()->toolHandButton));
+ tools_group->addAction(tools_hand_item_);
+
+ tools_transition_item_ = tools_menu_->AddItem("transitiontool", nullptr, nullptr, "T");
+ tools_transition_item_->setCheckable(true);
+ //tools_transition_item_->setData(reinterpret_cast(panel_timeline.first()->toolTransitionButton));
+ tools_group->addAction(tools_transition_item_);
+
+ tools_menu_->addSeparator();
+
+ tools_snapping_item_ = tools_menu_->AddItem("snapping", nullptr, nullptr, "S");
+ tools_snapping_item_->setCheckable(true);
+ //tools_snapping_item_->setData(reinterpret_cast(panel_timeline.first()->snappingButton));
+
+ tools_menu_->addSeparator();
+
+ tools_autocut_silence_item_ = tools_menu_->AddItem("autocutsilence", nullptr, nullptr);
+
+ tools_menu_->addSeparator();
+
+ QActionGroup* autoscroll_group = new QActionGroup(this);
+
+ tools_autoscroll_none_item_ = tools_menu_->AddItem("autoscrollno", nullptr, nullptr);
+ //tools_autoscroll_none_item_->setData(olive::AUTOSCROLL_NO_SCROLL);
+ tools_autoscroll_none_item_->setCheckable(true);
+ autoscroll_group->addAction(tools_autoscroll_none_item_);
+
+ tools_autoscroll_page_item_ = tools_menu_->AddItem("autoscrollpage", nullptr, nullptr);
+ //tools_autoscroll_page_item_->setData(olive::AUTOSCROLL_PAGE_SCROLL);
+ tools_autoscroll_page_item_->setCheckable(true);
+ autoscroll_group->addAction(tools_autoscroll_page_item_);
+
+ tools_autoscroll_smooth_item_ = tools_menu_->AddItem("autoscrollsmooth", nullptr, nullptr);
+ //tools_autoscroll_smooth_item_->setData(olive::AUTOSCROLL_SMOOTH_SCROLL);
+ tools_autoscroll_smooth_item_->setCheckable(true);
+ autoscroll_group->addAction(tools_autoscroll_smooth_item_);
+
+ tools_menu_->addSeparator();
+
+ tools_preferences_item_ = tools_menu_->AddItem("prefs", nullptr, nullptr, "Ctrl+,");
//
// HELP MENU
//
- tools_menu_ = new Menu(this);
-
- //
- // FILE MENU
- //
help_menu_ = new Menu(this);
+ help_action_search_item_ = help_menu_->AddItem("actionsearch", nullptr, nullptr, "/");
+ help_menu_->addSeparator();
+ help_debug_log_item_ = help_menu_->AddItem("debuglog", nullptr, nullptr);
+ help_menu_->addSeparator();
+ help_about_item_ = help_menu_->AddItem("about", nullptr, nullptr);
Retranslate();
}
@@ -69,7 +292,11 @@ void MainMenu::changeEvent(QEvent *e)
}
void MainMenu::Retranslate()
-{
+{
+ // MenuShared is not a QWidget and therefore does not receive a LanguageEvent, we use MainMenu's to update it
+ olive::menu_shared.Retranslate();
+
+ // File menu
file_menu_->setTitle(tr("&File"));
file_new_menu_->setTitle(tr("&New"));
file_open_item_->setText(tr("&Open Project"));
@@ -81,14 +308,88 @@ void MainMenu::Retranslate()
file_export_item_->setText(tr("&Export..."));
file_exit_item_->setText(tr("E&xit"));
+ // Edit menu
edit_menu_->setTitle(tr("&Edit"));
edit_undo_item_->setText(tr("&Undo"));
edit_redo_item_->setText(tr("Redo"));
- edit_menu_->addSeparator();
+ edit_select_all_item_->setText(tr("Select &All"));
+ edit_deselect_all_item_->setText(tr("Deselect All"));
+ edit_ripple_to_in_item_->setText(tr("Ripple to In Point"));
+ edit_ripple_to_out_item_->setText(tr("Ripple to Out Point"));
+ edit_edit_to_in_item_->setText(tr("Edit to In Point"));
+ edit_edit_to_out_item_->setText(tr("Edit to Out Point"));
+ edit_delete_inout_item_->setText(tr("Delete In/Out Point"));
+ edit_ripple_delete_inout_item_->setText(tr("Ripple Delete In/Out Point"));
+ edit_set_marker_item_->setText(tr("Set/Edit Marker"));
+ // View menu
view_menu_->setTitle(tr("&View"));
+ view_zoom_in_item_->setText(tr("Zoom In"));
+ view_zoom_out_item_->setText(tr("Zoom Out"));
+ 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_rectified_waveforms_item_->setText(tr("Rectified Waveforms"));
+ 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->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"));
+
+ // Playback menu
playback_menu_->setTitle(tr("&Playback"));
+ playback_gotostart_item_->setText(tr("Go to Start"));
+ playback_prevframe_item_->setText(tr("Previous Frame"));
+ playback_playpause_item_->setText(tr("Play/Pause"));
+ playback_playinout_item_->setText(tr("Play In to Out"));
+ playback_nextframe_item_->setText(tr("Next Frame"));
+ playback_gotoend_item_->setText(tr("Go to End"));
+ playback_prevcut_item_->setText(tr("Go to Previous Cut"));
+ playback_nextcut_item_->setText(tr("Go to Next Cut"));
+ playback_gotoin_item_->setText(tr("Go to In Point"));
+ playback_gotoout_item_->setText(tr("Go to Out Point"));
+ playback_shuttleleft_item_->setText(tr("Shuttle Left"));
+ playback_shuttlestop_item_->setText(tr("Shuttle Stop"));
+ playback_shuttleright_item_->setText(tr("Shuttle Right"));
+ playback_loop_item_->setText(tr("Loop"));
+
+ // Window menu
window_menu_->setTitle("&Window");
+ window_maximize_panel_item_->setText(tr("Maximize Panel"));
+ window_lock_layout_item_->setText(tr("Lock Panels"));
+ window_reset_layout_item_->setText(tr("Reset to Default Layout"));
+
+ // Tools menu
tools_menu_->setTitle(tr("&Tools"));
+ tools_pointer_item_->setText(tr("Pointer Tool"));
+ tools_edit_item_->setText(tr("Edit Tool"));
+ tools_ripple_item_->setText(tr("Ripple Tool"));
+ tools_razor_item_->setText(tr("Razor Tool"));
+ tools_slip_item_->setText(tr("Slip Tool"));
+ tools_slide_item_->setText(tr("Slide Tool"));
+ tools_hand_item_->setText(tr("Hand 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_autoscroll_none_item_->setText(tr("No Auto-Scroll"));
+ tools_autoscroll_page_item_->setText(tr("Page Auto-Scroll"));
+ tools_autoscroll_smooth_item_->setText(tr("Smooth Auto-Scroll"));
+ tools_preferences_item_->setText(tr("Preferences"));
+
+ // Help menu
help_menu_->setTitle(tr("&Help"));
+ help_action_search_item_->setText(tr("A&ction Search"));
+ help_debug_log_item_->setText(tr("Debug Log"));
+ help_about_item_->setText(tr("&About..."));
}
diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h
index d40cdeec6..e8e7058cb 100644
--- a/app/window/mainwindow/mainmenu.h
+++ b/app/window/mainwindow/mainmenu.h
@@ -1,3 +1,23 @@
+/***
+
+ Olive - Non-Linear Video Editor
+ Copyright (C) 2019 Olive Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+***/
+
#ifndef MAINMENU_H
#define MAINMENU_H
@@ -30,12 +50,77 @@ private:
Menu* edit_menu_;
QAction* edit_undo_item_;
QAction* edit_redo_item_;
+ QAction* edit_select_all_item_;
+ QAction* edit_deselect_all_item_;
+ QAction* edit_ripple_to_in_item_;
+ QAction* edit_ripple_to_out_item_;
+ QAction* edit_edit_to_in_item_;
+ QAction* edit_edit_to_out_item_;
+ QAction* edit_delete_inout_item_;
+ QAction* edit_ripple_delete_inout_item_;
+ QAction* edit_set_marker_item_;
Menu* view_menu_;
+ QAction* view_zoom_in_item_;
+ QAction* view_zoom_out_item_;
+ QAction* view_increase_track_height_item_;
+ QAction* view_decrease_track_height_item_;
+ QAction* view_show_all_item_;
+ QAction* view_rectified_waveforms_item_;
+ QAction* view_timecode_view_frames_item_;
+ QAction* view_timecode_view_dropframe_item_;
+ QAction* view_timecode_view_nondropframe_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_;
+
Menu* playback_menu_;
+ QAction* playback_gotostart_item_;
+ QAction* playback_prevframe_item_;
+ QAction* playback_playpause_item_;
+ QAction* playback_playinout_item_;
+ QAction* playback_nextframe_item_;
+ QAction* playback_gotoend_item_;
+ QAction* playback_prevcut_item_;
+ QAction* playback_nextcut_item_;
+ QAction* playback_gotoin_item_;
+ QAction* playback_gotoout_item_;
+ QAction* playback_shuttleleft_item_;
+ QAction* playback_shuttlestop_item_;
+ QAction* playback_shuttleright_item_;
+ QAction* playback_loop_item_;
+
Menu* window_menu_;
+ QAction* window_maximize_panel_item_;
+ QAction* window_lock_layout_item_;
+ QAction* window_reset_layout_item_;
+
Menu* tools_menu_;
+ QAction* tools_pointer_item_;
+ QAction* tools_edit_item_;
+ QAction* tools_ripple_item_;
+ QAction* tools_razor_item_;
+ QAction* tools_slip_item_;
+ QAction* tools_slide_item_;
+ QAction* tools_hand_item_;
+ QAction* tools_transition_item_;
+ QAction* tools_snapping_item_;
+ QAction* tools_autocut_silence_item_;
+ QAction* tools_autoscroll_none_item_;
+ QAction* tools_autoscroll_page_item_;
+ QAction* tools_autoscroll_smooth_item_;
+ QAction* tools_preferences_item_;
+
Menu* help_menu_;
+ QAction* help_action_search_item_;
+ QAction* help_debug_log_item_;
+ QAction* help_about_item_;
};
#endif // MAINMENU_H
diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp
index 0d9dc7ec2..3d10c3526 100644
--- a/app/window/mainwindow/mainwindow.cpp
+++ b/app/window/mainwindow/mainwindow.cpp
@@ -1,3 +1,23 @@
+/***
+
+ Olive - Non-Linear Video Editor
+ Copyright (C) 2019 Olive Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+***/
+
#include "mainwindow.h"
// Panel objects
diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h
index 94b7840e5..d5dd0213c 100644
--- a/app/window/mainwindow/mainwindow.h
+++ b/app/window/mainwindow/mainwindow.h
@@ -1,3 +1,23 @@
+/***
+
+ Olive - Non-Linear Video Editor
+ Copyright (C) 2019 Olive Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+***/
+
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
@@ -8,7 +28,7 @@ namespace olive {
/**
* @brief The MainWindow class
*
- * Olive's main window responsible for docking widgets.
+ * Olive's main window responsible for docking widgets and the main menu bar.
*/
class MainWindow : public QMainWindow {
Q_OBJECT