main_interface.cpp 19.7 KB
Newer Older
zorglub's avatar
zorglub committed
1
2
3
/*****************************************************************************
 * main_inteface.cpp : Main interface
 ****************************************************************************
4
5
 * Copyright (C) 2006 the VideoLAN team
 * $Id$
zorglub's avatar
zorglub committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * Authors: Clément Stenac <zorglub@videolan.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/

23
#include "qt4.hpp"
zorglub's avatar
zorglub committed
24
#include "main_interface.hpp"
zorglub's avatar
zorglub committed
25
#include "input_manager.hpp"
26
#include "util/input_slider.hpp"
zorglub's avatar
zorglub committed
27
#include "util/qvlcframe.hpp"
28
#include "util/customwidgets.hpp"
zorglub's avatar
zorglub committed
29
#include "dialogs_provider.hpp"
30
#include "components/interface_widgets.hpp"
31
32
33
#include "dialogs/playlist.hpp"
#include "menus.hpp"

zorglub's avatar
zorglub committed
34
#include <QMenuBar>
zorglub's avatar
zorglub committed
35
#include <QCloseEvent>
zorglub's avatar
zorglub committed
36
#include <QPushButton>
zorglub's avatar
zorglub committed
37
#include <QStatusBar>
38
#include <QKeyEvent>
zorglub's avatar
zorglub committed
39
#include <QUrl>
40
41

#include <assert.h>
42
#include <vlc_keys.h>
43
#include <vlc/vout.h>
zorglub's avatar
zorglub committed
44
#include <aout_internal.h>
zorglub's avatar
zorglub committed
45

zorglub's avatar
zorglub committed
46
#ifdef WIN32
zorglub's avatar
zorglub committed
47
    #define PREF_W 410
zorglub's avatar
zorglub committed
48
49
    #define PREF_H 121
#else
zorglub's avatar
zorglub committed
50
    #define PREF_W 450
zorglub's avatar
zorglub committed
51
52
    #define PREF_H 125
#endif
zorglub's avatar
zorglub committed
53

54
55
56
57
58
59
60
61
#define VISIBLE(i) (i && i->isVisible())

#define SET_WIDTH(i,j) i->widgetSize.setWidth(j)
#define SET_HEIGHT(i,j) i->widgetSize.setHeight(j)
#define SET_WH( i,j,k) i->widgetSize.setWidth(j); i->widgetSize.setHeight(k);

#define DS(i) i.width(),i.height()

zorglub's avatar
zorglub committed
62
63
static int InteractCallback( vlc_object_t *, const char *, vlc_value_t,
                             vlc_value_t, void *);
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* Video handling */
static void *DoRequest( intf_thread_t *p_intf, vout_thread_t *p_vout,
                        int *pi1, int *pi2, unsigned int*pi3,unsigned int*pi4)
{
    return p_intf->p_sys->p_mi->requestVideo( p_vout, pi1, pi2, pi3, pi4 );
}
static void DoRelease( intf_thread_t *p_intf, void *p_win )
{
    return p_intf->p_sys->p_mi->releaseVideo( p_win );
}
static int DoControl( intf_thread_t *p_intf, void *p_win, int i_q, va_list a )
{
    return p_intf->p_sys->p_mi->controlVideo( p_win, i_q, a );
}
zorglub's avatar
zorglub committed
78

79
80
bool embeddedPlaylistWasActive;
bool videoIsActive;
81
QSize savedVideoSize;
82

zorglub's avatar
zorglub committed
83
MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
zorglub's avatar
zorglub committed
84
{
85
    /* Configuration */
86
87
88
    settings = new QSettings( "VideoLAN", "VLC" );
    settings->beginGroup( "MainWindow" );

89
    need_components_update = false;
90
    bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL;
zorglub's avatar
zorglub committed
91
    embeddedPlaylistWasActive = videoIsActive = false;
92

zorglub's avatar
zorglub committed
93
    videoEmbeddedFlag = false;
94
    if( config_GetInt( p_intf, "embedded-video" ) ) videoEmbeddedFlag = true;
zorglub's avatar
zorglub committed
95
96
97
98
99

    alwaysVideoFlag = false;
    if( videoEmbeddedFlag && config_GetInt( p_intf, "qt-always-video" ))
        alwaysVideoFlag = true;

100
    playlistEmbeddedFlag = settings->value("playlist-embedded", true).toBool();
zorglub's avatar
zorglub committed
101
    advControlsEnabled= settings->value( "adv-controls", false ).toBool();
102
    visualSelectorEnabled= settings->value( "visual-selector", false ).toBool();
zorglub's avatar
zorglub committed
103

104
    /* UI */
zorglub's avatar
zorglub committed
105
    setWindowTitle( QString::fromUtf8( _("VLC media player") ) );
106
    handleMainUi( settings );
zorglub's avatar
zorglub committed
107
    QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag,
108
                             advControlsEnabled, visualSelectorEnabled );
