~bratsche/vlc/vlc-notify-add-actions-with-server-support

« back to all changes in this revision

Viewing changes to modules/gui/qt4/components/open_panels.cpp

  • Committer: Bazaar Package Importer
  • Date: 2008-11-28 09:41:28 UTC
  • Revision ID: jamesw@ubuntu.com-20081128094128-qc1zhxqwlf2ov8cl
Tags: upstream-ubuntu-0.9.2
ImportĀ upstreamĀ versionĀ 0.9.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*****************************************************************************
 
2
 * open.cpp : Panels for the open dialogs
 
3
 ****************************************************************************
 
4
 * Copyright (C) 2006-2008 the VideoLAN team
 
5
 * Copyright (C) 2007 SociĆ©tĆ© des arts technologiques
 
6
 * Copyright (C) 2007 Savoir-faire Linux
 
7
 *
 
8
 * $Id: f7e1cb296ff152c4cc279422d0ad45312e5f8e83 $
 
9
 *
 
10
 * Authors: ClĆ©ment Stenac <zorglub@videolan.org>
 
11
 *          Jean-Baptiste Kempf <jb@videolan.org>
 
12
 *          Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
 
13
 *
 
14
 * This program is free software; you can redistribute it and/or modify
 
15
 * it under the terms of the GNU General Public License as published by
 
16
 * the Free Software Foundation; either version 2 of the License, or
 
17
 * (at your option) any later version.
 
18
 *
 
19
 * This program is distributed in the hope that it will be useful,
 
20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
22
 * GNU General Public License for more details.
 
23
 *
 
24
 * You should have received a copy of the GNU General Public License
 
25
 * along with this program; if not, write to the Free Software
 
26
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 
27
 *****************************************************************************/
 
28
 
 
29
#ifdef HAVE_CONFIG_H
 
30
# include "config.h"
 
31
#endif
 
32
 
 
33
#include "qt4.hpp"
 
34
#include "components/open_panels.hpp"
 
35
#include "dialogs/open.hpp"
 
36
#include "dialogs_provider.hpp"
 
37
 
 
38
#include <QFileDialog>
 
39
#include <QDialogButtonBox>
 
40
#include <QLineEdit>
 
41
#include <QStackedLayout>
 
42
#include <QListView>
 
43
#include <QCompleter>
 
44
#include <QDirModel>
 
45
#include <QScrollArea>
 
46
#include <QUrl>
 
47
 
 
48
#define I_DEVICE_TOOLTIP N_("Select the device or the VIDEO_TS directory")
 
49
 
 
50
/**************************************************************************
 
51
 * Open Files and subtitles                                               *
 
52
 **************************************************************************/
 
53
FileOpenPanel::FileOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
 
54
                                OpenPanel( _parent, _p_intf )
 
55
{
 
56
    /* Classic UI Setup */
 
57
    ui.setupUi( this );
 
58
 
 
59
    /** BEGIN QFileDialog tweaking **/
 
60
    /* Use a QFileDialog and customize it because we don't want to
 
61
       rewrite it all. Be careful to your eyes cause there are a few hacks.
 
62
       Be very careful and test correctly when you modify this. */
 
63
 
 
64
    /* Set Filters for file selection */
 
65
    QString fileTypes = "";
 
66
    ADD_FILTER_MEDIA( fileTypes );
 
67
    ADD_FILTER_VIDEO( fileTypes );
 
68
    ADD_FILTER_AUDIO( fileTypes );
 
69
    ADD_FILTER_PLAYLIST( fileTypes );
 
70
    ADD_FILTER_ALL( fileTypes );
 
71
    fileTypes.replace( QString(";*"), QString(" *"));
 
72
 
 
73
    // Make this QFileDialog a child of tempWidget from the ui.
 
74
    dialogBox = new FileOpenBox( ui.tempWidget, NULL,
 
75
            qfu( p_intf->p_sys->psz_filepath ), fileTypes );
 
76
 
 
77
    dialogBox->setFileMode( QFileDialog::ExistingFiles );
 
78
    dialogBox->setAcceptMode( QFileDialog::AcceptOpen );
 
79
#if HAS_QT43
 
80
    dialogBox->restoreState(
 
81
            getSettings()->value( "file-dialog-state" ).toByteArray() );
 
82
#endif
 
83
 
 
84
    /* We don't want to see a grip in the middle of the window, do we? */
 
85
    dialogBox->setSizeGripEnabled( false );
 
86
 
 
87
    /* Add a tooltip */
 
88
    dialogBox->setToolTip( qtr( "Select one or multiple files" ) );
 
89
    dialogBox->setMinimumHeight( 250 );
 
90
 
 
91
    // But hide the two OK/Cancel buttons. Enable them for debug.
 
92
    QDialogButtonBox *fileDialogAcceptBox =
 
93
                      dialogBox->findChildren<QDialogButtonBox*>()[0];
 
94
    fileDialogAcceptBox->hide();
 
95
 
 
96
    /* Ugly hacks to get the good Widget */
 
97
    //This lineEdit is the normal line in the fileDialog.
 
98
#if HAS_QT43
 
99
    lineFileEdit = dialogBox->findChildren<QLineEdit*>()[0];
 
100
#else
 
101
    lineFileEdit = dialogBox->findChildren<QLineEdit*>()[1];
 
102
#endif
 
103
    /* Make a list of QLabel inside the QFileDialog to access the good ones */
 
104
    QList<QLabel *> listLabel = dialogBox->findChildren<QLabel*>();
 
105
 
 
106
    /* Hide the FileNames one. Enable it for debug */
 
107
    listLabel[1]->setText( qtr( "File names:" ) );
 
108
    /* Change the text that was uncool in the usual box */
 
109
    listLabel[2]->setText( qtr( "Filter:" ) );
 
110
 
 
111
    dialogBox->layout()->setMargin( 0 );
 
112
    dialogBox->layout()->setSizeConstraint( QLayout::SetNoConstraint );
 
113
 
 
114
    /** END of QFileDialog tweaking **/
 
115
 
 
116
    // Add the DialogBox to the layout
 
117
    ui.gridLayout->addWidget( dialogBox, 0, 0, 1, 3 );
 
118
 
 
119
    //TODO later: fill the fileCompleteList with previous items played.
 
120
    QCompleter *fileCompleter = new QCompleter( fileCompleteList, this );
 
121
    fileCompleter->setModel( new QDirModel( fileCompleter ) );
 
122
    lineFileEdit->setCompleter( fileCompleter );
 
123
 
 
124
    // Hide the subtitles control by default.
 
125
    ui.subFrame->hide();
 
126
 
 
127
    /* Build the subs size combo box */
 
128
    setfillVLCConfigCombo( "freetype-rel-fontsize" , p_intf,
 
129
                            ui.sizeSubComboBox );
 
130
 
 
131
    /* Build the subs align combo box */
 
132
    setfillVLCConfigCombo( "subsdec-align", p_intf, ui.alignSubComboBox );
 
133
 
 
134
    /* Connects  */
 
135
    BUTTONACT( ui.subBrowseButton, browseFileSub() );
 
136
    BUTTONACT( ui.subCheckBox, toggleSubtitleFrame());
 
137
 
 
138
    CONNECT( lineFileEdit, textChanged( QString ), this, updateMRL() );
 
139
    CONNECT( ui.subInput, textChanged( QString ), this, updateMRL() );
 
140
    CONNECT( ui.alignSubComboBox, currentIndexChanged( int ), this, updateMRL() );
 
141
    CONNECT( ui.sizeSubComboBox, currentIndexChanged( int ), this, updateMRL() );
 
142
}
 
143
 
 
144
FileOpenPanel::~FileOpenPanel()
 
