From 146c9dfa4932e85a7785c87d9e9aab043cfc0ae9 Mon Sep 17 00:00:00 2001 From: Anton Arbring Date: Fri, 18 Jul 2014 14:45:30 +0200 Subject: [PATCH] qv4l2: added right click menu to capturewin Making it possible to do certain actions in and out of fullscreen mode Signed-off-by: Anton Arbring Signed-off-by: Hans Verkuil --- utils/qv4l2/capture-win-gl.cpp | 3 ++- utils/qv4l2/capture-win-gl.h | 2 +- utils/qv4l2/capture-win-qt.cpp | 3 ++- utils/qv4l2/capture-win-qt.h | 2 +- utils/qv4l2/capture-win.cpp | 31 ++++++++++++++++++++++++++++++- utils/qv4l2/capture-win.h | 8 +++++++- utils/qv4l2/fullscreen.png | Bin 0 -> 1591 bytes utils/qv4l2/fullscreenexit.png | Bin 0 -> 1567 bytes utils/qv4l2/qv4l2.cpp | 4 ++-- utils/qv4l2/qv4l2.h | 9 ++++----- utils/qv4l2/qv4l2.qrc | 2 ++ 11 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 utils/qv4l2/fullscreen.png create mode 100644 utils/qv4l2/fullscreenexit.png diff --git a/utils/qv4l2/capture-win-gl.cpp b/utils/qv4l2/capture-win-gl.cpp index b785658..29cd1e2 100644 --- a/utils/qv4l2/capture-win-gl.cpp +++ b/utils/qv4l2/capture-win-gl.cpp @@ -24,7 +24,8 @@ #include -CaptureWinGL::CaptureWinGL() +CaptureWinGL::CaptureWinGL(ApplicationWindow *aw) : + CaptureWin(aw) { #ifdef HAVE_QTGL CaptureWin::buildWindow(&m_videoSurface); diff --git a/utils/qv4l2/capture-win-gl.h b/utils/qv4l2/capture-win-gl.h index 38884bd..bd7d6d6 100644 --- a/utils/qv4l2/capture-win-gl.h +++ b/utils/qv4l2/capture-win-gl.h @@ -106,7 +106,7 @@ private: class CaptureWinGL : public CaptureWin { public: - CaptureWinGL(); + CaptureWinGL(ApplicationWindow *aw); ~CaptureWinGL(); void stop(); diff --git a/utils/qv4l2/capture-win-qt.cpp b/utils/qv4l2/capture-win-qt.cpp index 7aafabc..41266de 100644 --- a/utils/qv4l2/capture-win-qt.cpp +++ b/utils/qv4l2/capture-win-qt.cpp @@ -19,7 +19,8 @@ #include "capture-win-qt.h" -CaptureWinQt::CaptureWinQt() : +CaptureWinQt::CaptureWinQt(ApplicationWindow *aw) : + CaptureWin(aw), m_image(new QImage(0, 0, QImage::Format_Invalid)), m_data(NULL), m_supportedFormat(false), diff --git a/utils/qv4l2/capture-win-qt.h b/utils/qv4l2/capture-win-qt.h index 5076e48..a4b80f3 100644 --- a/utils/qv4l2/capture-win-qt.h +++ b/utils/qv4l2/capture-win-qt.h @@ -30,7 +30,7 @@ class CaptureWinQt : public CaptureWin { public: - CaptureWinQt(); + CaptureWinQt(ApplicationWindow *aw); ~CaptureWinQt(); void stop(); diff --git a/utils/qv4l2/capture-win.cpp b/utils/qv4l2/capture-win.cpp index 864b05d..afca6bd 100644 --- a/utils/qv4l2/capture-win.cpp +++ b/utils/qv4l2/capture-win.cpp @@ -33,7 +33,8 @@ bool CaptureWin::m_enableScaling = true; double CaptureWin::m_pixelAspectRatio = 1.0; CropMethod CaptureWin::m_cropMethod = QV4L2_CROP_NONE; -CaptureWin::CaptureWin() +CaptureWin::CaptureWin(ApplicationWindow *aw) : + appWin(aw) { setWindowTitle("V4L2 Capture"); m_hotkeyClose = new QShortcut(Qt::CTRL+Qt::Key_W, this); @@ -44,6 +45,12 @@ CaptureWin::CaptureWin() connect(m_hotkeyExitFullscreen, SIGNAL(activated()), this, SLOT(escape())); m_hotkeyToggleFullscreen = new QShortcut(Qt::Key_F, this); connect(m_hotkeyToggleFullscreen, SIGNAL(activated()), this, SLOT(fullScreen())); + m_exitFullScreen = new QAction(QIcon(":/fullscreenexit.png"), "Exit Fullscreen", this); + m_exitFullScreen->setShortcut(Qt::Key_Escape); + connect(m_exitFullScreen, SIGNAL(triggered()), this, SLOT(escape())); + m_enterFullScreen = new QAction(QIcon(":/fullscreen.png"), "Show Fullscreen", this); + m_enterFullScreen->setShortcut(Qt::Key_F); + connect(m_enterFullScreen, SIGNAL(triggered()), this, SLOT(fullScreen())); m_frame.format = 0; m_frame.size.setWidth(0); m_frame.size.setHeight(0); @@ -114,6 +121,9 @@ void CaptureWin::buildWindow(QWidget *videoSurface) vbox->addWidget(bottom, 0, Qt::AlignBottom); vbox->getContentsMargins(&l, &t, &r, &b); vbox->setSpacing(t+b); + + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customMenuRequested(QPoint))); } void CaptureWin::resetSize() @@ -348,6 +358,25 @@ void CaptureWin::toggleFullScreen() } } +void CaptureWin::customMenuRequested(QPoint pos) +{ + QMenu *menu=new QMenu(this); + + if (isFullScreen()) { + menu->addAction(m_exitFullScreen); + menu->setStyleSheet("background-color:none;"); + } else { + menu->addAction(m_enterFullScreen); + } + + menu->addAction(appWin->m_resetScalingAct); + menu->addAction(appWin->m_useBlendingAct); + menu->addAction(appWin->m_snapshotAct); + menu->addAction(appWin->m_showFramesAct); + + menu->popup(mapToGlobal(pos)); +} + void CaptureWin::closeEvent(QCloseEvent *event) { QWidget::closeEvent(event); diff --git a/utils/qv4l2/capture-win.h b/utils/qv4l2/capture-win.h index 54bb800..8f49ebd 100644 --- a/utils/qv4l2/capture-win.h +++ b/utils/qv4l2/capture-win.h @@ -26,6 +26,7 @@ #include #include #include +#include enum CropMethod { // Crop Height @@ -54,13 +55,14 @@ struct crop { // cropInfo bool updated; }; +class ApplicationWindow; class CaptureWin : public QWidget { Q_OBJECT public: - CaptureWin(); + CaptureWin(ApplicationWindow *aw); ~CaptureWin(); void setWindowSize(QSize size); @@ -72,6 +74,8 @@ public: virtual void setBlending(bool enable) = 0; void setCropMethod(CropMethod crop); void toggleFullScreen(); + QAction *m_exitFullScreen; + QAction *m_enterFullScreen; /** * @brief Set a frame into the capture window. @@ -148,6 +152,7 @@ public: public slots: void resetSize(); + void customMenuRequested(QPoint pos); private slots: void fullScreen(); @@ -216,6 +221,7 @@ signals: void close(); private: + ApplicationWindow *appWin; static double m_pixelAspectRatio; static CropMethod m_cropMethod; QShortcut *m_hotkeyClose; diff --git a/utils/qv4l2/fullscreen.png b/utils/qv4l2/fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..3e589326c6a65a5504850a0ef93507bda85e46b6 GIT binary patch literal 1591 zcmV-72FUq|P)5>f*5E> zeKf&7s8EO?X`@;CFa!k+RET})gLzPCDT`W)yV8O+T~mtLJ9k@WH+y}^y|8R|lij;p z3%ciJhuJf8zHjE7nKS1CHL1z}TeSR+a5(IgJIVa~yynMvHEijHlmdZ3$rB18G{37i zKR>UTrdcwHR4VmAUtKX}LP!H4WFH|UKnSTPYhn;Wo*{(9Dg~dv0Gg&P5kj^KAvD)E zCxrA6LUs^Bc(L(C2}B|h1>iD(%>Xt5$O52BsT)eE?bQIEOTuxStxBn-!NI{T01VeV z;s6=}bd^nDaBxrqkOpuEz&!wM0CxQgaXAFwF#r;P4d4cVzsn}z2KXv~EdY7|WOZG? z-PYE23joUT-HpVXtF^WDdtKK*1+WBQH4=$908#)t{15dB-&Ye5AY8ZwN;3$AT7d$C9295$aqLi9pjG2tF zEMrV#jI}VvG|u^#hYug_^-IDVGcYjFckI})&lqD4W2|*@axw`3jIr%XsZW$r7Xj=k z+l7=;Q(ilfNSvpX9&wGVaL#qpG!>=v^62R3K)LSZ>5h($zRVc=?!tu&8s}Ua85v2O zIdevvoSgh9kx2aF>1Q&TX+JSQgbm@Njb0Qjat{lQ@Hcg{H&V=vCm&VIa+{SA}35?x?b2%(n>K1Ywb7t{l~rOr_? zfqY}-8a7R{0l@u2Zs#XG(JDQ|{TMb)Q+Lx809XdlTFuwuUxq+nScBG-HEyi!H05F?ovVIgRg`{UAYyr z93#yW6B9q=yTC>u3gtcVc)Vq7Z0tDz%j=CVgsZNc;L7RiK5^oNOeT|dEEa1lpx0h1 z_*g8)lgVVtw(XlkLqkW4JyDAht1H#dy>=)RI&kpd!4=E0R&CpEl2UGq#bV7lx=#op z66?J)Jl$9+OnGY^w^?N0)ngdfsA;eZ@IPAP}hI zoYzxITc)O_mRy}3LWo~Wje(OVPwtXZ{$$(sla^)ON~Kb1m&nA`t5?Sg)kgD+yX)=% zA>;$E-QM2*zLfIo;o)J&vaF|U+pf1P3pwDMO97v|6Q@s~{?@kbUdyunux&e=OeQfr zJe-wMj(2o)yqbgKxUU@`gm?t^G&D5)I6Xa`J$34oPASzm=b6RDMej-Zyb$6yzo*&$ z{rlgPQl59+Qj=0D+qO3;rJe@R3t&+xb*<12Y($_T=iy-(hLK^6fidR9<8crCD?*5i zmEI>ickX=Gw(U77P7Ez4R-r_-yENaQcKxJ$5B9rtySr2$ZPl2riNR4Vne``=z6#Bw$ADUU=V zkr>ZpGQ9u{w>nM%v|z2Y?~6bq)=KNoy1MrXA&yrQg literal 0 HcmV?d00001 diff --git a/utils/qv4l2/fullscreenexit.png b/utils/qv4l2/fullscreenexit.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a13595e91b623833abf16071184e116d04e778 GIT binary patch literal 1567 zcmV+)2H^RLP)YODOe#7 zYag3pAt<2_MVipC&BGQ-3w;UbL-SH8f_5Phv!SA3Yc*+8%)PTsXD3--?!vn4&+M4A zg8RMfF1hEN?>jkj?>%RL1{$b}SS;3F?eDq=2l+=xJ`dn#EEWs+5>O!jC`723OX_E? zk_f#P`BW;UJ!}z0v9}iDD-q3}1eB6jpKA|8L}~1j@2jy`%&ID&oP$gzV+;=u@2@4I zr>Cc;z-ns>zK4g0_b)6g{DWH&9~q0qf@K9%Ag}MZLbI+7G2kE0zd$s0Pw5hIBVH#7MCwy)@toS zrfE7v^gMtC#lbZUL!X$KSW6@lO{QsHoSU2LsYTw?RifZvc6Ro#l=2%P1b1Dx6~Hq9 zf&gy&$UXts0RYKlG6w*;TyA}EaF7cju6iZ!NkFlq#l^*T*L9y%c4+{205k#cbHM!p zz>LS^n)0#Db=?n_mX==fO5U@85?lwc2;gy5K1MQ`^dq1dKnDN|00ZzBfXTXdGp~C# z5#1o74gj{YTLo|zKvz5-Cm#al0Ne+#3xEqCmrN$_5YaYG({6h`TeNx(oLZ>kA@;1Y zRw)H)1_^L=+&R5D|3|Q3nyV`DrPMXb%y+Ktyj6QG|$g5>b$dI=zyww;xz?9A_E8R@Dd0 z0cZtq55P4a<$DjnEP!bMKLQ8==x`k8ht28-`T)RjoZkUF24Ee)FRCxN@ADZ9seT|2 z;0KkEP3Z^P09;Y^yGPkIsd0)8!0I0o}5! z0Aoy_n3z~^Zf)k8F7ytJEoha`LW|T*Br-L2XMlNfY%(y8Fw7#C&t*ToO6tfj6C3+ z=Q!s%##nM-V4xeoQZ*4;1@cd;nGJ@9hPK(Zy)1-S%Vx9dLI_AH-%h8~U#To^NK3hI z-@eZoW1n%(^QLJUobz_evVLQXJ$Lft$?Kj+i|U=!0stI8e!P`)&KP4Yobz?dvbJ;1 z-%6*`7Xh@TQYp>rc2{Y8F4(8j>7$(Umo3X`;+(HB#%?jj80UPx+Dn$w@p=fr&4TlA zIDC&WcFVG?70!9ng$oy2rl+Sbm1e__h%)vxJw1JeG4=-MJa1W+&N*KThr_GI>q|wH zj@SPz4HOQC?+1fH>(r@JOdULB3D+Z{iakwEPL5lawIdh|n&EI*luk!VZMABnlp@uy zs}mFdrewU%pi1LZ8?S5i%!4+Yd^y6^$k)717mIjU002ovPDHLkV1iXPy|DlQ literal 0 HcmV?d00001 diff --git a/utils/qv4l2/qv4l2.cpp b/utils/qv4l2/qv4l2.cpp index 2f9b000..7772597 100644 --- a/utils/qv4l2/qv4l2.cpp +++ b/utils/qv4l2/qv4l2.cpp @@ -392,10 +392,10 @@ void ApplicationWindow::newCaptureWin() switch (m_renderMethod) { case QV4L2_RENDER_GL: - m_capture = new CaptureWinGL; + m_capture = new CaptureWinGL(this); break; default: - m_capture = new CaptureWinQt; + m_capture = new CaptureWinQt(this); break; } diff --git a/utils/qv4l2/qv4l2.h b/utils/qv4l2/qv4l2.h index a73ee51..b8c2f5f 100644 --- a/utils/qv4l2/qv4l2.h +++ b/utils/qv4l2/qv4l2.h @@ -141,7 +141,6 @@ private slots: void updateColorspace(); void updateDisplayColorspace(); void clearBuffers(); - void about(); public: @@ -152,6 +151,10 @@ public: void errorCtrl(unsigned id, int err, const QString &v); void info(const QString &info); virtual void closeEvent(QCloseEvent *event); + QAction *m_resetScalingAct; + QAction *m_useBlendingAct; + QAction *m_snapshotAct; + QAction *m_showFramesAct; private: void addWidget(QGridLayout *grid, QWidget *w, Qt::Alignment align = Qt::AlignLeft); @@ -197,15 +200,11 @@ private: GeneralTab *m_genTab; VbiTab *m_vbiTab; QAction *m_capStartAct; - QAction *m_snapshotAct; QAction *m_saveRawAct; - QAction *m_showFramesAct; QAction *m_useGLAct; - QAction *m_useBlendingAct; QAction *m_showAllAudioAct; QAction *m_audioBufferAct; QAction *m_scalingAct; - QAction *m_resetScalingAct; QString m_filename; QSignalMapper *m_sigMapper; QTabWidget *m_tabs; diff --git a/utils/qv4l2/qv4l2.qrc b/utils/qv4l2/qv4l2.qrc index 469423b..3a91a0c 100644 --- a/utils/qv4l2/qv4l2.qrc +++ b/utils/qv4l2/qv4l2.qrc @@ -9,5 +9,7 @@ video-television.png qv4l2.png enterbutt.png + fullscreen.png + fullscreenexit.png -- 2.7.4