main_interface.cpp 10.3 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"
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

zorglub's avatar
zorglub committed
79 80
    ui.volumeSlider->setFocusPolicy( Qt::NoFocus );

81
    QVLCMenu::createMenuBar( menuBar(), p_intf );
zorglub's avatar
zorglub committed
82

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

    resize ( PREF_W, PREF_H );
zorglub's avatar
zorglub committed
89
    if( config_GetInt( p_intf, "embedded" ) )
90
    {
91
        videoWidget = new VideoWidget( p_intf );
zorglub's avatar
zorglub committed
92 93 94 95 96 97
        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
98
        }
zorglub's avatar
zorglub committed
99 100 101
        else
            videoSize = QSize( 1,1 );
        videoWidget->resize( videoSize );
102 103
        ui.vboxLayout->insertWidget( 0, videoWidget );
    }
zorglub's avatar
zorglub committed
104
    readSettings( "MainWindow" );
zorglub's avatar
zorglub committed
105

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

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

    /* Init input manager */
115
    MainInputManager::getInstance( p_intf );
zorglub's avatar
zorglub committed
116
    ON_TIMEOUT( updateOnTimer() );
zorglub's avatar
zorglub committed
117

zorglub's avatar
zorglub committed
118
    /* Volume control */
zorglub's avatar
zorglub committed
119
    CONNECT( ui.volumeSlider, valueChanged(int), this, updateVolume(int) );
zorglub's avatar
zorglub committed
120
    /* Connect the input manager to the GUI elements it manages */
zorglub's avatar
zorglub committed
121 122 123 124 125 126 127 128
    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 ) );
129

zorglub's avatar
zorglub committed
130
    /* Actions */
zorglub's avatar
zorglub committed
131 132 133 134 135
    BUTTONACT( ui.playButton, play() );
    BUTTONACT( ui.stopButton, stop() );
    BUTTONACT( ui.nextButton, next() );
    BUTTONACT( ui.prevButton, prev() );
    CONNECT( ui.playlistButton, clicked(), THEDP, playlistDialog() );
zorglub's avatar
zorglub committed
136 137 138 139

    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
140 141 142 143
}

MainInterface::~MainInterface()
{
zorglub's avatar
zorglub committed
144 145 146 147 148 149 150 151 152 153
    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
154
}
zorglub's avatar
zorglub committed
155

zorglub's avatar
zorglub committed
156
void MainInterface::resizeEvent( QResizeEvent *e )
157
{
158 159
    videoSize.setHeight( e->size().height() - addSize.height() );
    videoSize.setWidth( e->size().width() - addSize.width() );
zorglub's avatar
zorglub committed
160
    p_intf->p_sys->p_video->updateGeometry() ;
161 162
}

163 164 165
void MainInterface::keyPressEvent( QKeyEvent *e )
{
    int i_vlck = 0;
zorglub's avatar
zorglub committed
166
    /* Handle modifiers */
167 168 169 170 171 172 173 174
    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() );
zorglub's avatar
zorglub committed
175 176
    /* Look for some special keys */
#define HANDLE( qt, vk ) case Qt::qt : i_vlck |= vk; found = true;break
177 178
    switch( e->key() )
    {
zorglub's avatar
zorglub committed
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
        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 );

205 206 207 208
    }
    fprintf( stderr, "After keys %x\n", i_vlck );
    if( !found )
    {
zorglub's avatar
zorglub committed
209
        /* Force lowercase */
210 211 212 213 214 215 216 217
        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 )
    {
218
        var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
219 220 221 222 223 224
        e->accept();
    }
    else
        e->ignore();
}

zorglub's avatar
zorglub committed
225 226
void MainInterface::stop()
{
227
    playlist_Stop( THEPL );
zorglub's avatar
zorglub committed
228 229 230
}
void MainInterface::play()
{
231 232 233 234 235 236 237 238
    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
239 240 241
}
void MainInterface::prev()
{
242
    playlist_Prev( THEPL );
zorglub's avatar
zorglub committed
243 244 245
}
void MainInterface::next()
{
246
    playlist_Next( THEPL );
zorglub's avatar
zorglub committed
247 248 249 250 251 252 253 254 255
}

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 );
256
    timeLabel->setText( " "+title+" " );
zorglub's avatar
zorglub committed
257 258 259 260
}

void MainInterface::setName( QString name )
{
261
    nameLabel->setText( " " + name+" " );
zorglub's avatar
zorglub committed
262 263
}

264 265
void MainInterface::setStatus( int status )
{
zorglub's avatar
zorglub committed
266
    if( status == 1 ) // Playing
267 268 269 270 271
        ui.playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) );
    else
        ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) );
}

zorglub's avatar
zorglub committed
272 273
static bool b_my_volume;

zorglub's avatar
zorglub committed
274 275
void MainInterface::updateOnTimer()
{
zorglub's avatar
zorglub committed
276 277
    if( p_intf->b_die )
    {
zorglub's avatar
zorglub committed
278 279
        QApplication::closeAllWindows();
        DialogsProvider::killInstance();
zorglub's avatar
zorglub committed
280 281
        QApplication::quit();
    }
zorglub's avatar
zorglub committed
282 283 284 285 286 287 288 289 290 291 292
    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
293 294 295 296 297 298
}

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

zorglub's avatar
zorglub committed
301 302 303 304 305 306 307 308 309 310
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
311 312 313 314 315 316
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
317

zorglub's avatar
zorglub committed
318 319
    MainInterface *p_interface = (MainInterface*)param;
    DialogEvent *event = new DialogEvent( INTF_DIALOG_INTERACTION, 0, p_arg );
320
    QApplication::postEvent( THEDP, static_cast<QEvent*>(event) );
zorglub's avatar
zorglub committed
321 322
    return VLC_SUCCESS;
}