]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/components/preferences_widgets.cpp
Qt4 - make GNOME and KDE people happy.
[vlc] / modules / gui / qt4 / components / preferences_widgets.cpp
index b03a010a9632edf198cd342e02020c71e7d23196..f488406fa7bdecaae16d4b09690502cf5472b7a4 100644 (file)
 
 /**
  * Todo:
- *  - Finish implementation (see WX)
+ *  - Finish implementation (see WX, there might be missing a
+ *    i_action handler for IntegerLists, but I don't see any module using it...
  *  - Improvements over WX
- *      - Password field implementation (through "pwd" bool param
  *      - Validator for modulelist
- *  - Implement update stuff using a general Updated signal
  */
 
 #include "components/preferences_widgets.hpp"
 #include "util/customwidgets.hpp"
-#include "qt4.hpp"
 
 #include <vlc_keys.h>
 
@@ -46,6 +44,8 @@
 #include <QFontDialog>
 #include <QGroupBox>
 #include <QTreeWidgetItem>
+#include <QSignalMapper>
+#include <QDialogButtonBox>
 
 QString formatTooltip(const QString & tooltip)
 {
@@ -74,7 +74,7 @@ ConfigControl *ConfigControl::createControl( vlc_object_t *p_this,
                                              QGridLayout *l, int &line )
 {
     ConfigControl *p_control = NULL;
-    if( p_item->psz_current ) return NULL;
+    if( p_item->psz_current || p_item->b_unsaveable ) return NULL;
 
     switch( p_item->i_type )
     {
@@ -366,6 +366,42 @@ StringListConfigControl::StringListConfigControl( vlc_object_t *_p_this,
         l->addWidget( label, line, 0 );
         l->addWidget( combo, line, 1, Qt::AlignRight );
     }
+
+    if( p_item->i_action )
+    {
+        QSignalMapper *signalMapper = new QSignalMapper(this);
+
+        /* Some stringLists like Capture listings have action associated */
+        for( int i = 0; i < p_item->i_action; i++ )
+        {
+            QPushButton *button =
+                new QPushButton( qfu( p_item->ppsz_action_text[i] ));
+            CONNECT( button, clicked(), signalMapper, map() );
+            signalMapper->setMapping( button, i );
+            l->addWidget( button, line, 2 + i, Qt::AlignRight );
+        }
+        CONNECT( signalMapper, mapped( int ),
+                this, actionRequested( int ) );
+    }
+}
+
+void StringListConfigControl::actionRequested( int i_action )
+{
+    /* Supplementary check for boundaries */
+    if( i_action < 0 || i_action >= p_item->i_action ) return;
+
+    vlc_value_t val;
+    val.psz_string = 
+        qtu( (combo->itemData( combo->currentIndex() ).toString() ) );
+
+    p_item->ppf_action[i_action]( p_this, getName(), val, val, 0 );
+
+    if( p_item->b_dirty )
+    {
+        combo->clear();
+        finish( true );
+        p_item->b_dirty = VLC_FALSE;
+    }
 }
 StringListConfigControl::StringListConfigControl( vlc_object_t *_p_this,
                 module_config_t *_p_item, QLabel *_label, QComboBox *_combo,
@@ -400,6 +436,26 @@ QString StringListConfigControl::getValue()
     return combo->itemData( combo->currentIndex() ).toString();
 }
 
+void setfillVLCConfigCombo( const char *configname, intf_thread_t *p_intf,
+                        QComboBox *combo, QWidget *parent )
+{
+    module_config_t *p_config =
+                      config_FindConfig( VLC_OBJECT(p_intf), configname );
+    if( p_config )
+    {
+        for ( int i_index = 0; i_index < p_config->i_list; i_index++ )
+        {
+            combo->addItem( qfu( p_config->ppsz_list_text[i_index] ),
+                    QVariant( p_config->pi_list[i_index] ) );
+            if( p_config->value.i == p_config->pi_list[i_index] )
+            {
+                combo->setCurrentIndex( i_index );
+            }
+        }
+        combo->setToolTip( qfu( p_config->psz_longtext ) );
+    }
+}
+
 /********* Module **********/
 ModuleConfigControl::ModuleConfigControl( vlc_object_t *_p_this,
                module_config_t *_p_item, QWidget *_parent, bool bycat,
@@ -421,6 +477,7 @@ ModuleConfigControl::ModuleConfigControl( vlc_object_t *_p_this,
         l->addWidget( combo, line, 1, Qt::AlignRight );
     }
 }
+
 ModuleConfigControl::ModuleConfigControl( vlc_object_t *_p_this,
                 module_config_t *_p_item, QLabel *_label, QComboBox *_combo,
                 bool bycat ) : VStringConfigControl( _p_this, _p_item )
@@ -514,16 +571,6 @@ ModuleListConfigControl::ModuleListConfigControl( vlc_object_t *_p_this,
 
     text->setToolTip( formatTooltip( qtr( p_item->psz_longtext) ) );
 }
-#if 0
-ModuleConfigControl::ModuleConfigControl( vlc_object_t *_p_this,
-        module_config_t *_p_item, QLabel *_label, QComboBox *_combo,
-        bool bycat ) : VStringConfigControl( _p_this, _p_item )
-{
-    combo = _combo;
-    label = _label;
-    finish( bycat );
-}
-#endif
 
 ModuleListConfigControl::~ModuleListConfigControl()
 {
@@ -930,11 +977,38 @@ KeySelectorControl::KeySelectorControl( vlc_object_t *_p_this,
                                 ConfigControl( _p_this, _p_item, _parent )
 
 {
-    label = new QLabel( qtr("Select an action to change the associated hotkey") );
-    table = new QTreeWidget( 0 );
+    QWidget *keyContainer = new QWidget;
+    QGridLayout *gLayout = new QGridLayout( keyContainer );
+
+    label = new QLabel(
+            qtr( "Select an action to change the associated hotkey") );
+    
+    /* Deactivated for now
+    QLabel *searchLabel = new QLabel( qtr( "Search" ) );
+    QLineEdit *actionSearch = new QLineEdit;*/
+    
+    table = new QTreeWidget;
+    table->setColumnCount(2);
+    table->headerItem()->setText( 0, qtr( "Action" ) );
+    table->headerItem()->setText( 1, qtr( "Shortcut" ) );
+
+    shortcutValue = new KeyShortcutEdit;
+    shortcutValue->setReadOnly(true);
+
+    QPushButton *clearButton = new QPushButton( qtr( "Clear" ) );
+    QPushButton *setButton = new QPushButton( qtr( "Set" ) );
     finish();
 
-    if( !l )
+    gLayout->addWidget( label, 0, 0, 1, 4 );
+  /* deactivated for now
+    gLayout->addWidget( searchLabel, 1, 0, 1, 2 );
+    gLayout->addWidget( actionSearch, 1, 2, 1, 2 ); */
+    gLayout->addWidget( table, 2, 0, 1, 4 );
+    gLayout->addWidget( clearButton, 3, 0, 1, 1 );
+    gLayout->addWidget( shortcutValue, 3, 1, 1, 2 ); 
+    gLayout->addWidget( setButton, 3, 3, 1, 1 );
+
+    if( !l ) /* This shouldn't happen */
     {
         QVBoxLayout *layout = new QVBoxLayout();
         layout->addWidget( label, 0 ); layout->addWidget( table, 1 );
@@ -942,9 +1016,10 @@ KeySelectorControl::KeySelectorControl( vlc_object_t *_p_this,
     }
     else
     {
-        l->addWidget( label, line, 0, 1, 2 );
-        l->addWidget( table, line+1, 0, 1,2 );
+        l->addWidget( keyContainer, 0, 0, 1, 2 );
     }
+    CONNECT( clearButton, clicked(), shortcutValue, clear() );
+    BUTTONACT( setButton, setTheKey() );
 }
 
 void KeySelectorControl::finish()
@@ -977,16 +1052,31 @@ void KeySelectorControl::finish()
     }
     table->resizeColumnToContents( 0 );
 
+    CONNECT( table, itemClicked( QTreeWidgetItem *, int ),
+             this, select1Key( QTreeWidgetItem * ) );
     CONNECT( table, itemDoubleClicked( QTreeWidgetItem *, int ),
              this, selectKey( QTreeWidgetItem * ) );
+    CONNECT( shortcutValue, pressed(), this, selectKey() );
+}
+
+void KeySelectorControl::select1Key( QTreeWidgetItem *keyItem )
+{
+    shortcutValue->setText( keyItem->text( 1 ) );
 }
 
 void KeySelectorControl::selectKey( QTreeWidgetItem *keyItem )
 {
-   module_config_t *p_keyItem = static_cast<module_config_t*>
+    /* This happens when triggered by ClickEater */
+    if( keyItem == NULL ) keyItem = table->currentItem();
+    
+    /* This can happen when nothing is selected on the treeView
+       and the shortcutValue is clicked */
+    if( !keyItem ) return;
+
+    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 );
+    KeyInputDialog *d = new KeyInputDialog( values, p_keyItem->psz_text, widget );
     d->exec();
     if( d->result() == QDialog::Accepted )
     {
@@ -1000,15 +1090,20 @@ void KeySelectorControl::selectKey( QTreeWidgetItem *keyItem )
                               (it->data( 0, Qt::UserRole ).value<void*>());
                 if( p_keyItem != p_item && p_item->value.i == d->keyValue )
                     p_item->value.i = 0;
-                it->setText( 1, VLCKeyToString( p_item->value.i ) );
+                shortcutValue->setText( VLCKeyToString( p_item->value.i ) );
             }
         }
         else
-            keyItem->setText( 1, VLCKeyToString( p_keyItem->value.i ) );
+            shortcutValue->setText( VLCKeyToString( p_keyItem->value.i ) );
     }
     delete d;
 }
 
