]> git.sesse.net Git - nageru/blobdiff - glwidget.cpp
Make signal mapping changeable by right-clicking on the preview.
[nageru] / glwidget.cpp
index 3d5b0f97abe86a494bedda4ee5607e14499a2be2..e71ac405721bf53d94fb3caffd05711ee8c17f06 100644 (file)
@@ -6,6 +6,8 @@
 #include <qevent.h>  // Needs to come before egl.h.
 #include <epoxy/gl.h>
 #include <epoxy/egl.h>
+#include <QAction>
+#include <QMenu>
 #include <QSurfaceFormat>
 #include <movit/resource_pool.h>
 
@@ -31,6 +33,7 @@ class QWidget;
 #include <string>
 
 using namespace std;
+using namespace std::placeholders;
 
 GLWidget::GLWidget(QWidget *parent)
     : QGLWidget(parent, global_share_widget)
@@ -59,6 +62,15 @@ void GLWidget::initializeGL()
                emit resolution_updated(output);
        });
 
+       if (output >= Mixer::OUTPUT_INPUT0) {
+               int signal_num = global_mixer->get_channel_signal(output);
+               if (signal_num != -1) {
+                       setContextMenuPolicy(Qt::CustomContextMenu);
+                       connect(this, &QWidget::customContextMenuRequested,
+                               bind(&GLWidget::show_context_menu, this, signal_num, _1));
+               }
+       }
+
        glDisable(GL_BLEND);
        glDisable(GL_DEPTH_TEST);
        glDepthMask(GL_FALSE);
@@ -99,3 +111,29 @@ void GLWidget::mousePressEvent(QMouseEvent *event)
 {
        emit clicked();
 }
+
+void GLWidget::show_context_menu(int signal_num, const QPoint &pos)
+{
+       QPoint global_pos = mapToGlobal(pos);
+
+       QMenu menu;
+       QActionGroup group(&menu);
+
+       unsigned num_cards = global_mixer->get_num_cards();
+       unsigned current_card = global_mixer->map_signal(signal_num);
+       for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+               QString description(QString::fromStdString(global_mixer->get_card_description(card_index)));
+               QAction *action = new QAction(description, &group);
+               action->setCheckable(true);
+               if (current_card == card_index) {
+                       action->setChecked(true);
+               }
+               action->setData(card_index);
+               menu.addAction(action);
+       }
+       QAction *selected_item = menu.exec(global_pos);
+       if (selected_item) {
+               unsigned card_index = selected_item->data().toInt(nullptr);
+               global_mixer->set_signal_mapping(signal_num, card_index);
+       }
+}