MainWindow.cpp 22 KB
Newer Older
Ludovic Fauvet's avatar
Ludovic Fauvet committed
1
/*****************************************************************************
2
 * MainWindow.cpp: VLMC MainWindow
Ludovic Fauvet's avatar
Ludovic Fauvet committed
3
 *****************************************************************************
Ludovic Fauvet's avatar
Ludovic Fauvet committed
4
 * Copyright (C) 2008-2010 VideoLAN
Ludovic Fauvet's avatar
Ludovic Fauvet committed
5 6
 *
 * Authors: Ludovic Fauvet <etix@l0cal.com>
7
 *          Hugo Beauzee-Luyssen <beauze.h@gmail.com>
Ludovic Fauvet's avatar
Ludovic Fauvet committed
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 *
 * 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.
 *****************************************************************************/

24
#include <QSizePolicy>
Christophe Courtaut's avatar
Christophe Courtaut committed
25
#include <QDockWidget>
26
#include <QFileDialog>
27
#include <QSlider>
28
#include <QMessageBox>
29 30
#include <QDesktopServices>
#include <QUrl>
31
#include <QSettings>
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
32

Ludovic Fauvet's avatar
Ludovic Fauvet committed
33
#include "MainWindow.h"
34
#include "config.h"
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
35
#include "Library.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
36
#include "About.h"
37 38
#include "VlmcDebug.h"

Ludovic Fauvet's avatar
Ludovic Fauvet committed
39
#include "MainWorkflow.h"
40
#include "export/RendererSettings.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
41
#include "WorkflowFileRenderer.h"
42
#include "WorkflowRenderer.h"
43
#include "ClipRenderer.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
44
#include "EffectsEngine.h"
45 46 47

/* Widgets */
#include "DockWidgetManager.h"
48 49
#include "ImportController.h"
#include "MediaListView.h"
50
#include "PreviewWidget.h"
51 52
#include "timeline/Timeline.h"
#include "timeline/TracksView.h"
53
#include "UndoStack.h"
54 55

/* Settings / Preferences */
56
#include "project/GuiProjectManager.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
57 58
#include "ProjectWizard.h"
#include "Settings.h"
59
#include "SettingsManager.h"
60
#include "LanguageHelper.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
61

62 63 64
/* VLCpp */
#include "VLCInstance.h"

Ludovic Fauvet's avatar
Ludovic Fauvet committed
65
MainWindow::MainWindow( QWidget *parent ) :
66
    QMainWindow( parent ), m_fileRenderer( NULL )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