145
{
 
146
#if HAS_QT43
 
147
    getSettings()->setValue( "file-dialog-state", dialogBox->saveState() );
 
148
#endif
 
149
}
 
150
 
 
151
/* Show a fileBrowser to select a subtitle */
 
152
void FileOpenPanel::browseFileSub()
 
153
{
 
154
    // TODO Handle selection of more than one subtitles file
 
155
    QStringList files = THEDP->showSimpleOpen( qtr("Open subtitles file"),
 
156
                            EXT_FILTER_SUBTITLE,
 
157
                            dialogBox->directory().absolutePath() );
 
158
    if( files.isEmpty() ) return;
 
159
    ui.subInput->setText( files.join(" ") );
 
160
    updateMRL();
 
161
}
 
162
 
 
163
/* Update the current MRL */
 
164
void FileOpenPanel::updateMRL()
 
165
{
 
166
    QString mrl = "";
 
167
    foreach( QString file, dialogBox->selectedFiles() ) {
 
168
         mrl += "\"" + file + "\" ";
 
169
    }
 
170
 
 
171
    if( ui.subCheckBox->isChecked() ) {
 
172
        mrl.append( " :sub-file=\"" + ui.subInput->text() + "\"" );
 
173
        int align = ui.alignSubComboBox->itemData(
 
174
                    ui.alignSubComboBox->currentIndex() ).toInt();
 
175
        mrl.append( " :subsdec-align=" + QString().setNum( align ) );
 
176
        int size = ui.sizeSubComboBox->itemData(
 
177
                   ui.sizeSubComboBox->currentIndex() ).toInt();
 
178
        mrl.append( " :freetype-rel-fontsize=" + QString().setNum( size ) );
 
179
    }
 
180
 
 
181
    emit mrlUpdated( mrl );
 
182
    emit methodChanged( "file-caching" );
 
183
}
 
184
 
 
185
/* Function called by Open Dialog when clicke on Play/Enqueue */
 
186
void FileOpenPanel::accept()
 
187
{
 
188
    //TODO set the completer
 
189
    p_intf->p_sys->psz_filepath = qtu( dialogBox->directory().absolutePath() );
 
190
}
 
191
 
 
192
void FileOpenBox::accept()
 
193
{
 
194
    OpenDialog::getInstance( NULL, NULL, true )->selectSlots();
 
195
}
 
196
 
 
197
void FileOpenBox::reject()
 
198
{
 
199
    OpenDialog::getInstance( NULL, NULL, true )->cancel();
 
200
}
 
201
 
 
202
/* Function called by Open Dialog when clicked on cancel */
 
203
void FileOpenPanel::clear()
 
204
{
 
205
    lineFileEdit->clear();
 
206
    ui.subInput->clear();
 
207
}
 
208
 
 
209
void FileOpenPanel::toggleSubtitleFrame()
 
210
{
 
211
    TOGGLEV( ui.subFrame );
 
212
 
 
213
    /* Update the MRL */
 
214
    updateMRL();
 
215
}
 
216
 
 
217
/**************************************************************************
 
218
 * Open Discs ( DVD, CD, VCD and similar devices )                        *
 
219
 **************************************************************************/
 
220
DiscOpenPanel::DiscOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
 
221
                                OpenPanel( _parent, _p_intf )
 
222
{
 
223
    ui.setupUi( this );
 
224
 
 
225
    /* Get the default configuration path for the devices */
 
226
    psz_dvddiscpath = config_GetPsz( p_intf, "dvd" );
 
227
    psz_vcddiscpath = config_GetPsz( p_intf, "vcd" );
 
228
    psz_cddadiscpath = config_GetPsz( p_intf, "cd-audio" );
 
229
 
 
230
    /* State to avoid overwritting the users changes with the configuration */
 
231
    b_firstdvd = true;
 
232
    b_firstvcd = true;
 
233
    b_firstcdda = true;
 
234
 
 
235
    ui.browseDiscButton->setToolTip( qtr( I_DEVICE_TOOLTIP ));
 
236
    ui.deviceCombo->setToolTip( I_DEVICE_TOOLTIP );
 
237
 
 
238
#if WIN32 /* Disc drives probing for Windows */
 
239
    char szDrives[512];
 
240
    szDrives[0] = '\0';
 
241
    if( GetLogicalDriveStringsA( sizeof( szDrives ) - 1, szDrives ) )
 
242
    {
 
243
        char *drive = szDrives;
 
244
        UINT oldMode = SetErrorMode( SEM_FAILCRITICALERRORS );
 
245
        while( *drive )
 
246
        {
 
247
            if( GetDriveTypeA(drive) == DRIVE_CDROM )
 
248
                ui.deviceCombo->addItem( drive );
 
249
 
 
250
            /* go to next drive */
 
251
            while( *(drive++) );
 
252
        }
 
253
        SetErrorMode(oldMode);
 
254
    }
 
255
#else /* Use a Completer under Linux */
 
256
    QCompleter *discCompleter = new QCompleter( this );
 
257
    discCompleter->setModel( new QDirModel( discCompleter ) );
 
258
    ui.deviceCombo->setCompleter( discCompleter );
 
259
#endif
 
260
 
 
261
    /* CONNECTs */
 
262
    BUTTONACT( ui.dvdRadioButton, updateButtons() );
 
263
    BUTTONACT( ui.vcdRadioButton, updateButtons() );
 
264
    BUTTONACT( ui.audioCDRadioButton, updateButtons() );
 
265
    BUTTONACT( ui.dvdsimple, updateButtons() );
 
266
    BUTTONACT( ui.browseDiscButton, browseDevice() );
 
267
    BUTTON_SET_ACT_I( ui.ejectButton, "", eject, qtr( "Eject the disc" ),
 
268
            eject() );
 
269
 
 
270
    CONNECT( ui.deviceCombo, editTextChanged( QString ), this, updateMRL());
 
271
    CONNECT( ui.titleSpin, valueChanged( int ), this, updateMRL());
 
272
    CONNECT( ui.chapterSpin, valueChanged( int ), this, updateMRL());
 
273
    CONNECT( ui.audioSpin, valueChanged( int ), this, updateMRL());
 
274
    CONNECT( ui.subtitlesSpin, valueChanged( int ), this, updateMRL());
 
275
 
 
276
    /* Run once the updateButtons function in order to fill correctly the comboBoxes */
 
277
    updateButtons();
 
278
}
 
279
 
 
280
DiscOpenPanel::~DiscOpenPanel()
 
281
{
 
282
    free( psz_dvddiscpath );
 
283
    free( psz_vcddiscpath );
 
284
    free( psz_cddadiscpath );
 
285
}
 
286
 
 
287
void DiscOpenPanel::clear()
 
288
{
 
289
    ui.titleSpin->setValue( 0 );
 
290
    ui.chapterSpin->setValue( 0 );
 
291
    b_firstcdda = true;
 
292
    b_firstdvd = true;
 
293
    b_firstvcd = true;
 
294
}
 
295
 
 
296
#ifdef WIN32
 
297
    #define setDrive( psz_name ) {\
 
298
    int index = ui.deviceCombo->findText( qfu( psz_name ) ); \
 
299
    if( index != -1 ) ui.deviceCombo->setCurrentIndex( index );}
 
300
#else
 
301
    #define setDrive( psz_name ) {\
 
302
    ui.deviceCombo->setEditText( qfu( psz_name ) ); }
 
303
#endif
 
304
 
 
305
/* update the buttons according the type of device */
 
306
void DiscOpenPanel::updateButtons()
 
