]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/components/preferences_widgets.cpp
Qt4 - Remove unreachable code.
[vlc] / modules / gui / qt4 / components / preferences_widgets.cpp
index 81a48fe7895de96bcf17b940108d2e4fde2b2961..6844be6826357d2e4eb61fe4e4c1805e233dc8b5 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
  *      - Validator for modulelist
- *  - Implement update stuff using a general Updated signal
  */
 
 #include "components/preferences_widgets.hpp"
@@ -44,6 +44,8 @@
 #include <QFontDialog>
 #include <QGroupBox>
 #include <QTreeWidgetItem>
+#include <QSignalMapper>
+#include <QDialogButtonBox>
 
 QString formatTooltip(const QString & tooltip)
 {
@@ -231,8 +233,6 @@ void StringConfigControl::finish()
     text->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
     if( label )
         label->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( text, SIGNAL(textChanged( const QString & )), this,
-             SIGNAL(Updated()) );
 }
 
 /*********** File **************/
@@ -298,8 +298,6 @@ void FileConfigControl::finish()
     text->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
     if( label )
         label->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( text, SIGNAL(textChanged( const QString & )), this,
-             SIGNAL(Updated()) );
 }
 
 /********* String / Directory **********/
@@ -368,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,
@@ -395,8 +429,6 @@ void StringListConfigControl::finish( bool bycat )
     combo->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
     if( label )
         label->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( combo, SIGNAL(currentIndexChanged( int )), this,
-             SIGNAL(Updated()) );
 }
 
 QString StringListConfigControl::getValue()
@@ -404,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,
@@ -425,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 )
@@ -478,8 +531,6 @@ void ModuleConfigControl::finish( bool bycat )
     combo->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
     if( label )
         label->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( combo, SIGNAL(currentIndexChanged( int )), this,
-             SIGNAL(Updated()) );
 }
 
 QString ModuleConfigControl::getValue()
@@ -495,8 +546,6 @@ ModuleListConfigControl::ModuleListConfigControl( vlc_object_t *_p_this,
 {
     groupBox = new QGroupBox ( qtr(p_item->psz_text) );
     text = new QLineEdit();
-    connect( text, SIGNAL(textChanged( const QString & )), this,
-             SIGNAL(Updated()) );
     QGridLayout *layoutGroupBox = new QGridLayout( groupBox );
 
     finish( bycat );
@@ -522,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()
 {
@@ -648,7 +687,6 @@ void ModuleListConfigControl::onUpdate( int value )
             }
         }
     }
