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 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

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 243

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

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 );
    }
265 266
}

267 268
#undef CREATE_MENU_SHORTCUT

269 270
void
MainWindow::setupLibrary()
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
271 272
{
    //GUI part :
273
    QWidget     *libraryWidget = new QWidget( this );
274
    libraryWidget->setMinimumWidth( 280 );
275 276 277 278 279

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

    StackViewController *nav = new StackViewController( libraryWidget );
280 281
    MediaListView   *mediaView = new MediaListView( nav, Library::getInstance() );
    nav->pushViewController( mediaView );
282
    libraryWidget->layout()->addWidget( button );
283

284
    m_importController = new ImportController();
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
285 286
    const ClipRenderer* clipRenderer = qobject_cast<const ClipRenderer*>( m_clipPreview->getGenericRenderer() );
    Q_ASSERT( clipRenderer != NULL );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
287

288
    DockWidgetManager::getInstance()->addDockedWidget( libraryWidget, QT_TRANSLATE_NOOP( "DockWidgetManager", "Media Library" ),
289 290 291
                                                    Qt::AllDockWidgetAreas,
                                                    QDockWidget::AllDockWidgetFeatures,
                                                    Qt::LeftDockWidgetArea );
292
    connect( mediaView, SIGNAL( clipSelected( Clip* ) ),
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
293
             clipRenderer, SLOT( setClip( Clip* ) ) );
294

295 296
    connect( Library::getInstance(), SIGNAL( clipRemoved( const QUuid& ) ),
             clipRenderer, SLOT( clipUnloaded( const QUuid& ) ) );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
297 298
}

299 300
void    MainWindow::on_actionSave_triggered()
{
301
    GUIProjectManager::getInstance()->saveProject();
302 303
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
304 305
void    MainWindow::on_actionSave_As_triggered()
{
306
    GUIProjectManager::getInstance()->saveProject( true );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
307 308
}

309 310
void    MainWindow::on_actionLoad_Project_triggered()
{
311
    GUIProjectManager* pm = GUIProjectManager::getInstance();
312
    pm->loadProject( pm->acquireProjectFileName() );
313 314
}

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

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

340
    //Shortcut part:
341 342
    KeyboardShortcutHelper* defaultModeShortcut = new KeyboardShortcutHelper( "keyboard/defaultmode", this );
    KeyboardShortcutHelper* cutModeShortcut = new KeyboardShortcutHelper( "keyboard/cutmode", this );
343 344 345
    connect( defaultModeShortcut, SIGNAL( activated() ), mouseTool, SLOT( click() ) );
    connect( cutModeShortcut, SIGNAL( activated() ), splitTool, SLOT( click() ) );

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

    // Zoom slider
363 364 365 366 367 368 369 370 371
    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
372
    m_zoomSlider->setInvertedAppearance( true );
373
    m_ui.statusbar->addPermanentWidget( m_zoomSlider );
374

Ludovic Fauvet's avatar
Ludovic Fauvet committed
375 376 377
    // Zoom IN
    QToolButton* zoomInButton = new QToolButton( this );
    zoomInButton->setIcon( QIcon( ":/images/zoomin" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
378
    zoomInButton->setStatusTip( tr( "Zoom in" ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
379 380 381
    m_ui.statusbar->addPermanentWidget( zoomInButton );
    connect( zoomInButton, SIGNAL( clicked() ),
             this, SLOT( zoomIn() ) );
382 383
}

384
void MainWindow::initializeDockWidgets( void )
385
{
386 387 388
    m_renderer = new WorkflowRenderer();
    m_renderer->initializeRenderer();
    m_timeline = new Timeline( m_renderer, this );
389 390 391
    m_timeline->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    m_timeline->show();
    setCentralWidget( m_timeline );
392

393
    DockWidgetManager *dockManager = DockWidgetManager::getInstance();
394

395 396
    m_clipPreview = new PreviewWidget( new ClipRenderer, this );
    dockManager->addDockedWidget( m_clipPreview,
397
                                  QT_TRANSLATE_NOOP( "DockWidgetManager", "Clip Preview" ),
geoff's avatar
geoff committed
398 399 400
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::TopDockWidgetArea );
401
    KeyboardShortcutHelper* clipShortcut = new KeyboardShortcutHelper( "keyboard/mediapreview", this );
402
    connect( clipShortcut, SIGNAL( activated() ), m_clipPreview, SLOT( on_pushButtonPlay_clicked() ) );
403

404
    m_projectPreview = new PreviewWidget( m_renderer, this );
405
    dockManager->addDockedWidget( m_projectPreview,
406
                                  QT_TRANSLATE_NOOP( "DockWidgetManager", "Project Preview" ),
407 408
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
409
                                  Qt::TopDockWidgetArea );
410
    KeyboardShortcutHelper* renderShortcut = new KeyboardShortcutHelper( "keyboard/renderpreview", this );
411
    connect( renderShortcut, SIGNAL( activated() ), m_projectPreview, SLOT( on_pushButtonPlay_clicked() ) );
412

413
    QDockWidget* dock = dockManager->addDockedWidget( UndoStack::getInstance( this ),
414
                                  QT_TRANSLATE_NOOP( "DockWidgetManager", "History" ),
415 416 417
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::LeftDockWidgetArea );
418 419
    if ( dock != 0 )
        dock->hide();
420
    setupLibrary();
421 422
}

423 424
void        MainWindow::createGlobalPreferences()
{
425
    m_globalPreferences = new Settings( SettingsManager::Vlmc, this );
426
    m_globalPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "general" ), SettingsManager::Vlmc,
427 428
                                   QIcon( ":/images/images/vlmc.png" ),
                                   tr ( "VLMC settings" ) );
429
    m_globalPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "keyboard" ), SettingsManager::Vlmc,
430 431
                                     QIcon( ":/images/keyboard" ),
                                     tr( "Keyboard Settings" ) );
432 433
}