307
{
 
308
    if ( ui.dvdRadioButton->isChecked() )
 
309
    {
 
310
        if( b_firstdvd )
 
311
        {
 
312
            setDrive( psz_dvddiscpath );
 
313
            b_firstdvd = false;
 
314
        }
 
315
        ui.titleLabel->setText( qtr("Title") );
 
316
        ui.chapterLabel->show();
 
317
        ui.chapterSpin->show();
 
318
        ui.diskOptionBox_2->show();
 
319
        ui.dvdsimple->setEnabled( true );
 
320
    }
 
321
    else if ( ui.vcdRadioButton->isChecked() )
 
322
    {
 
323
        if( b_firstvcd )
 
324
        {
 
325
            setDrive( psz_vcddiscpath );
 
326
            b_firstvcd = false;
 
327
        }
 
328
        ui.titleLabel->setText( qtr("Entry") );
 
329
        ui.chapterLabel->hide();
 
330
        ui.chapterSpin->hide();
 
331
        ui.diskOptionBox_2->show();
 
332
        ui.dvdsimple->setEnabled( false );
 
333
    }
 
334
    else /* CDDA */
 
335
    {
 
336
        if( b_firstcdda )
 
337
        {
 
338
            setDrive( psz_cddadiscpath );
 
339
            b_firstcdda = false;
 
340
        }
 
341
        ui.titleLabel->setText( qtr("Track") );
 
342
        ui.chapterLabel->hide();
 
343
        ui.chapterSpin->hide();
 
344
        ui.diskOptionBox_2->hide();
 
345
        ui.dvdsimple->setEnabled( false );
 
346
    }
 
347
 
 
348
    updateMRL();
 
349
}
 
350
 
 
351
/* Update the current MRL */
 
352
void DiscOpenPanel::updateMRL()
 
353
{
 
354
    QString mrl = "";
 
355
 
 
356
    /* CDDAX and VCDX not implemented. TODO ? */
 
357
    /* DVD */
 
358
    if( ui.dvdRadioButton->isChecked() ) {
 
359
        if( !ui.dvdsimple->isChecked() )
 
360
            mrl = "\"dvd://";
 
361
        else
 
362
            mrl = "\"dvdsimple://";
 
363
        mrl += ui.deviceCombo->currentText();
 
364
        emit methodChanged( "dvdnav-caching" );
 
365
 
 
366
        if ( ui.titleSpin->value() > 0 ) {
 
367
            mrl += QString("@%1").arg( ui.titleSpin->value() );
 
368
            if ( ui.chapterSpin->value() > 0 ) {
 
369
                mrl+= QString(":%1").arg( ui.chapterSpin->value() );
 
370
            }
 
371
        }
 
372
 
 
373
    /* VCD */
 
374
    } else if ( ui.vcdRadioButton->isChecked() ) {
 
375
        mrl = "\"vcd://" + ui.deviceCombo->currentText();
 
376
        emit methodChanged( "vcd-caching" );
 
377
 
 
378
        if( ui.titleSpin->value() > 0 ) {
 
379
            mrl += QString("@E%1").arg( ui.titleSpin->value() );
 
380
        }
 
381
 
 
382
    /* CDDA */
 
383
    } else {
 
384
        mrl = "\"cdda://" + ui.deviceCombo->currentText();
 
385
        if( ui.titleSpin->value() > 0 ) {
 
386
            QString("@%1").arg( ui.titleSpin->value() );
 
387
        }
 
388
    }
 
389
 
 
390
    mrl += "\"";
 
391
 
 
392
    if ( ui.dvdRadioButton->isChecked() || ui.vcdRadioButton->isChecked() )
 
393
    {
 
394
        if ( ui.audioSpin->value() >= 0 ) {
 
395
            mrl += " :audio-track=" +
 
396
                QString("%1").arg( ui.audioSpin->value() );
 
397
        }
 
398
        if ( ui.subtitlesSpin->value() >= 0 ) {
 
399
            mrl += " :sub-track=" +
 
400
                QString("%1").arg( ui.subtitlesSpin->value() );
 
401
        }
 
402
    }
 
403
    emit mrlUpdated( mrl );
 
404
}
 
405
 
 
406
void DiscOpenPanel::browseDevice()
 
407
{
 
408
    QString dir = QFileDialog::getExistingDirectory( 0,
 
409
            qtr( I_DEVICE_TOOLTIP ) );
 
410
    if (!dir.isEmpty()) {
 
411
        ui.deviceCombo->setEditText( dir );
 
412
    }
 
413
    updateMRL();
 
414
}
 
415
 
 
416
void DiscOpenPanel::eject()
 
417
{
 
418
    intf_Eject( p_intf, qtu( ui.deviceCombo->currentText() ) );
 
419
}
 
420
 
 
421
void DiscOpenPanel::accept()
 
422
{}
 
423
 
 
424
/**************************************************************************
 
425
 * Open Network streams and URL pages                                     *
 
426
 **************************************************************************/
 
427
NetOpenPanel::NetOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
 
428
                                OpenPanel( _parent, _p_intf )
 
429
{
 
430
    ui.setupUi( this );
 
431
 
 
432
    /* CONNECTs */
 
433
    CONNECT( ui.protocolCombo, activated( int ),
 
434
             this, updateProtocol( int ) );
 
435
    CONNECT( ui.portSpin, valueChanged( int ), this, updateMRL() );
 
436
    CONNECT( ui.addressText, textChanged( QString ), this, updateMRL());
 
437
    CONNECT( ui.timeShift, clicked(), this, updateMRL());
 
438
 
 
439
    ui.protocolCombo->addItem( "" );
 
440
    ui.protocolCombo->addItem("HTTP", QVariant("http"));
 
441
    ui.protocolCombo->addItem("HTTPS", QVariant("https"));
 
442
    ui.protocolCombo->addItem("MMS", QVariant("mms"));
 
443
    ui.protocolCombo->addItem("FTP", QVariant("ftp"));
 
444
    ui.protocolCombo->addItem("RTSP", QVariant("rtsp"));
 
445
    ui.protocolCombo->addItem("RTP", QVariant("rtp"));
 
446
    ui.protocolCombo->addItem("UDP", QVariant("udp"));
 
447
    ui.protocolCombo->addItem("RTMP", QVariant("rtmp"));
 
448
 
 
449
    updateProtocol( ui.protocolCombo->currentIndex() );
 
450
}
 
451
 
 
452
NetOpenPanel::~NetOpenPanel()
 
453
{}
 
454
 
 
455
void NetOpenPanel::clear()
 
456
{}
 
457
 
 
458
/* update the widgets according the type of protocol */
 
459
void NetOpenPanel::updateProtocol( int idx_proto ) {
 
460
    QString addr = ui.addressText->text();
 
461
    QString proto = ui.protocolCombo->itemData( idx_proto ).toString();
 
462
 
 
463
    ui.timeShift->setEnabled( idx_proto == UDP_PROTO );
 
464
    ui.portSpin->setEnabled( idx_proto == UDP_PROTO ||
 
465
                             idx_proto == RTP_PROTO );
 
466
 
 
467
    if( idx_proto == NO_PROTO ) return;
 
468
 
 
469
    /* If we already have a protocol in the address, replace it */
 
470
    if( addr.contains( "://"))
 
471
    {
 
472
        if( idx_proto != UDP_PROTO && idx_proto != RTP_PROTO )
 
473
            addr.replace( QRegExp("^.*://@*"), proto + "://");
 
474
        else
 
475
             addr.replace( QRegExp("^.*://"), proto + "://@");
 
476
        ui.addressText->setText( addr );
 
477
    }
 
478
    updateMRL();
 
479
}
 
