]> git.sesse.net Git - vlc/commitdiff
Qt4 - open dialogs: Capture tab, DVB, PVR and V4L. main design is done. NEeds to...
authorJean-Baptiste Kempf <jb@videolan.org>
Sun, 20 May 2007 16:23:48 +0000 (16:23 +0000)
committerJean-Baptiste Kempf <jb@videolan.org>
Sun, 20 May 2007 16:23:48 +0000 (16:23 +0000)
modules/gui/qt4/components/open.cpp
modules/gui/qt4/components/open.hpp
modules/gui/qt4/dialogs/open.cpp
modules/gui/qt4/dialogs/open.hpp
modules/gui/qt4/ui/open_capture.ui

index a1aea81cd4ed9ddf3d28838512052b1102b2c237..f44f19759c6f5516ea474403c7519a4af4e4b4a8 100644 (file)
@@ -32,6 +32,7 @@
 #include <QFileDialog>
 #include <QDialogButtonBox>
 #include <QLineEdit>
+#include <QStackedLayout>
 
 /**************************************************************************
  * File open
@@ -53,7 +54,7 @@ FileOpenPanel::FileOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
     ADD_FILTER_AUDIO( fileTypes );
     ADD_FILTER_PLAYLIST( fileTypes );
     ADD_FILTER_ALL( fileTypes );
-    fileTypes.replace(QString(";*"), QString(" *"));
+    fileTypes.replace( QString(";*"), QString(" *"));
 
     // Make this QFileDialog a child of tempWidget from the ui.
     dialogBox = new FileOpenBox( ui.tempWidget, NULL,
@@ -65,7 +66,7 @@ FileOpenPanel::FileOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
     char *psz_filepath = config_GetPsz( p_intf, "qt-filedialog-path" );
     if( psz_filepath )
     {
-        dialogBox->setDirectory( QString::fromUtf8(psz_filepath) );
+        dialogBox->setDirectory( QString::fromUtf8( psz_filepath ) );
         delete psz_filepath;
     }
 
@@ -130,24 +131,26 @@ FileOpenPanel::FileOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
         }
     }
 
+    /* Connects  */
     BUTTONACT( ui.subBrowseButton, browseFileSub() );
     BUTTONACT( ui.subCheckBox, toggleSubtitleFrame());
 
-    CONNECT( ui.fileInput, editTextChanged(QString ), this, updateMRL());
-    CONNECT( ui.subInput, editTextChanged(QString ), this, updateMRL());
-    CONNECT( ui.alignSubComboBox, currentIndexChanged(int), this, updateMRL());
-    CONNECT( ui.sizeSubComboBox, currentIndexChanged(int), this, updateMRL());
+    CONNECT( ui.fileInput, editTextChanged( QString ), this, updateMRL());
+    CONNECT( ui.subInput, editTextChanged( QString ), this, updateMRL());
+    CONNECT( ui.alignSubComboBox, currentIndexChanged( int ), this, updateMRL());
+    CONNECT( ui.sizeSubComboBox, currentIndexChanged( int ), this, updateMRL());
     CONNECT( lineFileEdit, textChanged( QString ), this, browseFile());
 }
 
 FileOpenPanel::~FileOpenPanel()
 {}
 
-QStringList FileOpenPanel::browse(QString help)
+QStringList FileOpenPanel::browse( QString help )
 {
     return THEDP->showSimpleOpen( help );
 }
 