67 68
{
    m_ui.setupUi( this );
69

70
    qRegisterMetaType<MainWorkflow::TrackType>( "MainWorkflow::TrackType" );
71
    qRegisterMetaType<MainWorkflow::FrameChangedReason>( "MainWorkflow::FrameChangedReason" );
72
    qRegisterMetaType<QVariant>( "QVariant" );
73

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
74
    //We only install message handler here cause it uses configuration.
75
//    VlmcDebug::getInstance()->setup();
76

77
    //VLC Instance:
78
    LibVLCpp::Instance::getInstance();
79

80
    //Creating the project manager first (so it can create all the project variables)
81
    GUIProjectManager::getInstance();
82

83 84 85
    //Preferences
    initVlmcPreferences();

86
    // GUI
87
    DockWidgetManager::getInstance( this )->setMainWindow( this );
88
    createGlobalPreferences();
89
    createProjectPreferences();
90 91
    initializeDockWidgets();
    createStatusBar();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
92
#ifdef WITH_CRASHBUTTON
93 94
    setupCrashTester();
#endif
95

Ludovic Fauvet's avatar
Ludovic Fauvet committed
96
    // Zoom
97 98
    connect( m_zoomSlider, SIGNAL( valueChanged( int ) ),
             m_timeline, SLOT( changeZoom( int ) ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
99 100 101 102
    connect( m_timeline->tracksView(), SIGNAL( zoomIn() ),
             this, SLOT( zoomIn() ) );
    connect( m_timeline->tracksView(), SIGNAL( zoomOut() ),
             this, SLOT( zoomOut() ) );
103 104
    connect( this, SIGNAL( toolChanged( ToolButtons ) ),
             m_timeline, SLOT( setTool( ToolButtons ) ) );
105

106
    connect( GUIProjectManager::getInstance(), SIGNAL( projectUpdated( const QString&, bool ) ),
107
             this, SLOT( projectUpdated( const QString&, bool ) ) );
108

109 110 111 112 113 114 115 116 117
    // Undo/Redo
    connect( UndoStack::getInstance( this ), SIGNAL( canRedoChanged( bool ) ),
             this, SLOT( canRedoChanged( bool ) ) );
    connect( UndoStack::getInstance( this ), SIGNAL( canUndoChanged( bool ) ),
             this, SLOT( canUndoChanged( bool ) ) );
    canRedoChanged( UndoStack::getInstance( this )->canRedo() );
    canUndoChanged( UndoStack::getInstance( this )->canUndo() );


Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
118 119 120 121
    // Wizard
    m_pWizard = new ProjectWizard( this );
    m_pWizard->setModal( true );

122

123
#ifdef WITH_CRASHHANDLER
124
    if ( restoreSession() == true )
125 126
        return ;
#endif
127
    QSettings s;
128

129
    if ( s.value( "ShowWizardStartup", true ).toBool() )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
130
    {
131 132 133
        //If a project was opened from the command line: don't show the wizzard.
        if ( qApp->arguments().size() == 1 )
            m_pWizard->show();
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
134
    }
Ludovic Fauvet's avatar
Ludovic Fauvet committed
135 136
}

137 138
MainWindow::~MainWindow()
{
139 140 141 142 143
    QSettings s;
    // Save the current geometry
    s.setValue( "MainWindowGeometry", saveGeometry() );
    // Save the current layout
    s.setValue( "MainWindowState", saveState() );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
144
    s.setValue( "CleanQuit", true );
145 146
    s.sync();

147 148
    if ( m_fileRenderer )
        delete m_fileRenderer;
149
    delete m_importController;
150
    LibVLCpp::Instance::destroyInstance();
151 152
}

Ludovic Fauvet's avatar
Ludovic Fauvet committed
153 154 155 156 157 158 159 160 161 162 163 164
void MainWindow::changeEvent( QEvent *e )
{
    switch ( e->type() )
    {
    case QEvent::LanguageChange:
        m_ui.retranslateUi( this );
        break;
    default:
        break;
    }
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
165 166 167 168 169
//use this helper when the shortcut is binded to a menu action
#define CREATE_MENU_SHORTCUT( key, defaultValue, name, desc, actionInstance  )       \
        VLMC_CREATE_PREFERENCE_KEYBOARD( key, defaultValue, name, desc );    \
        KeyboardShortcutHelper  *helper##actionInstance = new KeyboardShortcutHelper( key, m_ui.actionInstance, this );

170 171 172
void
MainWindow::initVlmcPreferences()
{
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
173

174 175 176 177
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/defaultmode", "n", "Select mode", "Select the selection tool in the timeline" );
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/cutmode", "x", "Cut mode", "Select the cut/razor tool in the timeline" );
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/mediapreview", "Ctrl+Return", "Media preview", "Preview the selected media, or pause the current preview" );
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/renderpreview", "Space", "Render preview", "Preview the project, or pause the current preview" );
178
    //A bit nasty, but we better use what Qt's providing as default shortcut
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
179 180 181 182 183 184 185 186 187 188 189 190 191
    CREATE_MENU_SHORTCUT( "keyboard/undo", QKeySequence( QKeySequence::Undo ).toString().toLocal8Bit(), "Undo", "Undo the last action", actionUndo );
    CREATE_MENU_SHORTCUT( "keyboard/redo", QKeySequence( QKeySequence::Redo ).toString().toLocal8Bit(), "Redo", "Redo the last action", actionRedo );
    CREATE_MENU_SHORTCUT( "keyboard/help", QKeySequence( QKeySequence::HelpContents ).toString().toLocal8Bit(), "Help", "Toggle the help page", actionHelp );
    CREATE_MENU_SHORTCUT( "keyboard/quit", "Ctrl+Q", "Quit", "Quit VLMC", actionQuit );
    CREATE_MENU_SHORTCUT( "keyboard/preferences", "Alt+P", "Preferences", "Open VLMC preferences", actionPreferences );
    CREATE_MENU_SHORTCUT( "keyboard/fullscreen", "F", "Fullscreen", "Switch to fullscreen mode", actionFullscreen );
    CREATE_MENU_SHORTCUT( "keyboard/newproject", QKeySequence( QKeySequence::New ).toString().toLocal8Bit(), "New project", "Open the new project wizzard", actionNew_Project );
    CREATE_MENU_SHORTCUT( "keyboard/openproject", QKeySequence( QKeySequence::Open ).toString().toLocal8Bit(), "Open a project", "Open an existing project", actionLoad_Project );
    CREATE_MENU_SHORTCUT( "keyboard/save", QKeySequence( QKeySequence::Save ).toString().toLocal8Bit(), "Save", "Save the current project", actionSave );
    CREATE_MENU_SHORTCUT( "keyboard/saveas", "Ctrl+Shift+S", "Save as", "Save the current project to a new file", actionSave_As );
    CREATE_MENU_SHORTCUT( "keyboard/closeproject", QKeySequence( QKeySequence::Close ).toString().toLocal8Bit(), "Close the project", "Close the current project", actionClose_Project );
    CREATE_MENU_SHORTCUT( "keyboard/importmedia", "Ctrl+I", "Import media", "Open the import window", actionImport );
    CREATE_MENU_SHORTCUT( "keyboard/renderproject", "Ctrl+R", "Render the project", "Render the project to a file", actionRender );
192

193
    VLMC_CREATE_PREFERENCE_LANGUAGE( "general/VLMCLang", "default", "Langage", "The VLMC's UI language" );
194 195 196 197
    SettingsManager::getInstance()->watchValue( "general/VLMCLang",
                                                LanguageHelper::getInstance(),
                                                SLOT( languageChanged( const QVariant& ) ),
                                                SettingsManager::Vlmc );
198 199

    //Load saved preferences :
200 201 202 203 204 205 206 207 208
    QSettings       s;
    if ( s.value( "VlmcVersion" ).toString() != PROJECT_VERSION )
        s.clear();
    else
    {
        loadVlmcPreferences( "keyboard" );
        loadVlmcPreferences( "general" );
    }
    s.setValue( "VlmcVersion", PROJECT_VERSION );
209 210 211 212 213 214 215 216 217 218 219 220
}

void
MainWindow::loadVlmcPreferences( const QString &subPart )
{
    QSettings       s;
    s.beginGroup( subPart );
    foreach ( QString key, s.allKeys() )
    {
        SettingsManager::getInstance()->setValue( subPart + "/" + key, s.value( key ),
                                                  SettingsManager::Vlmc );
    }
221 222
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
223 224
#undef CREATE_MENU_SHORTCUT

225 226
void
MainWindow::setupLibrary()
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
227 228
{
    //GUI part :
229
    QWidget     *libraryWidget = new QWidget( this );
230
    libraryWidget->setMinimumWidth( 280 );
231 232 233 234 235

    QPushButton *button = new QPushButton( tr( "Import" ), this );
    connect( button, SIGNAL( clicked() ), this, SLOT( on_actionImport_triggered() ) );

    StackViewController *nav = new StackViewController( libraryWidget );
236 237
    MediaListView   *mediaView = new MediaListView( nav, Library::getInstance() );
    nav->pushViewController( mediaView );
238
    libraryWidget->layout()->addWidget( button );
239

240
    m_importController = new ImportController();
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
241 242
    const ClipRenderer* clipRenderer = qobject_cast<const ClipRenderer*>( m_clipPreview->getGenericRenderer() );
    Q_ASSERT( clipRenderer != NULL );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
243

244
    DockWidgetManager::getInstance()->addDockedWidget( libraryWidget, tr( "Media Library" ),
245 246 247
                                                    Qt::AllDockWidgetAreas,
                                                    QDockWidget::AllDockWidgetFeatures,
                                                    Qt::LeftDockWidgetArea );
248
    connect( mediaView, SIGNAL( clipSelected( Clip* ) ),
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
249
             clipRenderer, SLOT( setClip( Clip* ) ) );
250

251 252
    connect( Library::getInstance(), SIGNAL( clipRemoved( const QUuid& ) ),
             clipRenderer, SLOT( clipUnloaded( const QUuid& ) ) );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
253 254
}

255 256
void    MainWindow::on_actionSave_triggered()
{
257
    GUIProjectManager::getInstance()->saveProject();
258 259
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
260 261
void    MainWindow::on_actionSave_As_triggered()
{
262
    GUIProjectManager::getInstance()->saveProject( true );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
263 264
}

265 266
void    MainWindow::on_actionLoad_Project_triggered()
{
267
    GUIProjectManager* pm = GUIProjectManager::getInstance();
268
    pm->loadProject( pm->acquireProjectFileName() );
269 270
}

271 272
void MainWindow::createStatusBar()
{
273 274
    // Mouse (default) tool
    QToolButton* mouseTool = new QToolButton( this );
275
    mouseTool->setAutoRaise( true );
276 277 278 279 280 281
    mouseTool->setCheckable( true );
    mouseTool->setIcon( QIcon( ":/images/mouse" ) );
    m_ui.statusbar->addPermanentWidget( mouseTool );

    // Cut/Split tool
    QToolButton* splitTool = new QToolButton( this );
282
    splitTool->setAutoRaise( true );
283 284 285 286 287 288 289 290 291 292 293
    splitTool->setCheckable( true );
    splitTool->setIcon( QIcon( ":/images/editcut" ) );
    m_ui.statusbar->addPermanentWidget( splitTool );

    // Group the two previous buttons
    QButtonGroup* toolButtonGroup = new QButtonGroup( this );
    toolButtonGroup->addButton( mouseTool, TOOL_DEFAULT);
    toolButtonGroup->addButton( splitTool, TOOL_CUT );
    toolButtonGroup->setExclusive( true );
    mouseTool->setChecked( true );

294
    //Shortcut part:
295 296
    KeyboardShortcutHelper* defaultModeShortcut = new KeyboardShortcutHelper( "keyboard/defaultmode", this );
    KeyboardShortcutHelper* cutModeShortcut = new KeyboardShortcutHelper( "keyboard/cutmode", this );
297 298 299
    connect( defaultModeShortcut, SIGNAL( activated() ), mouseTool, SLOT( click() ) );
    connect( cutModeShortcut, SIGNAL( activated() ), splitTool, SLOT( click() ) );

300 301 302 303 304 305 306 307
    connect( toolButtonGroup, SIGNAL( buttonClicked( int ) ),
             this, SLOT( toolButtonClicked( int ) ) );

    // Spacer
    QWidget* spacer = new QWidget( this );
    spacer->setFixedWidth( 20 );
    m_ui.statusbar->addPermanentWidget( spacer );

Ludovic Fauvet's avatar
Ludovic Fauvet committed
308 309 310 311 312 313
    // Zoom Out
    QToolButton* zoomOutButton = new QToolButton( this );
    zoomOutButton->setIcon( QIcon( ":/images/zoomout" ) );
    m_ui.statusbar->addPermanentWidget( zoomOutButton );
    connect( zoomOutButton, SIGNAL( clicked() ),
             this, SLOT( zoomOut() ) );
314 315

    // Zoom slider
316 317 318 319 320 321 322 323 324
    m_zoomSlider = new QSlider( this );
    m_zoomSlider->setOrientation( Qt::Horizontal );
    m_zoomSlider->setTickInterval( 1 );
    m_zoomSlider->setSingleStep( 1 );
    m_zoomSlider->setPageStep( 1 );
    m_zoomSlider->setMinimum( 0 );
    m_zoomSlider->setMaximum( 13 );
    m_zoomSlider->setValue( 10 );
    m_zoomSlider->setFixedWidth( 80 );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
325
    m_zoomSlider->setInvertedAppearance( true );
326
    m_ui.statusbar->addPermanentWidget( m_zoomSlider );
327

Ludovic Fauvet's avatar
Ludovic Fauvet committed
328 329 330 331 332 333
    // Zoom IN
    QToolButton* zoomInButton = new QToolButton( this );
    zoomInButton->setIcon( QIcon( ":/images/zoomin" ) );
    m_ui.statusbar->addPermanentWidget( zoomInButton );
    connect( zoomInButton, SIGNAL( clicked() ),
             this, SLOT( zoomIn() ) );
334 335
}

336
void MainWindow::initializeDockWidgets( void )
337
{
338 339 340
    m_renderer = new WorkflowRenderer();
    m_renderer->initializeRenderer();
    m_timeline = new Timeline( m_renderer, this );
341 342 343
    m_timeline->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    m_timeline->show();
    setCentralWidget( m_timeline );
344

345
    DockWidgetManager *dockManager = DockWidgetManager::getInstance();
346

347 348
    m_clipPreview = new PreviewWidget( new ClipRenderer, this );
    dockManager->addDockedWidget( m_clipPreview,
349
                                  tr( "Clip Preview" ),
geoff's avatar
geoff committed
350 351 352
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::TopDockWidgetArea );
353
    KeyboardShortcutHelper* clipShortcut = new KeyboardShortcutHelper( "keyboard/mediapreview", this );
354
    connect( clipShortcut, SIGNAL( activated() ), m_clipPreview, SLOT( on_pushButtonPlay_clicked() ) );
355

356
    m_projectPreview = new PreviewWidget( m_renderer, this );
357
    dockManager->addDockedWidget( m_projectPreview,
358 359 360
                                  tr( "Project Preview" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
361
                                  Qt::TopDockWidgetArea );
362
    KeyboardShortcutHelper* renderShortcut = new KeyboardShortcutHelper( "keyboard/renderpreview", this );
363
    connect( renderShortcut, SIGNAL( activated() ), m_projectPreview, SLOT( on_pushButtonPlay_clicked() ) );
364

365
    QDockWidget* dock = dockManager->addDockedWidget( UndoStack::getInstance( this ),
366 367 368 369
                                  tr( "History" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::LeftDockWidgetArea );
370 371
    if ( dock != 0 )
        dock->hide();
372
    setupLibrary();
373 374
}

375 376
void        MainWindow::createGlobalPreferences()
{
377
    m_globalPreferences = new Settings( SettingsManager::Vlmc, this );
378 379 380 381 382 383
    m_globalPreferences->addCategorie( "general", SettingsManager::Vlmc,
                                   QIcon( ":/images/images/vlmc.png" ),
                                   tr ( "VLMC settings" ) );
    m_globalPreferences->addCategorie( "keyboard", SettingsManager::Vlmc,
                                     QIcon( ":/images/keyboard" ),
                                     tr( "Keyboard Settings" ) );
384 385
}

386
void    MainWindow::createProjectPreferences()
387
{
388
    m_projectPreferences = new Settings( SettingsManager::Project, this );
389 390 391 392 393 394 395 396 397
    m_projectPreferences->addCategorie( "general", SettingsManager::Project,
                                   QIcon( ":/images/images/vlmc.png" ),
                                   tr ( "Project settings" ) );
    m_projectPreferences->addCategorie( "video", SettingsManager::Project,
                                   QIcon( ":/images/images/video.png" ),
                                   tr ( "Video settings" ) );
    m_projectPreferences->addCategorie( "audio", SettingsManager::Project,
                                   QIcon( ":/images/images/audio.png" ),
                                   tr ( "Audio settings" ) );
398 399
}

400

401 402
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
403 404 405 406
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
407 408 409

void MainWindow::on_actionPreferences_triggered()
{
410
   m_globalPreferences->show();
411
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
412 413 414

void MainWindow::on_actionAbout_triggered()
{
415
    About::getInstance()->exec();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
416
}
417

418
void MainWindow::on_actionTranscode_triggered()
419
{
420 421
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
422
    //Transcode::instance( this )->exec();
423
}
424

425 426
void    MainWindow::on_actionRender_triggered()
{
427
    if ( MainWorkflow::getInstance()->getLengthFrame() <= 0 )
428
    {
429
        QMessageBox::warning( NULL, tr ( "VLMC Renderer" ), tr( "There is nothing to render." ) );
430 431
        return ;
    }
432 433
    else
    {
434
        m_renderer->killRenderer();
435 436 437 438 439 440 441 442 443 444 445 446 447 448
        //Setup dialog box for querying render parameters.
        RendererSettings    *settings = new RendererSettings;
        if ( settings->exec() == QDialog::Rejected )
        {
            delete settings;
            return ;
        }
        QString     outputFileName = settings->outputFileName();
        quint32     width = settings->width();
        quint32     height = settings->height();
        double      fps = settings->fps();
        quint32     vbitrate = settings->videoBitrate();
        quint32     abitrate = settings->audioBitrate();
        delete settings;
449

450 451 452
        if ( m_fileRenderer )
            delete m_fileRenderer;
        m_fileRenderer = new WorkflowFileRenderer();
453 454 455 456
        WorkflowFileRendererDialog  *dialog = new WorkflowFileRendererDialog( m_fileRenderer, width, height );
        dialog->setModal( true );
        dialog->setOutputFileName( outputFileName );

457
        m_fileRenderer->initializeRenderer();
458
        m_fileRenderer->run( outputFileName, width, height, fps, vbitrate, abitrate );
459 460
        dialog->exec();
        delete dialog;
461
    }
462 463
}

464 465
void MainWindow::on_actionNew_Project_triggered()
{
466
    m_pWizard->restart();
467
    m_pWizard->show();
468 469
}

470
void    MainWindow::on_actionHelp_triggered()
471 472
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
473 474
}

475
void    MainWindow::zoomIn()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
476 477 478 479
{
    m_zoomSlider->setValue( m_zoomSlider->value() - 1 );
}

480
void    MainWindow::zoomOut()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
481 482 483
{
    m_zoomSlider->setValue( m_zoomSlider->value() + 1 );
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
484

485
void    MainWindow::on_actionFullscreen_triggered( bool checked )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
486 487 488 489 490 491
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
492

493
void    MainWindow::registerWidgetInWindowMenu( QDockWidget* widget )
494
{
495
    m_ui.menuWindow->addAction( widget->toggleViewAction() );
496
}
497

498
void    MainWindow::toolButtonClicked( int id )
499 500 501
{
    emit toolChanged( (ToolButtons)id );
}
502

503
void MainWindow::on_actionBypass_effects_engine_toggled(bool)
504
{
505 506 507 508 509 510 511
//    EffectsEngine*  ee;
//
//    ee = MainWorkflow::getInstance()->getEffectsEngine();
//    if (toggled)
//        ee->enable();
//    else
//       ee->disable();
512 513
    return ;
}
514

515 516
void MainWindow::on_actionProject_Preferences_triggered()
{
517
  m_projectPreferences->show();
518
}
519

520 521
void    MainWindow::closeEvent( QCloseEvent* e )
{
522 523
    GUIProjectManager   *pm = GUIProjectManager::getInstance();
    if ( pm->askForSaveIfModified() )
524
        e->accept();
525 526
    else
        e->ignore();
527
}
528

529
void    MainWindow::projectUpdated( const QString& projectName, bool savedStatus )
530 531
{
    QString title = tr( "VideoLAN Movie Creator" );
532
    title += " - ";
533 534 535 536 537
    title += projectName;
    if ( savedStatus == false )
        title += " *";
    setWindowTitle( title );
}
538

539 540
void    MainWindow::on_actionClose_Project_triggered()
{
541
    GUIProjectManager::getInstance()->closeProject();
542 543
}

544 545 546 547 548 549 550 551 552 553
void    MainWindow::on_actionUndo_triggered()
{
    UndoStack::getInstance( this )->undo();
}

void    MainWindow::on_actionRedo_triggered()
{
    UndoStack::getInstance( this )->redo();
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
554 555
void    MainWindow::on_actionCrash_triggered()
{
556 557 558 559 560
    //WARNING: read this part at your own risk !!
    //I'm not responsible if you puke while reading this :D
    QString str;
    int test = 1 / str.length();
    Q_UNUSED( test );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
561
}
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
562 563 564 565

bool    MainWindow::restoreSession()
{
    QSettings   s;
566
    bool        fileCreated = false;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
567 568
    bool        ret = false;

569 570
    fileCreated = s.contains( "VlmcVersion" );
    if ( fileCreated == true )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
571
    {
572
        bool        cleanQuit = s.value( "CleanQuit", true ).toBool();
573 574 575 576 577 578 579

        // Restore the geometry
        restoreGeometry( s.value( "MainWindowGeometry" ).toByteArray() );
        // Restore the layout
        restoreState( s.value( "MainWindowState" ).toByteArray() );

        if ( cleanQuit == false )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
580
        {
581 582 583 584
            QMessageBox::StandardButton res = QMessageBox::question( this, tr( "Crash recovery" ), tr( "VLMC didn't closed nicely. Do you wan't to recover your project ?" ),
                                   QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes );
            if ( res == QMessageBox::Yes )
            {
585
                if ( GUIProjectManager::getInstance()->loadEmergencyBackup() == true )
586 587 588 589
                    ret = true;
                else
                    QMessageBox::warning( this, tr( "Can't restore project" ), tr( "VLMC didn't manage to restore your project. We appology for the inconvenience" ) );
            }
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
590 591 592 593 594 595
        }
    }
    s.setValue( "CleanQuit", false );
    s.sync();
    return ret;
}
596 597 598 599 600

void    MainWindow::on_actionImport_triggered()
{
    m_importController->exec();
}
601

602 603 604 605 606 607 608 609 610 611
void    MainWindow::canUndoChanged( bool canUndo )
{
    m_ui.actionUndo->setEnabled( canUndo );
}

void    MainWindow::canRedoChanged( bool canRedo )
{
    m_ui.actionRedo->setEnabled( canRedo );
}

Ludovic Fauvet's avatar
Ludovic Fauvet committed
612
#ifdef WITH_CRASHBUTTON
613 614 615 616 617 618 619 620 621
void    MainWindow::setupCrashTester()
{
    QAction* actionCrash = new QAction( this );
    actionCrash->setObjectName( QString::fromUtf8( "actionCrash" ) );
    m_ui.menuTools->addAction( actionCrash );
    actionCrash->setText( QApplication::translate( "MainWindow", "Crash", 0, QApplication::UnicodeUTF8 ) );
    connect( actionCrash, SIGNAL( triggered( bool ) ), this, SLOT( on_actionCrash_triggered() ) );
}
#endif
622