1 /*
2     SPDX-FileCopyrightText: 2003-2004 Christian Kvasny <chris@k3b.org>
3     SPDX-FileCopyrightText: 2008 Sebastian Trueg <trueg@k3b.org>
4     SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl>
5     SPDX-FileCopyrightText: 1998-2010 Sebastian Trueg <trueg@k3b.org>
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 
10 #include "k3bvcdtrackdialog.h"
11 #include "k3bglobals.h"
12 #include "k3bmsf.h"
13 #include "k3bvcddoc.h"
14 #include "k3bvcdtrack.h"
15 #include "k3bvcdtrackkeysdelegate.h"
16 #include "k3bvcdtrackkeysmodel.h"
17 
18 #include <KIconLoader>
19 #include <KIO/Global>
20 #include <KLocalizedString>
21 #include <KSqueezedTextLabel>
22 
23 #include <QList>
24 #include <QUrl>
25 #include <QPixmap>
26 #include <QCheckBox>
27 #include <QComboBox>
28 #include <QDialogButtonBox>
29 #include <QFormLayout>
30 #include <QGridLayout>
31 #include <QGroupBox>
32 #include <QHeaderView>
33 #include <QLabel>
34 #include <QLineEdit>
35 #include <QPushButton>
36 #include <QRadioButton>
37 #include <QSpinBox>
38 #include <QTabWidget>
39 #include <QToolTip>
40 #include <QTreeView>
41 #include <QVBoxLayout>
42 
43 
44 namespace {
45     const int KEY_COUNT = 99;
46 } // namespace
47 
48 
49 class K3b::VcdTrackDialog::Private
50 {
51 public:
Private(K3b::VcdDoc * d,const QList<K3b::VcdTrack * > & t,QList<K3b::VcdTrack * > & st)52     Private( K3b::VcdDoc* d, const QList<K3b::VcdTrack*>& t, QList<K3b::VcdTrack*>& st )
53         : doc( d ), tracks( t ), selectedTracks( st )
54     {
55     }
56 
57     void setPbcTrack( VcdTrack* selected, QComboBox* box, VcdTrack::PbcTracks which );
58 
59     VcdDoc* doc;
60     QList<VcdTrack*> tracks;
61     QList<VcdTrack*> selectedTracks;
62     QTabWidget* mainTabbed;
63 
64     KSqueezedTextLabel* displayFileName;
65     QLabel* labelMimeType;
66     QLabel* displaySize;
67     QLabel* displayLength;
68     QLabel* muxrate;
69 
70     QLabel* mpegver_audio;
71     QLabel* rate_audio;
72     QLabel* sampling_frequency_audio;
73     QLabel* mode_audio;
74     QLabel* copyright_audio;
75 
76     QLabel* mpegver_video;
77     QLabel* rate_video;
78     QLabel* chromaformat_video;
79     QLabel* format_video;
80     QLabel* resolution_video;
81     QLabel* highresolution_video;
82 
83     QLabel* labelAfterTimeout;
84     QLabel* labelWait;
85 
86     QGroupBox* groupPlay;
87     QGroupBox* groupPbc;
88     QWidget* widgetnumkeys;
89 
90     QComboBox* pbc_previous;
91     QComboBox* pbc_next;
92     QComboBox* pbc_return;
93     QComboBox* pbc_default;
94     QComboBox* comboAfterTimeout;
95 
96     QCheckBox* check_reactivity;
97     QCheckBox* check_pbc;
98     QCheckBox* check_usekeys;
99     QCheckBox* check_overwritekeys;
100     QTreeView* keys_view;
101     VcdTrackKeysModel* keys_model;
102     VcdTrackKeysDelegate* keys_delegate;
103 
104     QSpinBox* spin_times;
105     QSpinBox* spin_waittime;
106 };
107 
108 
setPbcTrack(K3b::VcdTrack * selected,QComboBox * box,VcdTrack::PbcTracks which)109 void K3b::VcdTrackDialog::Private::setPbcTrack( K3b::VcdTrack* selected, QComboBox* box, VcdTrack::PbcTracks which )
110 {
111     const int currentIndex = box->currentIndex();
112     const int count = tracks.count();
113 
114     // TODO: Unset Userdefined on default settings
115     qDebug() << QString( "K3b::VcdTrackDialog::setPbcTrack: currentIndex = %1, count = %2" ).arg( currentIndex ).arg( count );
116 
117     if( VcdTrack* track = selected->getPbcTrack( which ) )
118         track->delFromRevRefList( selected );
119 
120     if( currentIndex >= 0 && currentIndex < count ) {
121         selected->setPbcTrack( which, tracks.at( currentIndex ) );
122         tracks.at( currentIndex ) ->addToRevRefList( selected );
123     }
124     else if( currentIndex == count ) {
125         selected->setPbcTrack( which, 0 );
126         selected->setPbcNonTrack( which, VcdTrack::DISABLED );
127     }
128     else {
129         selected->setPbcTrack( which, 0 );
130         selected->setPbcNonTrack( which, VcdTrack::VIDEOEND );
131     }
132 
133     selected->setUserDefined( which, true );
134 }
135 
136 
VcdTrackDialog(K3b::VcdDoc * doc,const QList<K3b::VcdTrack * > & tracks,QList<K3b::VcdTrack * > & selectedTracks,QWidget * parent)137 K3b::VcdTrackDialog::VcdTrackDialog( K3b::VcdDoc* doc, const QList<K3b::VcdTrack*>& tracks, QList<K3b::VcdTrack*>& selectedTracks, QWidget* parent )
138     : QDialog( parent ),
139       d( new Private( doc, tracks, selectedTracks ) )
140 {
141     setWindowTitle( i18n( "Video Track Properties" ) );
142 
143     prepareGui();
144 
145     setupPbcTab();
146     setupPbcKeyTab();
147     setupVideoTab();
148     setupAudioTab();
149 
150     if ( !d->selectedTracks.isEmpty() ) {
151 
152         K3b::VcdTrack * selectedTrack = d->selectedTracks.first();
153 
154         d->displayFileName->setText( selectedTrack->fileName() );
155         d->displayLength->setText( selectedTrack->duration() );
156         d->displaySize->setText( KIO::convertSize( selectedTrack->size() ) );
157         d->muxrate->setText( i18n( "%1 bit/s", selectedTrack->muxrate() ) );
158 
159         if ( selectedTrack->isSegment() )
160             d->labelMimeType->setPixmap( QIcon::fromTheme("image-x-generic").pixmap(KIconLoader::SizeMedium) );
161         else
162             d->labelMimeType->setPixmap( QIcon::fromTheme("video-x-generic").pixmap(KIconLoader::SizeMedium) );
163 
164         fillGui();
165     }
166 }
167 
~VcdTrackDialog()168 K3b::VcdTrackDialog::~VcdTrackDialog()
169 {
170     delete d;
171 }
172 
accept()173 void K3b::VcdTrackDialog::accept()
174 {
175     slotApply();
176     QDialog::accept();
177 }
178 
slotApply()179 void K3b::VcdTrackDialog::slotApply()
180 {
181     // track set
182     K3b::VcdTrack * selectedTrack = d->selectedTracks.first();
183 
184     d->setPbcTrack( selectedTrack, d->pbc_previous, K3b::VcdTrack::PREVIOUS );
185     d->setPbcTrack( selectedTrack, d->pbc_next, K3b::VcdTrack::NEXT );
186     d->setPbcTrack( selectedTrack, d->pbc_return, K3b::VcdTrack::RETURN );
187     d->setPbcTrack( selectedTrack, d->pbc_default, K3b::VcdTrack::DEFAULT );
188     d->setPbcTrack( selectedTrack, d->comboAfterTimeout, K3b::VcdTrack::AFTERTIMEOUT );
189 
190     selectedTrack->setPlayTime( d->spin_times->value() );
191     selectedTrack->setWaitTime( d->spin_waittime->value() );
192     selectedTrack->setReactivity( d->check_reactivity->isChecked() );
193     selectedTrack->setPbcNumKeys( d->check_usekeys->isChecked() );
194     selectedTrack->setPbcNumKeysUserdefined( d->check_overwritekeys->isChecked() );
195 
196     // global set
197     d->doc->vcdOptions()->setPbcEnabled( d->check_pbc->isChecked() );
198 
199     // define numeric keys
200     selectedTrack->delDefinedNumKey();
201 
202     if ( d->check_overwritekeys->isChecked() ) {
203 
204         for( int key = 1; key <= d->keys_model->keyCount(); ++key ) {
205             VcdTrackKeysModel::Key2Track::const_iterator it = d->keys_model->keys().constFind( key );
206             if( it != d->keys_model->keys().constEnd() )
207                 selectedTrack->setDefinedNumKey( it.key(), it.value() );
208             else
209                 selectedTrack->delDefinedNumKey( it.key() );
210         }
211     } else {
212         selectedTrack->setDefinedNumKey( 1, selectedTrack );
213         qDebug() << "Key 1" << " Playing: (default) " << VcdTrackKeysModel::trackName( selectedTrack ) << "Track: " << selectedTrack;
214     }
215 }
216 
fillGui()217 void K3b::VcdTrackDialog::fillGui()
218 {
219     K3b::VcdTrack * selectedTrack = d->selectedTracks.first();
220 
221     d->mpegver_video->setText( selectedTrack->mpegTypeS() );
222     d->rate_video->setText( selectedTrack->video_bitrate() );
223     d->chromaformat_video->setText( selectedTrack->video_chroma() );
224     d->format_video->setText( selectedTrack->video_format() );
225     d->highresolution_video->setText( selectedTrack->highresolution() );
226     d->resolution_video->setText( selectedTrack->resolution() );
227 
228     d->mpegver_audio->setText( selectedTrack->mpegTypeS( true ) );
229     d->rate_audio->setText( selectedTrack->audio_bitrate() );
230 
231     d->sampling_frequency_audio->setText( selectedTrack->audio_sampfreq() );
232     d->mode_audio->setText( selectedTrack->audio_mode() );
233     d->copyright_audio->setText( selectedTrack->audio_copyright() );
234 
235     fillPbcGui();
236 
237 
238     d->pbc_previous->setToolTip( i18n( "May also look like | << on the remote control. " ) );
239     d->pbc_next->setToolTip( i18n( "May also look like >> | on the remote control." ) );
240     d->pbc_return->setToolTip( i18n( "This key may be mapped to the STOP key." ) );
241     d->pbc_default->setToolTip( i18n( "This key is usually mapped to the > or PLAY key." ) );
242     d->comboAfterTimeout->setToolTip( i18n( "Target to be jumped to on time-out of <wait>." ) );
243     d->check_reactivity->setToolTip( i18n( "Delay reactivity of keys." ) );
244     d->check_pbc->setToolTip( i18n( "Playback control, PBC, is available for Video CD 2.0 and Super Video CD 1.0 disc formats." ) );
245     d->check_usekeys->setToolTip( i18n( "Activate the use of numeric keys." ) );
246     d->check_overwritekeys->setToolTip( i18n( "Overwrite default numeric keys." ) );
247     d->keys_view->setToolTip( i18n( "Numeric keys." ) );
248     d->spin_times->setToolTip( i18n( "Times to repeat the playback of 'play track'." ) );
249     d->spin_waittime->setToolTip( i18n( "Time in seconds to wait after playback of 'play track'." ) );
250 
251     d->comboAfterTimeout->setWhatsThis( i18n( "<p>Target to be jumped to on time-out of <wait>."
252                                              "<p>If omitted (and <wait> is not set to an infinite time) one of the targets is selected at random." ) );
253     d->check_reactivity->setWhatsThis( i18n( "<p>When reactivity is set to delayed, it is recommended that the length of the referenced 'play track' is not more than 5 seconds."
254                                             "<p>The recommended setting for a play item consisting of one still picture and no audio is to loop once and have a delayed reactivity." ) );
255     d->check_pbc->setWhatsThis( i18n( "<p>Playback control, PBC, is available for Video CD 2.0 and Super Video CD 1.0 disc formats."
256                                      "<p>PBC allows control of the playback of play items and the possibility of interaction with the user through the remote control or some other input device available." ) );
257     d->check_usekeys->setWhatsThis( i18n( "These are actually pseudo keys, representing the numeric keys 0, 1, ..., 9." ) );
258     d->check_overwritekeys->setWhatsThis( i18n( "<p>If numeric keys enabled, you can overwrite the default settings." ) );
259     d->spin_times->setWhatsThis( i18n( "<p>Times to repeat the playback of 'play track'."
260                                       "<p>The reactivity attribute controls whether the playback of 'play track' is finished, thus delayed, before executing user triggered action or an immediate jump is performed."
261                                       "<p>After the specified number of repetitions have completed, the <wait> time begins to count down, unless set to an infinite wait time."
262                                       "<p>If this element is omitted, a default of `1' is used, i.e. the 'play track' will be displayed once." ) );
263     d->spin_waittime->setWhatsThis( i18n( "Time in seconds to wait after playback of 'play track' before triggering the <timeout> action (unless the user triggers some action before time ran up)." ) );
264 
265 }
266 
fillPbcGui()267 void K3b::VcdTrackDialog::fillPbcGui()
268 {
269     K3b::VcdTrack * selectedTrack = d->selectedTracks.first();
270     // add tracktitles to combobox
271     int iPrevious = -1;
272     int iNext = -1;
273     int iReturn = -1;
274     int iDefault = -1;
275     int iAfterTimeOut = -1;
276 
277     Q_FOREACH( K3b::VcdTrack* track, d->tracks ) {
278         QString name = VcdTrackKeysModel::trackName( track );
279         QIcon icon = VcdTrackKeysModel::trackIcon( track );
280 
281         d->pbc_previous->addItem( icon, name );
282         if ( track == selectedTrack->getPbcTrack( K3b::VcdTrack::PREVIOUS ) )
283             iPrevious = d->pbc_previous->count() - 1;
284 
285         d->pbc_next->addItem( icon, name );
286         if ( track == selectedTrack->getPbcTrack( K3b::VcdTrack::NEXT ) )
287             iNext = d->pbc_next->count() - 1;
288 
289         d->pbc_return->addItem( icon, name );
290         if ( track == selectedTrack->getPbcTrack( K3b::VcdTrack::RETURN ) )
291             iReturn = d->pbc_return->count() - 1;
292 
293         d->pbc_default->addItem( icon, name );
294         if ( track == selectedTrack->getPbcTrack( K3b::VcdTrack::DEFAULT ) )
295             iDefault = d->pbc_default->count() - 1;
296 
297         d->comboAfterTimeout->addItem( icon, name );
298         if ( track == selectedTrack->getPbcTrack( K3b::VcdTrack::AFTERTIMEOUT ) )
299             iAfterTimeOut = d->comboAfterTimeout->count() - 1;
300     }
301 
302     // add Event Disabled
303     QPixmap disabledIcon = QIcon::fromTheme( "process-stop" ).pixmap( KIconLoader::SizeSmall );
304     QString disabledName = i18n( "Event Disabled" );
305     d->pbc_previous->addItem( disabledIcon, disabledName );
306     d->pbc_next->addItem( disabledIcon, disabledName );
307     d->pbc_return->addItem( disabledIcon, disabledName );
308     d->pbc_default->addItem( disabledIcon, disabledName );
309     d->comboAfterTimeout->addItem( disabledIcon, disabledName );
310 
311     // add VideoCD End
312     QString endName = VcdTrackKeysModel::trackName( 0 );
313     QIcon endIcon = VcdTrackKeysModel::trackIcon( 0 );
314     d->pbc_previous->addItem( endIcon, endName );
315     d->pbc_next->addItem( endIcon, endName );
316     d->pbc_return->addItem( endIcon, endName );
317     d->pbc_default->addItem( endIcon, endName );
318     d->comboAfterTimeout->addItem( endIcon, endName );
319 
320     int count = d->tracks.count();
321 
322     if ( iPrevious < 0 )
323         d->pbc_previous->setCurrentIndex( count + selectedTrack->getNonPbcTrack( K3b::VcdTrack::PREVIOUS ) );
324     else
325         d->pbc_previous->setCurrentIndex( iPrevious );
326 
327     if ( iNext < 0 )
328         d->pbc_next->setCurrentIndex( count + selectedTrack->getNonPbcTrack( K3b::VcdTrack::NEXT ) );
329     else
330         d->pbc_next->setCurrentIndex( iNext );
331 
332     if ( iReturn < 0 )
333         d->pbc_return->setCurrentIndex( count + selectedTrack->getNonPbcTrack( K3b::VcdTrack::RETURN ) );
334     else
335         d->pbc_return->setCurrentIndex( iReturn );
336 
337     if ( iDefault < 0 )
338         d->pbc_default->setCurrentIndex( count + selectedTrack->getNonPbcTrack( K3b::VcdTrack::DEFAULT ) );
339     else
340         d->pbc_default->setCurrentIndex( iDefault );
341 
342     if ( iAfterTimeOut < 0 )
343         d->comboAfterTimeout->setCurrentIndex( count + selectedTrack->getNonPbcTrack( K3b::VcdTrack::AFTERTIMEOUT ) );
344     else
345         d->comboAfterTimeout->setCurrentIndex( iAfterTimeOut );
346 
347 
348     d->spin_waittime->setValue( selectedTrack->getWaitTime() );
349     d->spin_times->setValue( selectedTrack->getPlayTime() );
350 
351     d->check_reactivity->setChecked( selectedTrack->Reactivity() );
352     d->check_pbc->setChecked( d->doc->vcdOptions()->PbcEnabled() );
353 
354     d->check_usekeys->setChecked( selectedTrack->PbcNumKeys() );
355     d->check_overwritekeys->setChecked( selectedTrack->PbcNumKeysUserdefined() );
356 
357     if( selectedTrack->PbcNumKeysUserdefined() ) {
358         d->keys_model->setKeys( selectedTrack->DefinedNumKey() );
359     }
360     else {
361         QMap<int, VcdTrack*> keys;
362         keys.insert( 1, selectedTrack );
363         d->keys_model->setKeys( keys );
364     }
365 
366     d->mainTabbed->setTabEnabled( d->mainTabbed->indexOf( d->widgetnumkeys ),
367                                  d->check_usekeys->isChecked() && d->check_pbc->isChecked() );
368 }
369 
prepareGui()370 void K3b::VcdTrackDialog::prepareGui()
371 {
372     // /////////////////////////////////////////////////
373     // FILE-INFO BOX
374     // /////////////////////////////////////////////////
375     QGroupBox* groupFileInfo = new QGroupBox( i18n( "File Info" ), this );
376 
377     QGridLayout* groupFileInfoLayout = new QGridLayout( groupFileInfo );
378     groupFileInfoLayout->setAlignment( Qt::AlignTop );
379 
380     d->labelMimeType = new QLabel( groupFileInfo );
381 
382     d->displayFileName = new KSqueezedTextLabel( groupFileInfo );
383     d->displayFileName->setText( i18n( "Filename" ) );
384     d->displayFileName->setAlignment( Qt::AlignTop | Qt::AlignLeft );
385 
386     QLabel* labelSize = new QLabel( i18n( "Size:" ), groupFileInfo );
387     QLabel* labelLength = new QLabel( i18n( "Length:" ), groupFileInfo );
388     QLabel* labelMuxrate = new QLabel( i18n( "Muxrate:" ), groupFileInfo );
389 
390     d->displaySize = new QLabel( groupFileInfo );
391     d->displaySize->setText( "0.0 MB" );
392     d->displaySize->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
393 
394     d->displayLength = new QLabel( groupFileInfo );
395     d->displayLength->setText( "0:0:0" );
396     d->displayLength->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
397 
398     d->muxrate = new QLabel( groupFileInfo );
399     d->muxrate->setText( i18n( "%1 bit/s" ,QString::number( 0 ) ));
400     d->muxrate->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
401 
402     QFrame* fileInfoLine = new QFrame( groupFileInfo );
403     fileInfoLine->setFrameStyle( QFrame::HLine | QFrame::Sunken );
404 
405     groupFileInfoLayout->addWidget( d->labelMimeType, 0, 0 );
406     groupFileInfoLayout->addWidget( d->displayFileName, 0, 1, 2, 1 );
407     groupFileInfoLayout->addWidget( fileInfoLine, 2, 0, 1, 2 );
408     groupFileInfoLayout->addWidget( labelLength, 3, 0 );
409     groupFileInfoLayout->addWidget( labelSize, 4, 0 );
410     groupFileInfoLayout->addWidget( labelMuxrate, 5, 0 );
411     groupFileInfoLayout->addWidget( d->displayLength, 3, 1 );
412     groupFileInfoLayout->addWidget( d->displaySize, 4, 1 );
413     groupFileInfoLayout->addWidget( d->muxrate, 5, 1 );
414 
415     groupFileInfoLayout->setRowStretch( 6, 1 );
416     groupFileInfoLayout->setColumnStretch( 1, 1 );
417 
418     QFont f( d->displayLength->font() );
419     f.setBold( true );
420     d->displayLength->setFont( f );
421     d->displaySize->setFont( f );
422     d->muxrate->setFont( f );
423 
424     d->mainTabbed = new QTabWidget( this );
425 
426     QDialogButtonBox* buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel, this );
427     connect( buttonBox, SIGNAL(accepted()), SLOT(accept()) );
428     connect( buttonBox, SIGNAL(rejected()), SLOT(reject()) );
429     connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL(clicked()), SLOT(slotApply()) );
430 
431     QGridLayout* mainLayout = new QGridLayout( this );
432     mainLayout->addWidget( groupFileInfo, 0, 0 );
433     mainLayout->addWidget( d->mainTabbed, 0, 1 );
434     mainLayout->addWidget( buttonBox, 1, 0, 1, 2 );
435 }
436 
setupPbcTab()437 void K3b::VcdTrackDialog::setupPbcTab()
438 {
439     // /////////////////////////////////////////////////
440     // Playback Control TAB
441     // /////////////////////////////////////////////////
442     QWidget * w = new QWidget( d->mainTabbed );
443 
444     //////////////////////////////////////////////////////////////////////////////////////////
445     QGroupBox* groupOptions = new QGroupBox( i18n( "Settings" ), w );
446 
447     d->check_pbc = new QCheckBox( i18n( "Enable playback control (for the whole CD)" ), groupOptions );
448     d->check_usekeys = new QCheckBox( i18n( "Use numeric keys" ), groupOptions );
449     d->check_usekeys->setEnabled( false );
450     d->check_reactivity = new QCheckBox( i18n( "Reactivity delayed to the end of playing track" ), groupOptions );
451     d->check_reactivity->setEnabled( false );
452 
453     QVBoxLayout* groupOptionsLayout = new QVBoxLayout( groupOptions );
454     groupOptionsLayout->addWidget( d->check_pbc );
455     groupOptionsLayout->addWidget( d->check_usekeys );
456     groupOptionsLayout->addWidget( d->check_reactivity );
457 
458     //////////////////////////////////////////////////////////////////////////////////////////
459     d->groupPlay = new QGroupBox( i18n( "Playing" ), w );
460 
461     QGridLayout* groupPlayLayout = new QGridLayout( d->groupPlay );
462     groupPlayLayout->setAlignment( Qt::AlignTop );
463 
464     QLabel* labelPlaying = new QLabel( i18n( "Playing track" ) , d->groupPlay );
465 
466     d->spin_times = new QSpinBox( d->groupPlay );
467     d->spin_times->setValue( 1 );
468     d->spin_times->setSuffix( i18n( " time(s)" ) );
469     d->spin_times->setSpecialValueText( i18n( "forever" ) );
470 
471     //////////////////////////////////////////////////////////////////////////////////////////
472     d->labelWait = new QLabel( i18n( "then wait" ), d->groupPlay );
473     d->spin_waittime = new QSpinBox( d->groupPlay );
474     d->spin_waittime->setMinimum( -1 );
475     d->spin_waittime->setValue( 0 );
476     // d->spin_waittime->setEnabled( false );
477     d->spin_waittime->setSuffix( i18n( " seconds" ) );
478     d->spin_waittime->setSpecialValueText( i18n( "infinite" ) );
479 
480     d->labelAfterTimeout = new QLabel( i18n( "after timeout playing" ), d->groupPlay );
481     // d->labelAfterTimeout->setEnabled( false );
482     d->comboAfterTimeout = new QComboBox( /*K3b::CutComboBox::SQUEEZE, */d->groupPlay );
483     // d->comboAfterTimeout->setEnabled( false );
484 
485     groupPlayLayout->addWidget( labelPlaying, 1, 0 );
486     groupPlayLayout->addWidget( d->spin_times, 1, 1 );
487     groupPlayLayout->addWidget( d->labelWait, 1, 2 );
488     groupPlayLayout->addWidget( d->spin_waittime, 1, 3 );
489     groupPlayLayout->addWidget( d->labelAfterTimeout, 2, 1, 1, 3 );
490     groupPlayLayout->addWidget( d->comboAfterTimeout, 3, 1, 1, 3 );
491     groupPlayLayout->setColumnStretch( 1, 1 );
492     groupPlayLayout->setColumnStretch( 3, 1 );
493 
494     //////////////////////////////////////////////////////////////////////////////////////////
495     d->groupPbc = new QGroupBox( i18n( "Key Pressed Interaction" ), w );
496 
497     QLabel* labelPbc_previous = new QLabel( i18n( "Previous:" ), d->groupPbc );
498     QLabel* labelPbc_next = new QLabel( i18n( "Next:" ), d->groupPbc );
499     QLabel* labelPbc_return = new QLabel( i18n( "Return:" ), d->groupPbc );
500     QLabel* labelPbc_default = new QLabel( i18n( "Default:" ), d->groupPbc );
501 
502     d->pbc_previous = new QComboBox( /*K3b::CutComboBox::SQUEEZE,*/ d->groupPbc );
503     d->pbc_next = new QComboBox( /*K3b::CutComboBox::SQUEEZE,*/ d->groupPbc );
504     d->pbc_return = new QComboBox( /*K3b::CutComboBox::SQUEEZE,*/ d->groupPbc );
505     d->pbc_default = new QComboBox( /*K3b::CutComboBox::SQUEEZE,*/ d->groupPbc );
506 
507     QFormLayout* groupPbcLayout = new QFormLayout( d->groupPbc );
508     groupPbcLayout->setAlignment( Qt::AlignTop );
509     groupPbcLayout->setFieldGrowthPolicy( QFormLayout::AllNonFixedFieldsGrow );
510     groupPbcLayout->addRow( labelPbc_previous, d->pbc_previous );
511     groupPbcLayout->addRow( labelPbc_next, d->pbc_next );
512     groupPbcLayout->addRow( labelPbc_return, d->pbc_return );
513     groupPbcLayout->addRow( labelPbc_default, d->pbc_default );
514 
515     QVBoxLayout* grid = new QVBoxLayout( w );
516     grid->setAlignment( Qt::AlignTop );
517     grid->addWidget( groupOptions );
518     grid->addWidget( d->groupPlay );
519     grid->addWidget( d->groupPbc );
520 
521     d->mainTabbed->addTab( w, i18n( "Playback Control" ) );
522 
523     d->groupPlay->setEnabled( false );
524     d->groupPbc->setEnabled( false );
525 
526     connect( d->check_pbc, SIGNAL(toggled(bool)), this, SLOT(slotPbcToggled(bool)) );
527     connect( d->spin_times, SIGNAL(valueChanged(int)), this, SLOT(slotPlayTimeChanged(int)) );
528     connect( d->spin_waittime, SIGNAL(valueChanged(int)), this, SLOT(slotWaitTimeChanged(int)) );
529     connect( d->check_usekeys, SIGNAL(toggled(bool)), this, SLOT(slotUseKeysToggled(bool)) );
530 }
531 
setupPbcKeyTab()532 void K3b::VcdTrackDialog::setupPbcKeyTab()
533 {
534     // /////////////////////////////////////////////////
535     // Playback Control Numeric Key's TAB
536     // /////////////////////////////////////////////////
537     d->widgetnumkeys = new QWidget( d->mainTabbed );
538 
539     d->check_overwritekeys = new QCheckBox( i18n( "Overwrite default assignment" ), d->widgetnumkeys );
540 
541     d->keys_model = new VcdTrackKeysModel( KEY_COUNT, this );
542     d->keys_delegate = new VcdTrackKeysDelegate( d->tracks, this );
543 
544     d->keys_view = new QTreeView( d->widgetnumkeys );
545     d->keys_view->setEnabled( false );
546     d->keys_view->setModel( d->keys_model );
547     d->keys_view->setItemDelegateForColumn( VcdTrackKeysModel::PlayingColumn, d->keys_delegate );
548     d->keys_view->setAllColumnsShowFocus( true );
549     d->keys_view->setRootIsDecorated( false );
550     d->keys_view->setEditTriggers( QAbstractItemView::AllEditTriggers );
551     d->keys_view->header()->setSectionResizeMode( VcdTrackKeysModel::KeyColumn, QHeaderView::ResizeToContents );
552 
553     QVBoxLayout* layout = new QVBoxLayout( d->widgetnumkeys );
554     layout->addWidget( d->check_overwritekeys );
555     layout->addWidget( d->keys_view );
556 
557     d->mainTabbed->addTab( d->widgetnumkeys, i18n( "Numeric Keys" ) );
558 
559     connect( d->check_overwritekeys, SIGNAL(toggled(bool)), d->keys_view, SLOT(setEnabled(bool)) );
560 }
561 
setupAudioTab()562 void K3b::VcdTrackDialog::setupAudioTab()
563 {
564     // /////////////////////////////////////////////////
565     // AUDIO TAB
566     // /////////////////////////////////////////////////
567     QWidget * w = new QWidget( d->mainTabbed );
568 
569     d->mpegver_audio = new QLabel( w );
570     d->rate_audio = new QLabel( w );
571     d->sampling_frequency_audio = new QLabel( w );
572     d->mode_audio = new QLabel( w );
573     d->copyright_audio = new QLabel( w );
574 
575     d->mpegver_audio->setFrameShape( QLabel::StyledPanel );
576     d->rate_audio->setFrameShape( QLabel::StyledPanel );
577     d->sampling_frequency_audio->setFrameShape( QLabel::StyledPanel );
578     d->mode_audio->setFrameShape( QLabel::StyledPanel );
579     d->copyright_audio->setFrameShape( QLabel::StyledPanel );
580 
581     d->mpegver_audio->setFrameShadow( QLabel::Sunken );
582     d->rate_audio->setFrameShadow( QLabel::Sunken );
583     d->sampling_frequency_audio->setFrameShadow( QLabel::Sunken );
584     d->mode_audio->setFrameShadow( QLabel::Sunken );
585     d->copyright_audio->setFrameShadow( QLabel::Sunken );
586 
587     QFormLayout* layout = new QFormLayout( w );
588     layout->setAlignment( Qt::AlignTop );
589     layout->setFieldGrowthPolicy( QFormLayout::AllNonFixedFieldsGrow );
590     layout->addRow( new QLabel( i18n( "Type:" ), w ),               d->mpegver_audio );
591     layout->addRow( new QLabel( i18n( "Rate:" ), w ),               d->rate_audio );
592     layout->addRow( new QLabel( i18n( "Sampling frequency:" ), w ), d->sampling_frequency_audio );
593     layout->addRow( new QLabel( i18n( "Mode:" ), w ),               d->mode_audio );
594     layout->addRow( new QLabel( i18n( "Copyright:" ), w ),          d->copyright_audio );
595 
596     d->mainTabbed->addTab( w, i18n( "Audio" ) );
597 
598 }
599 
setupVideoTab()600 void K3b::VcdTrackDialog::setupVideoTab()
601 {
602     // /////////////////////////////////////////////////
603     // VIDEO TAB
604     // /////////////////////////////////////////////////
605     QWidget * w = new QWidget( d->mainTabbed );
606 
607     d->mpegver_video = new QLabel( w );
608     d->rate_video = new QLabel( w );
609     d->chromaformat_video = new QLabel( w );
610     d->format_video = new QLabel( w );
611     d->resolution_video = new QLabel( w );
612     d->highresolution_video = new QLabel( w );
613 
614     d->mpegver_video->setFrameShape( QLabel::StyledPanel );
615     d->rate_video->setFrameShape( QLabel::StyledPanel );
616     d->chromaformat_video->setFrameShape( QLabel::StyledPanel );
617     d->format_video->setFrameShape( QLabel::StyledPanel );
618     d->resolution_video->setFrameShape( QLabel::StyledPanel );
619     d->highresolution_video->setFrameShape( QLabel::StyledPanel );
620 
621     d->mpegver_video->setFrameShadow( QLabel::Sunken );
622     d->rate_video->setFrameShadow( QLabel::Sunken );
623     d->chromaformat_video->setFrameShadow( QLabel::Sunken );
624     d->format_video->setFrameShadow( QLabel::Sunken );
625     d->resolution_video->setFrameShadow( QLabel::Sunken );
626     d->highresolution_video->setFrameShadow( QLabel::Sunken );
627 
628     QFormLayout* layout = new QFormLayout( w );
629     layout->setAlignment( Qt::AlignTop );
630     layout->setFieldGrowthPolicy( QFormLayout::AllNonFixedFieldsGrow );
631     layout->addRow( new QLabel( i18n( "Type:" ), w ),            d->mpegver_video );
632     layout->addRow( new QLabel( i18n( "Rate:" ), w ),            d->rate_video );
633     layout->addRow( new QLabel( i18n( "Chroma format:" ), w ),   d->chromaformat_video );
634     layout->addRow( new QLabel( i18n( "Video format:" ), w ),    d->format_video );
635     layout->addRow( new QLabel( i18n( "Resolution:" ), w ),      d->resolution_video );
636     layout->addRow( new QLabel( i18n( "High resolution:" ), w ), d->highresolution_video );
637 
638     d->mainTabbed->addTab( w, i18n( "Video" ) );
639 }
640 
slotPlayTimeChanged(int value)641 void K3b::VcdTrackDialog::slotPlayTimeChanged( int value )
642 {
643     if ( value == 0 ) {
644         d->labelWait->setEnabled( false );
645         d->spin_waittime->setEnabled( false );
646         d->labelAfterTimeout->setEnabled( false );
647         d->comboAfterTimeout->setEnabled( false );
648     } else {
649         d->labelWait->setEnabled( true );
650         d->spin_waittime->setEnabled( true );
651         if ( d->spin_waittime->value() > -1 ) {
652             d->labelAfterTimeout->setEnabled( true );
653             d->comboAfterTimeout->setEnabled( true );
654         }
655     }
656 }
657 
slotWaitTimeChanged(int value)658 void K3b::VcdTrackDialog::slotWaitTimeChanged( int value )
659 {
660     if ( value < 0 || !d->labelWait->isEnabled() ) {
661         d->labelAfterTimeout->setEnabled( false );
662         d->comboAfterTimeout->setEnabled( false );
663     } else {
664         d->labelAfterTimeout->setEnabled( true );
665         d->comboAfterTimeout->setEnabled( true );
666     }
667 }
668 
slotPbcToggled(bool checked)669 void K3b::VcdTrackDialog::slotPbcToggled( bool checked )
670 {
671     d->groupPlay->setEnabled( checked );
672     d->groupPbc->setEnabled( checked );
673     d->check_usekeys->setEnabled( checked );
674     slotUseKeysToggled( checked && d->check_usekeys->isChecked() );
675     d->check_reactivity->setEnabled( checked );
676     if ( checked )
677         slotWaitTimeChanged( d->spin_waittime->value() );
678 }
679 
slotUseKeysToggled(bool checked)680 void K3b::VcdTrackDialog::slotUseKeysToggled( bool checked )
681 {
682     d->mainTabbed->setTabEnabled( d->mainTabbed->indexOf( d->widgetnumkeys ), checked );
683 }
684 
685 
686