109
110
111
112
    timeLabel = new QLabel( 0 );
    nameLabel = new QLabel( 0 );
    statusBar()->addWidget( nameLabel, 4 );
    statusBar()->addPermanentWidget( timeLabel, 1 );
zorglub's avatar
Icons    
zorglub committed
113

114
    setFocusPolicy( Qt::StrongFocus );
115
    setAcceptDrops(true);
116

117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
    /* Init input manager */
    MainInputManager::getInstance( p_intf );
    ON_TIMEOUT( updateOnTimer() );

    /* Volume control */
    CONNECT( ui.volumeSlider, valueChanged(int), this, updateVolume(int) );
    /* Connect the input manager to the GUI elements it manages */
    CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ),
             slider, setPosition( float,int, int ) );
    CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ),
             this, setDisplay( float, int, int ) );
    CONNECT( THEMIM->getIM(), nameChanged( QString ), this,setName( QString ) );
    CONNECT( THEMIM->getIM(), statusChanged( int ), this, setStatus( int ) );
    CONNECT( slider, sliderDragged( float ),
             THEMIM->getIM(), sliderUpdate( float ) );

    var_Create( p_intf, "interaction", VLC_VAR_ADDRESS );
    var_AddCallback( p_intf, "interaction", InteractCallback, this );
    p_intf->b_interaction = VLC_TRUE;
}

MainInterface::~MainInterface()
{
zorglub's avatar
zorglub committed
140
141
142
143
144
    settings->setValue( "playlist-embedded", playlistEmbeddedFlag );
    settings->setValue( "adv-controls", advControlsEnabled );
    settings->setValue( "pos", pos() );
    settings->endGroup();
    delete settings;
145
146
    p_intf->b_interaction = VLC_FALSE;
    var_DelCallback( p_intf, "interaction", InteractCallback, this );
147
148
149
150

    p_intf->pf_request_window = NULL;
    p_intf->pf_release_window = NULL;
    p_intf->pf_control_window = NULL;
151
152
153
154
155
156
157
158
}

void MainInterface::handleMainUi( QSettings *settings )
{
    QWidget *main = new QWidget( this );
    setCentralWidget( main );
    ui.setupUi( centralWidget() );

zorglub's avatar
zorglub committed
159
160
    slider = new InputSlider( Qt::Horizontal, NULL );
    ui.hboxLayout->insertWidget( 0, slider );
161

zorglub's avatar
zorglub committed
162
163
164
165
166
    BUTTON_SET_ACT_I( ui.prevButton, "" , previous.png,
                      qtr("Previous"), prev() );
    BUTTON_SET_ACT_I( ui.nextButton, "", next.png, qtr("Next"), next() );
    BUTTON_SET_ACT_I( ui.playButton, "", play.png, qtr("Play"), play() );
    BUTTON_SET_ACT_I( ui.stopButton, "", stop.png, qtr("Stop"), stop() );
167
168

    /* Volume */
169
    ui.volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) );
zorglub's avatar
zorglub committed
170
    ui.volumeSlider->setMaximum( 100 );
171
172
173
    ui.volMuteLabel->setToolTip( qtr( "Mute" ) );
    VolumeClickHandler *h = new VolumeClickHandler( p_intf, this );
    ui.volMuteLabel->installEventFilter(h);
zorglub's avatar
zorglub committed
174
175
    ui.volumeSlider->setFocusPolicy( Qt::NoFocus );

zorglub's avatar
zorglub committed
176
177
    BUTTON_SET_IMG( ui.playlistButton, "" ,volume-low.png,
                        playlistEmbeddedFlag ?  qtr( "Show playlist" ) :
zorglub's avatar
Cleanup    
zorglub committed
178
                                                qtr( "Open playlist" ) );
179
    BUTTONACT( ui.playlistButton, playlist() );
zorglub's avatar
zorglub committed
180

zorglub's avatar
zorglub committed
181
    /* Set initial size */
