diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index af9ebdbbf..ebbd48e7e 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -54,7 +54,6 @@ KeySequenceEditor::KeySequenceEditor(QWidget* parent, QAction* a) : QKeySequenceEdit(parent), action(a) { setKeySequence(action->shortcut()); - //connect(this, SIGNAL(editingFinished()), this, SLOT(set_action_shortcut())); } void KeySequenceEditor::set_action_shortcut() { @@ -195,6 +194,9 @@ void PreferencesDialog::save() { if (olive::CurrentConfig.use_software_fallback != use_software_fallbacks_checkbox->isChecked() || olive::CurrentConfig.thumbnail_resolution != thumbnail_res_spinbox->value() || olive::CurrentConfig.waveform_resolution != waveform_res_spinbox->value() +#ifdef Q_OS_WIN32 + || olive::CurrentConfig.use_native_menu_styling != native_menus->isChecked() +#endif || olive::CurrentConfig.style != static_cast(ui_style->currentData().toInt())) { // any changes to these settings will require a restart - ask the user if we should do one now or later @@ -258,6 +260,7 @@ void PreferencesDialog::save() { olive::CurrentConfig.language_file = language_combobox->currentData().toString(); olive::CurrentConfig.style = static_cast(ui_style->currentData().toInt()); + olive::CurrentConfig.use_native_menu_styling = native_menus->isChecked(); // Check if the thumbnail or waveform icon if (olive::CurrentConfig.thumbnail_resolution != thumbnail_res_spinbox->value() @@ -583,6 +586,16 @@ void PreferencesDialog::setup_ui() { row++; +#ifdef Q_OS_WIN + // Native menu styling is only available on Windows. Environments like Ubuntu and Mac use the native menu system by + // default + native_menus = new QCheckBox(tr("Use Native Menu Styling")); + native_menus->setChecked(olive::CurrentConfig.use_native_menu_styling); + appearance_layout->addWidget(native_menus, row, 0, 1, 3); + + row++; +#endif + // Appearance -> Custom CSS appearance_layout->addWidget(new QLabel(tr("Custom CSS:"), this), row, 0); diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index d93ff5ab3..714912fa0 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -104,6 +104,9 @@ private: QCheckBox* add_default_effects_to_clips; QComboBox* ui_style; Sequence sequence_settings; +#ifdef Q_OS_WIN + QCheckBox* native_menus; +#endif QVector key_shortcut_actions; QVector key_shortcut_items; diff --git a/global/config.cpp b/global/config.cpp index 53b43e42a..29ea9be76 100644 --- a/global/config.cpp +++ b/global/config.cpp @@ -72,7 +72,8 @@ Config::Config() thumbnail_resolution(120), add_default_effects_to_clips(true), invert_timeline_scroll_axes(true), - style(olive::styling::kOliveDefaultDark) + style(olive::styling::kOliveDefaultDark), + use_native_menu_styling(true) {} void Config::load(QString path) { @@ -215,6 +216,9 @@ void Config::load(QString path) { } else if (stream.name() == "Style") { stream.readNext(); style = static_cast(stream.text().toInt()); + } else if (stream.name() == "NativeMenuStyling") { + stream.readNext(); + use_native_menu_styling = (stream.text() == "1"); } } } @@ -283,6 +287,7 @@ void Config::save(QString path) { stream.writeTextElement("WaveformResolution", QString::number(waveform_resolution)); stream.writeTextElement("AddDefaultEffectsToClips", QString::number(add_default_effects_to_clips)); stream.writeTextElement("Style", QString::number(style)); + stream.writeTextElement("NativeMenuStyling", QString::number(use_native_menu_styling)); stream.writeEndElement(); // configuration stream.writeEndDocument(); // doc diff --git a/global/config.h b/global/config.h index 3b768e31e..849acc2e1 100644 --- a/global/config.h +++ b/global/config.h @@ -526,6 +526,13 @@ struct Config { */ olive::styling::Style style; + /** + * @brief Use native menu styling + * + * Use native styling on menus rather than cross-platform Fusion. + */ + bool use_native_menu_styling; + /** * @brief Load config from file * diff --git a/global/global.cpp b/global/global.cpp index bdc5d08e0..16a59c9c6 100644 --- a/global/global.cpp +++ b/global/global.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "panels/panels.h" @@ -141,6 +142,15 @@ void OliveGlobal::load_translation_from_config() { } } +void OliveGlobal::SetNativeStyling(QWidget *w) +{ +#ifdef Q_OS_WIN + w->setStyleSheet(""); + w->setPalette(w->style()->standardPalette()); + w->setStyle(QStyleFactory::create("windowsvista")); +#endif +} + void OliveGlobal::new_project() { if (can_close_project()) { // clear graph editor diff --git a/global/global.h b/global/global.h index 429960a11..6a9d57617 100644 --- a/global/global.h +++ b/global/global.h @@ -115,6 +115,15 @@ public: */ void load_translation_from_config(); + /** + * @brief Set native UI styling on a given widget + * + * @param w + * + * The widget to set styling on. + */ + static void SetNativeStyling(QWidget* w); + public slots: /** * @brief Undo user's last action diff --git a/olive.pro b/olive.pro index 54d2bf32c..95509fe66 100644 --- a/olive.pro +++ b/olive.pro @@ -174,7 +174,8 @@ SOURCES += \ ui/styling.cpp \ undo/undostack.cpp \ effects/internal/richtexteffect.cpp \ - ui/blur.cpp + ui/blur.cpp \ + ui/menu.cpp HEADERS += \ ui/mainwindow.h \ @@ -302,7 +303,8 @@ HEADERS += \ ui/styling.h \ undo/undostack.h \ effects/internal/richtexteffect.h \ - ui/blur.h + ui/blur.h \ + ui/menu.h FORMS += diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 5de095626..e12e4cc93 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -20,7 +20,6 @@ #include "effectcontrols.h" -#include #include #include #include @@ -52,6 +51,7 @@ #include "ui/keyframeview.h" #include "ui/resizablescrollbar.h" #include "global/debug.h" +#include "ui/menu.h" EffectControls::EffectControls(QWidget *parent) : Panel(parent), @@ -198,7 +198,7 @@ void EffectControls::show_effect_menu(int type, int subtype) { effects_loaded.lock(); - QMenu effects_menu(this); + Menu effects_menu(this); effects_menu.setToolTipsVisible(true); for (int i=0;isetToolTipsVisible(true); parent->setTitle(em.category); @@ -536,7 +536,7 @@ void EffectControls::queue_post_update() { } void EffectControls::effects_area_context_menu() { - QMenu menu(this); + Menu menu(this); olive::MenuHelper.create_effect_paste_action(&menu); diff --git a/panels/project.cpp b/panels/project.cpp index e5c3fbaa0..9da084b0a 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -20,6 +20,26 @@ #include "project.h" +extern "C" { +#include +#include +} + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "global/global.h" #include "panels.h" #include "rendering/renderfunctions.h" @@ -43,27 +63,7 @@ #include "project/sourcescommon.h" #include "project/projectfilter.h" #include "global/debug.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" { -#include -#include -} +#include "ui/menu.h" // TODO make these configurable const int kDefaultSequenceWidth = 1920; @@ -1374,7 +1374,7 @@ void Project::go_up_dir() { } void Project::make_new_menu() { - QMenu new_menu(this); + Menu new_menu(this); olive::MenuHelper.make_new_menu(&new_menu); new_menu.exec(QCursor::pos()); } diff --git a/panels/timeline.cpp b/panels/timeline.cpp index f10941a4e..37c276d9b 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -20,6 +20,20 @@ #include "timeline.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "global/global.h" #include "panels/panels.h" #include "project/projectelements.h" @@ -39,21 +53,7 @@ #include "ui/mainwindow.h" #include "undo/undostack.h" #include "global/debug.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "ui/menu.h" int olive::timeline::kTrackDefaultHeight = 40; int olive::timeline::kTrackMinHeight = 30; @@ -1730,7 +1730,7 @@ int Timeline::getTimelineScreenPointFromFrame(long frame) { } void Timeline::add_btn_click() { - QMenu add_menu(this); + Menu add_menu(this); QAction* titleMenuItem = new QAction(&add_menu); titleMenuItem->setText(tr("Title...")); @@ -1793,7 +1793,7 @@ void Timeline::record_btn_click() { void Timeline::transition_tool_click() { creating = false; - QMenu transition_menu(this); + Menu transition_menu(this); for (int i=0;i -#include #include #include #include @@ -44,6 +43,7 @@ #include "ui/viewerwidget.h" #include "project/proxygenerator.h" #include "ui/mainwindow.h" +#include "ui/menu.h" #include "undo/undostack.h" SourcesCommon::SourcesCommon(Project* parent) : @@ -74,17 +74,19 @@ void SourcesCommon::create_seq_from_selected() { } void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& items) { - QMenu menu(parent); + Menu menu(parent); selected_items = items; QAction* import_action = menu.addAction(tr("Import...")); QObject::connect(import_action, SIGNAL(triggered(bool)), project_parent, SLOT(import_dialog())); - QMenu* new_menu = menu.addMenu(tr("New")); + Menu* new_menu = new Menu(tr("New")); + menu.addMenu(new_menu); olive::MenuHelper.make_new_menu(new_menu); - QMenu* view_menu = menu.addMenu(tr("View")); + Menu* view_menu = new Menu(tr("View")); + menu.addMenu(view_menu); QAction* tree_view_action = view_menu->addAction(tr("Tree View")); connect(tree_view_action, SIGNAL(triggered(bool)), project_parent, SLOT(set_tree_view())); @@ -160,7 +162,8 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it QAction* delete_footage_from_sequences = menu.addAction(tr("Delete All Clips Using This Media")); QObject::connect(delete_footage_from_sequences, SIGNAL(triggered(bool)), project_parent, SLOT(delete_clips_using_selected_media())); - QMenu* proxies = menu.addMenu(tr("Proxy")); + Menu* proxies = new Menu(tr("Proxy")); + menu.addMenu(proxies); // special case if one footage item is selected and its proxy is currently being generated if (cached_selected_footage.size() == 1 diff --git a/ui/effectui.cpp b/ui/effectui.cpp index aca514805..4cbee4fa7 100644 --- a/ui/effectui.cpp +++ b/ui/effectui.cpp @@ -1,12 +1,12 @@ #include "effectui.h" #include -#include #include "timeline/clip.h" #include "ui/menuhelper.h" #include "ui/keyframenavigator.h" #include "ui/clickablelabel.h" +#include "ui/menu.h" #include "panels/panels.h" EffectUI::EffectUI(Effect* e) : @@ -273,7 +273,7 @@ void EffectUI::AttachKeyframeNavigationToRow(EffectRow *row, KeyframeNavigator * void EffectUI::show_context_menu(const QPoint& pos) { if (effect_->meta->type == EFFECT_TYPE_EFFECT) { - QMenu menu; + Menu menu; Clip* c = effect_->parent_clip; diff --git a/ui/graphview.cpp b/ui/graphview.cpp index e955db06a..3e13075cd 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include "global/config.h" @@ -37,6 +36,7 @@ #include "effects/effect.h" #include "timeline/clip.h" #include "ui/rectangleselect.h" +#include "ui/menu.h" #include "global/debug.h" const double kGraphZoomSpeed = 0.05; @@ -75,7 +75,7 @@ GraphView::GraphView(QWidget* parent) : QWidget(parent) { } void GraphView::show_context_menu(const QPoint& pos) { - QMenu menu(this); + Menu menu(this); QAction* zoom_to_selection = menu.addAction(tr("Zoom to Selection")); if (selected_keys.size() == 0 || row == nullptr) { diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 55b0d6b18..7e3b6c679 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -22,7 +22,6 @@ #include #include -#include #include "effects/effect.h" #include "ui/collapsiblewidget.h" @@ -42,6 +41,7 @@ #include "ui/rectangleselect.h" #include "effects/keyframe.h" #include "ui/graphview.h" +#include "ui/menu.h" KeyframeView::KeyframeView(QWidget *parent) : QWidget(parent), @@ -69,7 +69,7 @@ void KeyframeView::SetEffects(const QVector &open_effects) void KeyframeView::show_context_menu(const QPoint& pos) { if (selected_fields.size() > 0) { - QMenu menu(this); + Menu menu(this); QAction* linear = menu.addAction(tr("Linear")); linear->setData(EFFECT_KEYFRAME_LINEAR); diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index f83165abf..93fcbf698 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -20,17 +20,18 @@ #include "labelslider.h" +#include +#include +#include +#include + #include "undo/undo.h" #include "panels/viewer.h" #include "global/config.h" #include "global/math.h" #include "global/debug.h" #include "ui/styling.h" - -#include -#include -#include -#include +#include "ui/menu.h" LabelSlider::LabelSlider(QWidget* parent) : QLabel(parent) { // set a default frame rate - fallback, shouldn't ever really be used @@ -265,7 +266,7 @@ void LabelSlider::SetActiveCursor() { void LabelSlider::ShowContextMenu(const QPoint &pos) { - QMenu menu(this); + Menu menu(this); menu.addAction(tr("&Edit"), this, SLOT(ShowDialog())); diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index d70bda49b..32bbc81df 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -438,11 +438,9 @@ void MainWindow::editMenu_About_To_Be_Shown() { void MainWindow::setup_menus() { QMenuBar* menuBar = new QMenuBar(this); - /* - menuBar->setStyle(QStyleFactory::create("windowsvista")); - menuBar->setPalette(menuBar->style()->standardPalette()); - menuBar->setStyleSheet(""); - */ + if (olive::CurrentConfig.use_native_menu_styling) { + OliveGlobal::SetNativeStyling(menuBar); + } setMenuBar(menuBar); diff --git a/ui/menu.cpp b/ui/menu.cpp new file mode 100644 index 000000000..20a6990ca --- /dev/null +++ b/ui/menu.cpp @@ -0,0 +1,20 @@ +#include "menu.h" + +#include "global/global.h" +#include "global/config.h" + +Menu::Menu(QWidget *parent) : + QMenu(parent) +{ + if (olive::CurrentConfig.use_native_menu_styling) { + OliveGlobal::SetNativeStyling(this); + } +} + +Menu::Menu(const QString &title, QWidget *parent) : + QMenu(title, parent) +{ + if (olive::CurrentConfig.use_native_menu_styling) { + OliveGlobal::SetNativeStyling(this); + } +} diff --git a/ui/menu.h b/ui/menu.h new file mode 100644 index 000000000..6b33e60e3 --- /dev/null +++ b/ui/menu.h @@ -0,0 +1,13 @@ +#ifndef MENU_H +#define MENU_H + +#include + +class Menu : public QMenu +{ +public: + Menu(QWidget* parent = nullptr); + Menu(const QString &title, QWidget *parent = nullptr); +}; + +#endif // MENU_H diff --git a/ui/menuhelper.cpp b/ui/menuhelper.cpp index 5aea11144..9a637861e 100644 --- a/ui/menuhelper.cpp +++ b/ui/menuhelper.cpp @@ -271,10 +271,10 @@ void MenuHelper::create_effect_paste_action(QMenu *menu) paste_action->setEnabled(clipboard.size() > 0 && clipboard_type == CLIPBOARD_TYPE_EFFECT); } -QMenu* MenuHelper::create_submenu(QMenuBar* parent, +Menu* MenuHelper::create_submenu(QMenuBar* parent, const QObject *receiver, const char *member) { - QMenu* menu = new QMenu(parent); + Menu* menu = new Menu(parent); /* menu->setStyle(QStyleFactory::create("windowsvista")); @@ -291,8 +291,8 @@ QMenu* MenuHelper::create_submenu(QMenuBar* parent, return menu; } -QMenu* MenuHelper::create_submenu(QMenu* parent) { - QMenu* menu = new QMenu(parent); +Menu* MenuHelper::create_submenu(QMenu* parent) { + Menu* menu = new Menu(parent); /* menu->setStyle(QStyleFactory::create("windowsvista")); diff --git a/ui/menuhelper.h b/ui/menuhelper.h index 9e1783b3e..24b50db7b 100644 --- a/ui/menuhelper.h +++ b/ui/menuhelper.h @@ -22,9 +22,10 @@ #define MENUHELPER_H #include -#include #include +#include "ui/menu.h" + class MenuHelper : public QObject { Q_OBJECT public: @@ -126,10 +127,10 @@ public: void Retranslate(); - static QMenu* create_submenu(QMenuBar* parent, + static Menu *create_submenu(QMenuBar* parent, const QObject *receiver = nullptr, const char *member = nullptr); - static QMenu* create_submenu(QMenu* parent); + static Menu* create_submenu(QMenu* parent); static QAction* create_menu_action(QWidget *parent, const char* id, const QObject *receiver = nullptr, diff --git a/ui/texteditex.cpp b/ui/texteditex.cpp index 7c558ce98..3400217fc 100644 --- a/ui/texteditex.cpp +++ b/ui/texteditex.cpp @@ -21,9 +21,9 @@ #include "texteditex.h" #include -#include #include "dialogs/texteditdialog.h" +#include "ui/menu.h" #include "mainwindow.h" TextEditEx::TextEditEx(QWidget *parent, bool enable_rich_text) : @@ -37,7 +37,7 @@ TextEditEx::TextEditEx(QWidget *parent, bool enable_rich_text) : } void TextEditEx::text_edit_menu() { - QMenu menu; + Menu menu; menu.addAction(tr("&Edit Text"), this, SLOT(open_text_edit())); diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index c95b56e4c..0f1bb5aa7 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include "mainwindow.h" @@ -36,6 +35,7 @@ #include "panels/viewer.h" #include "global/config.h" #include "global/global.h" +#include "ui/menu.h" #include "ui/menuhelper.h" #include "global/debug.h" #include "undo/undostack.h" @@ -457,7 +457,7 @@ void TimelineHeader::paintEvent(QPaintEvent*) { } void TimelineHeader::show_context_menu(const QPoint &pos) { - QMenu menu(this); + Menu menu(this); // Add items for setting the in/out points of a QMenu olive::MenuHelper.make_inout_menu(&menu); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 0db9e46d0..2de81a528 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -52,6 +51,7 @@ #include "rendering/renderfunctions.h" #include "ui/cursors.h" #include "ui/menuhelper.h" +#include "ui/menu.h" #include "ui/focusfilter.h" #include "dialogs/clippropertiesdialog.h" #include "global/debug.h" @@ -86,7 +86,7 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { panel_timeline->rect_select_init = false; panel_timeline->rect_select_proc = false; - QMenu menu(this); + Menu menu(this); QAction* undoAction = menu.addAction(tr("&Undo")); QAction* redoAction = menu.addAction(tr("&Redo")); diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index cfeceb1f2..581c6a11c 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -32,7 +32,6 @@ extern "C" { #include #include #include -#include #include #include #include @@ -58,6 +57,7 @@ extern "C" { #include "rendering/renderfunctions.h" #include "rendering/renderthread.h" #include "ui/viewerwindow.h" +#include "ui/menu.h" #include "mainwindow.h" ViewerWidget::ViewerWidget(QWidget *parent) : @@ -112,12 +112,13 @@ void ViewerWidget::set_fullscreen(int screen) { } void ViewerWidget::show_context_menu() { - QMenu menu(this); + Menu menu(this); QAction* save_frame_as_image = menu.addAction(tr("Save Frame as Image...")); connect(save_frame_as_image, SIGNAL(triggered(bool)), this, SLOT(save_frame())); - QMenu* fullscreen_menu = menu.addMenu(tr("Show Fullscreen")); + Menu* fullscreen_menu = new Menu(tr("Show Fullscreen")); + menu.addMenu(fullscreen_menu); QList screens = QGuiApplication::screens(); if (window->isVisible()) { fullscreen_menu->addAction(tr("Disable")); @@ -131,7 +132,7 @@ void ViewerWidget::show_context_menu() { } connect(fullscreen_menu, SIGNAL(triggered(QAction*)), this, SLOT(fullscreen_menu_action(QAction*))); - QMenu zoom_menu(tr("Zoom")); + Menu zoom_menu(tr("Zoom")); QAction* fit_zoom = zoom_menu.addAction(tr("Fit")); connect(fit_zoom, SIGNAL(triggered(bool)), this, SLOT(set_fit_zoom())); zoom_menu.addAction("10%")->setData(0.1);