+void KeySelectorControl::setTheKey()
+{
+    table->currentItem()->setText( 1, shortcutValue->text() );
+}
+
 void KeySelectorControl::doApply()
 {
     foreach( module_config_t *p_current, values )
@@ -1018,13 +1113,15 @@ void KeySelectorControl::doApply()
 }
 
 KeyInputDialog::KeyInputDialog( QList<module_config_t*>& _values,
-                                const char * _keyToChange ) :
-                                                QDialog(0), keyValue(0)
+                                const char * _keyToChange,
+                                QWidget *_parent ) :
+                                QDialog( _parent ), keyValue(0)
 {
     setModal( true );
     values = _values;
     conflicts = false;
     keyToChange = _keyToChange;
+    
     setWindowTitle( qtr( "Hotkey for " ) + qfu( keyToChange)  );
 
     QVBoxLayout *l = new QVBoxLayout( this );
@@ -1033,16 +1130,16 @@ KeyInputDialog::KeyInputDialog( QList<module_config_t*>& _values,
     l->addWidget( selected , Qt::AlignCenter );
     l->addWidget( warning, Qt::AlignCenter );
 
-    QHBoxLayout *l2 = new QHBoxLayout();
+    QDialogButtonBox *buttonBox = new QDialogButtonBox;
     QPushButton *ok = new QPushButton( qtr("OK") );
-    l2->addWidget( ok );
     QPushButton *cancel = new QPushButton( qtr("Cancel") );
-    l2->addWidget( cancel );
-
-    BUTTONACT( ok, accept() );
-    BUTTONACT( cancel, reject() );
+    buttonBox->addButton( ok, QDialogButtonBox::AcceptRole );
+    buttonBox->addButton( cancel, QDialogButtonBox::RejectRole );
 
-    l->addLayout( l2 );
+    l->addWidget( buttonBox );
+    
+    CONNECT( buttonBox, accepted(), this, accept() );
+    CONNECT( buttonBox, rejected(), this, reject() );
 }
 
 void KeyInputDialog::checkForConflicts( int i_vlckey )
@@ -1083,3 +1180,8 @@ void KeyInputDialog::wheelEvent( QWheelEvent *e )
     checkForConflicts( i_vlck );
     keyValue = i_vlck;
 }
+
+void KeyShortcutEdit::mousePressEvent( QMouseEvent *)
+{
+    emit pressed();
+}