]> git.sesse.net Git - vlc/commitdiff
Qt(Dialog provider): Add support for key accelerators
authorErwan Tulou <erwan10@videolan.org>
Fri, 11 Jul 2014 15:48:06 +0000 (17:48 +0200)
committerErwan Tulou <erwan10@videolan.org>
Sun, 13 Jul 2014 11:37:38 +0000 (13:37 +0200)
include/vlc_interface.h
modules/gui/qt4/dialogs_provider.cpp
modules/gui/qt4/dialogs_provider.hpp
modules/gui/qt4/menus.cpp
modules/gui/qt4/menus.hpp

index e98be12aab142e9901562ea952ee11f54e207f46..d47f84221c859773e408e43a75e2098754f821c6 100644 (file)
@@ -172,6 +172,7 @@ typedef enum vlc_dialog {
 
     INTF_DIALOG_FILE_GENERIC = 30,
     INTF_DIALOG_INTERACTION = 50,
+    INTF_DIALOG_SENDKEY = 51,
 
     INTF_DIALOG_UPDATEVLC = 90,
     INTF_DIALOG_VLM,
index 23c336dc5d321402362ac0af4d364f5234415e1a..5729a7f9c4becdfca78d69d1b38d4c9788dd3b58 100644 (file)
@@ -34,6 +34,7 @@
 #include "menus.hpp"
 #include "recents.hpp"
 #include "util/qt_dirs.hpp"
+#include "util/customwidgets.hpp" /* VLCKeyToString() */
 #include "main_interface.hpp"
 
 /* The dialogs */
 DialogsProvider* DialogsProvider::instance = NULL;
 
 DialogsProvider::DialogsProvider( intf_thread_t *_p_intf ) :
-                                  QObject( NULL ), p_intf( _p_intf )
+                                  QObject( NULL ), p_intf( _p_intf ),
+                                  popupMenu( NULL ),
+                                  videoPopupMenu( NULL ),
+                                  audioPopupMenu( NULL ),
+                                  miscPopupMenu( NULL )
 {
     b_isDying = false;
 
@@ -103,10 +108,10 @@ DialogsProvider::~DialogsProvider()
     delete menusUpdateMapper;
     delete SDMapper;
 
-    VLCMenuBar::PopupMenu( p_intf, false );
-    VLCMenuBar::AudioPopupMenu( p_intf, false );
-    VLCMenuBar::VideoPopupMenu( p_intf, false );
-    VLCMenuBar::MiscPopupMenu( p_intf, false );
+    delete popupMenu;
+    delete videoPopupMenu;
+    delete audioPopupMenu;
+    delete miscPopupMenu;
 }
 
 void DialogsProvider::quit()
@@ -148,18 +153,44 @@ void DialogsProvider::customEvent( QEvent *event )
            bookmarksDialog(); break;
         case INTF_DIALOG_EXTENDED:
            extendedDialog(); break;
+        case INTF_DIALOG_SENDKEY:
+           sendKey( de->i_arg ); break;
 #ifdef ENABLE_VLM
         case INTF_DIALOG_VLM:
            vlmDialog(); break;
 #endif
         case INTF_DIALOG_POPUPMENU:
-           VLCMenuBar::PopupMenu( p_intf, (de->i_arg != 0) ); break;
+        {
+           delete popupMenu; popupMenu = NULL;
+           bool show = (de->i_arg != 0);
+           if( show )
+               popupMenu = VLCMenuBar::PopupMenu( p_intf, show );
+           break;
+        }
         case INTF_DIALOG_AUDIOPOPUPMENU:
-           VLCMenuBar::AudioPopupMenu( p_intf, (de->i_arg != 0) ); break;
+        {
+           delete audioPopupMenu; audioPopupMenu = NULL;
+           bool show = (de->i_arg != 0);
+           if( show )
+               audioPopupMenu = VLCMenuBar::AudioPopupMenu( p_intf, show );
+           break;
+        }
         case INTF_DIALOG_VIDEOPOPUPMENU:
-           VLCMenuBar::VideoPopupMenu( p_intf, (de->i_arg != 0) ); break;
+        {
+           delete videoPopupMenu; videoPopupMenu = NULL;
+           bool show = (de->i_arg != 0);
+           if( show )
+               videoPopupMenu = VLCMenuBar::VideoPopupMenu( p_intf, show );
+           break;
+        }
         case INTF_DIALOG_MISCPOPUPMENU:
-           VLCMenuBar::MiscPopupMenu( p_intf, (de->i_arg != 0) ); break;
+        {
+           delete miscPopupMenu; miscPopupMenu = NULL;
+           bool show = (de->i_arg != 0);
+           if( show )
+               miscPopupMenu = VLCMenuBar::MiscPopupMenu( p_intf, show );
+           break;
+        }
         case INTF_DIALOG_WIZARD:
         case INTF_DIALOG_STREAMWIZARD:
             openAndStreamingDialogs(); break;
@@ -760,3 +791,32 @@ void DialogsProvider::SDMenuAction( const QString& data )
         playlist_ServicesDiscoveryRemove( THEPL, qtu( data ) );
 }
 