480
 
 
481
void NetOpenPanel::updateMRL() {
 
482
    QString mrl = "";
 
483
    QString addr = ui.addressText->text();
 
484
    addr = QUrl::toPercentEncoding( addr, ":/?#@!$&'()*+,;=" );
 
485
    int idx_proto = ui.protocolCombo->currentIndex();
 
486
 
 
487
    if( addr.contains( "://"))
 
488
    {
 
489
        /* Match the correct item in the comboBox */
 
490
        ui.protocolCombo->setCurrentIndex(
 
491
                ui.protocolCombo->findData( addr.section( ':', 0, 0 ) ) );
 
492
 
 
493
        if( idx_proto != UDP_PROTO || idx_proto != RTP_PROTO )
 
494
            mrl = addr;
 
495
    }
 
496
    else
 
497
    {
 
498
        switch( idx_proto ) {
 
499
        case HTTP_PROTO:
 
500
            mrl = "http://" + addr;
 
501
            emit methodChanged("http-caching");
 
502
            break;
 
503
        case HTTPS_PROTO:
 
504
            mrl = "https://" + addr;
 
505
            emit methodChanged("http-caching");
 
506
            break;
 
507
        case MMS_PROTO:
 
508
            mrl = "mms://" + addr;
 
509
            emit methodChanged("mms-caching");
 
510
            break;
 
511
        case FTP_PROTO:
 
512
            mrl = "ftp://" + addr;
 
513
            emit methodChanged("ftp-caching");
 
514
            break;
 
515
        case RTSP_PROTO:
 
516
            mrl = "rtsp://" + addr;
 
517
            emit methodChanged("rtsp-caching");
 
518
            break;
 
519
        case UDP_PROTO:
 
520
            mrl = "udp://@";
 
521
            /* Add [] to IPv6 */
 
522
            if ( addr.contains(':') && !addr.contains('[') )
 
523
            {
 
524
                mrl += "[" + addr + "]";
 
525
            }
 
526
            else mrl += addr;
 
527
            mrl += QString(":%1").arg( ui.portSpin->value() );
 
528
            emit methodChanged("udp-caching");
 
529
            break;
 
530
        case RTP_PROTO:
 
531
            mrl = "rtp://@";
 
532
            if ( addr.contains(':') && !addr.contains('[') )
 
533
                mrl += "[" + addr + "]"; /* Add [] to IPv6 */
 
534
            else
 
535
                mrl += addr;
 
536
            mrl += QString(":%1").arg( ui.portSpin->value() );
 
537
            emit methodChanged("rtp-caching");
 
538
            break;
 
539
        case RTMP_PROTO:
 
540
            mrl = "rtmp://" + addr;
 
541
            emit methodChanged("rtmp-caching");
 
542
            break;
 
543
        }
 
544
    }
 
545
 
 
546
    // Encode the boring stuffs
 
547
 
 
548
    if( ui.timeShift->isEnabled() && ui.timeShift->isChecked() ) {
 
549
        mrl += " :access-filter=timeshift";
 
550
    }
 
551
    emit mrlUpdated( mrl );
 
552
}
 
553
 
 
554
/**************************************************************************
 
555
 * Open Capture device ( DVB, PVR, V4L, and similar )                     *
 
556
 **************************************************************************/
 
557
CaptureOpenPanel::CaptureOpenPanel( QWidget *_parent, intf_thread_t *_p_intf ) :
 
558
                                OpenPanel( _parent, _p_intf )
 
559
{
 
560
    isInitialized = false;
 
561
}
 
562
 
 
563
void CaptureOpenPanel::initialize()
 
564
{
 
565
    if( isInitialized ) return;
 
566
 
 
567
    msg_Dbg( p_intf, "Initialization of Capture device panel" );
 
568
    isInitialized = true;
 
569
 
 
570
    ui.setupUi( this );
 
571
 
 
572
    BUTTONACT( ui.advancedButton, advancedDialog() );
 
573
 
 
574
    /* Create two stacked layouts in the main comboBoxes */
 
575
    QStackedLayout *stackedDevLayout = new QStackedLayout;
 
576
    ui.cardBox->setLayout( stackedDevLayout );
 
577
 
 
578
    QStackedLayout *stackedPropLayout = new QStackedLayout;
 
579
    ui.optionsBox->setLayout( stackedPropLayout );
 
580
 
 
581
    /* Creation and connections of the WIdgets in the stacked layout */
 
582
#define addModuleAndLayouts( number, name, label )                    \
 
583
    QWidget * name ## DevPage = new QWidget( this );                  \
 
584
    QWidget * name ## PropPage = new QWidget( this );                 \
 
585
    stackedDevLayout->addWidget( name ## DevPage );        \
 
586
    stackedPropLayout->addWidget( name ## PropPage );      \
 
587
    QGridLayout * name ## DevLayout = new QGridLayout;                \
 
588
    QGridLayout * name ## PropLayout = new QGridLayout;               \
 
589
    name ## DevPage->setLayout( name ## DevLayout );                  \
 
590
    name ## PropPage->setLayout( name ## PropLayout );                \
 
591
    ui.deviceCombo->addItem( qtr( label ), QVariant( number ) );
 
592
 
 
593
#define CuMRL( widget, slot ) CONNECT( widget , slot , this, updateMRL() );
 
594
 
 
595
#ifdef WIN32
 
596
    /*********************
 
597
     * DirectShow Stuffs *
 
598
     *********************/
 
599
    if( module_Exists( p_intf, "dshow" ) ){
 
600
    addModuleAndLayouts( DSHOW_DEVICE, dshow, "DirectShow" );
 
601
 
 
602
    /* dshow Main */
 
603
    int line = 0;
 
604
    module_config_t *p_config =
 
605
        config_FindConfig( VLC_OBJECT(p_intf), "dshow-vdev" );
 
606
    vdevDshowW = new StringListConfigControl(
 
607
        VLC_OBJECT(p_intf), p_config, this, false, dshowDevLayout, line );
 
608
    line++;
 
609
 
 
610
    p_config = config_FindConfig( VLC_OBJECT(p_intf), "dshow-adev" );
 
611
    adevDshowW = new StringListConfigControl(
 
612
        VLC_OBJECT(p_intf), p_config, this, false, dshowDevLayout, line );
 
613
    line++;
 
614
 
 
615
    /* dshow Properties */
 
616
    QLabel *dshowVSizeLabel = new QLabel( qtr( "Video size" ) );
 
617
    dshowPropLayout->addWidget( dshowVSizeLabel, 0, 0 );
 
618
 
 
619
    dshowVSizeLine = new QLineEdit;
 
620
    dshowPropLayout->addWidget( dshowVSizeLine, 0, 1);
 
621
    dshowPropLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ),
 
622
            1, 0, 3, 1 );
 
623
 
 
624
    /* dshow CONNECTs */
 
625
    CuMRL( vdevDshowW->combo, currentIndexChanged ( int ) );
 
626
    CuMRL( adevDshowW->combo, currentIndexChanged ( int ) );
 
627
    CuMRL( dshowVSizeLine, textChanged( QString ) );
 
628
    }
 
629
 
 
630
    /**************
 
631
     * BDA Stuffs *
 
632
     **************/
 
633
    if( module_Exists( p_intf, "bda" ) ){
 
634
    addModuleAndLayouts( BDA_DEVICE, bda, "DVB DirectShow" );
 
635
 
 
636
    /* bda Main */
 
637
    QLabel *bdaTypeLabel = new QLabel( qtr( "DVB Type:" ) );
 
638
 
 
639
    bdas = new QRadioButton( "DVB-S" );
 
640
    bdas->setChecked( true );
 
641
    bdac = new QRadioButton( "DVB-C" );
 
642
    bdat = new QRadioButton( "DVB-T" );
 
643
 
 
644
    bdaDevLayout->addWidget( bdaTypeLabel, 0, 0 );
 
645
    bdaDevLayout->addWidget( bdas, 0, 1 );
 
646
    bdaDevLayout->addWidget( bdac, 0, 2 );
 
647
    bdaDevLayout->addWidget( bdat, 0, 3 );
 
648
 
 
649
    /* bda Props */
 
650
    QLabel *bdaFreqLabel =
 
651
                    new QLabel( qtr( "Transponder/multiplex frequency" ) );
 
652
    bdaPropLayout->addWidget( bdaFreqLabel, 0, 0 );
 
653
 
 
654
    bdaFreq = new QSpinBox;
 
655
    bdaFreq->setAlignment( Qt::AlignRight );
 
656
    bdaFreq->setSuffix(" kHz");
 
657
    bdaFreq->setSingleStep( 1000 );
 
658
    setSpinBoxFreq( bdaFreq )
 
659
    bdaPropLayout->addWidget( bdaFreq, 0, 1 );
 
660
 
 
661
    bdaSrateLabel = new QLabel( qtr( "Transponder symbol rate" ) );
 
662
    bdaPropLayout->addWidget( bdaSrateLabel, 1, 0 );
 
663
 
 
664
    bdaSrate = new QSpinBox;
 
665
    bdaSrate->setAlignment( Qt::AlignRight );
 
666
    bdaSrate->setSuffix(" kHz");
 
667
    setSpinBoxFreq( bdaSrate );
 
668
    bdaPropLayout->addWidget( bdaSrate, 1, 1 );
 
669
 
 
670
    bdaBandLabel = new QLabel( qtr( "Bandwidth" ) );
 
671
    bdaPropLayout->addWidget( bdaBandLabel, 2, 0 );
 
672
 
 
673
    bdaBandBox = new QComboBox;
 
674
    setfillVLCConfigCombo( "dvb-bandwidth", p_intf, bdaBandBox );
 
675
    bdaPropLayout->addWidget( bdaBandBox, 2, 1 );
 
676
 
 
677
    bdaBandLabel->hide();
 
678
    bdaBandBox->hide();
 
679
    bdaPropLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ),
 
680
            2, 0, 2, 1 );
 
