MainWindow.cpp 25.2 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 Beauzée-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
#include "ImportController.h"
49
#include "MediaLibrary.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

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
        //If a project was opened from the command line: don't show the wizard.
132 133
        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
void MainWindow::changeEvent( QEvent *e )
{
    switch ( e->type() )
    {
    case QEvent::LanguageChange:
        m_ui.retranslateUi( this );
159
        DockWidgetManager::getInstance()->retranslateUi();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
160 161 162 163 164 165
        break;
    default:
        break;
    }
}

166 167 168 169 170
//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 );

171 172 173
void
MainWindow::initVlmcPreferences()
{
174

175 176 177 178 179 180 181 182 183 184 185 186
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/defaultmode", "n",
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Select mode" ),
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Select the selection tool in the timeline" ) );
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/cutmode", "x",
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Cut mode" ),
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Select the cut/razor tool in the timeline" ) );
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/mediapreview", "Ctrl+Return",
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Media preview" ),
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Preview the selected media, or pause the current preview" ) );
    VLMC_CREATE_PREFERENCE_KEYBOARD( "keyboard/renderpreview", "Space",
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Render preview" ),
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Preview the project, or pause the current preview" ) );
187
    //A bit nasty, but we better use what Qt's providing as default shortcut
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
    CREATE_MENU_SHORTCUT( "keyboard/undo",
                          QKeySequence( QKeySequence::Undo ).toString().toLocal8Bit(),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Undo" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Undo the last action" ), actionUndo );
    CREATE_MENU_SHORTCUT( "keyboard/redo",
                          QKeySequence( QKeySequence::Redo ).toString().toLocal8Bit(),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Redo" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Redo the last action" ), actionRedo );
    CREATE_MENU_SHORTCUT( "keyboard/help",
                          QKeySequence( QKeySequence::HelpContents ).toString().toLocal8Bit(),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Help" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Toggle the help page" ), actionHelp );
    CREATE_MENU_SHORTCUT( "keyboard/quit", "Ctrl+Q",
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Quit" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Quit VLMC" ), actionQuit );
    CREATE_MENU_SHORTCUT( "keyboard/preferences", "Alt+P",
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Preferences" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Open VLMC preferences" ), actionPreferences );
    CREATE_MENU_SHORTCUT( "keyboard/fullscreen", "F",
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Fullscreen" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Switch to fullscreen mode" ), actionFullscreen );
    CREATE_MENU_SHORTCUT( "keyboard/newproject",
                          QKeySequence( QKeySequence::New ).toString().toLocal8Bit(),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "New project" ),
212
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Open the new project wizard" ), actionNew_Project );
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
    CREATE_MENU_SHORTCUT( "keyboard/openproject",
                          QKeySequence( QKeySequence::Open ).toString().toLocal8Bit(),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Open a project" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Open an existing project" ), actionLoad_Project );
    CREATE_MENU_SHORTCUT( "keyboard/save",
                          QKeySequence( QKeySequence::Save ).toString().toLocal8Bit(),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Save" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Save the current project" ), actionSave );
    CREATE_MENU_SHORTCUT( "keyboard/saveas", "Ctrl+Shift+S",
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Save as" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Save the current project to a new file" ), actionSave_As );
    CREATE_MENU_SHORTCUT( "keyboard/closeproject",
                          QKeySequence( QKeySequence::Close ).toString().toLocal8Bit(),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Close the project" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Close the current project" ), actionClose_Project );
    CREATE_MENU_SHORTCUT( "keyboard/importmedia", "Ctrl+I",
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Import media" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Open the import window" ), actionImport );
    CREATE_MENU_SHORTCUT( "keyboard/renderproject", "Ctrl+R",
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Render the project" ),
                          QT_TRANSLATE_NOOP( "PreferenceWidget", "Render the project to a file" ), actionRender );

    VLMC_CREATE_PREFERENCE_LANGUAGE( "general/VLMCLang", "default",
236
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Language" ),
237
                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "The VLMC's UI language" ) );
238 239 240 241
    SettingsManager::getInstance()->watchValue( "general/VLMCLang",
                                                LanguageHelper::getInstance(),
                                                SLOT( languageChanged( const QVariant& ) ),
                                                SettingsManager::Vlmc );
242
    VLMC_CREATE_PREFERENCE_BOOL( "general/ConfirmDeletion", true,
243
                                 QT_TRANSLATE_NOOP( "PreferenceWidget", "Confirm clip deletion"),
244
                                 QT_TRANSLATE_NOOP( "PreferenceWidget", "Ask for confirmation before deleting a clip from the timeline" ) );