+void DialogsProvider::sendKey( int key )
+{
+     // translate from a vlc keycode into a Qt sequence
+     QKeySequence kseq0( VLCKeyToString( key, true ) );
+
+     if( popupMenu == NULL )
+     {
+         // make sure at least a non visible popupmenu is available
+         popupMenu = VLCMenuBar::PopupMenu( p_intf, false );
+         if( unlikely( popupMenu == NULL ) )
+             return;
+     }
+
+     // test against key accelerators from the popupmenu
+     QList<QAction*> actions = popupMenu->findChildren<QAction*>();
+     for( int i = 0; i < actions.size(); i++ )
+     {
+         QAction* action = actions.at(i);
+         QKeySequence kseq = action->shortcut();
+         if( kseq == kseq0 )
+         {
+             action->trigger();
+             return;
+         }
+     }
+
+     // forward key to vlc core when not a key accelerator
+     var_SetInteger( p_intf->p_libvlc, "key-pressed", key );
+}
index 990590b0b00f241122a77c527a53d113fda43c3b..a475b19f4d429489a350040fa25cddc03a4bc289 100644 (file)
@@ -104,6 +104,12 @@ private:
     static DialogsProvider *instance;
 
     intf_thread_t *p_intf;
+
+    QMenu* popupMenu;
+    QMenu* videoPopupMenu;
+    QMenu* audioPopupMenu;
+    QMenu* miscPopupMenu;
+
     QWidget* root;
     bool b_isDying;
 
@@ -120,6 +126,7 @@ public slots:
     void extendedDialog();
     void synchroDialog();
     void messagesDialog();
+    void sendKey( int key );
 #ifdef ENABLE_VLM
     void vlmDialog();
 #endif
