main_interface.cpp 24.6 KB
Newer Older
zorglub's avatar
zorglub committed
1
/*****************************************************************************
zorglub's avatar
Wtf ?    
zorglub committed
2
 * main_interface.cpp : Main interface
zorglub's avatar
zorglub committed
3
 ****************************************************************************
4
 * Copyright (C) 2006-2007 the VideoLAN team
5
 * $Id$
zorglub's avatar
zorglub committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 *
 * 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
21
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. 
 *****************************************************************************/
zorglub's avatar
zorglub committed
23

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

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

#include <assert.h>
43
#include <vlc_keys.h>
zorglub's avatar
zorglub committed
44
#include <vlc_vout.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()

62
63
64
65
66
/* Callback prototypes */
static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
                        vlc_value_t old_val, vlc_value_t new_val, void *param );
static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable,
                       vlc_value_t old_val, vlc_value_t new_val, void *param );
zorglub's avatar
zorglub committed
67
68
static int InteractCallback( vlc_object_t *, const char *, vlc_value_t,
                             vlc_value_t, void *);
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* 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
83

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

90
91
    setWindowIcon( QApplication::windowIcon() );

92
    need_components_update = false;
93
    bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL;
zorglub's avatar
zorglub committed
94
    embeddedPlaylistWasActive = videoIsActive = false;
95

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

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

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

107
    /* UI */
108
    setVLCWindowsTitle();
109
    handleMainUi( settings );
zorglub's avatar
zorglub committed
110
    QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag,
111
                             advControlsEnabled, visualSelectorEnabled );
112
113
114
115
    timeLabel = new QLabel( 0 );
    nameLabel = new QLabel( 0 );
    statusBar()->addWidget( nameLabel, 4 );
    statusBar()->addPermanentWidget( timeLabel, 1 );
zorglub's avatar
Icons    
zorglub committed
116

117
    setFocusPolicy( Qt::StrongFocus );
118
    setAcceptDrops(true);
119

120
121
122
123
124
125
126
127
128
129
130
131
132
    /* 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 ) );
133
    CONNECT( THEMIM->getIM(), navigationChanged( int ), this, setNavigation(int) );
134
135
136
    CONNECT( slider, sliderDragged( float ),
             THEMIM->getIM(), sliderUpdate( float ) );

137
138
139
140
141
142
143
    CONNECT( ui.prevSectionButton, clicked(), THEMIM->getIM(),
             sectionPrev() );
    CONNECT( ui.nextSectionButton, clicked(), THEMIM->getIM(),
             sectionNext() );
    CONNECT( ui.menuButton, clicked(), THEMIM->getIM(),
             sectionMenu() );

144
145
146
    var_Create( p_intf, "interaction", VLC_VAR_ADDRESS );
    var_AddCallback( p_intf, "interaction", InteractCallback, this );
    p_intf->b_interaction = VLC_TRUE;
147
148
149
150
151
152
153
154
155
156

    /* Register callback for the intf-popupmenu variable */
    playlist_t *p_playlist =
        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
    if( p_playlist != NULL )
    {
        var_AddCallback( p_playlist, "intf-popupmenu", PopupMenuCB, p_intf );
        var_AddCallback( p_playlist, "intf-show", IntfShowCB, p_intf );
        vlc_object_release( p_playlist );
    }
157
158
159
160
}

MainInterface::~MainInterface()
{
161
162
163
164
165
166
167
168
169
170
    /* Unregister callback for the intf-popupmenu variable */
    playlist_t *p_playlist =
        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
    if( p_playlist != NULL )
    {
        var_DelCallback( p_playlist, "intf-popupmenu", PopupMenuCB, p_intf );
        var_DelCallback( p_playlist, "intf-show", IntfShowCB, p_intf );
        vlc_object_release( p_playlist );
    }

zorglub's avatar
zorglub committed
171
172
173
174
175
    settings->setValue( "playlist-embedded", playlistEmbeddedFlag );
    settings->setValue( "adv-controls", advControlsEnabled );
    settings->setValue( "pos", pos() );
    settings->endGroup();
    delete settings;
176
177
    p_intf->b_interaction = VLC_FALSE;
    var_DelCallback( p_intf, "interaction", InteractCallback, this );
178
179
180
181

    p_intf->pf_request_window = NULL;
    p_intf->pf_release_window = NULL;
    p_intf->pf_control_window = NULL;
182
183
}

