main_interface.cpp 20.9 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"
zorglub's avatar
zorglub committed
28
#include "dialogs_provider.hpp"
29
#include "components/interface_widgets.hpp"
30
31
32
#include "dialogs/playlist.hpp"
#include "menus.hpp"

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

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

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

52
53
54
55
56
57
58
59
#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
60
61
static int InteractCallback( vlc_object_t *, const char *, vlc_value_t,
                             vlc_value_t, void *);
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* 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
76

77
78
bool embeddedPlaylistWasActive;
bool videoIsActive;
79
QSize savedVideoSize;
80

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

86
    need_components_update = false;
87
    bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL;
zorglub's avatar
zorglub committed
88
    embeddedPlaylistWasActive = videoIsActive = false;
89

zorglub's avatar
zorglub committed
90
91
92
93
94
95
96
97
98
99
100
101
102
    /* Fetch configuration from settings and vlc config */
    videoEmbeddedFlag = false;
    if( config_GetInt( p_intf, "embedded-video" ) )
        videoEmbeddedFlag = true;

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

    playlistEmbeddedFlag = settings->value( "playlist-embedded", true ).
                                                                    toBool();
    advControlsEnabled= settings->value( "adv-controls", false ).toBool();

zorglub's avatar
zorglub committed
103
    setWindowTitle( QString::fromUtf8( _("VLC media player") ) );
104
105
    handleMainUi( settings );

zorglub's avatar
zorglub committed
106
107
    QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag,
                             advControlsEnabled );
zorglub's avatar
zorglub committed
108

109
110
111
112
113
    /* Status bar */
    timeLabel = new QLabel( 0 );
    nameLabel = new QLabel( 0 );
    statusBar()->addWidget( nameLabel, 4 );
    statusBar()->addPermanentWidget( timeLabel, 1 );
zorglub's avatar
Icons    
zorglub committed
114

115
116
    setFocusPolicy( Qt::StrongFocus );

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
167
168
    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() );
    BUTTON_SET_ACT_I( ui.visualButton, "", stop.png,
                    qtr( "Audio visualizations" ), visual() );
169
170

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

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

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

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

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

194
195
196
197
198
199
200
201
202
203
204
205
206
207
    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 );
    }

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

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

222
223
224
/**********************************************************************
 * Handling of the components
 **********************************************************************/
225
void MainInterface::calculateInterfaceSize()
zorglub's avatar
zorglub committed
226
{
227
    int width = 0, height = 0;
228
    if( VISIBLE( bgWidget ) )
zorglub's avatar
zorglub committed
229
    {
230
231
        width = bgWidget->widgetSize.width();
        height = bgWidget->widgetSize.height();
zorglub's avatar
zorglub committed
232
        assert( !(playlistWidget && playlistWidget->isVisible() ) );
zorglub's avatar
zorglub committed
233
    }
234
    else if( VISIBLE( playlistWidget ) )
235
    {
236
237
238
        width = playlistWidget->widgetSize.width();
        height = playlistWidget->widgetSize.height();
        fprintf( stderr, "Have %ix%i playlist\n", width, height );
239
    }
240
241
242
243
    else if( videoIsActive )
    {
        width =  videoWidget->widgetSize.width() ;
        height = videoWidget->widgetSize.height();
244
        fprintf( stderr, "Video Size %ix%i\n", DS( videoWidget->widgetSize ) );
245
    }
zorglub's avatar
Cleanup    
zorglub committed
246
247
248
249
250
    else
    {
        width = PREF_W - addSize.width();
        height = PREF_H - addSize.height();
    }
251
252
    if( VISIBLE( visualSelector ) )
        height += visualSelector->height();
zorglub's avatar
zorglub committed
253
254
255
256
257
258
    fprintf( stderr, "Adv %p - visible %i\n", advControls, advControls->isVisible() );
    if( VISIBLE( advControls) )
    {
        fprintf( stderr, "visible\n" );
        height += advControls->sizeHint().height();
    }
259

zorglub's avatar
zorglub committed
260
    fprintf( stderr, "Adv height %i\n", advControls->sizeHint().height() );
261
262
263
264
    fprintf( stderr, "Setting to %ix%i\n",
                     width + addSize.width() , height + addSize.height() );

    mainSize = QSize( width + addSize.width(), height + addSize.height() );
zorglub's avatar
zorglub committed
265
}
zorglub's avatar
zorglub committed
266

