]> git.sesse.net Git - vlc/commitdiff
Hotkey selector widget. Save not implemented yet
authorClément Stenac <zorglub@videolan.org>
Sun, 8 Oct 2006 19:28:49 +0000 (19:28 +0000)
committerClément Stenac <zorglub@videolan.org>
Sun, 8 Oct 2006 19:28:49 +0000 (19:28 +0000)
modules/gui/qt4/components/preferences_widgets.cpp
modules/gui/qt4/components/preferences_widgets.hpp
modules/gui/qt4/main_interface.cpp
modules/gui/qt4/util/customwidgets.cpp
modules/gui/qt4/util/customwidgets.hpp

index 477c7ddd788c6b993e1ecde51dc78d50f3dbb431..bd17adb1c48900e3c509cd207fe49d2e06b5ab9a 100644 (file)
@@ -32,7 +32,9 @@
  */
 
 #include "components/preferences_widgets.hpp"
+#include "util/customwidgets.hpp"
 #include "qt4.hpp"
+
 #include <QLineEdit>
 #include <QString>
 #include <QSpinBox>
@@ -40,6 +42,9 @@
 #include <QVariant>
 #include <QComboBox>
 #include <QGridLayout>
+#include <QPushButton>
+
+#include <vlc_keys.h>
 
 ConfigControl *ConfigControl::createControl( vlc_object_t *p_this,
                                              module_config_t *p_item,
@@ -761,14 +766,100 @@ void KeySelectorControl::finish()
         {
             QTreeWidgetItem *treeItem = new QTreeWidgetItem();
             treeItem->setText( 0, qfu( p_item->psz_text ) );
-            treeItem->setText( 1, p_item->psz_value );
-            treeItem->setData( 0, Qt::UserRole, QVariant( p_item->psz_name ) );
+            treeItem->setText( 1, VLCKeyToString( p_item->i_value ) );
+            treeItem->setData( 0, Qt::UserRole,
+                                  QVariant::fromValue( (void*)p_item ) );
+            values += p_item;
             table->addTopLevelItem( treeItem );
         }
     } while( p_item->i_type != CONFIG_HINT_END && p_item++ );
+    table->resizeColumnToContents( 0 );
+
+    CONNECT( table, itemDoubleClicked( QTreeWidgetItem *, int ),
+             this, selectKey( QTreeWidgetItem * ) );
+}
+
+void KeySelectorControl::selectKey( QTreeWidgetItem *keyItem )
+{
+   module_config_t *p_keyItem = static_cast<module_config_t*>
+                          (keyItem->data( 0, Qt::UserRole ).value<void*>());
+
+    KeyInputDialog *d = new KeyInputDialog( values, p_keyItem->psz_text );
+    d->exec();
+    if( d->result() == QDialog::Accepted )
+    {
+        p_keyItem->i_value = d->keyValue;
+        if( d->conflicts )
+        {
+            for( int i = 0; i < table->topLevelItemCount() ; i++ )
+            {
+                QTreeWidgetItem *it = table->topLevelItem(i);
+                module_config_t *p_item = static_cast<module_config_t*>
+                              (it->data( 0, Qt::UserRole ).value<void*>());
+                it->setText( 1, VLCKeyToString( p_item->i_value ) );
+            }
+        }
+        else
+            keyItem->setText( 1, VLCKeyToString( p_keyItem->i_value ) );
+    }
+    delete d;
 }
 
 void KeySelectorControl::doApply()
 {
+}
 
+KeyInputDialog::KeyInputDialog( QList<module_config_t*>& _values,
+                                char * _keyToChange ) :
+                                                QDialog(0), keyValue(0)
+{
+    setModal( true );
+    values = _values;
+    conflicts = false;
+    keyToChange = _keyToChange;
+    setWindowTitle( qtr( "Hotkey for " ) + qfu( keyToChange)  );
+
+    QVBoxLayout *l = new QVBoxLayout( this );
+    selected = new QLabel( qtr("Press the new keys for ")  + qfu(keyToChange) );
+    warning = new QLabel();
+    l->addWidget( selected , Qt::AlignCenter );
+    l->addWidget( warning, Qt::AlignCenter );
+
+    QHBoxLayout *l2 = new QHBoxLayout();
+    QPushButton *ok = new QPushButton( qtr("OK") );
+    l2->addWidget( ok );
+    QPushButton *cancel = new QPushButton( qtr("Cancel") );
+    l2->addWidget( cancel );
+
+    BUTTONACT( ok, accept() );
+    BUTTONACT( cancel, reject() );
+
+    l->addLayout( l2 );
+}
+
+void KeyInputDialog::keyPressEvent( QKeyEvent *e )
+{
+    if( e->key() == Qt::Key_Tab ) return;
+    int i_vlck = qtEventToVLCKey( e );
+    selected->setText( VLCKeyToString( i_vlck ) );
+    conflicts = false;
+    module_config_t *p_current = NULL;
+    foreach( p_current, values )
+    {
+        if( p_current->i_value == i_vlck && strcmp( p_current->psz_text,
+                                                    keyToChange ) )
+        {
+            p_current->i_value = 0;
+            conflicts = true;
+            break;
+        }
+    }
+    if( conflicts )
+    {
+        warning->setText(
+          qtr("Warning: the  key is already assigned to \"") +
+          QString( p_current->psz_text ) + "\"" );
+    }
+    else warning->setText( "" );
+    keyValue = i_vlck;
 }