zorglub's avatar
zorglub committed
182
    resize ( PREF_W, PREF_H );
183

184
    addSize = QSize( ui.vboxLayout->margin() * 2, PREF_H );
185

zorglub's avatar
zorglub committed
186
187
188
189
190
191
    advControls = new ControlsWidget( p_intf );
    ui.vboxLayout->insertWidget( 0, advControls );
    advControls->updateGeometry();
    if( !advControlsEnabled ) advControls->hide();
    need_components_update = true;

192
193
194
195
196
197
198
199
200
201
202
203
204
205
    visualSelector = new VisualSelector( p_intf );
    ui.vboxLayout->insertWidget( 0, visualSelector );
    visualSelector->hide();

    if( alwaysVideoFlag )
    {
        bgWidget = new BackgroundWidget( p_intf );
        bgWidget->widgetSize = settings->value( "backgroundSize",
                                                QSize( 200, 200 ) ).toSize();
        bgWidget->resize( bgWidget->widgetSize );
        bgWidget->updateGeometry();
        ui.vboxLayout->insertWidget( 0, bgWidget );
    }

206
    if( videoEmbeddedFlag )
207
    {
208
        videoWidget = new VideoWidget( p_intf );
209
        videoWidget->widgetSize = QSize( 1, 1 );
210
211
212
        videoWidget->resize( videoWidget->widgetSize );
        ui.vboxLayout->insertWidget( 0, videoWidget );

213
214
215
        p_intf->pf_request_window  = ::DoRequest;
        p_intf->pf_release_window  = ::DoRelease;
        p_intf->pf_control_window  = ::DoControl;
216
    }
zorglub's avatar
zorglub committed
217
    setMinimumSize( PREF_W, addSize.height() );
zorglub's avatar
zorglub committed
218
219
}

220
221
222
/**********************************************************************
 * Handling of the components
 **********************************************************************/
223
void MainInterface::calculateInterfaceSize()
zorglub's avatar
zorglub committed
224
{
225
    int width = 0, height = 0;
226
    if( VISIBLE( bgWidget ) )
zorglub's avatar
zorglub committed
227
    {
228
229
        width = bgWidget->widgetSize.width();
        height = bgWidget->widgetSize.height();
zorglub's avatar
zorglub committed
230
        assert( !(playlistWidget && playlistWidget->isVisible() ) );
zorglub's avatar
zorglub committed
231
    }
232
    else if( VISIBLE( playlistWidget ) )
233
    {
234
235
        width = playlistWidget->widgetSize.width();
        height = playlistWidget->widgetSize.height();
236
    }
237
238
239
240
241
    else if( videoIsActive )
    {
        width =  videoWidget->widgetSize.width() ;
        height = videoWidget->widgetSize.height();
    }
zorglub's avatar
Cleanup    
zorglub committed
242
243
244
245
246
    else
    {
        width = PREF_W - addSize.width();
        height = PREF_H - addSize.height();
    }
247
248
    if( VISIBLE( visualSelector ) )
        height += visualSelector->height();
zorglub's avatar
zorglub committed
249
250
251
252
    if( VISIBLE( advControls) )
    {
        height += advControls->sizeHint().height();
    }
253
    mainSize = QSize( width + addSize.width(), height + addSize.height() );
zorglub's avatar
zorglub committed
254
}
zorglub's avatar
zorglub committed
255

zorglub's avatar
zorglub committed
256
void MainInterface::resizeEvent( QResizeEvent *e )
257
{
258
259
    videoWidget->widgetSize.setWidth(  e->size().width() - addSize.width() );
    if( videoWidget && videoIsActive && videoWidget->widgetSize.height() > 1 )
260
    {
261
262
263
        SET_WH( videoWidget, e->size().width() - addSize.width(),
                             e->size().height()  - addSize.height() );
        videoWidget->updateGeometry();
264
    }
265
    if( VISIBLE( playlistWidget ) )
266
    {
267
268
269
        SET_WH( playlistWidget , e->size().width() - addSize.width(),
                                 e->size().height() - addSize.height() );
        playlistWidget->updateGeometry();
270
    }
271
272
}