434
void    MainWindow::createProjectPreferences()
435
{
436
    m_projectPreferences = new Settings( SettingsManager::Project, this );
437
    m_projectPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "general" ), SettingsManager::Project,
438 439
                                   QIcon( ":/images/images/vlmc.png" ),
                                   tr ( "Project settings" ) );
440
    m_projectPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "video" ), SettingsManager::Project,
441 442
                                   QIcon( ":/images/images/video.png" ),
                                   tr ( "Video settings" ) );
443
    m_projectPreferences->addCategory( QT_TRANSLATE_NOOP( "Settings", "audio" ), SettingsManager::Project,
444 445
                                   QIcon( ":/images/images/audio.png" ),
                                   tr ( "Audio settings" ) );
446 447
}

448

449 450
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
451 452 453 454
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
455 456 457

void MainWindow::on_actionPreferences_triggered()
{
458
   m_globalPreferences->show();
459
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
460 461 462

void MainWindow::on_actionAbout_triggered()
{
463
    About::getInstance()->exec();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
464
}
465

466
void MainWindow::on_actionTranscode_triggered()
467
{
468 469
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
470
    //Transcode::instance( this )->exec();
471
}
472

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

498 499 500
        if ( m_fileRenderer )
            delete m_fileRenderer;
        m_fileRenderer = new WorkflowFileRenderer();
501 502 503 504
        WorkflowFileRendererDialog  *dialog = new WorkflowFileRendererDialog( m_fileRenderer, width, height );
        dialog->setModal( true );
        dialog->setOutputFileName( outputFileName );

505
        m_fileRenderer->initializeRenderer();
506
        m_fileRenderer->run( outputFileName, width, height, fps, vbitrate, abitrate );
507 508
        dialog->exec();
        delete dialog;
509
    }
510 511
}

512 513
void MainWindow::on_actionNew_Project_triggered()
{
514
    m_pWizard->restart();
515
    m_pWizard->show();
516 517
}

518
void    MainWindow::on_actionHelp_triggered()
519 520
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
521 522
}

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

528
void    MainWindow::zoomOut()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
529 530 531
{
    m_zoomSlider->setValue( m_zoomSlider->value() + 1 );
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
532

533
void    MainWindow::on_actionFullscreen_triggered( bool checked )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
534 535 536 537 538 539
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
540

541
void    MainWindow::registerWidgetInWindowMenu( QDockWidget* widget )
542
{
543
    m_ui.menuWindow->addAction( widget->toggleViewAction() );
544
}
545

546
void    MainWindow::toolButtonClicked( int id )
547 548 549
{
    emit toolChanged( (ToolButtons)id );
}
550

551
void MainWindow::on_actionBypass_effects_engine_toggled(bool)
552
{
553 554 555 556 557 558 559
//    EffectsEngine*  ee;
//
//    ee = MainWorkflow::getInstance()->getEffectsEngine();
//    if (toggled)
//        ee->enable();
//    else
//       ee->disable();
560 561
    return ;
}
562

563 564
void MainWindow::on_actionProject_Preferences_triggered()
{
565
  m_projectPreferences->show();
566
}
567

568 569
void    MainWindow::closeEvent( QCloseEvent* e )
{
570 571
    GUIProjectManager   *pm = GUIProjectManager::getInstance();
    if ( pm->askForSaveIfModified() )
572
        e->accept();
573 574
    else
        e->ignore();
575
}
576

577
void    MainWindow::projectUpdated( const QString& projectName, bool savedStatus )
578 579
{
    QString title = tr( "VideoLAN Movie Creator" );
580
    title += " - ";
581 582 583 584 585
    title += projectName;
    if ( savedStatus == false )
        title += " *";
    setWindowTitle( title );
}
586

587 588
void    MainWindow::on_actionClose_Project_triggered()
{
589
    GUIProjectManager::getInstance()->closeProject();
590 591
}

592 593 594 595 596 597 598 599 600 601
void    MainWindow::on_actionUndo_triggered()
{
    UndoStack::getInstance( this )->undo();
}

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

602 603
void    MainWindow::on_actionCrash_triggered()
{
604 605 606 607 608
    //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 );
609
}
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
610 611 612 613

bool    MainWindow::restoreSession()
{
    QSettings   s;
614
    bool        fileCreated = false;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
615 616
    bool        ret = false;

617 618
    fileCreated = s.contains( "VlmcVersion" );
    if ( fileCreated == true )
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
619
    {
620
        bool        cleanQuit = s.value( "CleanQuit", true ).toBool();
621 622 623 624 625 626 627

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

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

650 651 652 653 654 655 656 657 658 659
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
660
#ifdef WITH_CRASHBUTTON
661 662 663 664 665 666 667 668 669
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
670