index e5c7f4f082edaa113f739df23f7767a8cdd1c73f..11e3877c8f5a31218d77b8b732433d7a57302601 100644 (file)
@@ -33,6 +33,8 @@
 #include <QComboBox>
 #include <QCheckBox>
 #include <QVector>
+#include <QDialog>
+
 #include "ui/input_stats.h"
 #include "qt4.hpp"
 #include <assert.h>
@@ -310,6 +312,20 @@ private slot:
 /**********************************************************************
  * Key selector widget
  **********************************************************************/
+class KeyInputDialog : public QDialog
+{
+public:
+    KeyInputDialog( QList<module_config_t *> &, char * );
+    int keyValue;
+    bool conflicts;
+private:
+    void keyPressEvent( QKeyEvent *);
+    QLabel *selected;
+    QLabel *warning;
+    char * keyToChange;
+    QList<module_config_t*> values;
+};
+
 class KeySelectorControl : public ConfigControl
 {
     Q_OBJECT;
@@ -325,6 +341,9 @@ private:
     void finish();
     QLabel *label;
     QTreeWidget *table;
+    QList<module_config_t *> values;
+private slots:
+    void selectKey( QTreeWidgetItem *);
 };
 
 #endif
index 7251d2e59397f29651b516c955c5c1c4588f89a1..d39f2a29435048cad3614a05d83999a408cd3d20 100644 (file)
@@ -25,6 +25,7 @@
 #include "input_manager.hpp"
 #include "util/input_slider.hpp"
 #include "util/qvlcframe.hpp"
+#include "util/customwidgets.hpp"
 #include "dialogs_provider.hpp"
 #include "components/interface_widgets.hpp"
 #include "dialogs/playlist.hpp"