zorglub's avatar
zorglub committed
267
void MainInterface::resizeEvent( QResizeEvent *e )
268
{
269
270
271
    fprintf( stderr, "Resize event to %ix%i\n", DS( e->size() ) );
    videoWidget->widgetSize.setWidth(  e->size().width() - addSize.width() );
    if( videoWidget && videoIsActive && videoWidget->widgetSize.height() > 1 )
272
    {
273
274
275
        SET_WH( videoWidget, e->size().width() - addSize.width(),
                             e->size().height()  - addSize.height() );
        videoWidget->updateGeometry();
276
    }
277
    if( VISIBLE( playlistWidget ) )
278
    {
279
280
281
        SET_WH( playlistWidget , e->size().width() - addSize.width(),
                                 e->size().height() - addSize.height() );
        playlistWidget->updateGeometry();
282
    }
283
284
}

285
286
287
288
289
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 );
290
291
292
    if( ret )
    {
        videoIsActive = true;
293
        if( VISIBLE( playlistWidget ) )
294
295
296
297
        {
            embeddedPlaylistWasActive = true;
            playlistWidget->hide();
        }
298
299
        bool bgWasVisible = false;
        if( VISIBLE( bgWidget) )
zorglub's avatar
zorglub committed
300
        {
301
            bgWasVisible = true;
zorglub's avatar
zorglub committed
302
303
            bgWidget->hide();
        }
304
305
306
307
308
309
310
311
312
313
314
        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 );
        }
315
316
317
        videoWidget->updateGeometry(); /// FIXME: Needed ?
        need_components_update = true;
    }
318
319
320
321
322
323
    return ret;
}

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

327
328
    if( embeddedPlaylistWasActive )
        playlistWidget->show();
zorglub's avatar
zorglub committed
329
330
331
    else if( bgWidget )
        bgWidget->show();

332
    videoIsActive = false;
333
    need_components_update = true;
334
335
}

336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
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 );
//          if( !i_width && p_vout ) i_width = p_vout->i_window_width;
//          if( !i_height && p_vout ) i_height = p_vout->i_window_height;
            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
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
void MainInterface::advanced()
{
    if( !VISIBLE( advControls ) )
    {
        advControls->show();
        advControlsEnabled = true;
    }
    else
    {
        advControls->hide();
        advControlsEnabled = false;
    }
    doComponentsUpdate();
}

385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
void MainInterface::visual()
{
    if( !VISIBLE( visualSelector) )
    {
        visualSelector->show();
        if( !THEMIM->getIM()->hasVideo() )
        {
            /* Show the background widget */
        }
    }
    else
    {
        /* Stop any currently running visualization */
        visualSelector->hide();
    }
400
    doComponentsUpdate();
401
402
}

403
404
405
406
407
408
409
void MainInterface::playlist()
{
    // Toggle the playlist dialog
    if( !playlistEmbeddedFlag )
    {
        if( playlistWidget )
        {
410
            /// \todo Destroy it
411
412
413
414
415
416
417
418
419
420
421
        }
        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
422
                                               QSize( 650, 310 ) ).toSize();
423
        playlistWidget->hide();
424
425
    }
    /// Todo, reset its size ?
426
    if( VISIBLE( playlistWidget) )
427
428
429
430
    {
        playlistWidget->hide();
        if( videoIsActive )
        {
431
432
433
            videoWidget->widgetSize = savedVideoSize;
            videoWidget->resize( videoWidget->widgetSize );
            videoWidget->updateGeometry();
434
435
436
437
438
439
        }
    }
    else
    {
        playlistWidget->show();
        if( videoIsActive )
440
441
442
443
444
445
        {
            savedVideoSize = videoWidget->widgetSize;
            videoWidget->widgetSize.setHeight( 0 );
            videoWidget->resize( videoWidget->widgetSize );
            videoWidget->updateGeometry();
        }
446
        if( VISIBLE( bgWidget ) ) bgWidget->hide();
447
    }
