main_interface.cpp 9.97 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/video_widget.hpp"
zorglub's avatar
zorglub committed
30
#include <QCloseEvent>
31
#include <assert.h>
zorglub's avatar
zorglub committed
32
#include <QPushButton>
zorglub's avatar
zorglub committed
33
#include <QStatusBar>
34
#include <QKeyEvent>
35
#include "menus.hpp"
36
#include <vlc_keys.h>
zorglub's avatar
zorglub committed
37

zorglub's avatar
zorglub committed
38
#ifdef WIN32
zorglub's avatar
zorglub committed
39
    #define PREF_W 410
zorglub's avatar
zorglub committed
40
41
    #define PREF_H 121
#else
zorglub's avatar
zorglub committed
42
    #define PREF_W 450
zorglub's avatar
zorglub committed
43
44
    #define PREF_H 125
#endif
zorglub's avatar
zorglub committed
45

zorglub's avatar
zorglub committed
46
47
48
static int InteractCallback( vlc_object_t *, const char *, vlc_value_t,
                             vlc_value_t, void *);

zorglub's avatar
zorglub committed
49
MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
zorglub's avatar
zorglub committed
50
{
51
52
53
    /* All UI stuff */
    QWidget *main = new QWidget( this );
    setCentralWidget( main );
zorglub's avatar
zorglub committed
54
    setWindowTitle( QString::fromUtf8( _("VLC media player") ) );
55
    ui.setupUi( centralWidget() );
zorglub's avatar
Icons    
zorglub committed
56

57
58
    setFocusPolicy( Qt::StrongFocus );

zorglub's avatar
zorglub committed
59
60
    slider = new InputSlider( Qt::Horizontal, NULL );
    ui.hboxLayout->insertWidget( 0, slider );
zorglub's avatar
zorglub committed
61
62
    ui.prevButton->setText( "" );
    ui.nextButton->setText( "" );
zorglub's avatar
zorglub committed
63
64
    ui.playButton->setText( "" );
    ui.stopButton->setText( "" );
zorglub's avatar
Icons    
zorglub committed
65
66
67
68
69
70
    ui.prevButton->setIcon( QIcon( ":/pixmaps/previous.png" ) );
    ui.nextButton->setIcon( QIcon( ":/pixmaps/next.png" ) );
    ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) );
    ui.stopButton->setIcon( QIcon( ":/pixmaps/stop.png" ) );
    ui.volLowLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) );
    ui.volHighLabel->setPixmap( QPixmap( ":/pixmaps/volume-high.png" ) );
zorglub's avatar
zorglub committed
71
    ui.volumeSlider->setMaximum( 100 );
zorglub's avatar
zorglub committed
72
    ui.playlistButton->setText( "" );
73
74
    ui.playlistButton->setIcon( QIcon( ":/pixmaps/volume-low.png" ) );

zorglub's avatar
zorglub committed
75
76
77
    VolumeClickHandler *h = new VolumeClickHandler( this );
    ui.volLowLabel->installEventFilter(h);
    ui.volHighLabel->installEventFilter(h);
zorglub's avatar
Icons    
zorglub committed
78

79
    QVLCMenu::createMenuBar( menuBar(), p_intf );
zorglub's avatar
zorglub committed
80

zorglub's avatar
zorglub committed
81
82
    timeLabel = new QLabel( 0 );
    nameLabel = new QLabel( 0 );
zorglub's avatar
zorglub committed
83
84
85
86
    statusBar()->addWidget( nameLabel, 4 );
    statusBar()->addPermanentWidget( timeLabel, 1 );

    resize ( PREF_W, PREF_H );
zorglub's avatar
zorglub committed
87
    if( config_GetInt( p_intf, "embedded" ) )
88
    {
zorglub's avatar
zorglub committed
89
90
        videoWidget = new VideoWidget( p_intf, config_GetInt( p_intf,
                                         "qt-always-video" ) ? true:false );
zorglub's avatar
zorglub committed
91
92
93
94
95
96
        if( config_GetInt( p_intf, "qt-always-video" ) )
        {
            QSettings settings( "VideoLAN", "VLC" );
            settings.beginGroup( "MainWindow" );
            videoSize = settings.value( "videoSize", QSize( 200, 200 ) ).
                                                toSize();
zorglub's avatar
zorglub committed
97
        }
zorglub's avatar
zorglub committed
98
99
100
        else
            videoSize = QSize( 1,1 );
        videoWidget->resize( videoSize );
101
102
        ui.vboxLayout->insertWidget( 0, videoWidget );
    }