184
185
186
187
188
189
190
191
192
193
194
195
void MainInterface::setVLCWindowsTitle( QString aTitle )
{
    if( aTitle.isEmpty() )
    {
        this->setWindowTitle( qtr( "VLC media player" ) );
    }
    else
    {
        this->setWindowTitle( aTitle + " - " + qtr( "VLC media player" ) );
    }
}

196
197
198
199
200
201
void MainInterface::handleMainUi( QSettings *settings )
{
    QWidget *main = new QWidget( this );
    setCentralWidget( main );
    ui.setupUi( centralWidget() );

zorglub's avatar
zorglub committed
202
    slider = new InputSlider( Qt::Horizontal, NULL );
203
    ui.vboxLayout->insertWidget( 0, slider );
204
205
206
207
    ui.discFrame->hide();
    BUTTON_SET_IMG( ui.prevSectionButton, "", previous.png, "" );
    BUTTON_SET_IMG( ui.nextSectionButton, "", next.png, "" );
    BUTTON_SET_IMG( ui.menuButton, "", previous.png, "" );
208

zorglub's avatar
zorglub committed
209
210
211
212
213
    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() );
214
215

    /* Volume */
216
    ui.volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) );
zorglub's avatar
zorglub committed
217
    ui.volumeSlider->setMaximum( 100 );
218
219
220
    ui.volMuteLabel->setToolTip( qtr( "Mute" ) );
    VolumeClickHandler *h = new VolumeClickHandler( p_intf, this );
    ui.volMuteLabel->installEventFilter(h);
zorglub's avatar
zorglub committed
221
222
    ui.volumeSlider->setFocusPolicy( Qt::NoFocus );

223
    BUTTON_SET_IMG( ui.playlistButton, "" , playlist_icon.png,
zorglub's avatar
zorglub committed
224
                        playlistEmbeddedFlag ?  qtr( "Show playlist" ) :
zorglub's avatar
Cleanup    
zorglub committed
225
                                                qtr( "Open playlist" ) );
226
    BUTTONACT( ui.playlistButton, playlist() );
zorglub's avatar
zorglub committed
227

zorglub's avatar
zorglub committed
228
    /* Set initial size */
zorglub's avatar
zorglub committed
229
    resize ( PREF_W, PREF_H );
230

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

zorglub's avatar
zorglub committed
233
234
235
236
237
238
    advControls = new ControlsWidget( p_intf );
    ui.vboxLayout->insertWidget( 0, advControls );
    advControls->updateGeometry();
    if( !advControlsEnabled ) advControls->hide();
    need_components_update = true;

239
240
241
242
243
244
245
246
247
248
249
250
251
252
    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 );
    }

253
    if( videoEmbeddedFlag )
254
    {
255
        videoWidget = new VideoWidget( p_intf );
256
        videoWidget->widgetSize = QSize( 1, 1 );
257
258
259
        videoWidget->resize( videoWidget->widgetSize );
        ui.vboxLayout->insertWidget( 0, videoWidget );

260
261
262
        p_intf->pf_request_window  = ::DoRequest;
        p_intf->pf_release_window  = ::DoRelease;
        p_intf->pf_control_window  = ::DoControl;
263
    }
zorglub's avatar
zorglub committed
264
    setMinimumSize( PREF_W, addSize.height() );
zorglub's avatar
zorglub committed
265
266
}

267
268
269
/**********************************************************************
 * Handling of the components
 **********************************************************************/
270
void MainInterface::calculateInterfaceSize()
zorglub's avatar
zorglub committed
271
{
272
    int width = 0, height = 0;
273
    if( VISIBLE( bgWidget ) )
zorglub's avatar
zorglub committed
274
    {
275
276
        width = bgWidget->widgetSize.width();
        height = bgWidget->widgetSize.height();
zorglub's avatar
zorglub committed
277
        assert( !(playlistWidget && playlistWidget->isVisible() ) );
zorglub's avatar
zorglub committed
278
    }
279
    else if( VISIBLE( playlistWidget ) )
280
    {
281
282
        width = playlistWidget->widgetSize.width();
        height = playlistWidget->widgetSize.height();
283
    }
284
285
286
287
288
    else if( videoIsActive )
    {
        width =  videoWidget->widgetSize.width() ;
        height = videoWidget->widgetSize.height();
    }
zorglub's avatar
Cleanup    
zorglub committed
289
290
291
292
293
    else
    {
        width = PREF_W - addSize.width();
        height = PREF_H - addSize.height();
    }
294
295
    if( VISIBLE( visualSelector ) )
        height += visualSelector->height();
zorglub's avatar
zorglub committed
296
297
298
299
    if( VISIBLE( advControls) )
    {
        height += advControls->sizeHint().height();
    }
300
    mainSize = QSize( width + addSize.width(), height + addSize.height() );
zorglub's avatar
zorglub committed
301
}
zorglub's avatar
zorglub committed
302

