]> git.sesse.net Git - nageru/commitdiff
Add a copy of the right-click HDMI/SDI output video menu on the main menu bar.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 25 Feb 2017 09:36:50 +0000 (10:36 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 25 Feb 2017 09:36:58 +0000 (10:36 +0100)
Makefile
context_menus.cpp [new file with mode: 0644]
context_menus.h [new file with mode: 0644]
glwidget.cpp
mainwindow.cpp
ui_mainwindow.ui

index 99914248d19868d60f5a62fd18c879fc38bc7f2f..6d46bc38619f8803db2ddf93dbff9d5d5cb1d573 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -17,7 +17,7 @@ LDLIBS=$(shell pkg-config --libs $(PKG_MODULES)) -pthread -lva -lva-drm -lva-x11
 OBJS_WITH_MOC = glwidget.o mainwindow.o vumeter.o lrameter.o compression_reduction_meter.o correlation_meter.o aboutdialog.o input_mapping_dialog.o midi_mapping_dialog.o nonlinear_fader.o
 OBJS += $(OBJS_WITH_MOC)
 OBJS += $(OBJS_WITH_MOC:.o=.moc.o) ellipsis_label.moc.o clickable_label.moc.o
-OBJS += vu_common.o piecewise_interpolator.o main.o
+OBJS += context_menus.o vu_common.o piecewise_interpolator.o main.o
 OBJS += midi_mapper.o midi_mapping.pb.o
 
 # Mixer objects
diff --git a/context_menus.cpp b/context_menus.cpp
new file mode 100644 (file)
index 0000000..790de94
--- /dev/null
@@ -0,0 +1,66 @@
+#include <QActionGroup>
+#include <QMenu>
+#include <QObject>
+
+#include <map>
+
+#include "mixer.h"
+
+using namespace std;
+
+void fill_hdmi_sdi_output_device_menu(QMenu *menu)
+{
+       menu->clear();
+       QActionGroup *card_group = new QActionGroup(menu);
+       int current_card = global_mixer->get_output_card_index();
+
+       QAction *none_action = new QAction("None", card_group);
+       none_action->setCheckable(true);
+       if (current_card == -1) {
+               none_action->setChecked(true);
+       }
+       QObject::connect(none_action, &QAction::triggered, []{ global_mixer->set_output_card(-1); });
+       menu->addAction(none_action);
+
+       unsigned num_cards = global_mixer->get_num_cards();
+       for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+               if (!global_mixer->card_can_be_used_as_output(card_index)) {
+                       continue;
+               }
+
+               QString description(QString::fromStdString(global_mixer->get_output_card_description(card_index)));
+               QAction *action = new QAction(description, card_group);
+               action->setCheckable(true);
+               if (current_card == int(card_index)) {
+                       action->setChecked(true);
+               }
+               QObject::connect(action, &QAction::triggered, [card_index]{ global_mixer->set_output_card(card_index); });
+               menu->addAction(action);
+       }
+}
+
+void fill_hdmi_sdi_output_resolution_menu(QMenu *menu)
+{
+       menu->clear();
+       int current_card = global_mixer->get_output_card_index();
+       if (current_card == -1) {
+               menu->setEnabled(false);
+               return;
+       }
+
+       menu->setEnabled(true);
+       QActionGroup *resolution_group = new QActionGroup(menu);
+       uint32_t current_mode = global_mixer->get_output_video_mode();
+       map<uint32_t, bmusb::VideoMode> video_modes = global_mixer->get_available_output_video_modes();
+       for (const auto &mode : video_modes) {
+               QString description(QString::fromStdString(mode.second.name));
+               QAction *action = new QAction(description, resolution_group);
+               action->setCheckable(true);
+               if (current_mode == mode.first) {
+                       action->setChecked(true);
+               }
+               const uint32_t mode_id = mode.first;
+               QObject::connect(action, &QAction::triggered, [mode_id]{ global_mixer->set_output_video_mode(mode_id); });
+               menu->addAction(action);
+       }
+}
diff --git a/context_menus.h b/context_menus.h
new file mode 100644 (file)
index 0000000..2f9005d
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _CONTEXT_MENUS_H
+#define _CONTEXT_MENUS_H 1
+
+// Some context menus for controlling various I/O selections,
+// based on data from Mixer.
+
+class QMenu;
+
+// Populate a submenu for selecting output card, with an action for each card.
+// Will call into the mixer on trigger.
+void fill_hdmi_sdi_output_device_menu(QMenu *menu);
+
+// Populate a submenu for choosing the output resolution. Since this is
+// card-dependent, the entire menu is disabled if we haven't chosen a card
+// (but it's still there so that the user will know it exists).
+// Will call into the mixer on trigger.
+void fill_hdmi_sdi_output_resolution_menu(QMenu *menu);
+
+#endif  // !defined(_CONTEXT_MENUS_H)
index ae4b62f09da9b1d17039c84dcb8f4373d561af08..0dd4a569aea3c458a14771bba3ff953d8afe538a 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "audio_mixer.h"
 #include "context.h"
+#include "context_menus.h"
 #include "flags.h"
 #include "mainwindow.h"
 #include "mixer.h"
@@ -132,76 +133,20 @@ void GLWidget::show_live_context_menu(const QPoint &pos)
 
        // Add a submenu for selecting output card, with an action for each card.
        QMenu card_submenu;