273
274
275
276
277
void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x,
                                   int *pi_y, unsigned int *pi_width,
                                   unsigned int *pi_height )
{
    void *ret = videoWidget->request( p_nvout,pi_x, pi_y, pi_width, pi_height );
278
279
280
    if( ret )
    {
        videoIsActive = true;
281
        if( VISIBLE( playlistWidget ) )
282
283
284
285
        {
            embeddedPlaylistWasActive = true;
            playlistWidget->hide();
        }
286
287
        bool bgWasVisible = false;
        if( VISIBLE( bgWidget) )
zorglub's avatar
zorglub committed
288
        {
289
            bgWasVisible = true;
zorglub's avatar
zorglub committed
290
291
            bgWidget->hide();
        }
292
293
294
295
296
297
298
299
300
301
302
        if( THEMIM->getIM()->hasVideo() || !bgWasVisible )
        {
            videoWidget->widgetSize = QSize( *pi_width, *pi_height );
        }
        else /* Background widget available, use its size */
        {
            /* Ok, our visualizations are bad, so don't do this for the moment
             * use the requested size anyway */
            // videoWidget->widgetSize = bgWidget->widgeTSize;
            videoWidget->widgetSize = QSize( *pi_width, *pi_height );
        }
303
304
305
        videoWidget->updateGeometry(); /// FIXME: Needed ?
        need_components_update = true;
    }
306
307
308
309
310
311
    return ret;
}

void MainInterface::releaseVideo( void *p_win )
{
    videoWidget->release( p_win );
312
313
    videoWidget->widgetSize = QSize( 0, 0 );
    videoWidget->resize( videoWidget->widgetSize );
zorglub's avatar
zorglub committed
314

315
316
    if( embeddedPlaylistWasActive )
        playlistWidget->show();
zorglub's avatar
zorglub committed
317
318
319
    else if( bgWidget )
        bgWidget->show();

320
    videoIsActive = false;
321
    need_components_update = true;
322
323
}

324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
int MainInterface::controlVideo( void *p_window, int i_query, va_list args )
{
    int i_ret = VLC_EGENERIC;
    switch( i_query )
    {
        case VOUT_GET_SIZE:
        {
            unsigned int *pi_width  = va_arg( args, unsigned int * );
            unsigned int *pi_height = va_arg( args, unsigned int * );
            *pi_width = videoWidget->widgetSize.width();
            *pi_height = videoWidget->widgetSize.height();
            i_ret = VLC_SUCCESS;
            break;
        }
        case VOUT_SET_SIZE:
        {
            unsigned int i_width  = va_arg( args, unsigned int );
            unsigned int i_height = va_arg( args, unsigned int );
            videoWidget->widgetSize = QSize( i_width, i_height );
            videoWidget->updateGeometry();
            need_components_update = true;
            i_ret = VLC_SUCCESS;
            break;
        }
        case VOUT_SET_STAY_ON_TOP:
        default:
            msg_Warn( p_intf, "unsupported control query" );
            break;
    }
    return i_ret;
}

zorglub's avatar
zorglub committed
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
void MainInterface::advanced()
{
    if( !VISIBLE( advControls ) )
    {
        advControls->show();
        advControlsEnabled = true;
    }
    else
    {
        advControls->hide();
        advControlsEnabled = false;
    }
    doComponentsUpdate();
}

371
372
373
374
375
376
377
378
379
void MainInterface::visual()
{
    if( !VISIBLE( visualSelector) )
    {
        visualSelector->show();
        if( !THEMIM->getIM()->hasVideo() )
        {
            /* Show the background widget */
        }
380
        visualSelectorEnabled = true;
381
382
383
384
385
    }
    else
    {
        /* Stop any currently running visualization */
        visualSelector->hide();
386
        visualSelectorEnabled = false;
387
    }
388
    doComponentsUpdate();
389
390
}

391
392
393
394
395
396
397
void MainInterface::playlist()
{
    // Toggle the playlist dialog
    if( !playlistEmbeddedFlag )
    {
        if( playlistWidget )
        {
398
            /// \todo Destroy it
399
400
401
402
403
404
405
406
407
408
409
        }
        THEDP->playlistDialog();
        return;
    }

    if( !playlistWidget )
    {
        PlaylistDialog::killInstance();
        playlistWidget = new PlaylistWidget( p_intf );
        ui.vboxLayout->insertWidget( 0, playlistWidget );
        playlistWidget->widgetSize = settings->value( "playlistSize",
zorglub's avatar
zorglub committed
410
                                               QSize( 650, 310 ) ).toSize();
411
        playlistWidget->hide();
412
    }
413
    if( VISIBLE( playlistWidget ) )
414
415
416
417
    {
        playlistWidget->hide();
        if( videoIsActive )
        {
418
419
420
            videoWidget->widgetSize = savedVideoSize;
            videoWidget->resize( videoWidget->widgetSize );
            videoWidget->updateGeometry();
421
422
423
424
425
426
        }
    }
    else
    {
        playlistWidget->show();
        if( videoIsActive )
427
428
429
430
431
432
        {
            savedVideoSize = videoWidget->widgetSize;
            videoWidget->widgetSize.setHeight( 0 );
            videoWidget->resize( videoWidget->widgetSize );
            videoWidget->updateGeometry();
        }
433
        if( VISIBLE( bgWidget ) ) bgWidget->hide();
434
    }
435
    doComponentsUpdate();
436
437
}

