MainWindow.cpp 25.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
#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
    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
{
    //GUI part :
276
    QWidget     *libraryWidget = new QWidget( this );
277
    libraryWidget->setMinimumWidth( 280 );
278 279 280 281 282

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

    StackViewController *nav = new StackViewController( libraryWidget );
283 284
    MediaListView   *mediaView = new MediaListView( nav, Library::getInstance() );
    nav->pushViewController( mediaView );
285
    libraryWidget->layout()->addWidget( button );
286

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

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

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

302 303
void    MainWindow::on_actionSave_triggered()
{
304
    GUIProjectManager::getInstance()->saveProject();
305 306
}

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

312 313
void    MainWindow::on_actionLoad_Project_triggered()
{
314
    GUIProjectManager* pm = GUIProjectManager::getInstance();
315
    pm->loadProject( pm->acquireProjectFileName() );
316 317
}

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

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

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

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

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

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

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

396
    DockWidgetManager *dockManager = DockWidgetManager::getInstance();
397

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

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

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

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

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

451

452 453
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
454 455 456 457
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
458 459 460

void MainWindow::on_actionPreferences_triggered()
{
461
   m_globalPreferences->show();
462
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
463 464 465

void MainWindow::on_actionAbout_triggered()
{
466
    About::getInstance()->exec();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
467
}
468

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

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

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

508
        m_fileRenderer->initializeRenderer();
509
        m_fileRenderer->run( outputFileName, width, height, fps, vbitrate, abitrate );
510 511
        dialog->exec();
        delete dialog;
512
    }
513 514
}

515 516
void MainWindow::on_actionNew_Project_triggered()
{
517
    m_pWizard->restart();
518
    m_pWizard->show();
519 520
}

521
void    MainWindow::on_actionHelp_triggered()
522 523
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
524 525
}

526
void    MainWindow::zoomIn()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
527 528 529 530
{
    m_zoomSlider->setValue( m_zoomSlider->value() - 1 );
}

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

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

544
void    MainWindow::registerWidgetInWindowMenu( QDockWidget* widget )
545
{
546
    m_ui.menuWindow->addAction( widget->toggleViewAction() );
547
}
548

549
void    MainWindow::toolButtonClicked( int id )
550 551 552
{
    emit toolChanged( (ToolButtons)id );
}
553

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

566 567
void MainWindow::on_actionProject_Preferences_triggered()
{
568
  m_projectPreferences->show();
569
}
570

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

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

590 591
void    MainWindow::on_actionClose_Project_triggered()
{
592
    GUIProjectManager::getInstance()->closeProject();
593 594
}

595 596 597 598 599 600 601 602 603 604
void    MainWindow::on_actionUndo_triggered()
{
    UndoStack::getInstance( this )->undo();
}

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

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

bool    MainWindow::restoreSession()
{
    QSettings   s;
617
    bool        fileCreated = false;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
618 619
    bool        ret = false;

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

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

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

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