@@ -498,54 +499,7 @@ void MainInterface::customEvent( QEvent *event )
  ************************************************************************/
 void MainInterface::keyPressEvent( QKeyEvent *e )
 {
-    int i_vlck = 0;
-    /* Handle modifiers */
-    if( e->modifiers()& Qt::ShiftModifier ) i_vlck |= KEY_MODIFIER_SHIFT;
-    if( e->modifiers()& Qt::AltModifier ) i_vlck |= KEY_MODIFIER_ALT;
-    if( e->modifiers()& Qt::ControlModifier ) i_vlck |= KEY_MODIFIER_CTRL;
-    if( e->modifiers()& Qt::MetaModifier ) i_vlck |= KEY_MODIFIER_META;
-
-    bool found = false;
-    /* Look for some special keys */
-#define HANDLE( qt, vk ) case Qt::qt : i_vlck |= vk; found = true;break
-    switch( e->key() )
-    {
-        HANDLE( Key_Left, KEY_LEFT );
-        HANDLE( Key_Right, KEY_RIGHT );
-        HANDLE( Key_Up, KEY_UP );
-        HANDLE( Key_Down, KEY_DOWN );
-        HANDLE( Key_Space, KEY_SPACE );
-        HANDLE( Key_Escape, KEY_ESC );
-        HANDLE( Key_Enter, KEY_ENTER );
-        HANDLE( Key_F1, KEY_F1 );
-        HANDLE( Key_F2, KEY_F2 );
-        HANDLE( Key_F3, KEY_F3 );
-        HANDLE( Key_F4, KEY_F4 );
-        HANDLE( Key_F5, KEY_F5 );
-        HANDLE( Key_F6, KEY_F6 );
-        HANDLE( Key_F7, KEY_F7 );
-        HANDLE( Key_F8, KEY_F8 );
-        HANDLE( Key_F9, KEY_F9 );
-        HANDLE( Key_F10, KEY_F10 );
-        HANDLE( Key_F11, KEY_F11 );
-        HANDLE( Key_F12, KEY_F12 );
-        HANDLE( Key_PageUp, KEY_PAGEUP );
-        HANDLE( Key_PageDown, KEY_PAGEDOWN );
-        HANDLE( Key_Home, KEY_HOME );
-        HANDLE( Key_End, KEY_END );
-        HANDLE( Key_Insert, KEY_INSERT );
-        HANDLE( Key_Delete, KEY_DELETE );
-
-    }
-    if( !found )
-    {
-        /* Force lowercase */
-        if( e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z )
-            i_vlck += e->key() + 32;
-        /* Rest of the ascii range */
-        else if( e->key() >= Qt::Key_Space && e->key() <= Qt::Key_AsciiTilde )
-            i_vlck += e->key();
-    }
+    int i_vlck = qtEventToVLCKey( e );
     if( i_vlck >= 0 )
     {
         var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
index b59ac6c971097e3cba5729bfc921e12f62e484c3..10c37c617a54e18147fb29e60395dfd4ededd174 100644 (file)
@@ -29,6 +29,9 @@
 #include <QPainter>
 #include <QColorGroup>
 #include <QRect>
+#include <QKeyEvent>
+
+#include <vlc_keys.h>
 
 ClickLineEdit::ClickLineEdit( const QString &msg, QWidget *parent) : QLineEdit( parent )
 {
@@ -90,3 +93,81 @@ void ClickLineEdit::focusOutEvent( QFocusEvent *ev )
     }
     QLineEdit::focusOutEvent( ev );
 }
+
+/***************************************************************************
+ * Hotkeys converters
+ ***************************************************************************/
+
+int qtEventToVLCKey( QKeyEvent *e )
+{
+    int i_vlck = 0;
+    /* Handle modifiers */
+    if( e->modifiers()& Qt::ShiftModifier ) i_vlck |= KEY_MODIFIER_SHIFT;
+    if( e->modifiers()& Qt::AltModifier ) i_vlck |= KEY_MODIFIER_ALT;
+    if( e->modifiers()& Qt::ControlModifier ) i_vlck |= KEY_MODIFIER_CTRL;
+    if( e->modifiers()& Qt::MetaModifier ) i_vlck |= KEY_MODIFIER_META;
+
+    bool found = false;
+    /* Look for some special keys */
+#define HANDLE( qt, vk ) case Qt::qt : i_vlck |= vk; found = true;break
+    switch( e->key() )
+    {
+        HANDLE( Key_Left, KEY_LEFT );
+        HANDLE( Key_Right, KEY_RIGHT );
+        HANDLE( Key_Up, KEY_UP );
+        HANDLE( Key_Down, KEY_DOWN );
+        HANDLE( Key_Space, KEY_SPACE );
+        HANDLE( Key_Escape, KEY_ESC );
+        HANDLE( Key_Enter, KEY_ENTER );
+        HANDLE( Key_F1, KEY_F1 );
+        HANDLE( Key_F2, KEY_F2 );
+        HANDLE( Key_F3, KEY_F3 );
+        HANDLE( Key_F4, KEY_F4 );
+        HANDLE( Key_F5, KEY_F5 );
+        HANDLE( Key_F6, KEY_F6 );
+        HANDLE( Key_F7, KEY_F7 );
+        HANDLE( Key_F8, KEY_F8 );
+        HANDLE( Key_F9, KEY_F9 );
+        HANDLE( Key_F10, KEY_F10 );
+        HANDLE( Key_F11, KEY_F11 );
+        HANDLE( Key_F12, KEY_F12 );
+        HANDLE( Key_PageUp, KEY_PAGEUP );
+        HANDLE( Key_PageDown, KEY_PAGEDOWN );
+        HANDLE( Key_Home, KEY_HOME );
+        HANDLE( Key_End, KEY_END );
+        HANDLE( Key_Insert, KEY_INSERT );
+        HANDLE( Key_Delete, KEY_DELETE );
+
+    }
+    if( !found )
+    {
+        /* Force lowercase */
+        if( e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z )
+            i_vlck += e->key() + 32;
+        /* Rest of the ascii range */
+        else if( e->key() >= Qt::Key_Space && e->key() <= Qt::Key_AsciiTilde )
+            i_vlck += e->key();
+    }
+    return i_vlck;
+}
+
+QString VLCKeyToString( int val )
+{
+    QString r = "";
+    if( val & KEY_MODIFIER_CTRL )
+        r+= "Ctrl+";
+    if( val & KEY_MODIFIER_ALT )
+        r+= "Alt+";
+    if( val & KEY_MODIFIER_SHIFT )
+        r+= "Shift+";
+
+    unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
+    for( unsigned int i = 0; i< i_keys; i++ )
+    {
+        if( vlc_keys[i].i_key_code == (val& ~KEY_MODIFIER) )
+        {
+            r+= vlc_keys[i].psz_key_string;
+        }
+    }
+    return r;
+}
index a9a7b32248b8eafc43168e971bd5cfe7b402fd51..9a4d94b0182fa07d1eecb35972ced4538b58aaa7 100644 (file)
@@ -84,4 +84,9 @@ public:
 signals:
     void rightClicked( QModelIndex, QPoint  );
 };
+
+class QKeyEvent;
+int qtEventToVLCKey( QKeyEvent *e );
+QString VLCKeyToString( int val );
+
 #endif