zorglub's avatar
zorglub committed
303
void MainInterface::resizeEvent( QResizeEvent *e )
304
{
305
306
    videoWidget->widgetSize.setWidth(  e->size().width() - addSize.width() );
    if( videoWidget && videoIsActive && videoWidget->widgetSize.height() > 1 )
307
    {
308
309
310
        SET_WH( videoWidget, e->size().width() - addSize.width(),
                             e->size().height()  - addSize.height() );
        videoWidget->updateGeometry();
311
    }
312
    if( VISIBLE( playlistWidget ) )
313
    {
314
315
316
        SET_WH( playlistWidget , e->size().width() - addSize.width(),
                                 e->size().height() - addSize.height() );
        playlistWidget->updateGeometry();
317
    }
318
319
}

320
321
322
323
324
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 );
325
326
327
    if( ret )
    {
        videoIsActive = true;
328
        if( VISIBLE( playlistWidget ) )
329
330
        {
            embeddedPlaylistWasActive = true;
331
//            playlistWidget->hide();
332
        }
333
334
        bool bgWasVisible = false;
        if( VISIBLE( bgWidget) )
zorglub's avatar
zorglub committed
335
        {
336
            bgWasVisible = true;
337
//            bgWidget->hide();
zorglub's avatar
zorglub committed
338
        }
339
340
341
342
343
344
345
346
347
348
349
        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 );
        }
350
//        videoWidget->updateGeometry(); /// FIXME: Needed ?
351
352
        need_components_update = true;
    }
353
354
355
356
357
358
    return ret;
}

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

362
    if( embeddedPlaylistWasActive )
363
        ;//playlistWidget->show();
zorglub's avatar
zorglub committed
364
    else if( bgWidget )
365
        ;//bgWidget->show();
zorglub's avatar
zorglub committed
366

367
    videoIsActive = false;
368
    need_components_update = true;
369
370
}

371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
class SetVideoOnTopQtEvent : public QEvent
{
public:
    SetVideoOnTopQtEvent( bool _onTop ) :
      QEvent( (QEvent::Type)SetVideoOnTopEvent_Type ), onTop( _onTop)
    {
    }

    bool OnTop() const
    {
        return onTop;
    }

private:
    bool onTop;
};

388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
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 );
407
            // videoWidget->updateGeometry();
408
409
410
411
412
            need_components_update = true;
            i_ret = VLC_SUCCESS;
            break;
        }
        case VOUT_SET_STAY_ON_TOP:
413
414
415
416
417
418
        {
            int i_arg = va_arg( args, int );
            QApplication::postEvent( this, new SetVideoOnTopQtEvent( i_arg ) );
            i_ret = VLC_SUCCESS;
            break;
        }
419
420
421
422
423
424
425
        default:
            msg_Warn( p_intf, "unsupported control query" );
            break;
    }
    return i_ret;
}

zorglub's avatar
zorglub committed
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
void MainInterface::advanced()
{
    if( !VISIBLE( advControls ) )
    {
        advControls->show();
        advControlsEnabled = true;
    }
    else
    {
        advControls->hide();
        advControlsEnabled = false;
    }
    doComponentsUpdate();
}

441
442
443
444
445
446
447
448
449
void MainInterface::visual()
{
    if( !VISIBLE( visualSelector) )
    {
        visualSelector->show();
        if( !THEMIM->getIM()->hasVideo() )
        {
            /* Show the background widget */
        }
450
        visualSelectorEnabled = true;
451
452
453
454
455
    }
    else
    {
        /* Stop any currently running visualization */
        visualSelector->hide();
456
        visualSelectorEnabled = false;
457
    }
458
    doComponentsUpdate();
459
460
}

461
462
463
464
465
466
467
void MainInterface::playlist()
{
    // Toggle the playlist dialog
    if( !playlistEmbeddedFlag )
    {
        if( playlistWidget )
        {
468
            /// \todo Destroy it
469
470
471
472
473
474
475
476
477
478
479
        }
        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
480
                                               QSize( 650, 310 ) ).toSize();
481
        playlistWidget->hide();
482
    }