681
 
 
682
    /* bda CONNECTs */
 
683
    CuMRL( bdaFreq, valueChanged ( int ) );
 
684
    CuMRL( bdaSrate, valueChanged ( int ) );
 
685
    CuMRL( bdaBandBox,  currentIndexChanged ( int ) );
 
686
    BUTTONACT( bdas, updateButtons() );
 
687
    BUTTONACT( bdat, updateButtons() );
 
688
    BUTTONACT( bdac, updateButtons() );
 
689
    BUTTONACT( bdas, updateMRL() );
 
690
    BUTTONACT( bdat, updateMRL() );
 
691
    BUTTONACT( bdac, updateMRL() );
 
692
    }
 
693
 
 
694
#else /* WIN32 */
 
695
    /*******
 
696
     * V4L2*
 
697
     *******/
 
698
    if( module_Exists( p_intf, "v4l2" ) ){
 
699
    addModuleAndLayouts( V4L2_DEVICE, v4l2, "Video for Linux 2" );
 
700
 
 
701
    /* V4l Main panel */
 
702
    QLabel *v4l2VideoDeviceLabel = new QLabel( qtr( "Video device name" ) );
 
703
    v4l2DevLayout->addWidget( v4l2VideoDeviceLabel, 0, 0 );
 
704
 
 
705
    v4l2VideoDevice = new QLineEdit;
 
706
    v4l2DevLayout->addWidget( v4l2VideoDevice, 0, 1 );
 
707
 
 
708
    QLabel *v4l2AudioDeviceLabel = new QLabel( qtr( "Audio device name" ) );
 
709
    v4l2DevLayout->addWidget( v4l2AudioDeviceLabel, 1, 0 );
 
710
 
 
711
    v4l2AudioDevice = new QLineEdit;
 
712
    v4l2DevLayout->addWidget( v4l2AudioDevice, 1, 1 );
 
713
 
 
714
    /* v4l2 Props panel */
 
715
    QLabel *v4l2StdLabel = new QLabel( qtr( "Standard" ) );
 
716
    v4l2PropLayout->addWidget( v4l2StdLabel, 0 , 0 );
 
717
 
 
718
    v4l2StdBox = new QComboBox;
 
719
    setfillVLCConfigCombo( "v4l2-standard", p_intf, v4l2StdBox );
 
720
    v4l2PropLayout->addWidget( v4l2StdBox, 0 , 1 );
 
721
    v4l2PropLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ),
 
722
            1, 0, 3, 1 );
 
723
 
 
724
    /* v4l2 CONNECTs */
 
725
    CuMRL( v4l2VideoDevice, textChanged( QString ) );
 
726
    CuMRL( v4l2AudioDevice, textChanged( QString ) );
 
727
    CuMRL( v4l2StdBox,  currentIndexChanged ( int ) );
 
728
    }
 
729
 
 
730
    /*******
 
731
     * V4L *
 
732
     *******/
 
733
    if( module_Exists( p_intf, "v4l" ) ){
 
734
    addModuleAndLayouts( V4L_DEVICE, v4l, "Video for Linux" );
 
735
 
 
736
    /* V4l Main panel */
 
737
    QLabel *v4lVideoDeviceLabel = new QLabel( qtr( "Video device name" ) );
 
738
    v4lDevLayout->addWidget( v4lVideoDeviceLabel, 0, 0 );
 
739
 
 
740
    v4lVideoDevice = new QLineEdit;
 
741
    v4lDevLayout->addWidget( v4lVideoDevice, 0, 1 );
 
742
 
 
743
    QLabel *v4lAudioDeviceLabel = new QLabel( qtr( "Audio device name" ) );
 
744
    v4lDevLayout->addWidget( v4lAudioDeviceLabel, 1, 0 );
 
745
 
 
746
    v4lAudioDevice = new QLineEdit;
 
747
    v4lDevLayout->addWidget( v4lAudioDevice, 1, 1 );
 
748
 
 
749
    /* V4l Props panel */
 
750
    QLabel *v4lNormLabel = new QLabel( qtr( "Norm" ) );
 
751
    v4lPropLayout->addWidget( v4lNormLabel, 0 , 0 );
 
752
 
 
753
    v4lNormBox = new QComboBox;
 
754
    setfillVLCConfigCombo( "v4l-norm", p_intf, v4lNormBox );
 
755
    v4lPropLayout->addWidget( v4lNormBox, 0 , 1 );
 
756
 
 
757
    QLabel *v4lFreqLabel = new QLabel( qtr( "Frequency" ) );
 
758
    v4lPropLayout->addWidget( v4lFreqLabel, 1 , 0 );
 
759
 
 
760
    v4lFreq = new QSpinBox;
 
761
    v4lFreq->setAlignment( Qt::AlignRight );
 
762
    v4lFreq->setSuffix(" kHz");
 
763
    setSpinBoxFreq( v4lFreq );
 
764
    v4lPropLayout->addWidget( v4lFreq, 1 , 1 );
 
765
    v4lPropLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ),
 
766
            2, 0, 2, 1 );
 
767
 
 
768
    /* v4l CONNECTs */
 
769
    CuMRL( v4lVideoDevice, textChanged( QString ) );
 
770
    CuMRL( v4lAudioDevice, textChanged( QString ) );
 
771
    CuMRL( v4lFreq, valueChanged ( int ) );
 
772
    CuMRL( v4lNormBox,  currentIndexChanged ( int ) );
 
773
    }
 
774
 
 
775
    /*******
 
776
     * JACK *
 
777
     *******/
 
