MainWindow.cpp 21.5 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
39
40
#include "ProjectManager.h"
#include "KeyboardShortcut.h"
#include "VlmcDebug.h"

Ludovic Fauvet's avatar
Ludovic Fauvet committed
41
42
#include "MainWorkflow.h"
#include "WorkflowFileRenderer.h"
43
#include "WorkflowRenderer.h"
44
#include "ClipRenderer.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
45
#include "EffectsEngine.h"
46
47
48

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

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

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

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

75
    qRegisterMetaType<MainWorkflow::TrackType>( "MainWorkflow::TrackType" );
76
    qRegisterMetaType<MainWorkflow::FrameChangedReason>( "MainWorkflow::FrameChangedReason" );
77
    qRegisterMetaType<QVariant>( "QVariant" );
78

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

82
83
84
    //VLC Instance:
    LibVLCpp::Instance::getInstance( this );

85
86
87
88
89
90
    //Preferences
    initVlmcPreferences();

    //Creating the project manager first (so it can create all the project variables)
    ProjectManager::getInstance();

91
    // GUI
92
    DockWidgetManager::instance( this )->setMainWindow( this );
93
    createGlobalPreferences();
94
    createProjectPreferences();
95
96
    initializeDockWidgets();
    createStatusBar();
97
    initializeMenuKeyboardShortcut();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
98
#ifdef WITH_CRASHBUTTON
99
100
    setupCrashTester();
#endif
101

Ludovic Fauvet's avatar
Ludovic Fauvet committed
102
    // Translations