483
    if( VISIBLE( playlistWidget ) )
484
485
486
487
    {
        playlistWidget->hide();
        if( videoIsActive )
        {
488
489
490
            videoWidget->widgetSize = savedVideoSize;
            videoWidget->resize( videoWidget->widgetSize );
            videoWidget->updateGeometry();
491
492
493
494
495
496
        }
    }
    else
    {
        playlistWidget->show();
        if( videoIsActive )
497
498
499
500
501
502
        {
            savedVideoSize = videoWidget->widgetSize;
            videoWidget->widgetSize.setHeight( 0 );
            videoWidget->resize( videoWidget->widgetSize );
            videoWidget->updateGeometry();
        }
503
        if( VISIBLE( bgWidget ) ) bgWidget->hide();
504
    }
505
    doComponentsUpdate();
506
507
}

zorglub's avatar
zorglub committed
508
509
/* Video widget cannot do this synchronously as it runs in another thread */
/* Well, could it, actually ? Probably dangerous ... */
510
511
void MainInterface::doComponentsUpdate()
{
512
513
    calculateInterfaceSize();
    resize( mainSize );
514
515
}

zorglub's avatar
zorglub committed
516
void MainInterface::undockPlaylist()
517
{
zorglub's avatar
zorglub committed
518
    if( playlistWidget )
519
    {
zorglub's avatar
zorglub committed
520
521
        playlistWidget->hide();
        playlistWidget->deleteLater();
522
523
524
        ui.vboxLayout->removeWidget( playlistWidget );
        playlistWidget = NULL;
        playlistEmbeddedFlag = false;
zorglub's avatar
zorglub committed
525

zorglub's avatar
zorglub committed
526
        menuBar()->clear();
527
528
        QVLCMenu::createMenuBar( this, p_intf, false, advControlsEnabled,
                                 visualSelectorEnabled);
zorglub's avatar
zorglub committed
529
530
531
532
533
534
535
536
537
538

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

        doComponentsUpdate();
        THEDP->playlistDialog();
539
    }
zorglub's avatar
zorglub committed
540
541
542
543
544
}

void MainInterface::customEvent( QEvent *event )
{
    if( event->type() == PLDockEvent_Type )
545
546
547
    {
        PlaylistDialog::killInstance();
        playlistEmbeddedFlag = true;
zorglub's avatar
zorglub committed
548
        menuBar()->clear();
549
550
        QVLCMenu::createMenuBar(this, p_intf, true, advControlsEnabled,
                                visualSelectorEnabled);
551
552
        playlist();
    }
553
554
555
556
557
558
559
560
561
    else if ( event->type() == SetVideoOnTopEvent_Type )
    {
        SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event;
        if( p_event->OnTop() )
            setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
        else
            setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint);            
        show(); /* necessary to apply window flags?? */
    }
562
563
}

564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589

/************************************************************************
 * 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 ) {
590
591
            playlist_Add( THEPL, qtu(s), NULL,
                          PLAYLIST_APPEND | (first ? PLAYLIST_GO:0),
592
                          PLAYLIST_END, VLC_TRUE, VLC_FALSE );
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
            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();
}

611
612
613
/************************************************************************
 * Other stuff
 ************************************************************************/
614
615
void MainInterface::keyPressEvent( QKeyEvent *e )
{
616
    int i_vlck = qtEventToVLCKey( e );
617
618
    if( i_vlck >= 0 )
    {
619
        var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
620
621
622
623
624
625
        e->accept();
    }
    else
        e->ignore();
}

626
627
void MainInterface::wheelEvent( QWheelEvent *e )
{
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
628
    int i_vlckey = qtWheelEventToVLCKey( e );
629
630
631
632
    var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlckey );
    e->accept();
}

zorglub's avatar
zorglub committed
633
634
void MainInterface::stop()
{
635
    THEMIM->stop();
zorglub's avatar
zorglub committed
636
}
637

zorglub's avatar
zorglub committed
638
639
void MainInterface::play()
{
zorglub's avatar
zorglub committed
640
    if( playlist_IsEmpty(THEPL) )
641
642
    {
        /* The playlist is empty, open a file requester */
zorglub's avatar
Wtf ?    
zorglub committed
643
        THEDP->openFileDialog();
644
645
646
647
        setStatus( 0 );
        return;
    }
    THEMIM->togglePlayPause();
zorglub's avatar
zorglub committed
648
}
649