zorglub's avatar
zorglub committed
438
439
/* Video widget cannot do this synchronously as it runs in another thread */
/* Well, could it, actually ? Probably dangerous ... */
440
441
void MainInterface::doComponentsUpdate()
{
442
443
    calculateInterfaceSize();
    resize( mainSize );
444
445
}

zorglub's avatar
zorglub committed
446
void MainInterface::undockPlaylist()
447
{
zorglub's avatar
zorglub committed
448
    if( playlistWidget )
449
    {
zorglub's avatar
zorglub committed
450
451
        playlistWidget->hide();
        playlistWidget->deleteLater();
452
453
454
        ui.vboxLayout->removeWidget( playlistWidget );
        playlistWidget = NULL;
        playlistEmbeddedFlag = false;
zorglub's avatar
zorglub committed
455

zorglub's avatar
zorglub committed
456
        menuBar()->clear();
457
458
        QVLCMenu::createMenuBar( this, p_intf, false, advControlsEnabled,
                                 visualSelectorEnabled);
zorglub's avatar
zorglub committed
459
460
461
462
463
464
465
466
467
468

        if( videoIsActive )
        {
            videoWidget->widgetSize = savedVideoSize;
            videoWidget->resize( videoWidget->widgetSize );
            videoWidget->updateGeometry();
        }

        doComponentsUpdate();
        THEDP->playlistDialog();
469
    }
zorglub's avatar
zorglub committed
470
471
472
473
474
}

void MainInterface::customEvent( QEvent *event )
{
    if( event->type() == PLDockEvent_Type )
475
476
477
    {
        PlaylistDialog::killInstance();
        playlistEmbeddedFlag = true;
zorglub's avatar
zorglub committed
478
        menuBar()->clear();
479
480
        QVLCMenu::createMenuBar(this, p_intf, true, advControlsEnabled,
                                visualSelectorEnabled);
481
482
483
484
        playlist();
    }
}

485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531

/************************************************************************
 * D&D
 ************************************************************************/
void MainInterface::dropEvent(QDropEvent *event)
{
     const QMimeData *mimeData = event->mimeData();

     /* D&D of a subtitles file, add it on the fly */
     if( mimeData->urls().size() == 1 )
     {
        if( THEMIM->getIM()->hasInput() )
        {
            if( input_AddSubtitles( THEMIM->getInput(),
                                    qtu( mimeData->urls()[0].toString() ),
                                    VLC_TRUE ) )
            {
                event->acceptProposedAction();
                return;
            }
        }
     }
     bool first = true;
     foreach( QUrl url, mimeData->urls() ) {
        QString s = url.toString();
        if( s.length() > 0 ) {
            playlist_PlaylistAdd( THEPL, qtu(s), NULL,
                                  PLAYLIST_APPEND | (first ? PLAYLIST_GO:0),
                                  PLAYLIST_END );
            first = false;
        }
     }
     event->acceptProposedAction();
}
void MainInterface::dragEnterEvent(QDragEnterEvent *event)
{
     event->acceptProposedAction();
}
void MainInterface::dragMoveEvent(QDragMoveEvent *event)
{
     event->acceptProposedAction();
}
void MainInterface::dragLeaveEvent(QDragLeaveEvent *event)
{
     event->accept();
}

532
533
534
/************************************************************************
 * Other stuff
 ************************************************************************/
535
536
void MainInterface::keyPressEvent( QKeyEvent *e )
{
537
    int i_vlck = qtEventToVLCKey( e );
538
539
    if( i_vlck >= 0 )
    {
540
        var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
541
542
543
544
545
546
        e->accept();
    }
    else
        e->ignore();
}