245 246

    //Load saved preferences :
247 248 249 250 251 252 253 254 255
    QSettings       s;
    if ( s.value( "VlmcVersion" ).toString() != PROJECT_VERSION )
        s.clear();
    else
    {
        loadVlmcPreferences( "keyboard" );
        loadVlmcPreferences( "general" );
    }
    s.setValue( "VlmcVersion", PROJECT_VERSION );
256 257 258 259 260 261 262 263 264 265 266 267
}

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 );
    }
268 269
}

270 271
#undef CREATE_MENU_SHORTCUT

272 273
void
MainWindow::setupLibrary()
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
274
{
275
    m_importController = new ImportController();
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
276 277
    const ClipRenderer* clipRenderer = qobject_cast<const ClipRenderer*>( m_clipPreview->getGenericRenderer() );
    Q_ASSERT( clipRenderer != NULL );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
278

279 280 281
    MediaLibrary    *mediaLibrary = new MediaLibrary();

    DockWidgetManager::getInstance()->addDockedWidget( mediaLibrary, QT_TRANSLATE_NOOP( "DockWidgetManager", "Media Library" ),
282 283 284
                                                    Qt::AllDockWidgetAreas,
                                                    QDockWidget::AllDockWidgetFeatures,
                                                    Qt::LeftDockWidgetArea );
285
    connect( mediaLibrary, SIGNAL( clipSelected( Clip* ) ),
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
286
             clipRenderer, SLOT( setClip( Clip* ) ) );
287 288
    connect( mediaLibrary, SIGNAL( importRequired() ),
             this, SLOT( on_actionImport_triggered() ) );
289 290
    connect( Library::getInstance(), SIGNAL( clipRemoved( const QUuid& ) ),
             clipRenderer, SLOT( clipUnloaded( const QUuid& ) ) );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
291 292
}