-       QActionGroup card_group(&card_submenu);
-
-       int current_card = global_mixer->get_output_card_index();
-
-       QAction *none_action = new QAction("None", &card_group);
-       none_action->setCheckable(true);
-       if (current_card == -1) {
-               none_action->setChecked(true);
-       }
-       none_action->setData(QList<QVariant>{"output_card", -1});
-       card_submenu.addAction(none_action);
-
-       unsigned num_cards = global_mixer->get_num_cards();
-       for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
-               if (!global_mixer->card_can_be_used_as_output(card_index)) {
-                       continue;
-               }
-
-               QString description(QString::fromStdString(global_mixer->get_output_card_description(card_index)));
-               QAction *action = new QAction(description, &card_group);
-               action->setCheckable(true);
-               if (current_card == int(card_index)) {
-                       action->setChecked(true);
-               }
-               action->setData(QList<QVariant>{"output_card", card_index});
-               card_submenu.addAction(action);
-       }
-
-       card_submenu.setTitle("HDMI/SDI output");
+       fill_hdmi_sdi_output_device_menu(&card_submenu);
+       card_submenu.setTitle("HDMI/SDI output device");
        menu.addMenu(&card_submenu);
 
        // Add a submenu for choosing the output resolution. Since this is
        // card-dependent, it is disabled if we haven't chosen a card
        // (but it's still there so that the user will know it exists).
        QMenu resolution_submenu;
-       QActionGroup resolution_group(&resolution_submenu);
-       if (current_card == -1) {
-               resolution_submenu.setEnabled(false);
-       } else {
-               uint32_t current_mode = global_mixer->get_output_video_mode();
-               map<uint32_t, bmusb::VideoMode> video_modes = global_mixer->get_available_output_video_modes();
-               for (const auto &mode : video_modes) {
-                       QString description(QString::fromStdString(mode.second.name));
-                       QAction *action = new QAction(description, &resolution_group);
-                       action->setCheckable(true);
-                       if (current_mode == mode.first) {
-                               action->setChecked(true);
-                       }
-                       action->setData(QList<QVariant>{"video_mode", mode.first});
-                       resolution_submenu.addAction(action);
-               }
-       }
-
+       fill_hdmi_sdi_output_resolution_menu(&resolution_submenu);
        resolution_submenu.setTitle("HDMI/SDI output resolution");
        menu.addMenu(&resolution_submenu);
 
-       // Show the menu and look at the result.
-       QAction *selected_item = menu.exec(global_pos);
-       if (selected_item != nullptr) {
-               QList<QVariant> selected = selected_item->data().toList();
-               if (selected[0].toString() == "output_card") {
-                       unsigned output_card = selected[1].toUInt(nullptr);
-                       global_mixer->set_output_card(output_card);
-               } else if (selected[0].toString() == "video_mode") {
-                       uint32_t mode = selected[1].toUInt(nullptr);
-                       global_mixer->set_output_video_mode(mode);
-               } else {
-                       assert(false);
-               }
-       }
+       // Show the menu; if there's an action selected, it will deal with it itself.
+       menu.exec(global_pos);
 }
 
 void GLWidget::show_preview_context_menu(unsigned signal_num, const QPoint &pos)
index 04a16a8164787e73a08521d96c5c793afab52910..a1c291537fd5031f88fd33320f7c70f104ce4a7a 100644 (file)
@@ -47,6 +47,7 @@
 #include "aboutdialog.h"
 #include "alsa_pool.h"
 #include "clickable_label.h"
+#include "context_menus.h"
 #include "correlation_meter.h"
 #include "disk_space_estimator.h"
 #include "ellipsis_label.h"
@@ -215,6 +216,11 @@ MainWindow::MainWindow()
                ui->x264_bitrate_action->setEnabled(false);
        }
 
+       connect(ui->video_menu, &QMenu::aboutToShow, [this]{
+               fill_hdmi_sdi_output_device_menu(ui->hdmi_sdi_output_device_menu);
+               fill_hdmi_sdi_output_resolution_menu(ui->hdmi_sdi_output_resolution_menu);
+       });
+
        // Hook up the transition buttons. (Keyboard shortcuts are set in set_transition_names().)
        // TODO: Make them dynamic.
        connect(ui->transition_btn1, &QPushButton::clicked, bind(&MainWindow::transition_clicked, this, 0));
index b11141e1b5f5f9d453b84a0a7d06b899b1937002..0118eaeb659f43edbbda4003f04c1c2c7dd3191b 100644 (file)
      <height>23</height>
     </rect>
    </property>
-   <widget class="QMenu" name="menuWhat">
+   <widget class="QMenu" name="video_menu">
     <property name="title">
      <string>&amp;Video</string>
     </property>
      <addaction name="timecode_stream_action"/>
      <addaction name="timecode_stdout_action"/>
     </widget>
+    <widget class="QMenu" name="hdmi_sdi_output_device_menu">
+     <property name="title">
+      <string>HDMI/SDI output device</string>
+     </property>
+     <addaction name="separator"/>
+    </widget>
+    <widget class="QMenu" name="hdmi_sdi_output_resolution_menu">
+     <property name="title">
+      <string>HDMI/SDI output resolution</string>
+     </property>
+     <addaction name="separator"/>
+    </widget>
     <addaction name="cut_action"/>
     <addaction name="x264_bitrate_action"/>
+    <addaction name="hdmi_sdi_output_device_menu"/>
+    <addaction name="hdmi_sdi_output_resolution_menu"/>
     <addaction name="display_timecode_menu"/>
     <addaction name="exit_action"/>
    </widget>
     <addaction name="input_mapping_action"/>
     <addaction name="midi_mapping_action"/>
    </widget>
-   <addaction name="menuWhat"/>
+   <addaction name="video_menu"/>
    <addaction name="menu_Audio"/>
    <addaction name="menu_Help"/>
   </widget>