+/* Unused. FIXME ? */
 void FileOpenPanel::browseFile()
 {
     QString fileString = "";
@@ -175,15 +178,17 @@ void FileOpenPanel::updateMRL()
 
     if( ui.subCheckBox->isChecked() ) {
         mrl.append( " :sub-file=" + ui.subInput->currentText() );
-        int align = ui.alignSubComboBox->itemData( ui.alignSubComboBox->currentIndex() ).toInt();
+        int align = ui.alignSubComboBox->itemData(
+                    ui.alignSubComboBox->currentIndex() ).toInt();
         mrl.append( " :subsdec-align=" + QString().setNum( align ) );
-        int size = ui.sizeSubComboBox->itemData( ui.sizeSubComboBox->currentIndex() ).toInt();
+        int size = ui.sizeSubComboBox->itemData(
+                   ui.sizeSubComboBox->currentIndex() ).toInt();
         mrl.append( " :freetype-rel-fontsize=" + QString().setNum( size ) );
     }
 
     const char *psz_filepath = config_GetPsz( p_intf, "qt-filedialog-path" );
-    if( (NULL == psz_filepath)
-      || strcmp(psz_filepath,dialogBox->directory().absolutePath().toUtf8()) )
+    if( ( NULL == psz_filepath )
+      || strcmp( psz_filepath,dialogBox->directory().absolutePath().toUtf8()) )
     {
         /* set dialog box current directory as last known path */
         config_PutPsz( p_intf, "qt-filedialog-path",
@@ -199,8 +204,8 @@ void FileOpenPanel::updateMRL()
 /* Function called by Open Dialog when clicke on Play/Enqueue */
 void FileOpenPanel::accept()
 {
-    ui.fileInput->addItem(ui.fileInput->currentText());
-    if ( ui.fileInput->count() > 8 ) ui.fileInput->removeItem(0);
+    ui.fileInput->addItem( ui.fileInput->currentText());
+    if ( ui.fileInput->count() > 8 ) ui.fileInput->removeItem( 0 );
 }
 
 void FileOpenBox::accept()
@@ -217,7 +222,7 @@ void FileOpenPanel::clear()
 
 void FileOpenPanel::toggleSubtitleFrame()
 {
-    if (ui.subFrame->isVisible())
+    if ( ui.subFrame->isVisible() )
     {
         ui.subFrame->hide();
         updateGeometry();
@@ -245,11 +250,11 @@ DiscOpenPanel::DiscOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
     BUTTONACT( ui.audioCDRadioButton, updateButtons());
     BUTTONACT( ui.dvdsimple,  updateButtons());
 
-    CONNECT( ui.deviceCombo, editTextChanged(QString ), this, updateMRL());
-    CONNECT( ui.titleSpin, valueChanged(int), this, updateMRL());
-    CONNECT( ui.chapterSpin, valueChanged(int), this, updateMRL());
-    CONNECT( ui.audioSpin, valueChanged(int), this, updateMRL());
-    CONNECT( ui.subtitlesSpin, valueChanged(int), this, updateMRL());
+    CONNECT( ui.deviceCombo, editTextChanged( QString ), this, updateMRL());
+    CONNECT( ui.titleSpin, valueChanged( int ), this, updateMRL());
+    CONNECT( ui.chapterSpin, valueChanged( int ), this, updateMRL());
+    CONNECT( ui.audioSpin, valueChanged( int ), this, updateMRL());
+    CONNECT( ui.subtitlesSpin, valueChanged( int ), this, updateMRL());
 }
 
 DiscOpenPanel::~DiscOpenPanel()
@@ -257,8 +262,8 @@ DiscOpenPanel::~DiscOpenPanel()
 
 void DiscOpenPanel::clear()
 {
-    ui.titleSpin->setValue(0);
-    ui.chapterSpin->setValue(0);
+    ui.titleSpin->setValue( 0 );
+    ui.chapterSpin->setValue( 0 );
 }
 
 void DiscOpenPanel::updateButtons()
@@ -302,41 +307,42 @@ void DiscOpenPanel::updateMRL()
         emit methodChanged( "dvdnav-caching" );
 
         if ( ui.titleSpin->value() > 0 ) {
-            mrl += QString("@%1").arg(ui.titleSpin->value());
+            mrl += QString("@%1").arg( ui.titleSpin->value() );
             if ( ui.chapterSpin->value() > 0 ) {
-                mrl+= QString(":%1").arg(ui.chapterSpin->value());
+                mrl+= QString(":%1").arg( ui.chapterSpin->value() );
             }
         }
 
     /* VCD */
-    } else if (ui.vcdRadioButton->isChecked() ) {
+    } else if ( ui.vcdRadioButton->isChecked() ) {
         mrl = "vcd://" + ui.deviceCombo->currentText();
         emit methodChanged( "vcd-caching" );
 
         if( ui.titleSpin->value() > 0 ) {
-            mrl += QString("@E%1").arg(ui.titleSpin->value());
+            mrl += QString("@E%1").arg( ui.titleSpin->value() );
         }
 
     /* CDDA */
     } else {
         mrl = "cdda://" + ui.deviceCombo->currentText();
         if( ui.titleSpin->value() > 0 ) {
-            QString("@%1").arg(ui.titleSpin->value());
+            QString("@%1").arg( ui.titleSpin->value() );
         }
     }
 
     if ( ui.dvdRadioButton->isChecked() || ui.vcdRadioButton->isChecked() )
     {
         if ( ui.audioSpin->value() >= 0 ) {
-            mrl += " :audio-track=" + QString("%1").arg(ui.audioSpin->value());
+            mrl += " :audio-track=" +
+                QString("%1").arg( ui.audioSpin->value() );
         }
         if ( ui.subtitlesSpin->value() >= 0 ) {
             mrl += " :sub-track=" +
-                QString("%1").arg(ui.subtitlesSpin->value());
+                QString("%1").arg( ui.subtitlesSpin->value() );
         }
     }
 
-    emit mrlUpdated(mrl);
+    emit mrlUpdated( mrl );
 }
 
 
@@ -349,10 +355,10 @@ NetOpenPanel::NetOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
 {
     ui.setupUi( this );
 
-    CONNECT( ui.protocolCombo, currentIndexChanged(int),
-             this, updateProtocol(int) );
-    CONNECT( ui.portSpin, valueChanged(int), this, updateMRL());
-    CONNECT( ui.addressText, textChanged(QString), this, updateAddress());
+    CONNECT( ui.protocolCombo, currentIndexChanged( int ),
+             this, updateProtocol( int ) );
+    CONNECT( ui.portSpin, valueChanged( int ), this, updateMRL() );
+    CONNECT( ui.addressText, textChanged( QString ), this, updateAddress());
     CONNECT( ui.timeShift, clicked(), this, updateMRL());
     CONNECT( ui.ipv6, clicked(), this, updateMRL());
 
@@ -371,11 +377,11 @@ NetOpenPanel::~NetOpenPanel()
 void NetOpenPanel::clear()
 {}
 
-void NetOpenPanel::updateProtocol(int idx) {
+void NetOpenPanel::updateProtocol( int idx ) {
     QString addr = ui.addressText->text();
-    QString proto = ui.protocolCombo->itemData(idx).toString();
+    QString proto = ui.protocolCombo->itemData( idx ).toString();
 
-    ui.timeShift->setEnabled( idx >= 4);
+    ui.timeShift->setEnabled( idx >= 4 );
     ui.ipv6->setEnabled( idx == 4 );
     ui.addressText->setEnabled( idx != 4 );
     ui.portSpin->setEnabled( idx >= 4 );
@@ -383,8 +389,8 @@ void NetOpenPanel::updateProtocol(int idx) {
     /* If we already have a protocol in the address, replace it */
     if( addr.contains( "://")) {
         msg_Err( p_intf, "replace");
-        addr.replace(QRegExp("^.*://"), proto + "://");
-        ui.addressText->setText(addr);
+        addr.replace( QRegExp("^.*://"), proto + "://");
+        ui.addressText->setText( addr );
     }
 
     updateMRL();
@@ -402,7 +408,7 @@ void NetOpenPanel::updateMRL() {
     if( addr.contains( "://") && proto != 4 ) {
         mrl = addr;
     } else {
-        switch(proto) {
+        switch( proto ) {
         case 0:
         case 1:
             mrl = "http://" + addr;
@@ -425,7 +431,7 @@ void NetOpenPanel::updateMRL() {
             if( ui.ipv6->isEnabled() && ui.ipv6->isChecked() ) {
                 mrl += "[::]";
             }
-            mrl += QString(":%1").arg(ui.portSpin->value());
+            mrl += QString(":%1").arg( ui.portSpin->value() );
             emit methodChanged("udp-caching");
             break;
         case 6: /* UDP multicast */
@@ -434,14 +440,14 @@ void NetOpenPanel::updateMRL() {
             if ( addr.contains(':') && !addr.contains('[') ) {
                 mrl += "[" + addr + "]";
             } else mrl += addr;
-            mrl += QString(":%1").arg(ui.portSpin->value());
+            mrl += QString(":%1").arg( ui.portSpin->value() );
             emit methodChanged("udp-caching");
         }
     }
     if( ui.timeShift->isEnabled() && ui.timeShift->isChecked() ) {
         mrl += " :access-filter=timeshift";
     }
-    emit mrlUpdated(mrl);
+    emit mrlUpdated( mrl );
 }
 
 /**************************************************************************
@@ -451,6 +457,175 @@ CaptureOpenPanel::CaptureOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
                                 OpenPanel( _parent, _p_intf )
 {
     ui.setupUi( this );
+
+    QStackedLayout *stackedDevLayout = new QStackedLayout;
+    ui.cardBox->setLayout( stackedDevLayout );
+
+    QStackedLayout *stackedPropLayout = new QStackedLayout;
+    ui.optionsBox->setLayout( stackedPropLayout );
+
+#define addModuleAndLayouts( name, label )                            \
+    QWidget * name ## DevPage = new QWidget( this );                  \
+    QWidget * name ## PropPage = new QWidget( this );                 \
+    stackedDevLayout->addWidget( name ## DevPage );                   \
+    stackedPropLayout->addWidget( name ## PropPage );                  \
+    QGridLayout * name ## DevLayout = new QGridLayout;                \
+    QGridLayout * name ## PropLayout = new QGridLayout;               \
+    name ## DevPage->setLayout( name ## DevLayout );                  \
+    name ## PropPage->setLayout( name ## PropLayout );                \
+    ui.deviceCombo->addItem( qtr( label ) );
+
+#define CuMRL( widget, slot ) CONNECT( widget , slot , this, updateMRL() );
+
+    /*******
+     * V4L *
+     *******/
+    /* V4l Main */
+    addModuleAndLayouts( v4l, "Video for Linux" );
+    QLabel *v4lVideoDeviceLabel = new QLabel( qtr( "Video device name" ) );
+    v4lDevLayout->addWidget( v4lVideoDeviceLabel, 0, 0 );
+    QLineEdit *v4lVideoDevice = new QLineEdit;
+    v4lDevLayout->addWidget( v4lVideoDevice, 0, 1 );
+    QLabel *v4lAudioDeviceLabel = new QLabel( qtr( "Audio device name" ) );
+    v4lDevLayout->addWidget( v4lAudioDeviceLabel, 1, 0 );
+    QLineEdit *v4lAudioDevice = new QLineEdit;
+    v4lDevLayout->addWidget( v4lAudioDevice, 1, 1 );
+
+    /* V4l Props */
+    QComboBox *v4lNormBox = new QComboBox;
+    v4lNormBox->insertItem( 3, qtr( "Automatic" ) );
+    v4lNormBox->insertItem( 0, "SECAM" );
+    v4lNormBox->insertItem( 1, "NTSC" );
+    v4lNormBox->insertItem( 2, "PAL" );
+
+    QSpinBox *v4lFreq = new QSpinBox;
+    v4lFreq->setAlignment( Qt::AlignRight );
+    v4lFreq->setSuffix(" kHz");
+
+    QLabel *v4lNormLabel = new QLabel( qtr( "Norm" ) );
+    QLabel *v4lFreqLabel = new QLabel( qtr( "Frequency" ) );
+
+    v4lPropLayout->addWidget( v4lNormLabel, 0 , 0 );
+    v4lPropLayout->addWidget( v4lNormBox, 0 , 1 );
+
+    v4lPropLayout->addWidget( v4lFreqLabel, 1 , 0 );
+    v4lPropLayout->addWidget( v4lFreq, 1 , 1 );
+
+    /* v4l CONNECTs */
+    CuMRL( v4lVideoDevice, textChanged( QString ) );
+    CuMRL( v4lAudioDevice, textChanged( QString ) );
+    CuMRL( v4lFreq, valueChanged ( int ) );
+    CuMRL( v4lNormBox,  currentIndexChanged ( int ) );
+
+    /************
+     * PVR      *
+     ************/
+    addModuleAndLayouts( pvr, "PVR" );
+
+    /* PVR Main */
+    QLabel *pvrVideoDeviceLabel = new QLabel( qtr( "Device name" ) );
+    pvrDevLayout->addWidget( pvrVideoDeviceLabel, 0, 0 );
+    QLineEdit *pvrVideoDevice = new QLineEdit;
+    pvrDevLayout->addWidget( pvrVideoDevice, 0, 1 );
+    QLabel *pvrAudioDeviceLabel = new QLabel( qtr( "Radio device name" ) );
+    pvrDevLayout->addWidget( pvrAudioDeviceLabel, 1, 0 );
+    QLineEdit *pvrAudioDevice = new QLineEdit;
+    pvrDevLayout->addWidget( pvrAudioDevice, 1, 1 );
+
+    /* PVR props */
+    QComboBox *pvrNormBox = new QComboBox;
+    pvrNormBox->insertItem( 3, qtr( "Automatic" ) );
+    pvrNormBox->insertItem( 0, "SECAM" );
+    pvrNormBox->insertItem( 1, "NTSC" );
+    pvrNormBox->insertItem( 2, "PAL" );
+
+    QSpinBox *pvrFreq = new QSpinBox;
+    pvrFreq->setAlignment( Qt::AlignRight );
+    pvrFreq->setSuffix(" kHz");
+    QLabel *pvrNormLabel = new QLabel( qtr( "Norm" ) );
+    QLabel *pvrFreqLabel = new QLabel( qtr( "Frequency" ) );
+
+    pvrPropLayout->addWidget( pvrNormLabel, 0, 0 );
+    pvrPropLayout->addWidget( pvrNormBox, 0, 1 );
+
+    pvrPropLayout->addWidget( pvrFreqLabel, 1, 0 );
+    pvrPropLayout->addWidget( pvrFreq, 1, 1 );
+
+    /* PVR CONNECTs */
+    CuMRL( pvrVideoDevice, textChanged( QString ) );
+    CuMRL( pvrAudioDevice, textChanged( QString ) );
+
+    CuMRL( pvrFreq, valueChanged ( int ) );
+    CuMRL( pvrNormBox,  currentIndexChanged ( int ) );
+
+    /*********************
+     * DirectShow Stuffs *
+     *********************/
+    addModuleAndLayouts( dshow, "DirectShow" );
+
+
+    /**************
+     * BDA Stuffs *
+     **************/
+    addModuleAndLayouts( bda, "DVB / BDA" );
+
+    /**************
+     * DVB Stuffs *
+     **************/
+    addModuleAndLayouts( dvb, "DVB" );
+
+    /* DVB Main */
+    QLabel *dvbDeviceLabel = new QLabel( qtr( "Adapter card to tune" ) );
+
+    QSpinBox *dvbCard = new QSpinBox;
+    dvbCard->setAlignment( Qt::AlignRight );
+    dvbCard->setPrefix( "/dev/dvb/adapter" );
+
+    dvbDevLayout->addWidget( dvbDeviceLabel, 0, 0 );
+    dvbDevLayout->addWidget( dvbCard, 0, 2 );
+
+    dvbs = new QRadioButton( "DVB-S" );
+    dvbs->setChecked( true );
+    dvbc = new QRadioButton( "DVB-C" );
+    dvbt = new QRadioButton( "DVB-T" );
+
+    dvbDevLayout->addWidget( dvbs, 1, 0 );
+    dvbDevLayout->addWidget( dvbc, 1, 1 );
+    dvbDevLayout->addWidget( dvbt, 1, 2 );
+
+    /* DVB Props */
+    QLabel *dvbFreqLabel =
+                    new QLabel( qtr( "Transponder/multiplex frequency" ) );
+    dvbFreq = new QSpinBox;
+    dvbFreq->setAlignment( Qt::AlignRight );
+    //FIXME DVB-C/T uses Hz
+    dvbFreq->setSuffix(" kHz");
+    dvbPropLayout->addWidget( dvbFreqLabel, 0, 0 );
+    dvbPropLayout->addWidget( dvbFreq, 0, 1 );
+
+    QLabel *dvbSrateLabel = new QLabel( qtr( "Transponder symbol rate" ) );
+    QSpinBox *dvbSrate = new QSpinBox;
+    dvbSrate->setAlignment( Qt::AlignRight );
+    dvbSrate->setSuffix(" kHz");
+    dvbPropLayout->addWidget( dvbSrateLabel, 1, 0 );
+    dvbPropLayout->addWidget( dvbSrate, 1, 1 );
+
+    /* DVB CONNECTs */
+    CuMRL( dvbCard, valueChanged ( int ) );
+    CuMRL( dvbFreq, valueChanged ( int ) );
+    CuMRL( dvbSrate, valueChanged ( int ) );
+    BUTTONACT( dvbs, updateButtons() );
+    BUTTONACT( dvbt, updateButtons() );
+    BUTTONACT( dvbc, updateButtons() );
+
+    /* General connects */
+    connect( ui.deviceCombo, SIGNAL( activated( int ) ),
+                     stackedDevLayout, SLOT( setCurrentIndex( int ) ) );
+    connect( ui.deviceCombo, SIGNAL( activated( int ) ),
+                     stackedPropLayout, SLOT( setCurrentIndex( int ) ) );
+    CONNECT( ui.deviceCombo, activated( int ), this, updateMRL() );
+
+#undef addModule
 }
 
 CaptureOpenPanel::~CaptureOpenPanel()
@@ -462,5 +637,11 @@ void CaptureOpenPanel::clear()
 void CaptureOpenPanel::updateMRL()
 {
     QString mrl = "";
-    emit mrlUpdated(mrl);
+    emit mrlUpdated( mrl );
+}
+
+void CaptureOpenPanel::updateButtons()
+{
+    if( dvbs->isChecked() ) dvbFreq->setSuffix(" kHz");
+    if( dvbc->isChecked() || dvbt->isChecked() ) dvbFreq->setSuffix(" Hz");
 }
index 7bc7f3ad088a19ae30a7493edbb91a235700a239..3060fd1b7c9a99d0871c06555bc1439f8f1e9c3f 100644 (file)
@@ -128,8 +128,15 @@ public:
     virtual void clear() ;
 private:
     Ui::OpenCapture ui;
+    QRadioButton *dvbs;
+    QRadioButton *dvbt;
+    QRadioButton *dvbc;
+    QSpinBox *dvbFreq;
+
 public slots:
     virtual void updateMRL();
+private slots:
+    void updateButtons();
 };
 
 #endif
index 0f5eeb835956df593453e32374b892e7d9b25ef5..af2ee71b1ab8bd1c038056d4008cdd5506b14bf8 100644 (file)
@@ -74,7 +74,7 @@ OpenDialog::OpenDialog( QWidget *parent, intf_thread_t *_p_intf, bool modal,
     playButton->setPopupMode( QToolButton::MenuButtonPopup );
     playButton->setToolButtonStyle( Qt::ToolButtonTextOnly );
 
-    cancelButton = new QToolButton();
+    cancelButton = new QPushButton();
     cancelButton->setText( qtr( "&Cancel" ) );
     cancelButton->setSizePolicy( buttonSizePolicy );
 
index 54255fe881de553c8af026c391ef7c33ad5fcd0d..59c6ac7d9977a9979f574e7b9c400e3c05d24fdd 100644 (file)
@@ -84,7 +84,7 @@ private:
     int i_action_flag;
     QStringList SeparateEntries( QString );
 
-    QToolButton *cancelButton;
+    QPushButton *cancelButton;
     QToolButton *playButton;
     void finish( bool );
 
index 5c9b5b486e9712a92ee59b70181dd95225ea77f6..52ff451a45a2b441ff7a1f9735d8ece7ac6e023f 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>314</width>
-    <height>140</height>
+    <height>147</height>
    </rect>
   </property>
   <property name="windowTitle" >
    <property name="spacing" >
     <number>6</number>
    </property>
-   <item row="1" column="0" colspan="2" >
-    <widget class="QGroupBox" name="groupBox" >
+   <item row="4" column="0" colspan="2" >
+    <spacer>
+     <property name="orientation" >
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType" >
+      <enum>QSizePolicy::MinimumExpanding</enum>
+     </property>
+     <property name="sizeHint" >
+      <size>
+       <width>20</width>
+       <height>10</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="0" column="1" >
+    <widget class="QComboBox" name="deviceCombo" >
      <property name="sizePolicy" >
       <sizepolicy>
-       <hsizetype>3</hsizetype>
-       <vsizetype>5</vsizetype>
+       <hsizetype>1</hsizetype>
+       <vsizetype>0</vsizetype>
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
-     <property name="title" >
-      <string>Card Selection</string>
+    </widget>
+   </item>
+   <item row="0" column="0" >
+    <widget class="QLabel" name="label" >
+     <property name="text" >
+      <string>Capture Mode</string>
      </property>
-     <widget class="QWidget" name="gridLayout" >
-      <property name="geometry" >
-       <rect>
-        <x>10</x>
-        <y>10</y>
-        <width>531</width>
-        <height>41</height>
-       </rect>
-      </property>
-      <layout class="QGridLayout" >
-       <property name="margin" >
-        <number>0</number>
-       </property>
-       <property name="spacing" >
-        <number>6</number>
-       </property>
-      </layout>
-     </widget>
     </widget>
    </item>
    <item row="2" column="0" colspan="2" >
-    <widget class="QGroupBox" name="Options" >
+    <widget class="QGroupBox" name="optionsBox" >
      <property name="sizePolicy" >
       <sizepolicy>
        <hsizetype>5</hsizetype>
      <property name="title" >
       <string>Options</string>
      </property>
-     <layout class="QHBoxLayout" >
-      <property name="margin" >
-       <number>9</number>
-      </property>
-      <property name="spacing" >
-       <number>6</number>
-      </property>
-     </layout>
-    </widget>
-   </item>
-   <item row="0" column="0" >
-    <widget class="QLabel" name="label" >
-     <property name="text" >
-      <string>Capture Mode</string>
-     </property>
     </widget>
    </item>
-   <item row="0" column="1" >
-    <widget class="QComboBox" name="protocolCombo" >
+   <item row="1" column="0" colspan="2" >
+    <widget class="QGroupBox" name="cardBox" >
      <property name="sizePolicy" >
       <sizepolicy>
-       <hsizetype>1</hsizetype>
-       <vsizetype>0</vsizetype>
+       <hsizetype>3</hsizetype>
+       <vsizetype>5</vsizetype>
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
+     <property name="title" >
+      <string>Card Selection</string>
+     </property>
     </widget>
    </item>
-   <item row="3" column="0" colspan="2" >
-    <spacer>
-     <property name="orientation" >
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeType" >
-      <enum>QSizePolicy::MinimumExpanding</enum>
-     </property>
-     <property name="sizeHint" >
-      <size>
-       <width>20</width>
-       <height>10</height>
-      </size>
+   <item row="3" column="0" >
+    <widget class="QPushButton" name="advancedButton" >
+     <property name="text" >
+      <string>Advanced options...</string>
      </property>
-    </spacer>
+    </widget>
    </item>
   </layout>
  </widget>