index 0935346d0ad067a4a2d93ed759d5bb5a3667129e..279ff0fd1b53caba2fdbce86e923076033dd4e11 100644 (file)
@@ -396,7 +396,7 @@ QMenu *VLCMenuBar::FileMenu( intf_thread_t *p_intf, QWidget *parent, MainInterfa
     action->setCheckable( true );
     action->setChecked( THEMIM->getPlayExitState() );
 
-    if( mi->getSysTray() )
+    if( mi && mi->getSysTray() )
     {
         action = menu->addAction( qtr( "Close to systray"), mi,
                                  SLOT( toggleUpdateSystrayMenu() ) );
@@ -786,10 +786,7 @@ QMenu *VLCMenuBar::HelpMenu( QWidget *parent )
  * Popup menus - Right Click menus                                           *
  *****************************************************************************/
 #define POPUP_BOILERPLATE \
-    static QMenu* menu = NULL;  \
-    delete menu; menu = NULL; \
-    if( !show ) \
-        return; \
+    QMenu* menu;  \
     QVector<vlc_object_t *> objects; \
     QVector<const char *> varnames; \
     input_thread_t *p_input = THEMIM->getInput();
@@ -797,7 +794,8 @@ QMenu *VLCMenuBar::HelpMenu( QWidget *parent )
 #define CREATE_POPUP \
     menu = new QMenu(); \
     Populate( p_intf, menu, varnames, objects ); \
-    menu->popup( QCursor::pos() ); \
+    if( show ) \
+        menu->popup( QCursor::pos() ); \
 
 void VLCMenuBar::PopupMenuPlaylistEntries( QMenu *menu,
                                         intf_thread_t *p_intf,
@@ -944,25 +942,27 @@ void VLCMenuBar::PopupMenuStaticEntries( QMenu *menu )
 }
 
 /* Video Tracks and Subtitles tracks */
-void VLCMenuBar::VideoPopupMenu( intf_thread_t *p_intf, bool show )
+QMenu* VLCMenuBar::VideoPopupMenu( intf_thread_t *p_intf, bool show )
 {
     POPUP_BOILERPLATE
     if( p_input )
         VideoAutoMenuBuilder( THEPL, p_input, objects, varnames );
     CREATE_POPUP
+    return menu;
 }
 
 /* Audio Tracks */
-void VLCMenuBar::AudioPopupMenu( intf_thread_t *p_intf, bool show )
+QMenu* VLCMenuBar::AudioPopupMenu( intf_thread_t *p_intf, bool show )
 {
     POPUP_BOILERPLATE
     if( p_input )
         AudioAutoMenuBuilder( p_input, objects, varnames );
     CREATE_POPUP
+    return menu;
 }
 
 /* Navigation stuff, and general menus ( open ), used only for skins */
-void VLCMenuBar::MiscPopupMenu( intf_thread_t *p_intf, bool show )
+QMenu* VLCMenuBar::MiscPopupMenu( intf_thread_t *p_intf, bool show )
 {
     POPUP_BOILERPLATE
 
@@ -984,11 +984,13 @@ void VLCMenuBar::MiscPopupMenu( intf_thread_t *p_intf, bool show )
     menu->addSeparator();
     PopupMenuStaticEntries( menu );
 
-    menu->popup( QCursor::pos() );
+    if( show )
+        menu->popup( QCursor::pos() );
+    return menu;
 }
 
 /* Main Menu that sticks everything together  */
-void VLCMenuBar::PopupMenu( intf_thread_t *p_intf, bool show )
+QMenu* VLCMenuBar::PopupMenu( intf_thread_t *p_intf, bool show )
 {
     POPUP_BOILERPLATE
 
@@ -1113,7 +1115,9 @@ void VLCMenuBar::PopupMenu( intf_thread_t *p_intf, bool show )
     /* Static entries for ending, like open */
     PopupMenuStaticEntries( menu );
 
-    menu->popup( QCursor::pos() );
+    if( show )
+        menu->popup( QCursor::pos() );
+    return menu;
 }
 
 #undef CREATE_POPUP
index 3b39c7b12f72104bd9877d70a1077efc86c3fc1e..b02e9393a719cf4932ef0a1928bf93182a91f74c 100644 (file)
@@ -78,10 +78,10 @@ public:
     static void createMenuBar( MainInterface *mi, intf_thread_t * );
 
     /* Popups Menus */
-    static void PopupMenu( intf_thread_t *, bool );
-    static void AudioPopupMenu( intf_thread_t *, bool );
-    static void VideoPopupMenu( intf_thread_t *, bool );
-    static void MiscPopupMenu( intf_thread_t *, bool );
+    static QMenu* PopupMenu( intf_thread_t *, bool );
+    static QMenu* AudioPopupMenu( intf_thread_t *, bool );
+    static QMenu* VideoPopupMenu( intf_thread_t *, bool );
+    static QMenu* MiscPopupMenu( intf_thread_t *, bool );
 
     /* Systray */
     static void updateSystrayMenu( MainInterface *, intf_thread_t  *,