zorglub's avatar
zorglub committed
650
651
void MainInterface::prev()
{
652
    THEMIM->prev();
zorglub's avatar
zorglub committed
653
}
654

zorglub's avatar
zorglub committed
655
656
void MainInterface::next()
{
657
    THEMIM->next();
zorglub's avatar
zorglub committed
658
659
660
661
662
663
664
665
666
}

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 );
667
    timeLabel->setText( " "+title+" " );
zorglub's avatar
zorglub committed
668
669
670
671
}

void MainInterface::setName( QString name )
{
672
    nameLabel->setText( " " + name+" " );
673
    setVLCWindowsTitle( name );
zorglub's avatar
zorglub committed
674
675
}

676
677
void MainInterface::setStatus( int status )
{
zorglub's avatar
zorglub committed
678
    if( status == 1 ) // Playing
679
680
681
682
683
        ui.playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) );
    else
        ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) );
}

684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
#define HELP_MENU N_("Menu")
#define HELP_PCH N_("Previous chapter")
#define HELP_NCH N_("Next chapter")
#define HELP_PTR N_("Previous track")
#define HELP_NTR N_("Next track")

void MainInterface::setNavigation( int navigation )
{
    // 1 = chapter, 2 = title, 0 = no
    if( navigation == 0 )
    {
        ui.discFrame->hide();
    } else if( navigation == 1 ) {
        ui.prevSectionButton->show();
        ui.prevSectionButton->setToolTip( qfu(HELP_PCH) );
        ui.nextSectionButton->show();
        ui.nextSectionButton->setToolTip( qfu(HELP_NCH) );
        ui.menuButton->show();
        ui.discFrame->show();
    } else {
        ui.prevSectionButton->show();
        ui.prevSectionButton->setToolTip( qfu(HELP_PCH) );
        ui.nextSectionButton->show();
        ui.nextSectionButton->setToolTip( qfu(HELP_NCH) );
        ui.menuButton->hide();
        ui.discFrame->show();
    }
}

zorglub's avatar
zorglub committed
713
714
static bool b_my_volume;

zorglub's avatar
zorglub committed
715
716
void MainInterface::updateOnTimer()
{
717
    /* \todo Make this event-driven */
zorglub's avatar
zorglub committed
718
719
720
    advControls->enableInput( THEMIM->getIM()->hasInput() );
    advControls->enableVideo( THEMIM->getIM()->hasVideo() );

721
    if( intf_ShouldDie( p_intf ) )
zorglub's avatar
zorglub committed
722
    {
zorglub's avatar
zorglub committed
723
        QApplication::closeAllWindows();
zorglub's avatar
zorglub committed
724
725
        QApplication::quit();
    }
726
727
728
729
730
731
    if( need_components_update )
    {
        doComponentsUpdate();
        need_components_update = false;
    }

zorglub's avatar
zorglub committed
732
733
734
735
736
737
738
739
740
741
742
    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
743
744
745
746
747
748
}

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

zorglub's avatar
zorglub committed
751
752
753
754
755
756
757
758
759
760
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
761
762
763
764
765
766
767
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 );
768
    QApplication::postEvent( THEDP, static_cast<QEvent*>(event) );
zorglub's avatar
zorglub committed
769
770
    return VLC_SUCCESS;
}
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801

/*****************************************************************************
 * PopupMenuCB: callback triggered by the intf-popupmenu playlist variable.
 *  We don't show the menu directly here because we don't want the
 *  caller to block for a too long time.
 *****************************************************************************/
static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
                        vlc_value_t old_val, vlc_value_t new_val, void *param )
{
    intf_thread_t *p_intf = (intf_thread_t *)param;

    if( p_intf->pf_show_dialog )
    {
        p_intf->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU,
                                new_val.b_bool, 0 );
    }

    return VLC_SUCCESS;
}

/*****************************************************************************
 * IntfShowCB: callback triggered by the intf-show playlist variable.
 *****************************************************************************/
static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable,
                       vlc_value_t old_val, vlc_value_t new_val, void *param )
{
    intf_thread_t *p_intf = (intf_thread_t *)param;
    //p_intf->p_sys->b_intf_show = VLC_TRUE;

    return VLC_SUCCESS;
}