MainWindow.cpp 20.6 KB
Newer Older
Ludovic Fauvet's avatar
Ludovic Fauvet committed
1
/*****************************************************************************
2
 * MainWindow.cpp: VLMC MainWindow
Ludovic Fauvet's avatar
Ludovic Fauvet committed
3 4 5 6
 *****************************************************************************
 * Copyright (C) 2008-2009 the VLMC team
 *
 * 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"
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
34
#include "Library.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
35
#include "About.h"
36 37 38 39
#include "ProjectManager.h"
#include "KeyboardShortcut.h"
#include "VlmcDebug.h"

Ludovic Fauvet's avatar
Ludovic Fauvet committed
40 41
#include "MainWorkflow.h"
#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
#include "UndoStack.h"
49
#include "PreviewWidget.h"
50 51 52 53
#include "MediaLibraryWidget.h"
#include "timeline/Timeline.h"
#include "timeline/TracksView.h"
#include "ImportController.h"
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
54
#include "Export.h"
55 56 57

/* Settings / Preferences */
#include "ProjectManager.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
58
#include "ProjectWizard.h"
59
#include "ProjectPreferences.h"
60 61
#include "VLMCPreferences.h"
#include "VLMCSettingsDefault.h"
62 63
#include "AudioProjectPreferences.h"
#include "VideoProjectPreferences.h"
64
#include "LanguagePreferences.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
65
#include "Settings.h"
66
#include "SettingsManager.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
67

68 69 70
/* VLCpp */
#include "VLCInstance.h"

Ludovic Fauvet's avatar
Ludovic Fauvet committed
71
MainWindow::MainWindow( QWidget *parent ) :
72
    QMainWindow( parent ), m_renderer( NULL )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