293 294
void    MainWindow::on_actionSave_triggered()
{
295
    GUIProjectManager::getInstance()->saveProject();
296 297
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
298 299
void    MainWindow::on_actionSave_As_triggered()
{
300
    GUIProjectManager::getInstance()->saveProject( true );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
301 302
}

303 304
void    MainWindow::on_actionLoad_Project_triggered()
{
305
    GUIProjectManager* pm = GUIProjectManager::getInstance();
306
    pm->loadProject( pm->acquireProjectFileName() );
307 308
}

309 310
void MainWindow::createStatusBar()
{
311 312
    // Mouse (default) tool
    QToolButton* mouseTool = new QToolButton( this );
313
    mouseTool->setAutoRaise( true );
314 315
    mouseTool->setCheckable( true );
    mouseTool->setIcon( QIcon( ":/images/mouse" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
316
    mouseTool->setStatusTip( tr( "Use the mouse tool to manipulate regions in the timeline" ) );
317 318 319 320
    m_ui.statusbar->addPermanentWidget( mouseTool );

    // Cut/Split tool
    QToolButton* splitTool = new QToolButton( this );
321
    splitTool->setAutoRaise( true );
322 323
    splitTool->setCheckable( true );
    splitTool->setIcon( QIcon( ":/images/editcut" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
324
    splitTool->setStatusTip( tr( "Use the scissors to cut regions in the timeline" ) );
325 326 327 328 329 330 331 332 333
    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 );

334
    //Shortcut part:
335 336
    KeyboardShortcutHelper* defaultModeShortcut = new KeyboardShortcutHelper( "keyboard/defaultmode", this );
    KeyboardShortcutHelper* cutModeShortcut = new KeyboardShortcutHelper( "keyboard/cutmode", this );
337 338 339
    connect( defaultModeShortcut, SIGNAL( activated() ), mouseTool, SLOT( click() ) );
    connect( cutModeShortcut, SIGNAL( activated() ), splitTool, SLOT( click() ) );

340 341 342 343 344 345 346 347
    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
348 349 350
    // Zoom Out
    QToolButton* zoomOutButton = new QToolButton( this );
    zoomOutButton->setIcon( QIcon( ":/images/zoomout" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
351
    zoomOutButton->setStatusTip( tr( "Zoom out" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
352 353 354
    m_ui.statusbar->addPermanentWidget( zoomOutButton );
    connect( zoomOutButton, SIGNAL( clicked() ),
             this, SLOT( zoomOut() ) );
355 356

    // Zoom slider
357 358 359 360 361 362 363 364 365
    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
366
    m_zoomSlider->setInvertedAppearance( true );
367
    m_ui.statusbar->addPermanentWidget( m_zoomSlider );
368

Ludovic Fauvet's avatar
Ludovic Fauvet committed
369 370 371
    // Zoom IN
    QToolButton* zoomInButton = new QToolButton( this );
    zoomInButton->setIcon( QIcon( ":/images/zoomin" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
372
    zoomInButton->setStatusTip( tr( "Zoom in" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
373 374 375
    m_ui.statusbar->addPermanentWidget( zoomInButton );
    connect( zoomInButton, SIGNAL( clicked() ),
             this, SLOT( zoomIn() ) );
376 377
}

378
void MainWindow::initializeDockWidgets( void )
379
{
380 381 382
    m_renderer = new WorkflowRenderer();
    m_renderer->initializeRenderer();
    m_timeline = new Timeline( m_renderer, this );
383 384 385
    m_timeline->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    m_timeline->show();
    setCentralWidget( m_timeline );
386

387
    DockWidgetManager *dockManager = DockWidgetManager::getInstance();
388

389 390
    m_clipPreview = new PreviewWidget( new ClipRenderer, this );
    dockManager->addDockedWidget( m_clipPreview,
391
                                  QT_TRANSLATE_NOOP( "DockWidgetManager", "Clip Preview" ),
geoff's avatar
geoff committed
392 393 394
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::TopDockWidgetArea );
395
    KeyboardShortcutHelper* clipShortcut = new KeyboardShortcutHelper( "keyboard/mediapreview", this );
396
    connect( clipShortcut, SIGNAL( activated() ), m_clipPreview, SLOT( on_pushButtonPlay_clicked() ) );
397

398
    m_projectPreview = new PreviewWidget( m_renderer, this );
399
    dockManager->addDockedWidget( m_projectPreview,
400
                                  QT_TRANSLATE_NOOP( "DockWidgetManager", "Project Preview" ),
401 402
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
403
                                  Qt::TopDockWidgetArea );
404
    KeyboardShortcutHelper* renderShortcut = new KeyboardShortcutHelper( "keyboard/renderpreview", this );
405
    connect( renderShortcut, SIGNAL( activated() ), m_projectPreview, SLOT( on_pushButtonPlay_clicked() ) );
406

407
    QDockWidget* dock = dockManager->addDockedWidget( UndoStack::getInstance( this ),
408
                                  QT_TRANSLATE_NOOP( "DockWidgetManager", "History" ),
409 410 411
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::LeftDockWidgetArea );
412 413
    if ( dock != 0 )
        dock->hide();
414
    setupLibrary();
415 416
}

417 418
void        MainWindow::createGlobalPreferences()
{
419
    m_globalPreferences = new Settings( SettingsManager::Vlmc, this );
420
    m_globalPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "general" ), SettingsManager::Vlmc,
421 422
                                   QIcon( ":/images/images/vlmc.png" ),
                                   tr ( "VLMC settings" ) );
423
    m_globalPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "keyboard" ), SettingsManager::Vlmc,
424 425
                                     QIcon( ":/images/keyboard" ),
                                     tr( "Keyboard Settings" ) );
426 427
}

428
void    MainWindow::createProjectPreferences()
429
{
430
    m_projectPreferences = new Settings( SettingsManager::Project, this );
431
    m_projectPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "general" ), SettingsManager::Project,
432 433
                                   QIcon( ":/images/images/vlmc.png" ),
                                   tr ( "Project settings" ) );
434
    m_projectPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "video" ), SettingsManager::Project,
435 436
                                   QIcon( ":/images/images/video.png" ),
                                   tr ( "Video settings" ) );
437
    m_projectPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "audio" ), SettingsManager::Project,
438 439
                                   QIcon( ":/images/images/audio.png" ),
                                   tr ( "Audio settings" ) );
440 441
}

442

443 444
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
445 446 447 448
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
449 450 451

void MainWindow::on_actionPreferences_triggered()
{
452
   m_globalPreferences->show();
453
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
454 455 456

void MainWindow::on_actionAbout_triggered()
{
457
    About::getInstance()->exec();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
458
}
459

460
void MainWindow::on_actionTranscode_triggered()
461
{
462 463
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
464
    //Transcode::instance( this )->exec();
465
}
466

467 468
void    MainWindow::on_actionRender_triggered()
{
469
    if ( MainWorkflow::getInstance()->getLengthFrame() <= 0 )
470
    {
471
        QMessageBox::warning( NULL, tr ( "VLMC Renderer" ), tr( "There is nothing to render." ) );
472 473
        return ;
    }
474 475
    else
    {
476
        m_renderer->killRenderer();
477 478 479 480 481 482 483 484 485 486 487 488 489 490
        //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;
491

492 493 494
        if ( m_fileRenderer )
            delete m_fileRenderer;
        m_fileRenderer = new WorkflowFileRenderer();
495 496 497 498
        WorkflowFileRendererDialog  *dialog = new WorkflowFileRendererDialog( m_fileRenderer, width, height );
        dialog->setModal( true );
        dialog->setOutputFileName( outputFileName );

499
        m_fileRenderer->initializeRenderer();
500
        m_fileRenderer->run( outputFileName, width, height, fps, vbitrate, abitrate );
501 502
        dialog->exec();
        delete dialog;
503
    }
504 505
}

506 507
void MainWindow::on_actionNew_Project_triggered()
{
508
    m_pWizard->restart();
509
    m_pWizard->show();
510 511
}

512
void    MainWindow::on_actionHelp_triggered()
513 514
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
515 516
}

517
void    MainWindow::zoomIn()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
518 519 520 521
{
    m_zoomSlider->setValue( m_zoomSlider->value() - 1 );
}

522
void    MainWindow::zoomOut()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
523 524 525
{
    m_zoomSlider->setValue( m_zoomSlider->value() + 1 );
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
526

527
void    MainWindow::on_actionFullscreen_triggered( bool checked )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
528 529 530 531 532 533
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
534

535
void    MainWindow::registerWidgetInWindowMenu( QDockWidget* widget )
536
{
537
    m_ui.menuWindow->addAction( widget->toggleViewAction() );
538
}
539

540
void    MainWindow::toolButtonClicked( int id )
541 542 543
{
    emit toolChanged( (ToolButtons)id );
}
544

545
void MainWindow::on_actionBypass_effects_engine_toggled(bool)
546
{
547 548 549 550 551 552 553
//    EffectsEngine*  ee;
//
//    ee = MainWorkflow::getInstance()->getEffectsEngine();
//    if (toggled)
//        ee->enable();
//    else
//       ee->disable();
554 555
    return ;
}
556

557 558
void MainWindow::on_actionProject_Preferences_triggered()
{
559
  m_projectPreferences->show();
560
}
561

562 563
void    MainWindow::closeEvent( QCloseEvent* e )
{
564 565
    GUIProjectManager   *pm = GUIProjectManager::getInstance();
    if ( pm->askForSaveIfModified() )
566
        e->accept();
567 568
    else
        e->ignore();
569
}
570

571
void    MainWindow::projectUpdated( const QString& projectName, bool savedStatus )
572 573
{
    QString title = tr( "VideoLAN Movie Creator" );
574
    title += " - ";
575 576 577 578 579
    title += projectName;
    if ( savedStatus == false )
        title += " *";
    setWindowTitle( title );
}
580

581 582
void    MainWindow::on_actionClose_Project_triggered()
{
583
    GUIProjectManager::getInstance()->closeProject();
584 585
}

586 587 588 589 590 591 592 593 594 595
void    MainWindow::on_actionUndo_triggered()
{
    UndoStack::getInstance( this )->undo();
}

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

596 597
void    MainWindow::on_actionCrash_triggered()
{
598 599 600 601 602
    //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 );
603
}
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
604 605 606 607

bool    MainWindow::restoreSession()
{
    QSettings   s;
608
    bool        fileCreated = false;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
609 610
    bool        ret = false;

611 612
    fileCreated = s.contains( "VlmcVersion" );
    if ( fileCreated == true )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
613
    {
614
        bool        cleanQuit = s.value( "CleanQuit", true ).toBool();
615 616 617 618 619 620 621

        // 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
622
        {
623
            QMessageBox::StandardButton res = QMessageBox::question( this, tr( "Crash recovery" ), tr( "VLMC didn't closed nicely. Do you wan't to recover your project?" ),
624 625 626
                                   QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes );
            if ( res == QMessageBox::Yes )
            {
627
                if ( GUIProjectManager::getInstance()->loadEmergencyBackup() == true )
628 629
                    ret = true;
                else
630
                    QMessageBox::warning( this, tr( "Can't restore project" ), tr( "VLMC didn't manage to restore your project. We apology for the inconvenience" ) );
631
            }
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
632 633 634 635 636 637
        }
    }
    s.setValue( "CleanQuit", false );
    s.sync();
    return ret;
}
638 639 640 641 642

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

644 645 646 647 648 649 650 651 652 653
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
654
#ifdef WITH_CRASHBUTTON
655 656 657 658 659 660 661 662 663
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
664