778
    if( module_Exists( p_intf, "jack" ) ){
 
779
    addModuleAndLayouts( JACK_DEVICE, jack, "JACK Audio Connection Kit" );
 
780
 
 
781
    /* Jack Main panel */
 
782
    /* Channels */
 
783
    QLabel *jackChannelsLabel = new QLabel( qtr( "Channels:" ) );
 
784
    jackDevLayout->addWidget( jackChannelsLabel, 1, 0 );
 
785
 
 
786
    jackChannels = new QSpinBox;
 
787
    setSpinBoxFreq( jackChannels );
 
788
    jackChannels->setMaximum(255);
 
789
    jackChannels->setValue(2);
 
790
    jackChannels->setAlignment( Qt::AlignRight );
 
791
    jackDevLayout->addWidget( jackChannels, 1, 1 );
 
792
 
 
793
    /* Jack Props panel */
 
794
 
 
795
    /* Selected ports */
 
796
    QLabel *jackPortsLabel = new QLabel( qtr( "Selected ports:" ) );
 
797
    jackPropLayout->addWidget( jackPortsLabel, 0 , 0 );
 
798
 
 
799
    jackPortsSelected = new QLineEdit( qtr( ".*") );
 
800
    jackPortsSelected->setAlignment( Qt::AlignRight );
 
801
    jackPropLayout->addWidget( jackPortsSelected, 0, 1 );
 
802
 
 
803
    /* Caching */
 
804
    QLabel *jackCachingLabel = new QLabel( qtr( "Input caching:" ) );
 
805
    jackPropLayout->addWidget( jackCachingLabel, 1 , 0 );
 
806
    jackCaching = new QSpinBox;
 
807
    setSpinBoxFreq( jackCaching );
 
808
    jackCaching->setSuffix( " ms" );
 
809
    jackCaching->setValue(1000);
 
810
    jackCaching->setAlignment( Qt::AlignRight );
 
811
    jackPropLayout->addWidget( jackCaching, 1 , 1 );
 
812
 
 
813
    /* Pace */
 
814
    jackPace = new QCheckBox(qtr( "Use VLC pace" ));
 
815
    jackPropLayout->addWidget( jackPace, 2, 1 );
 
816
 
 
817
    /* Auto Connect */
 
818
    jackConnect = new QCheckBox( qtr( "Auto connnection" ));
 
819
    jackPropLayout->addWidget( jackConnect, 3, 1 );
 
820
 
 
821
    /* Jack CONNECTs */
 
822
    CuMRL( jackChannels, valueChanged( int ) );
 
823
    CuMRL( jackCaching, valueChanged( int ) );
 
824
    CuMRL( jackPace, stateChanged( int ) );
 
825
    CuMRL( jackConnect, stateChanged( int ) );
 
826
    CuMRL( jackPortsSelected, textChanged( QString ) );
 
827
    }
 
828
 
 
829
    /************
 
830
     * PVR      *
 
831
     ************/
 
832
    if( module_Exists( p_intf, "pvr" ) ){
 
833
    addModuleAndLayouts( PVR_DEVICE, pvr, "PVR" );
 
834
 
 
835
    /* PVR Main panel */
 
836
    QLabel *pvrDeviceLabel = new QLabel( qtr( "Device name" ) );
 
837
    pvrDevLayout->addWidget( pvrDeviceLabel, 0, 0 );
 
838
 
 
839
    pvrDevice = new QLineEdit;
 
840
    pvrDevLayout->addWidget( pvrDevice, 0, 1 );
 
841
 
 
842
    QLabel *pvrRadioDeviceLabel = new QLabel( qtr( "Radio device name" ) );
 
843
    pvrDevLayout->addWidget( pvrRadioDeviceLabel, 1, 0 );
 
844
 
 
845
    pvrRadioDevice = new QLineEdit;
 
846
    pvrDevLayout->addWidget( pvrRadioDevice, 1, 1 );
 
847
 
 
848
    /* PVR props panel */
 
849
    QLabel *pvrNormLabel = new QLabel( qtr( "Norm" ) );
 
850
    pvrPropLayout->addWidget( pvrNormLabel, 0, 0 );
 
851
 
 
852
    pvrNormBox = new QComboBox;
 
853
    setfillVLCConfigCombo( "pvr-norm", p_intf, pvrNormBox );
 
854
    pvrPropLayout->addWidget( pvrNormBox, 0, 1 );
 
855
 
 
856
    QLabel *pvrFreqLabel = new QLabel( qtr( "Frequency" ) );
 
857
    pvrPropLayout->addWidget( pvrFreqLabel, 1, 0 );
 
858
 
 
859
    pvrFreq = new QSpinBox;
 
860
    pvrFreq->setAlignment( Qt::AlignRight );
 
861
    pvrFreq->setSuffix(" kHz");
 
862
    setSpinBoxFreq( pvrFreq );
 
863
    pvrPropLayout->addWidget( pvrFreq, 1, 1 );
 
864
 
 
865
    QLabel *pvrBitrLabel = new QLabel( qtr( "Bitrate" ) );
 
866
    pvrPropLayout->addWidget( pvrBitrLabel, 2, 0 );
 
867
 
 
868
    pvrBitr = new QSpinBox;
 
869
    pvrBitr->setAlignment( Qt::AlignRight );
 
870
    pvrBitr->setSuffix(" kHz");
 
871
    setSpinBoxFreq( pvrBitr );
 
872
    pvrPropLayout->addWidget( pvrBitr, 2, 1 );
 
873
    pvrPropLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ),
 
874
            3, 0, 1, 1 );
 
875
 
 
876
    /* PVR CONNECTs */
 
877
    CuMRL( pvrDevice, textChanged( QString ) );
 
878
    CuMRL( pvrRadioDevice, textChanged( QString ) );
 
879
 
 
880
    CuMRL( pvrFreq, valueChanged ( int ) );
 
881
    CuMRL( pvrBitr, valueChanged ( int ) );
 
882
    CuMRL( pvrNormBox, currentIndexChanged ( int ) );
 
883
    }
 
884
 
 
885
    /**************
 
886
     * DVB Stuffs *
 
887
     **************/
 
888
    if( module_Exists( p_intf, "dvb" ) ){
 
889
    addModuleAndLayouts( DVB_DEVICE, dvb, "DVB" );
 
890
 
 
891
    /* DVB Main */
 
892
    QLabel *dvbDeviceLabel = new QLabel( qtr( "Adapter card to tune" ) );
 
893
    QLabel *dvbTypeLabel = new QLabel( qtr( "DVB Type:" ) );
 
894
 
 
895
    dvbCard = new QSpinBox;
 
896
    dvbCard->setAlignment( Qt::AlignRight );
 
897
    dvbCard->setPrefix( "/dev/dvb/adapter" );
 
898
 
 
899
    dvbDevLayout->addWidget( dvbDeviceLabel, 0, 0 );
 
900
    dvbDevLayout->addWidget( dvbCard, 0, 2, 1, 2 );
 
901
 
 
902
    dvbs = new QRadioButton( "DVB-S" );
 
903
    dvbs->setChecked( true );
 
904
    dvbc = new QRadioButton( "DVB-C" );
 
905
    dvbt = new QRadioButton( "DVB-T" );
 
906
 
 
907
    dvbDevLayout->addWidget( dvbTypeLabel, 1, 0 );
 
908
    dvbDevLayout->addWidget( dvbs, 1, 1 );
 
909
    dvbDevLayout->addWidget( dvbc, 1, 2 );
 
910
    dvbDevLayout->addWidget( dvbt, 1, 3 );
 
911
 
 
912
    /* DVB Props panel */
 
913
    QLabel *dvbFreqLabel =
 
914
                    new QLabel( qtr( "Transponder/multiplex frequency" ) );
 
915
    dvbPropLayout->addWidget( dvbFreqLabel, 0, 0 );
 
916
 
 
917
    dvbFreq = new QSpinBox;
 
918
    dvbFreq->setAlignment( Qt::AlignRight );
 
919
    dvbFreq->setSuffix(" kHz");
 
920
    setSpinBoxFreq( dvbFreq  );
 
921
    dvbPropLayout->addWidget( dvbFreq, 0, 1 );
 
922
 
 
923
    QLabel *dvbSrateLabel = new QLabel( qtr( "Transponder symbol rate" ) );
 
924
    dvbPropLayout->addWidget( dvbSrateLabel, 1, 0 );
 
925
 
 
926
    dvbSrate = new QSpinBox;
 
927
    dvbSrate->setAlignment( Qt::AlignRight );
 
928
    dvbSrate->setSuffix(" kHz");
 
929
    setSpinBoxFreq( dvbSrate );
 
930
    dvbPropLayout->addWidget( dvbSrate, 1, 1 );
 
931
    dvbPropLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ),
 