-    emit Updated();
 }
 
 /**************************************************************************
@@ -698,8 +736,6 @@ void IntegerConfigControl::finish()
     spin->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
     if( label )
         label->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( spin, SIGNAL(valueChanged( int )), this,
-             SIGNAL(Updated()) );
 }
 
 int IntegerConfigControl::getValue()
@@ -797,8 +833,6 @@ void IntegerListConfigControl::finish( bool bycat )
     combo->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
     if( label )
         label->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( combo, SIGNAL(currentIndexChanged( int )), this,
-             SIGNAL(Updated()) );
 }
 
 int IntegerListConfigControl::getValue()
@@ -843,8 +877,6 @@ void BoolConfigControl::finish()
     checkbox->setCheckState( p_item->value.i == VLC_TRUE ? Qt::Checked
                                                         : Qt::Unchecked );
     checkbox->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( checkbox, SIGNAL(stateChanged( int )), this,
-             SIGNAL(Updated()) );
 }
 
 int BoolConfigControl::getValue()
@@ -902,8 +934,6 @@ void FloatConfigControl::finish()
     spin->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
     if( label )
         label->setToolTip( formatTooltip(qtr(p_item->psz_longtext)) );
-    connect( spin, SIGNAL(valueChanged( double )), this,
-             SIGNAL(Updated()) );
 }
 
 float FloatConfigControl::getValue()
@@ -947,21 +977,41 @@ 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 )
-    {
-        QVBoxLayout *layout = new QVBoxLayout();
-        layout->addWidget( label, 0 ); layout->addWidget( table, 1 );
-        widget->setLayout( layout );
-    }
-    else
-    {
-        l->addWidget( label, line, 0, 1, 2 );
-        l->addWidget( table, line+1, 0, 1,2 );
-    }
+    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 );
+
+    l->addWidget( keyContainer, line, 0, 1, 2 );
+
+    CONNECT( clearButton, clicked(), shortcutValue, clear() );
+    BUTTONACT( setButton, setTheKey() );
 }
 
 void KeySelectorControl::finish()
@@ -981,7 +1031,7 @@ void KeySelectorControl::finish()
         module_config_t *p_item = p_main->p_config + i;
 
         if( p_item->i_type & CONFIG_ITEM && p_item->psz_name &&
-            strstr( p_item->psz_name , "key-" ) )
+            strstr( p_item->psz_name , "key-" ) && !EMPTY_STR( p_item->psz_text ) )
         {
             QTreeWidgetItem *treeItem = new QTreeWidgetItem();
             treeItem->setText( 0, qtr( p_item->psz_text ) );
@@ -994,16 +1044,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 )
     {
@@ -1017,15 +1082,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 )
@@ -1035,37 +1105,39 @@ 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 );
-    selected = new QLabel( qtr("Press the new keys for ")  + qfu(keyToChange) );
-    warning = new QLabel();
-    l->addWidget( selected , Qt::AlignCenter );
-    l->addWidget( warning, Qt::AlignCenter );
+    vLayout = new QVBoxLayout( this );
+    selected = new QLabel( qtr("Press the new keys for ") + qfu( keyToChange ) );
+    vLayout->addWidget( selected , Qt::AlignCenter );
 
-    QHBoxLayout *l2 = new QHBoxLayout();
+    buttonBox = new QDialogButtonBox;
     QPushButton *ok = new QPushButton( qtr("OK") );
-    l2->addWidget( ok );
     QPushButton *cancel = new QPushButton( qtr("Cancel") );
-    l2->addWidget( cancel );
+    buttonBox->addButton( ok, QDialogButtonBox::AcceptRole );
+    buttonBox->addButton( cancel, QDialogButtonBox::RejectRole );
 
-    BUTTONACT( ok, accept() );
-    BUTTONACT( cancel, reject() );
+    vLayout->addWidget( buttonBox );
+    buttonBox->hide();
 
-    l->addLayout( l2 );
+    CONNECT( buttonBox, accepted(), this, accept() );
+    CONNECT( buttonBox, rejected(), this, reject() );
 }
 
 void KeyInputDialog::checkForConflicts( int i_vlckey )
 {
     conflicts = false;
     module_config_t *p_current = NULL;
+    /* Search for conflicts */
     foreach( p_current, values )
     {
         if( p_current->value.i == i_vlckey && strcmp( p_current->psz_text,
@@ -1075,13 +1147,17 @@ void KeyInputDialog::checkForConflicts( int i_vlckey )
             break;
         }
     }
+
     if( conflicts )
     {
-        warning->setText(
+        QLabel *warning = new QLabel(
           qtr("Warning: the  key is already assigned to \"") +
-          QString( p_current->psz_text ) + "\"" );
+          qfu( p_current->psz_text ) + "\"" );
+        warning->setWordWrap( true );
+        vLayout->insertWidget( 1, warning );
+        buttonBox->show();
     }
-    else warning->setText( "" );
+    else accept();
 }
 
 void KeyInputDialog::keyPressEvent( QKeyEvent *e )
@@ -1100,3 +1176,8 @@ void KeyInputDialog::wheelEvent( QWheelEvent *e )
     checkForConflicts( i_vlck );
     keyValue = i_vlck;
 }
+
+void KeyShortcutEdit::mousePressEvent( QMouseEvent *)
+{
+    emit pressed();
+}