448
    doComponentsUpdate();
449
450
}

zorglub's avatar
zorglub committed
451
452
/* Video widget cannot do this synchronously as it runs in another thread */
/* Well, could it, actually ? Probably dangerous ... */
453
454
void MainInterface::doComponentsUpdate()
{
455
456
    calculateInterfaceSize();
    resize( mainSize );
457
458
}

zorglub's avatar
zorglub committed
459
void MainInterface::undockPlaylist()
460
{
zorglub's avatar
zorglub committed
461
    if( playlistWidget )
462
    {
zorglub's avatar
zorglub committed
463
464
        playlistWidget->hide();
        playlistWidget->deleteLater();
465
466
467
        ui.vboxLayout->removeWidget( playlistWidget );
        playlistWidget = NULL;
        playlistEmbeddedFlag = false;
zorglub's avatar
zorglub committed
468

zorglub's avatar
zorglub committed
469
        menuBar()->clear();
zorglub's avatar
zorglub committed
470
        QVLCMenu::createMenuBar( this, p_intf, false, advControlsEnabled );
zorglub's avatar
zorglub committed
471
472
473
474
475
476
477
478
479
480

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

        doComponentsUpdate();
        THEDP->playlistDialog();
481
    }
zorglub's avatar
zorglub committed
482
483
484
485
486
}

void MainInterface::customEvent( QEvent *event )
{
    if( event->type() == PLDockEvent_Type )
487
488
489
    {
        PlaylistDialog::killInstance();
        playlistEmbeddedFlag = true;
zorglub's avatar
zorglub committed
490
        menuBar()->clear();
zorglub's avatar
zorglub committed
491
        QVLCMenu::createMenuBar(this, p_intf, true, advControlsEnabled );
492
493
494
495
        playlist();
    }
}

496
497
498
/************************************************************************
 * Other stuff
 ************************************************************************/
499
500
501
void MainInterface::keyPressEvent( QKeyEvent *e )
{
    int i_vlck = 0;
zorglub's avatar
zorglub committed
502
    /* Handle modifiers */
503
504
505
506
507
508
    if( e->modifiers()& Qt::ShiftModifier ) i_vlck |= KEY_MODIFIER_SHIFT;
    if( e->modifiers()& Qt::AltModifier ) i_vlck |= KEY_MODIFIER_ALT;
    if( e->modifiers()& Qt::ControlModifier ) i_vlck |= KEY_MODIFIER_CTRL;
    if( e->modifiers()& Qt::MetaModifier ) i_vlck |= KEY_MODIFIER_META;

    bool found = false;
zorglub's avatar
zorglub committed
509
510
    /* Look for some special keys */
#define HANDLE( qt, vk ) case Qt::qt : i_vlck |= vk; found = true;break
511
512
    switch( e->key() )
    {
zorglub's avatar
zorglub committed
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
        HANDLE( Key_Left, KEY_LEFT );
        HANDLE( Key_Right, KEY_RIGHT );
        HANDLE( Key_Up, KEY_UP );
        HANDLE( Key_Down, KEY_DOWN );
        HANDLE( Key_Space, KEY_SPACE );
        HANDLE( Key_Escape, KEY_ESC );
        HANDLE( Key_Enter, KEY_ENTER );
        HANDLE( Key_F1, KEY_F1 );
        HANDLE( Key_F2, KEY_F2 );
        HANDLE( Key_F3, KEY_F3 );
        HANDLE( Key_F4, KEY_F4 );
        HANDLE( Key_F5, KEY_F5 );
        HANDLE( Key_F6, KEY_F6 );
        HANDLE( Key_F7, KEY_F7 );
        HANDLE( Key_F8, KEY_F8 );
        HANDLE( Key_F9, KEY_F9 );
        HANDLE( Key_F10, KEY_F10 );
        HANDLE( Key_F11, KEY_F11 );
        HANDLE( Key_F12, KEY_F12 );
        HANDLE( Key_PageUp, KEY_PAGEUP );
        HANDLE( Key_PageDown, KEY_PAGEDOWN );
        HANDLE( Key_Home, KEY_HOME );
        HANDLE( Key_End, KEY_END );
        HANDLE( Key_Insert, KEY_INSERT );
        HANDLE( Key_Delete, KEY_DELETE );

539
540
541
    }
    if( !found )
    {
zorglub's avatar
zorglub committed
542
        /* Force lowercase */
543
544
545
546
547
548
549
550
        if( e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z )
            i_vlck += e->key() + 32;
        /* Rest of the ascii range */
        else if( e->key() >= Qt::Key_Space && e->key() <= Qt::Key_AsciiTilde )
            i_vlck += e->key();
    }
    if( i_vlck >= 0 )
    {
551
        var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
552
553
554
555
556
557
        e->accept();
    }
    else
        e->ignore();
}