932
            2, 0, 2, 1 );
 
933
 
 
934
    /* DVB CONNECTs */
 
935
    CuMRL( dvbCard, valueChanged ( int ) );
 
936
    CuMRL( dvbFreq, valueChanged ( int ) );
 
937
    CuMRL( dvbSrate, valueChanged ( int ) );
 
938
 
 
939
    BUTTONACT( dvbs, updateButtons() );
 
940
    BUTTONACT( dvbt, updateButtons() );
 
941
    BUTTONACT( dvbc, updateButtons() );
 
942
    }
 
943
 
 
944
#endif
 
945
 
 
946
 
 
947
    /**********
 
948
     * Screen *
 
949
     **********/
 
950
    addModuleAndLayouts( SCREEN_DEVICE, screen, "Desktop" );
 
951
    QLabel *screenLabel = new QLabel( "This option will open your own "
 
952
            "desktop in order to save or stream it.");
 
953
    screenLabel->setWordWrap( true );
 
954
    screenDevLayout->addWidget( screenLabel, 0, 0 );
 
955
 
 
956
    QLabel *screenFPSLabel = new QLabel(
 
957
            qtr( "Desired frame rate for the capture." ) );
 
958
    screenPropLayout->addWidget( screenFPSLabel, 0, 0 );
 
959
 
 
960
    screenFPS = new QSpinBox;
 
961
    screenFPS->setValue( 1 );
 
962
    screenFPS->setAlignment( Qt::AlignRight );
 
963
    screenPropLayout->addWidget( screenFPS, 0, 1 );
 
964
 
 
965
    /* General connects */
 
966
    CONNECT( ui.deviceCombo, activated( int ) ,
 
967
             stackedDevLayout, setCurrentIndex( int ) );
 
968
    CONNECT( ui.deviceCombo, activated( int ),
 
969
             stackedPropLayout, setCurrentIndex( int ) );
 
970
    CONNECT( ui.deviceCombo, activated( int ), this, updateMRL() );
 
971
    CONNECT( ui.deviceCombo, activated( int ), this, updateButtons() );
 
972
 
 
973
#undef addModule
 
974
}
 
975
 
 
976
CaptureOpenPanel::~CaptureOpenPanel()
 
977
{
 
978
}
 
979
 
 
980
void CaptureOpenPanel::clear()
 
981
{
 
982
    advMRL.clear();
 
983
}
 
984
 
 
985
void CaptureOpenPanel::updateMRL()
 
986
{
 
987
    QString mrl = "";
 
988
    int i_devicetype = ui.deviceCombo->itemData(
 
989
            ui.deviceCombo->currentIndex() ).toInt();
 
990
    switch( i_devicetype )
 
991
    {
 
992
#ifdef WIN32
 
993
    case BDA_DEVICE:
 
994
        if( bdas->isChecked() ) mrl = "dvb-s://";
 
995
        else if(  bdat->isChecked() ) mrl = "dvb-t://";
 
996
        else if(  bdac->isChecked() ) mrl = "dvb-c://";
 
997
        else return;
 
998
        mrl += " :dvb-frequency=" + QString("%1").arg( bdaFreq->value() );
 
999
        if( bdas->isChecked() || bdac->isChecked() )
 
1000
            mrl += " :dvb-srate=" + QString("%1").arg( bdaSrate->value() );
 
1001
        else
 
1002
            mrl += " :dvb-bandwidth=" +
 
1003
                QString("%1").arg( bdaBandBox->itemData(
 
1004
                    bdaBandBox->currentIndex() ).toInt() );
 
1005
        break;
 
1006
    case DSHOW_DEVICE:
 
1007
        mrl = "dshow://";
 
1008
        mrl+= " :dshow-vdev=" + QString("\"%1\"").arg( vdevDshowW->getValue() );
 
1009
        mrl+= " :dshow-adev=" + QString("\"%1\"").arg( adevDshowW->getValue() );
 
1010
        if( dshowVSizeLine->isModified() )
 
1011
            mrl += " :dshow-size=" + dshowVSizeLine->text();
 
1012
        break;
 
1013
#else
 
1014
    case V4L_DEVICE:
 
1015
        mrl = "v4l://";
 
1016
        mrl += " :v4l-vdev=" + v4lVideoDevice->text();
 
1017
        mrl += " :v4l-adev=" + v4lAudioDevice->text();
 
1018
        mrl += " :v4l-norm=" + QString("%1").arg( v4lNormBox->currentIndex() );
 
1019
        mrl += " :v4l-frequency=" + QString("%1").arg( v4lFreq->value() );
 
1020
        break;
 
1021
    case V4L2_DEVICE:
 
1022
        mrl = "v4l2://";
 
1023
        mrl += " :v4l2-dev=" + v4l2VideoDevice->text();
 
1024
        mrl += " :v4l2-adev=" + v4l2AudioDevice->text();
 
1025
        mrl += " :v4l2-standard=" + QString("%1").arg( v4l2StdBox->currentIndex() );
 
1026
        break;
 
1027
    case JACK_DEVICE:
 
1028
        mrl = "jack://";
 
1029
        mrl += "channels=" + QString("%1").arg( jackChannels->value() );
 
1030
        mrl += " :ports=" + jackPortsSelected->text();
 
1031
        mrl += " :jack-input-caching=" + QString("%1").arg( jackCaching->value() );
 
1032
        if ( jackPace->isChecked() )
 
1033
        {
 
1034
                mrl += " :jack-input-use-vlc-pace";
 
1035
        }
 
1036
        if ( jackConnect->isChecked() )
 
1037
        {
 
1038
                mrl += " :jack-input-auto-connect";
 
1039
        }
 
1040
        break;
 
1041
    case PVR_DEVICE:
 
1042
        mrl = "pvr://";
 
1043
        mrl += " :pvr-device=" + pvrDevice->text();
 
1044
        mrl += " :pvr-radio-device=" + pvrRadioDevice->text();
 
1045
        mrl += " :pvr-norm=" + QString("%1").arg( pvrNormBox->currentIndex() );
 
1046
        if( pvrFreq->value() )
 
1047
            mrl += " :pvr-frequency=" + QString("%1").arg( pvrFreq->value() );
 
1048
        if( pvrBitr->value() )
 
1049
            mrl += " :pvr-bitrate=" + QString("%1").arg( pvrBitr->value() );
 
1050
        break;
 
1051
    case DVB_DEVICE:
 
1052
        mrl = "dvb://";
 
1053
        mrl += " :dvb-adapter=" + QString("%1").arg( dvbCard->value() );
 
1054
        mrl += " :dvb-frequency=" + QString("%1").arg( dvbFreq->value() );
 
1055
        mrl += " :dvb-srate=" + QString("%1").arg( dvbSrate->value() );
 
1056
        break;
 
1057
#endif
 
1058
    case SCREEN_DEVICE:
 
1059
        mrl = "screen://";
 
1060
        mrl += " :screen-fps=" + QString("%1").arg( screenFPS->value() );
 
1061
        updateButtons();
 
1062
        break;
 
1063
    }
 
1064
 
 
1065
    if( !advMRL.isEmpty() ) mrl += advMRL;
 
1066
 
 
1067
    emit mrlUpdated( mrl );
 
1068
}
 