73 74
{
    m_ui.setupUi( this );
75

76
    qRegisterMetaType<MainWorkflow::TrackType>( "MainWorkflow::TrackType" );
77
    qRegisterMetaType<MainWorkflow::FrameChangedReason>( "MainWorkflow::FrameChangedReason" );
78
    qRegisterMetaType<QVariant>( "QVariant" );
79 80 81 82

    // Settings
    VLMCSettingsDefault::load( "default" );
    VLMCSettingsDefault::load( "VLMC" );
83
    VLMCSettingsDefault::loadKeyboardShortcutDefaults();
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
84
    //We only install message handler here cause it uses configuration.
85
    VlmcDebug::getInstance()->setup();
86 87

    // GUI
88
    DockWidgetManager::instance( this )->setMainWindow( this );
89
    initializeDockWidgets();
90
    createStatusBar();
91
    createGlobalPreferences();
92
    createProjectPreferences();
93
    initializeMenuKeyboardShortcut();
94 95 96
#ifdef DEBUG_CRASHHANDLER
    setupCrashTester();
#endif
97

Ludovic Fauvet's avatar
Ludovic Fauvet committed
98
    // Translations
99 100
    connect( this, SIGNAL( translateDockWidgetTitle() ),
             DockWidgetManager::instance(), SLOT( transLateWidgetTitle() ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
101 102

    // Zoom
103 104
    connect( m_zoomSlider, SIGNAL( valueChanged( int ) ),
             m_timeline, SLOT( changeZoom( int ) ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
105 106 107 108
    connect( m_timeline->tracksView(), SIGNAL( zoomIn() ),
             this, SLOT( zoomIn() ) );
    connect( m_timeline->tracksView(), SIGNAL( zoomOut() ),
             this, SLOT( zoomOut() ) );
109 110
    connect( this, SIGNAL( toolChanged( ToolButtons ) ),
             m_timeline, SLOT( setTool( ToolButtons ) ) );
111

112 113
    connect( ProjectManager::getInstance(), SIGNAL( projectUpdated( const QString&, bool ) ),
             this, SLOT( projectUpdated( const QString&, bool ) ) );
114

115 116 117 118 119 120 121 122 123
    // 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
124 125 126 127
    // Wizard
    m_pWizard = new ProjectWizard( this );
    m_pWizard->setModal( true );

128 129 130
    QSettings s;
    if ( s.value( "ShowWizardStartup", true ).toBool() &&
         restoreSession() == false )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
131 132 133
    {
        m_pWizard->show();
    }
Ludovic Fauvet's avatar
Ludovic Fauvet committed
134 135
}

136 137
MainWindow::~MainWindow()
{
138 139 140 141 142
    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
143
    s.setValue( "CleanQuit", true );
144 145
    s.sync();

146 147
    if ( m_renderer )
        delete m_renderer;
148
    LibVLCpp::Instance::destroyInstance();
149 150
}

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

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
164 165 166
void        MainWindow::setupLibrary()
{
    //GUI part :
167

168
    MediaLibraryWidget* mediaLibraryWidget = new MediaLibraryWidget( this );
169
    m_importController = new ImportController( this );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
170

171 172 173 174
    DockWidgetManager::instance()->addDockedWidget( mediaLibraryWidget,
                                                    tr( "Media Library" ),
                                                    Qt::AllDockWidgetAreas,
                                                    QDockWidget::AllDockWidgetFeatures,
175

176
                                                    Qt::LeftDockWidgetArea );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
177 178
    connect( mediaLibraryWidget, SIGNAL( mediaSelected( Media* ) ),
             m_clipPreview->getGenericRenderer(), SLOT( setMedia( Media* ) ) );
179

180 181
    connect( Library::getInstance(), SIGNAL( mediaRemoved( const QUuid& ) ),
             m_clipPreview->getGenericRenderer(), SLOT( mediaUnloaded( QUuid ) ) );
182 183

    connect( mediaLibraryWidget, SIGNAL( importRequired() ), this, SLOT( on_actionImport_triggered() ) );
184 185

    connect( m_clipPreview, SIGNAL( addClip( Clip* ) ), mediaLibraryWidget, SLOT( clipAdded( Clip* ) ) );
186 187 188

    connect( mediaLibraryWidget, SIGNAL( previewClipSetted( Clip* ) ),
            m_clipPreview->getGenericRenderer(), SLOT( setClip( Clip* ) ) );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
189 190
}

191 192
void    MainWindow::on_actionSave_triggered()
{
193
    ProjectManager::getInstance()->saveProject();
194 195
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
196 197 198 199 200
void    MainWindow::on_actionSave_As_triggered()
{
    ProjectManager::getInstance()->saveProject( true );
}

201 202
void    MainWindow::on_actionLoad_Project_triggered()
{
203 204
    ProjectManager* pm = ProjectManager::getInstance();
    pm->loadProject( pm->loadProjectFile() );
205 206
}

207 208
void MainWindow::createStatusBar()
{
209 210
    // Mouse (default) tool
    QToolButton* mouseTool = new QToolButton( this );
211
    mouseTool->setAutoRaise( true );
212 213 214 215 216 217
    mouseTool->setCheckable( true );
    mouseTool->setIcon( QIcon( ":/images/mouse" ) );
    m_ui.statusbar->addPermanentWidget( mouseTool );

    // Cut/Split tool
    QToolButton* splitTool = new QToolButton( this );
218
    splitTool->setAutoRaise( true );
219 220 221 222 223 224 225 226 227 228 229
    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 );

230 231 232 233 234 235
    //Shortcut part:
    KeyboardShortcutHelper* defaultModeShortcut = new KeyboardShortcutHelper( "Default mode", this );
    KeyboardShortcutHelper* cutModeShortcut = new KeyboardShortcutHelper( "Cut mode", this );
    connect( defaultModeShortcut, SIGNAL( activated() ), mouseTool, SLOT( click() ) );
    connect( cutModeShortcut, SIGNAL( activated() ), splitTool, SLOT( click() ) );

236 237 238 239 240 241 242 243
    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
244 245 246 247 248 249
    // Zoom Out
    QToolButton* zoomOutButton = new QToolButton( this );
    zoomOutButton->setIcon( QIcon( ":/images/zoomout" ) );
    m_ui.statusbar->addPermanentWidget( zoomOutButton );
    connect( zoomOutButton, SIGNAL( clicked() ),
             this, SLOT( zoomOut() ) );
250 251

    // Zoom slider
252 253 254 255 256 257 258 259 260
    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
261
    m_zoomSlider->setInvertedAppearance( true );
262
    m_ui.statusbar->addPermanentWidget( m_zoomSlider );
263

Ludovic Fauvet's avatar
Ludovic Fauvet committed
264 265 266 267 268 269
    // Zoom IN
    QToolButton* zoomInButton = new QToolButton( this );
    zoomInButton->setIcon( QIcon( ":/images/zoomin" ) );
    m_ui.statusbar->addPermanentWidget( zoomInButton );
    connect( zoomInButton, SIGNAL( clicked() ),
             this, SLOT( zoomIn() ) );
270 271
}

272
void MainWindow::initializeDockWidgets( void )
273
{
274
    WorkflowRenderer*    workflowRenderer = new WorkflowRenderer();
275
    workflowRenderer->initializeRenderer();
276
    m_timeline = new Timeline( workflowRenderer, this );
277 278 279
    m_timeline->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    m_timeline->show();
    setCentralWidget( m_timeline );
280

281 282
    DockWidgetManager *dockManager = DockWidgetManager::instance();

283 284
    m_clipPreview = new PreviewWidget( new ClipRenderer, this );
    dockManager->addDockedWidget( m_clipPreview,
285
                                  tr( "Clip Preview" ),
geoff's avatar
geoff committed
286 287 288
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::TopDockWidgetArea );
289
    KeyboardShortcutHelper* clipShortcut = new KeyboardShortcutHelper( "Launch media preview", this );
290
    connect( clipShortcut, SIGNAL( activated() ), m_clipPreview, SLOT( on_pushButtonPlay_clicked() ) );
291

292
    m_projectPreview = new PreviewWidget( workflowRenderer, this );
293
    dockManager->addDockedWidget( m_projectPreview,
294 295 296
                                  tr( "Project Preview" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
297
                                  Qt::TopDockWidgetArea );
298
    KeyboardShortcutHelper* renderShortcut = new KeyboardShortcutHelper( "Start render preview", this );
299
    connect( renderShortcut, SIGNAL( activated() ), m_projectPreview, SLOT( on_pushButtonPlay_clicked() ) );
300

301
    dockManager->addDockedWidget( UndoStack::getInstance( this ),
302 303 304 305
                                  tr( "History" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::LeftDockWidgetArea );
306
    setupLibrary();
307 308
}

309 310
void        MainWindow::createGlobalPreferences()
{
311
    m_globalPreferences = new Settings( false, "VLMC", this );
312
    m_globalPreferences->addWidget("VLMC",
Ludovic Fauvet's avatar
Ludovic Fauvet committed
313
                                   new VLMCPreferences( m_globalPreferences ),
314
                                   QIcon( ":/images/images/vlmc.png" ),
315
                                   "VLMC settings");
316 317
    m_globalPreferences->addWidget("Language preferences",
                                   new LanguagePreferences( m_globalPreferences ),
318
                                   QIcon( ":/images/images/vlmc.png" ),
319
                                   "Langage settings");
320 321 322 323
    m_globalPreferences->addWidget( "Keyboard",
                                     new KeyboardShortcut( m_globalPreferences ),
                                     QIcon( ":/images/keyboard" ),
                                     tr( "Keyboard Settings" ) );
324 325
}

326 327
void	    MainWindow::createProjectPreferences()
{
328
    m_projectPreferences = new Settings( false, "project", this );
329 330
    m_projectPreferences->addWidget("Project",
                                   new ProjectPreferences,
331
                                   QIcon( ":/images/images/vlmc.png" ),
332 333
                                   "Project settings" );
    m_projectPreferences->addWidget( "Video",
334
                                   new VideoProjectPreferences,
335
                                   QIcon( ":/images/images/video.png" ),
336 337
                                   "Video settings" );
    m_projectPreferences->addWidget( "Audio",
338
                                   new AudioProjectPreferences,
339
                                   QIcon( ":/images/images/audio.png" ),
340
                                   "Audio settings" );
341 342
}

343

344 345
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
346 347 348 349
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
350 351 352

void MainWindow::on_actionPreferences_triggered()
{
353
   m_globalPreferences->show();
354
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
355 356 357 358 359

void MainWindow::on_actionAbout_triggered()
{
    About::instance()->exec();
}
360

361
void MainWindow::on_actionTranscode_triggered()
362
{
363 364
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
365
    //Transcode::instance( this )->exec();
366
}
367

368 369
void    MainWindow::on_actionRender_triggered()
{
370
    if ( MainWorkflow::getInstance()->getLengthFrame() <= 0 )
371 372 373 374
    {
        QMessageBox::warning( NULL, "VLMC Renderer", "There is nothing to render." );
        return ;
    }
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
    Export* exportMenu = new Export();
    exportMenu->exec();
    delete exportMenu;

//    QString outputFileName =
//            QFileDialog::getSaveFileName( NULL, "Enter the output file name",
//                                          QDir::currentPath(), "Videos(*.avi *.mpg)" );
//    if ( outputFileName.length() == 0 )
//        return ;
//    else
//    {
//        if ( m_renderer )
//            delete m_renderer;
//        m_renderer = new WorkflowFileRenderer( outputFileName );
//        m_renderer->initializeRenderer();
//        m_renderer->run();
//    }
392 393
}

394 395 396 397
void MainWindow::on_actionNew_Project_triggered()
{
    //TODO : clear the library, the timeline, and show the configuration box
    //of the newly created project
398

399
    m_pWizard->restart();
400
    m_pWizard->show();
401 402
}

403
void    MainWindow::on_actionHelp_triggered()
404 405
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
406 407
}

408
void    MainWindow::zoomIn()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
409 410 411 412
{
    m_zoomSlider->setValue( m_zoomSlider->value() - 1 );
}

413
void    MainWindow::zoomOut()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
414 415 416
{
    m_zoomSlider->setValue( m_zoomSlider->value() + 1 );
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
417

418
void    MainWindow::on_actionFullscreen_triggered( bool checked )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
419 420 421 422 423 424
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
425

426
void    MainWindow::registerWidgetInWindowMenu( QDockWidget* widget )
427
{
428
    m_ui.menuWindow->addAction( widget->toggleViewAction() );
429
}
430

431
void    MainWindow::toolButtonClicked( int id )
432 433 434
{
    emit toolChanged( (ToolButtons)id );
}
435

436 437 438 439 440 441 442 443 444 445 446
void MainWindow::on_actionBypass_effects_engine_toggled(bool toggled)
{
    EffectsEngine*  ee;

    ee = MainWorkflow::getInstance()->getEffectsEngine();
    if (toggled)
        ee->enable();
    else
       ee->disable();
    return ;
}
447

448 449
void MainWindow::on_actionProject_Preferences_triggered()
{
450
  m_projectPreferences->show( "project" );
451
}
452

453 454
void    MainWindow::closeEvent( QCloseEvent* e )
{
455
    if ( ProjectManager::getInstance()->askForSaveIfModified() )
456
        e->accept();
457 458
    else
        e->ignore();
459
}
460

461
void    MainWindow::projectUpdated( const QString& projectName, bool savedStatus )
462 463
{
    QString title = tr( "VideoLAN Movie Creator" );
464
    title += " - ";
465 466 467 468 469
    title += projectName;
    if ( savedStatus == false )
        title += " *";
    setWindowTitle( title );
}
470

471 472 473 474 475
void    MainWindow::on_actionClose_Project_triggered()
{
    ProjectManager::getInstance()->closeProject();
}

476 477 478 479 480 481 482 483 484 485
void    MainWindow::on_actionUndo_triggered()
{
    UndoStack::getInstance( this )->undo();
}

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

486
#define INIT_SHORTCUT( instName, shortcutName, actionInstance )      \
487 488
            const SettingValue* instName = SettingsManager::getInstance()->getValue( "keyboard_shortcut", shortcutName );\
            KeyboardShortcutHelper* helper##instName = new KeyboardShortcutHelper( shortcutName, this, true ); \
489 490
            connect( helper##instName, SIGNAL( changed( const QString&, const QString&) ), this, SLOT( keyboardShortcutChanged(QString,QString)) ); \
            m_ui.actionInstance->setShortcut( instName->get().toString() );
491 492 493

void    MainWindow::initializeMenuKeyboardShortcut()
{
494 495 496 497 498 499 500 501
    INIT_SHORTCUT( help, "Help", actionHelp );
    INIT_SHORTCUT( quit, "Quit", actionQuit );
    INIT_SHORTCUT( preferences, "Preferences", actionPreferences );
    INIT_SHORTCUT( fullscreen, "Fullscreen", actionFullscreen );
    INIT_SHORTCUT( newProject, "New project", actionNew_Project );
    INIT_SHORTCUT( openProject, "Open project", actionLoad_Project );
    INIT_SHORTCUT( save, "Save", actionSave );
    INIT_SHORTCUT( saveAs, "Save as", actionSave_As );
502
    INIT_SHORTCUT( closeProject, "Close project", actionClose_Project );
503
    INIT_SHORTCUT( importProject, "Import media", actionImport );
504
    INIT_SHORTCUT( renderProject, "Render project", actionRender );
505 506
    INIT_SHORTCUT( undo, "Undo", actionUndo );
    INIT_SHORTCUT( redo, "Redo", actionRedo );
507 508
}

509 510
#undef INIT_SHORTCUT

511 512 513 514 515
void    MainWindow::keyboardShortcutChanged( const QString& name, const QString& val )
{
    qDebug() << "shortcut" << name << "changed to" << val;
    if ( name == "Help" )
        m_ui.actionHelp->setShortcut( val );
516 517 518 519 520 521 522 523 524 525 526 527 528 529
    else if ( name == "Quit" )
        m_ui.actionQuit->setShortcut( val );
    else if ( name == "Preferences" )
        m_ui.actionPreferences->setShortcut( val );
    else if ( name == "Fullscreen" )
        m_ui.actionFullscreen->setShortcut( val );
    else if ( name == "New project" )
        m_ui.actionNew_Project->setShortcut( val );
    else if ( name == "Open project" )
        m_ui.actionLoad_Project->setShortcut( val );
    else if ( name == "Save" )
        m_ui.actionSave->setShortcut( val );
    else if ( name == "Save as" )
        m_ui.actionSave_As->setShortcut( val );
530 531
    else if ( name == "Close project" )
        m_ui.actionClose_Project->setShortcut( val );
532 533
    else if ( name == "Import media" )
        m_ui.actionImport->setShortcut( val );
534 535
    else if ( name == "Render project" )
        m_ui.actionRender->setShortcut( val );
536 537 538 539
    else if ( name == "Undo" )
        m_ui.actionUndo->setShortcut( val );
    else if ( name == "Redo" )
        m_ui.actionRedo->setShortcut( val );
540 541
    else
        qWarning() << "Unknown shortcut:" << name;
542
}
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
543 544 545

void    MainWindow::on_actionCrash_triggered()
{
546 547 548 549 550
    //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
551
}
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
552 553 554 555

bool    MainWindow::restoreSession()
{
    QSettings   s;
556
    bool        fileCreated = false;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
557 558
    bool        ret = false;

559 560
    fileCreated = s.contains( "VlmcVersion" );
    if ( fileCreated == true )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
561
    {
562 563 564 565 566 567 568 569
        bool        cleanQuit = s.value( "CleanQuit", false ).toBool();

        // 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
570
        {
571 572 573 574 575 576 577 578 579
            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 )
            {
                if ( ProjectManager::getInstance()->loadEmergencyBackup() == true )
                    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
580 581 582 583 584 585
        }
    }
    s.setValue( "CleanQuit", false );
    s.sync();
    return ret;
}
586 587 588 589 590

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

592 593 594 595 596 597 598 599 600 601
void    MainWindow::canUndoChanged( bool canUndo )
{
    m_ui.actionUndo->setEnabled( canUndo );
}

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

602 603 604 605 606 607 608 609 610 611
#ifdef DEBUG_CRASHHANDLER
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