zorglub's avatar
zorglub committed
558
559
void MainInterface::stop()
{
560
    playlist_Stop( THEPL );
zorglub's avatar
zorglub committed
561
562
563
}
void MainInterface::play()
{
564
565
566
    if( !THEPL->i_size || !THEPL->i_enabled )
    {
        /* The playlist is empty, open a file requester */
zorglub's avatar
zorglub committed
567
        THEDP->simpleOpenDialog();
568
569
570
571
        setStatus( 0 );
        return;
    }
    THEMIM->togglePlayPause();
zorglub's avatar
zorglub committed
572
573
574
}
void MainInterface::prev()
{
575
    playlist_Prev( THEPL );
zorglub's avatar
zorglub committed
576
577
578
}
void MainInterface::next()
{
579
    playlist_Next( THEPL );
zorglub's avatar
zorglub committed
580
581
582
583
584
585
586
587
588
}

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 );
589
    timeLabel->setText( " "+title+" " );
zorglub's avatar
zorglub committed
590
591
592
593
}

void MainInterface::setName( QString name )
{
594
    nameLabel->setText( " " + name+" " );
zorglub's avatar
zorglub committed
595
596
}

597
598
void MainInterface::setStatus( int status )
{
zorglub's avatar
zorglub committed
599
    if( status == 1 ) // Playing
600
601
602
603
604
        ui.playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) );
    else
        ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) );
}

zorglub's avatar
zorglub committed
605
606
static bool b_my_volume;

zorglub's avatar
zorglub committed
607
608
void MainInterface::updateOnTimer()
{
zorglub's avatar
zorglub committed
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
    aout_instance_t *p_aout = (aout_instance_t *)vlc_object_find( p_intf,
                                    VLC_OBJECT_AOUT, FIND_ANYWHERE );
    /* Todo: make this event-driven */
    if( p_aout )
    {
        ui.visualButton->setEnabled( true );
        vlc_object_release( p_aout );
    }
    else
        ui.visualButton->setEnabled( false );

    /* And this too */
    advControls->enableInput( THEMIM->getIM()->hasInput() );
    advControls->enableVideo( THEMIM->getIM()->hasVideo() );

624
    if( intf_ShouldDie( p_intf ) )
zorglub's avatar
zorglub committed
625
    {
zorglub's avatar
zorglub committed
626
        QApplication::closeAllWindows();
zorglub's avatar
zorglub committed
627
628
        QApplication::quit();
    }
629
630
631
632
633
634
    if( need_components_update )
    {
        doComponentsUpdate();
        need_components_update = false;
    }

zorglub's avatar
zorglub committed
635
636
637
638
639
640
641
642
643
644
645
    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
646
647
648
649
650
651
}

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

zorglub's avatar
zorglub committed
654
655
656
657
658
659
660
661
662
663
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
664
665
666
667
668
669
670
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 );
671
    QApplication::postEvent( THEDP, static_cast<QEvent*>(event) );
zorglub's avatar
zorglub committed
672
673
    return VLC_SUCCESS;
}