1069
 
 
1070
/**
 
1071
 * Update the Buttons (show/hide) for the GUI as all device type don't
 
1072
 * use the same ui. elements.
 
1073
 **/
 
1074
void CaptureOpenPanel::updateButtons()
 
1075
{
 
1076
    /*  Be sure to display the ui Elements in case they were hidden by
 
1077
     *  some Device Type (like Screen://) */
 
1078
    ui.optionsBox->show();
 
1079
    ui.advancedButton->show();
 
1080
    /* Get the current Device Number */
 
1081
    int i_devicetype = ui.deviceCombo->itemData(
 
1082
                                ui.deviceCombo->currentIndex() ).toInt();
 
1083
    switch( i_devicetype )
 
1084
    {
 
1085
#ifdef WIN32
 
1086
    case BDA_DEVICE:
 
1087
        if( bdas->isChecked() || bdac->isChecked() )
 
1088
        {
 
1089
            bdaSrate->show();
 
1090
            bdaSrateLabel->show();
 
1091
            bdaBandBox->hide();
 
1092
            bdaBandLabel->hide();
 
1093
        }
 
1094
        else
 
1095
        {
 
1096
            bdaSrate->hide();
 
1097
            bdaSrateLabel->hide();
 
1098
            bdaBandBox->show();
 
1099
            bdaBandLabel->show();
 
1100
        }
 
1101
        break;
 
1102
#else
 
1103
    case DVB_DEVICE:
 
1104
        if( dvbs->isChecked() ) dvbFreq->setSuffix(" kHz");
 
1105
        if( dvbc->isChecked() || dvbt->isChecked() ) dvbFreq->setSuffix(" Hz");
 
1106
        break;
 
1107
#endif
 
1108
    case SCREEN_DEVICE:
 
1109
        //ui.optionsBox->hide();
 
1110
        ui.advancedButton->hide();
 
1111
        break;
 
1112
    }
 
1113
 
 
1114
    advMRL.clear();
 
1115
}
 
1116
 
 
1117
void CaptureOpenPanel::advancedDialog()
 
1118
{
 
1119
    /* Get selected device type */
 
1120
    int i_devicetype = ui.deviceCombo->itemData(
 
1121
                                ui.deviceCombo->currentIndex() ).toInt();
 
1122
 
 
1123
    /* Get the corresponding module */
 
1124
    module_t *p_module =
 
1125
        module_Find( VLC_OBJECT(p_intf), psz_devModule[i_devicetype] );
 
1126
    if( NULL == p_module ) return;
 
1127
 
 
1128
    /* Init */
 
1129
    QList<ConfigControl *> controls;
 
1130
 
 
1131
    /* Get the confsize  */
 
1132
    unsigned int i_confsize;
 
1133
    module_config_t *p_config;
 
1134
    p_config = module_GetConfig( p_module, &i_confsize );
 
1135
 
 
1136
    /* New Adv Prop dialog */
 
1137
    adv = new QDialog( this );
 
1138
    adv->setWindowTitle( qtr( "Advanced Options" ) );
 
1139
 
 
1140
    /* A main Layout with a Frame */
 
1141
    QVBoxLayout *mainLayout = new QVBoxLayout( adv );
 
1142
    QScrollArea *scroll = new QScrollArea;
 
1143
    mainLayout->addWidget( scroll );
 
1144
 
 
1145
    QFrame *advFrame = new QFrame;
 
1146
    /* GridLayout inside the Frame */
 
1147
    QGridLayout *gLayout = new QGridLayout( advFrame );
 
1148
 
 
1149
    scroll->setWidgetResizable( true );
 
1150
    scroll->setWidget( advFrame );
 
1151
 
 
1152
    /* Create the options inside the FrameLayout */
 
1153
    for( int n = 0; n < i_confsize; n++ )
 
1154
    {
 
1155
        module_config_t *p_item = p_config + n;
 
1156
        ConfigControl *config = ConfigControl::createControl(
 
1157
                        VLC_OBJECT( p_intf ), p_item, advFrame, gLayout, n );
 
1158
        controls.append( config );
 
1159
    }
 
1160
 
 
1161
    /* Button stuffs */
 
1162
    QDialogButtonBox *advButtonBox = new QDialogButtonBox( adv );
 
1163
    QPushButton *closeButton = new QPushButton( qtr( "OK" ) );
 
1164
    QPushButton *cancelButton = new QPushButton( qtr( "Cancel" ) );
 
1165
 
 
1166
    CONNECT( closeButton, clicked(), adv, accept() );
 
1167
    CONNECT( cancelButton, clicked(), adv, reject() );
 
1168
 
 
1169
    advButtonBox->addButton( closeButton, QDialogButtonBox::AcceptRole );
 
1170
    advButtonBox->addButton( cancelButton, QDialogButtonBox::RejectRole );
 
1171
 
 
1172
    mainLayout->addWidget( advButtonBox );
 
1173
 
 
1174
    /* Creation of the MRL */
 
1175
    if( adv->exec() )
 
1176
    {
 
1177
        QString tempMRL = "";
 
1178
        for( int i = 0; i < controls.size(); i++ )
 
1179
        {
 
1180
            ConfigControl *control = controls[i];
 
1181
            if( !control )
 
1182
            {
 
1183
                msg_Dbg( p_intf, "This shouldn't happen, please report" );
 
1184
                continue;
 
1185
            }
 
1186
 
 
1187
            tempMRL += (i ? " :" : ":");
 
1188
 
 
1189
            if( control->getType() == CONFIG_ITEM_BOOL )
 
1190
                if( !(qobject_cast<VIntConfigControl *>(control)->getValue() ) )
 
1191
                    tempMRL += "no-";
 
1192
 
 
1193
            tempMRL += control->getName();
 
1194
 
 
1195
            switch( control->getType() )
 
1196
            {
 
1197
                case CONFIG_ITEM_STRING:
 
1198
                case CONFIG_ITEM_FILE:
 
1199
                case CONFIG_ITEM_DIRECTORY:
 
1200
                case CONFIG_ITEM_MODULE:
 
1201
                    tempMRL += QString("=\"%1\"").arg( qobject_cast<VStringConfigControl *>(control)->getValue() );
 
1202
                    break;
 
1203
                case CONFIG_ITEM_INTEGER:
 
1204
                    tempMRL += QString("=%1").arg( qobject_cast<VIntConfigControl *>(control)->getValue() );
 
1205
                    break;
 
1206
                case CONFIG_ITEM_FLOAT:
 
1207
                    tempMRL += QString("=%1").arg( qobject_cast<VFloatConfigControl *>(control)->getValue() );
 
1208
                    break;
 
1209
            }
 
1210
        }
 
1211
        advMRL = tempMRL;
 
1212
        updateMRL();
 
1213
        msg_Dbg( p_intf, "%s", qtu( advMRL ) );
 
1214
    }
 
1215
    delete adv;
 
1216
    module_PutConfig( p_config );
 
1217
    module_Put( p_module );
 
1218
}
 
1219