zorglub's avatar
zorglub committed
547
548
void MainInterface::stop()
{
549
    playlist_Stop( THEPL );
zorglub's avatar
zorglub committed
550
551
552
}
void MainInterface::play()
{
zorglub's avatar
zorglub committed
553
    if( !playlist_IsEmpty(THEPL) || !THEPL->i_enabled )
554
555
    {
        /* The playlist is empty, open a file requester */
zorglub's avatar
zorglub committed
556
        THEDP->simpleOpenDialog();
557
558
559
560
        setStatus( 0 );
        return;
    }
    THEMIM->togglePlayPause();
zorglub's avatar
zorglub committed
561
562
563
}
void MainInterface::prev()
{
564
    playlist_Prev( THEPL );
zorglub's avatar
zorglub committed
565
566
567
}
void MainInterface::next()
{
568
    playlist_Next( THEPL );
zorglub's avatar
zorglub committed
569
570
571
572
573
574
575
576
577
}

void MainInterface::setDisplay( float pos, int time, int length )
{
    char psz_length[MSTRTIME_MAX_SIZE], psz_time[MSTRTIME_MAX_SIZE];
    secstotimestr( psz_length, length );
    secstotimestr( psz_time, time );
    QString title;
    title.sprintf( "%s/%s", psz_time, psz_length );
578
    timeLabel->setText( " "+title+" " );
zorglub's avatar
zorglub committed
579
580
581
582
}

void MainInterface::setName( QString name )
{
583
    nameLabel->setText( " " + name+" " );
zorglub's avatar
zorglub committed
584
585
}

586
587
void MainInterface::setStatus( int status )
{
zorglub's avatar
zorglub committed
588
    if( status == 1 ) // Playing
589
590
591
592
593
        ui.playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) );
    else
        ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) );
}

zorglub's avatar
zorglub committed
594
595
static bool b_my_volume;

zorglub's avatar
zorglub committed
596
597
void MainInterface::updateOnTimer()
{
598
    /* \todo Make this event-driven */
zorglub's avatar
zorglub committed
599
600
601
    advControls->enableInput( THEMIM->getIM()->hasInput() );
    advControls->enableVideo( THEMIM->getIM()->hasVideo() );

602
    if( intf_ShouldDie( p_intf ) )
zorglub's avatar
zorglub committed
603
    {
zorglub's avatar
zorglub committed
604
        QApplication::closeAllWindows();
zorglub's avatar
zorglub committed
605
606
        QApplication::quit();
    }
607
608
609
610
611
612
    if( need_components_update )
    {
        doComponentsUpdate();
        need_components_update = false;
    }

zorglub's avatar
zorglub committed
613
614
615
616
617
618
619
620
621
622
623
    audio_volume_t i_volume;
    aout_VolumeGet( p_intf, &i_volume );
    i_volume = (i_volume *  200 )/ AOUT_VOLUME_MAX ;
    int i_gauge = ui.volumeSlider->value();
    b_my_volume = false;
    if( i_volume - i_gauge > 1 || i_gauge - i_volume > 1 )
    {
        b_my_volume = true;
        ui.volumeSlider->setValue( i_volume );
        b_my_volume = false;
    }
zorglub's avatar
zorglub committed
624
625
626
627
628
629
}

void MainInterface::closeEvent( QCloseEvent *e )
{
    hide();
    p_intf->b_die = VLC_TRUE;
zorglub's avatar
zorglub committed
630
}
zorglub's avatar
zorglub committed
631

zorglub's avatar
zorglub committed
632
633
634
635
636
637
638
639
640
641
void MainInterface::updateVolume( int sliderVolume )
{
    if( !b_my_volume )
    {
        int i_res = sliderVolume * AOUT_VOLUME_MAX /
                            (2*ui.volumeSlider->maximum() );
        aout_VolumeSet( p_intf, i_res );
    }
}

zorglub's avatar
zorglub committed
642
643
644
645
646
647
648
static int InteractCallback( vlc_object_t *p_this,
                             const char *psz_var, vlc_value_t old_val,
                             vlc_value_t new_val, void *param )
{
    intf_dialog_args_t *p_arg = new intf_dialog_args_t;
    p_arg->p_dialog = (interaction_dialog_t *)(new_val.p_address);
    DialogEvent *event = new DialogEvent( INTF_DIALOG_INTERACTION, 0, p_arg );
649
    QApplication::postEvent( THEDP, static_cast<QEvent*>(event) );
zorglub's avatar
zorglub committed
650
651
    return VLC_SUCCESS;
}