103
104
    connect( this, SIGNAL( translateDockWidgetTitle() ),
             DockWidgetManager::instance(), SLOT( transLateWidgetTitle() ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
105
106

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

116
117
    connect( ProjectManager::getInstance(), SIGNAL( projectUpdated( const QString&, bool ) ),
             this, SLOT( projectUpdated( const QString&, bool ) ) );
118

119
120
121
122
123
124
125
126
127
    // 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
128
129
130
131
    // Wizard
    m_pWizard = new ProjectWizard( this );
    m_pWizard->setModal( true );

132
#ifdef WITH_CRASHHANDLER
133
134
135
    QSettings s;
    if ( s.value( "ShowWizardStartup", true ).toBool() &&
         restoreSession() == false )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
136
137
138
    {
        m_pWizard->show();
    }
139
140
141
#else
    m_pWizard->show();
#endif
Ludovic Fauvet's avatar
Ludovic Fauvet committed
142
143
}

144
145
MainWindow::~MainWindow()
{
146
147
148
149
150
    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
151
    s.setValue( "CleanQuit", true );
152
153
    s.sync();

154
155
    if ( m_fileRenderer )
        delete m_fileRenderer;
156
    delete m_importController;
157
158
}

Ludovic Fauvet's avatar
Ludovic Fauvet committed
159
160
161
162
163
164
void MainWindow::changeEvent( QEvent *e )
{
    switch ( e->type() )
    {
    case QEvent::LanguageChange:
        m_ui.retranslateUi( this );
165
        emit translateDockWidgetTitle();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
166
167
168
169
170
171
        break;
    default:
        break;
    }
}

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

    VLMC_CREATE_PREFERENCE( "global/VLMCLang", "en_US", "Langage", "The VLMC's UI language" );
195
196
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
197
198
199
void        MainWindow::setupLibrary()
{
    //GUI part :
200

201
    MediaLibraryWidget* mediaLibraryWidget = new MediaLibraryWidget( this );
202
    m_importController = new ImportController();
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
203

204
205
206
207
208
    DockWidgetManager::instance()->addDockedWidget( mediaLibraryWidget,
                                                    tr( "Media Library" ),
                                                    Qt::AllDockWidgetAreas,
                                                    QDockWidget::AllDockWidgetFeatures,
                                                    Qt::LeftDockWidgetArea );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
209
210
    connect( mediaLibraryWidget, SIGNAL( mediaSelected( Media* ) ),
             m_clipPreview->getGenericRenderer(), SLOT( setMedia( Media* ) ) );
211

212
213
    connect( Library::getInstance(), SIGNAL( mediaRemoved( const QUuid& ) ),
             m_clipPreview->getGenericRenderer(), SLOT( mediaUnloaded( QUuid ) ) );
214
215

    connect( mediaLibraryWidget, SIGNAL( importRequired() ), this, SLOT( on_actionImport_triggered() ) );
216
217

    connect( m_clipPreview, SIGNAL( addClip( Clip* ) ), mediaLibraryWidget, SLOT( clipAdded( Clip* ) ) );
218
219
220

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

223
224
void    MainWindow::on_actionSave_triggered()
{
225
    ProjectManager::getInstance()->saveProject();
226
227
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
228
229
230
231
232
void    MainWindow::on_actionSave_As_triggered()
{
    ProjectManager::getInstance()->saveProject( true );
}

233
234
void    MainWindow::on_actionLoad_Project_triggered()
{
235
    ProjectManager* pm = ProjectManager::getInstance();
236
    pm->loadProject( pm->acquireProjectFileName() );
237
238
}

239
240
void MainWindow::createStatusBar()
{
241
242
    // Mouse (default) tool
    QToolButton* mouseTool = new QToolButton( this );
243
    mouseTool->setAutoRaise( true );
244
245
246
247
248
249
    mouseTool->setCheckable( true );
    mouseTool->setIcon( QIcon( ":/images/mouse" ) );
    m_ui.statusbar->addPermanentWidget( mouseTool );

    // Cut/Split tool
    QToolButton* splitTool = new QToolButton( this );
250
    splitTool->setAutoRaise( true );
251
252
253
254
255
256
257
258
259
260
261
    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 );

262
    //Shortcut part:
263
264
    KeyboardShortcutHelper* defaultModeShortcut = new KeyboardShortcutHelper( "keyboard/defaultmode", this );
    KeyboardShortcutHelper* cutModeShortcut = new KeyboardShortcutHelper( "keyboard/cutmode", this );
265
266
267
    connect( defaultModeShortcut, SIGNAL( activated() ), mouseTool, SLOT( click() ) );
    connect( cutModeShortcut, SIGNAL( activated() ), splitTool, SLOT( click() ) );

268
269
270
271
272
273
274
275
    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
276
277
278
279
280
281
    // Zoom Out
    QToolButton* zoomOutButton = new QToolButton( this );
    zoomOutButton->setIcon( QIcon( ":/images/zoomout" ) );
    m_ui.statusbar->addPermanentWidget( zoomOutButton );
    connect( zoomOutButton, SIGNAL( clicked() ),
             this, SLOT( zoomOut() ) );
282
283

    // Zoom slider
284
285
286
287
288
289
290
291
292
    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
293
    m_zoomSlider->setInvertedAppearance( true );
294
    m_ui.statusbar->addPermanentWidget( m_zoomSlider );
295

Ludovic Fauvet's avatar
Ludovic Fauvet committed
296
297
298
299
300
301
    // Zoom IN
    QToolButton* zoomInButton = new QToolButton( this );
    zoomInButton->setIcon( QIcon( ":/images/zoomin" ) );
    m_ui.statusbar->addPermanentWidget( zoomInButton );
    connect( zoomInButton, SIGNAL( clicked() ),
             this, SLOT( zoomIn() ) );
302
303
}

304
void MainWindow::initializeDockWidgets( void )
305
{
306
307
308
    m_renderer = new WorkflowRenderer();
    m_renderer->initializeRenderer();
    m_timeline = new Timeline( m_renderer, this );
309
310
311
    m_timeline->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    m_timeline->show();
    setCentralWidget( m_timeline );
312

313
314
    DockWidgetManager *dockManager = DockWidgetManager::instance();

315
316
    m_clipPreview = new PreviewWidget( new ClipRenderer, this );
    dockManager->addDockedWidget( m_clipPreview,
317
                                  tr( "Clip Preview" ),
geoff's avatar
geoff committed
318
319
320
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::TopDockWidgetArea );
321
    KeyboardShortcutHelper* clipShortcut = new KeyboardShortcutHelper( "keyboard/mediapreview", this );
322
    connect( clipShortcut, SIGNAL( activated() ), m_clipPreview, SLOT( on_pushButtonPlay_clicked() ) );
323

324
    m_projectPreview = new PreviewWidget( m_renderer, this );
325
    dockManager->addDockedWidget( m_projectPreview,
326
327
328
                                  tr( "Project Preview" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
329
                                  Qt::TopDockWidgetArea );
330
    KeyboardShortcutHelper* renderShortcut = new KeyboardShortcutHelper( "keyboard/renderpreview", this );
331
    connect( renderShortcut, SIGNAL( activated() ), m_projectPreview, SLOT( on_pushButtonPlay_clicked() ) );
332

333
    QDockWidget* dock = dockManager->addDockedWidget( UndoStack::getInstance( this ),
334
335
336
337
                                  tr( "History" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::LeftDockWidgetArea );
338
339
    if ( dock != 0 )
        dock->hide();
340
    setupLibrary();
341
342
}

343
344
void        MainWindow::createGlobalPreferences()
{
345
    m_globalPreferences = new Settings( this );
346
    m_globalPreferences->addWidget( tr ( "VLMC" ),
Ludovic Fauvet's avatar
Ludovic Fauvet committed
347
                                   new VLMCPreferences( m_globalPreferences ),
348
                                   QIcon( ":/images/images/vlmc.png" ),
349
350
                                   tr ( "VLMC settings" ) );
    m_globalPreferences->addWidget( tr ("Language preferences" ),
351
                                   new LanguagePreferences( m_globalPreferences ),
352
                                   QIcon( ":/images/images/vlmc.png" ),
353
354
                                   tr ( "Language settings" ) );
    m_globalPreferences->addWidget( tr ("Keyboard" ),
355
356
357
                                     new KeyboardShortcut( m_globalPreferences ),
                                     QIcon( ":/images/keyboard" ),
                                     tr( "Keyboard Settings" ) );
358
359
}

360
void    MainWindow::createProjectPreferences()
361
{
362
    m_projectPreferences = new Settings( this );
363
    m_projectPreferences->addWidget( tr( "Project" ),
364
                                   new ProjectPreferences,
365
                                   QIcon( ":/images/images/vlmc.png" ),
366
367
                                   tr ( "Project settings" ) );
    m_projectPreferences->addWidget( tr ( "Video" ),
368
                                   new VideoProjectPreferences,
369
                                   QIcon( ":/images/images/video.png" ),
370
371
                                   tr ( "Video settings" ) );
    m_projectPreferences->addWidget( tr ( "Audio" ),
372
                                   new AudioProjectPreferences,
373
                                   QIcon( ":/images/images/audio.png" ),
374
                                   tr ( "Audio settings" ) );
375
376
}

377

378
379
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
380
381
382
383
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
384
385
386

void MainWindow::on_actionPreferences_triggered()
{
387
   m_globalPreferences->show();
388
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
389
390
391
392
393

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

395
void MainWindow::on_actionTranscode_triggered()
396
{
397
398
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
399
    //Transcode::instance( this )->exec();
400
}
401

402
403
void    MainWindow::on_actionRender_triggered()
{
404
    if ( MainWorkflow::getInstance()->getLengthFrame() <= 0 )
405
    {
406
        QMessageBox::warning( NULL, tr ( "VLMC Renderer" ), tr( "There is nothing to render." ) );
407
408
        return ;
    }
409
410
    else
    {
411
        m_renderer->killRenderer();
412
413
        if ( m_fileRenderer )
            delete m_fileRenderer;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
414
        m_fileRenderer = new WorkflowFileRenderer();
415
416
        m_fileRenderer->initializeRenderer();
        m_fileRenderer->run();
417
    }
418
419
}

420
421
422
423
void MainWindow::on_actionNew_Project_triggered()
{
    //TODO : clear the library, the timeline, and show the configuration box
    //of the newly created project
424

425
    m_pWizard->restart();
426
    m_pWizard->show();
427
428
}

429
void    MainWindow::on_actionHelp_triggered()
430
431
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
432
433
}

434
void    MainWindow::zoomIn()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
435
436
437
438
{
    m_zoomSlider->setValue( m_zoomSlider->value() - 1 );
}

439
void    MainWindow::zoomOut()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
440
441
442
{
    m_zoomSlider->setValue( m_zoomSlider->value() + 1 );
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
443

444
void    MainWindow::on_actionFullscreen_triggered( bool checked )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
445
446
447
448
449
450
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
451

452
void    MainWindow::registerWidgetInWindowMenu( QDockWidget* widget )
453
{
454
    m_ui.menuWindow->addAction( widget->toggleViewAction() );
455
}
456

457
void    MainWindow::toolButtonClicked( int id )
458
459
460
{
    emit toolChanged( (ToolButtons)id );
}
461

462
463
464
465
466
467
468
469
470
471
472
void MainWindow::on_actionBypass_effects_engine_toggled(bool toggled)
{
    EffectsEngine*  ee;

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

474
475
void MainWindow::on_actionProject_Preferences_triggered()
{
476
  m_projectPreferences->show();
477
}
478

479
480
void    MainWindow::closeEvent( QCloseEvent* e )
{
481
    if ( ProjectManager::getInstance()->askForSaveIfModified() )
482
        e->accept();
483
484
    else
        e->ignore();
485
}
486

487
void    MainWindow::projectUpdated( const QString& projectName, bool savedStatus )
488
489
{
    QString title = tr( "VideoLAN Movie Creator" );
490
    title += " - ";
491
492
493
494
495
    title += projectName;
    if ( savedStatus == false )
        title += " *";
    setWindowTitle( title );
}
496

497
498
499
500
501
void    MainWindow::on_actionClose_Project_triggered()
{
    ProjectManager::getInstance()->closeProject();
}

502
503
504
505
506
507
508
509
510
511
void    MainWindow::on_actionUndo_triggered()
{
    UndoStack::getInstance( this )->undo();
}

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

512
#define INIT_SHORTCUT( instName, shortcutName, actionInstance  )      \
513
            QString instName = VLMC_GET_STRING( shortcutName ); \
514
            KeyboardShortcutHelper* helper##instName = new KeyboardShortcutHelper( shortcutName, m_ui.actionInstance, this ); \
515
            m_ui.actionInstance->setShortcut( instName );
516
517
518

void    MainWindow::initializeMenuKeyboardShortcut()
{
519
520
521
522
523
524
525
526
527
528
529
530
531
    INIT_SHORTCUT( help, "keyboard/help", actionHelp );
    INIT_SHORTCUT( quit, "keyboard/quit", actionQuit );
    INIT_SHORTCUT( preferences, "keyboard/preferences", actionPreferences );
    INIT_SHORTCUT( fullscreen, "keyboard/fullscreen", actionFullscreen );
    INIT_SHORTCUT( newProject, "keyboard/newproject", actionNew_Project );
    INIT_SHORTCUT( openProject, "keyboard/openproject", actionLoad_Project );
    INIT_SHORTCUT( save, "keyboard/save", actionSave );
    INIT_SHORTCUT( saveAs, "keyboard/saveas", actionSave_As );
    INIT_SHORTCUT( closeProject, "keyboard/closeproject", actionClose_Project );
    INIT_SHORTCUT( importProject, "keyboard/importmedia", actionImport );
    INIT_SHORTCUT( renderProject, "keyboard/renderproject", actionRender );
    INIT_SHORTCUT( undo, "keyboard/undo", actionUndo );
    INIT_SHORTCUT( redo, "keyboard/redo", actionRedo );
532
533
}

534
535
#undef INIT_SHORTCUT

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
536
537
void    MainWindow::on_actionCrash_triggered()
{
538
539
540
541
542
    //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
543
}
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
544
545
546
547

bool    MainWindow::restoreSession()
{
    QSettings   s;
548
    bool        fileCreated = false;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
549
550
    bool        ret = false;

551
552
    fileCreated = s.contains( "VlmcVersion" );
    if ( fileCreated == true )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
553
    {
554
555
556
557
558
559
560
561
        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
562
        {
563
564
565
566
567
568
569
570
571
            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
572
573
574
575
576
577
        }
    }
    s.setValue( "CleanQuit", false );
    s.sync();
    return ret;
}
578
579
580
581
582

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

584
585
586
587
588
589
590
591
592
593
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
594
#ifdef WITH_CRASHBUTTON
595
596
597
598
599
600
601
602
603
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