zorglub's avatar
zorglub committed
103
    readSettings( "MainWindow" );
zorglub's avatar
zorglub committed
104

zorglub's avatar
zorglub committed
105
    addSize = QSize( ui.vboxLayout->margin() * 2, PREF_H );
zorglub's avatar
zorglub committed
106
107
    mainSize.setWidth( videoSize.width() + addSize.width() );
    mainSize.setHeight( videoSize.height() + addSize.height() );
zorglub's avatar
zorglub committed
108
109
    resize( mainSize );
    mainSize = size();
zorglub's avatar
Icons    
zorglub committed
110

zorglub's avatar
zorglub committed
111
    setMinimumSize( PREF_W, addSize.height() );
zorglub's avatar
zorglub committed
112
113

    /* Init input manager */
114
    MainInputManager::getInstance( p_intf );
zorglub's avatar
zorglub committed
115

zorglub's avatar
zorglub committed
116
117
118
119
    /* Volume control */
    connect( ui.volumeSlider, SIGNAL( valueChanged(int) ),
             this, SLOT( updateVolume(int) ) );

zorglub's avatar
zorglub committed
120
    /* Get timer updates */
121
122
    connect( THEDP->fixed_timer, SIGNAL( timeout() ),
             this, SLOT(updateOnTimer() ) );
zorglub's avatar
zorglub committed
123

zorglub's avatar
zorglub committed
124
    /* Connect the input manager to the GUI elements it manages */
125
    connect( THEMIM->getIM(),SIGNAL(positionUpdated( float, int, int ) ),
zorglub's avatar
zorglub committed
126
             slider, SLOT( setPosition( float,int, int ) ) );
127
    connect( THEMIM->getIM(), SIGNAL( positionUpdated( float, int, int ) ),
zorglub's avatar
zorglub committed
128
             this, SLOT( setDisplay( float, int, int ) ) );
zorglub's avatar
zorglub committed
129
130
    connect( THEMIM->getIM(), SIGNAL( nameChanged( QString ) ),
             this, SLOT( setName( QString ) ) );
131
132
133
134
    connect( THEMIM->getIM(), SIGNAL( statusChanged( int ) ),
             this, SLOT( setStatus( int ) ) );
    connect( slider, SIGNAL( sliderDragged( float ) ),
             THEMIM->getIM(),SLOT( sliderUpdate( float ) ) );
135

zorglub's avatar
zorglub committed
136
    /* Actions */
zorglub's avatar
zorglub committed
137
138
139
140
    connect( ui.playButton, SIGNAL( clicked() ), this, SLOT( play() ) );
    connect( ui.stopButton, SIGNAL( clicked() ), this, SLOT( stop() ) );
    connect( ui.nextButton, SIGNAL( clicked() ), this, SLOT( next() ) );
    connect( ui.prevButton, SIGNAL( clicked() ), this, SLOT( prev() ) );
zorglub's avatar
zorglub committed
141

zorglub's avatar
zorglub committed
142
    connect( ui.playlistButton, SIGNAL(clicked()),
143
             THEDP, SLOT( playlistDialog() ) );
zorglub's avatar
zorglub committed
144
145
146
147

    var_Create( p_intf, "interaction", VLC_VAR_ADDRESS );
    var_AddCallback( p_intf, "interaction", InteractCallback, this );
    p_intf->b_interaction = VLC_TRUE;
zorglub's avatar
zorglub committed
148
149
150
151
}

MainInterface::~MainInterface()
{
zorglub's avatar
zorglub committed
152
153
154
155
156
157
158
159
160
161
    writeSettings( "MainWindow" );
    if( config_GetInt( p_intf, "qt-always-video" ) )
    {
        QSettings s("VideoLAN", "VLC" );
        s.beginGroup( "MainWindow" );
        s.setValue( "videoSize", videoSize );
        s.endGroup();
    }
    p_intf->b_interaction = VLC_FALSE;
    var_DelCallback( p_intf, "interaction", InteractCallback, this );
zorglub's avatar
zorglub committed
162
}
zorglub's avatar
zorglub committed
163

zorglub's avatar
zorglub committed
164
void MainInterface::resizeEvent( QResizeEvent *e )
165
{
166
167
    videoSize.setHeight( e->size().height() - addSize.height() );
    videoSize.setWidth( e->size().width() - addSize.width() );
zorglub's avatar
zorglub committed
168
    p_intf->p_sys->p_video->updateGeometry() ;
169
170
}

171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
void MainInterface::keyPressEvent( QKeyEvent *e )
{
    int i_vlck = 0;
    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;

    fprintf( stderr, "After modifiers %x\n", i_vlck );
    bool found = false;
    fprintf( stderr, "Qt %x\n", e->key() );
    switch( e->key() )
    {
        case Qt::Key_Left: i_vlck |= KEY_LEFT;found=true;;break;
        case Qt::Key_Right: i_vlck |= KEY_RIGHT;found = true;break;
    }
    fprintf( stderr, "After keys %x\n", i_vlck );
    if( !found )
    {
        fprintf( stderr, "Not found\n" );
        if( e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z )
        {
            fprintf( stderr, "Alphabet\n" );
            i_vlck += e->key() + 32;
        }
        /* Rest of the ascii range */
        else if( e->key() >= Qt::Key_Space && e->key() <= Qt::Key_AsciiTilde )
        {
            fprintf( stderr, "Yeh !\n" );
            i_vlck += e->key();
        }
    }
    if( i_vlck >= 0 )
    {
        fprintf( stderr, "Setting key-pressed %i\n", i_vlck );
        var_SetInteger( p_intf->p_vlc, "key-pressed", i_vlck );
        e->accept();
    }
    else
        e->ignore();
}

zorglub's avatar
zorglub committed
213
214
void MainInterface::stop()
{
215
    playlist_Stop( THEPL );
zorglub's avatar
zorglub committed
216
217
218
}
void MainInterface::play()
{
219
220
221
222
223
224
225
226
    if( !THEPL->i_size || !THEPL->i_enabled )
    {
        /* The playlist is empty, open a file requester */
        THEDP->openDialog();
        setStatus( 0 );
        return;
    }
    THEMIM->togglePlayPause();
zorglub's avatar
zorglub committed
227
228
229
}
void MainInterface::prev()
{
230
    playlist_Prev( THEPL );
zorglub's avatar
zorglub committed
231
232
233
}
void MainInterface::next()
{
234
    playlist_Next( THEPL );
zorglub's avatar
zorglub committed
235
236
237
238
239
240
241
242
243
}

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 );
244
    timeLabel->setText( " "+title+" " );
zorglub's avatar
zorglub committed
245
246
247
248
}

void MainInterface::setName( QString name )
{
249
    nameLabel->setText( " " + name+" " );
zorglub's avatar
zorglub committed
250
251
}

252
253
void MainInterface::setStatus( int status )
{
zorglub's avatar
zorglub committed
254
    if( status == 1 ) // Playing
255
256
257
258
259
        ui.playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) );
    else
        ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) );
}

zorglub's avatar
zorglub committed
260
261
static bool b_my_volume;

zorglub's avatar
zorglub committed
262
263
void MainInterface::updateOnTimer()
{
zorglub's avatar
zorglub committed
264
265
266
267
    if( p_intf->b_die )
    {
        QApplication::quit();
    }
zorglub's avatar
zorglub committed
268
269
270
271
272
273
274
275
276
277
278
    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
279
280
281
282
283
284
}

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

zorglub's avatar
zorglub committed
287
288
289
290
291
292
293
294
295
296
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
297
298
299
300
301
302
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);
zorglub's avatar
zorglub committed
303

zorglub's avatar
zorglub committed
304
305
    MainInterface *p_interface = (MainInterface*)param;
    DialogEvent *event = new DialogEvent( INTF_DIALOG_INTERACTION, 0, p_arg );
306
    QApplication::postEvent( THEDP, static_cast<QEvent*>(event) );
zorglub's avatar
zorglub committed
307
308
    return VLC_SUCCESS;
}