MainWindow.cpp 13 KB
Newer Older
Ludovic Fauvet's avatar
Ludovic Fauvet committed
1
/*****************************************************************************
2
 * MainWindow.cpp: VLMC MainWindow
Ludovic Fauvet's avatar
Ludovic Fauvet committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *****************************************************************************
 * Copyright (C) 2008-2009 the VLMC team
 *
 * Authors: Ludovic Fauvet <etix@l0cal.com>
 *
 * 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.
 *****************************************************************************/

23 24 25
#include <QLabel>
#include <QSizePolicy>
#include <QPalette>
Christophe Courtaut's avatar
Christophe Courtaut committed
26
#include <QDockWidget>
27
#include <QFileDialog>
28
#include <QSlider>
29
#include <QUndoView>
30
#include <QMessageBox>
31 32
#include <QDesktopServices>
#include <QUrl>
33
#include <QSettings>
34
#include <QStringList>
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
35

Ludovic Fauvet's avatar
Ludovic Fauvet committed
36
#include "MainWindow.h"
37
#include "MediaListWidget.h"
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
38 39
#include "LibraryWidget.h"
#include "Library.h"
40
#include "Timeline.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
41
#include "About.h"
42
#include "FileBrowser.h"
43
#include "WorkflowRenderer.h"
44
#include "ClipRenderer.h"
45
#include "UndoStack.h"
46
#include "ClipProperty.h"
47
#include "PreviewWidget.h"
48 49
#include "PreferenceWidget.h"
#include "ProjectPreferences.h"
50
#include "ProjectManager.h"
51 52 53
#include "AudioProjectPreferences.h"
#include "VideoProjectPreferences.h"
#include "VLMCPreferences.h"
54
#include "Import.h"
55
#include "MediaLibraryWidget.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
56 57

MainWindow::MainWindow( QWidget *parent ) :
58
    QMainWindow( parent ), m_renderer( NULL )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
59 60
{
    m_ui.setupUi( this );
61
    DockWidgetManager::instance( this )->setMainWindow( this );
62
    initializeDockWidgets();
63
    createStatusBar();
64
    createGlobalPreferences();
65
    createProjectPreferences();
66

Ludovic Fauvet's avatar
Ludovic Fauvet committed
67
    // Translations
68 69
    connect( this, SIGNAL( translateDockWidgetTitle() ),
             DockWidgetManager::instance(), SLOT( transLateWidgetTitle() ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
70 71

    // Zoom
72 73
    connect( m_zoomSlider, SIGNAL( valueChanged( int ) ),
             m_timeline, SLOT( changeZoom( int ) ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
74 75 76 77
    connect( m_timeline->tracksView(), SIGNAL( zoomIn() ),
             this, SLOT( zoomIn() ) );
    connect( m_timeline->tracksView(), SIGNAL( zoomOut() ),
             this, SLOT( zoomOut() ) );
78 79
    connect( this, SIGNAL( toolChanged( ToolButtons ) ),
             m_timeline, SLOT( setTool( ToolButtons ) ) );
80 81 82 83 84 85

    QSettings s;
    // Restore the geometry
    restoreGeometry( s.value( "MainWindowGeometry" ).toByteArray() );
    // Restore the layout
    restoreState( s.value( "MainWindowState" ).toByteArray() );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
86 87
}

88 89
MainWindow::~MainWindow()
{
90 91 92 93 94 95 96
    QSettings s;
    // Save the current geometry
    s.setValue( "MainWindowGeometry", saveGeometry() );
    // Save the current layout
    s.setValue( "MainWindowState", saveState() );
    s.sync();

97 98
    if ( m_renderer )
        delete m_renderer;
99
    MetaDataManager::destroyInstance();
100
    LibVLCpp::Instance::destroyInstance();
101 102
}

Ludovic Fauvet's avatar
Ludovic Fauvet committed
103 104 105 106 107 108
void MainWindow::changeEvent( QEvent *e )
{
    switch ( e->type() )
    {
    case QEvent::LanguageChange:
        m_ui.retranslateUi( this );
109
        emit translateDockWidgetTitle();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
110 111 112 113 114 115
        break;
    default:
        break;
    }
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
116 117 118 119 120 121
void        MainWindow::setupLibrary()
{
    //Library part :
    Library*    library = Library::getInstance();

    //GUI part :
122
    MediaLibraryWidget* mediaLibraryWidget = new MediaLibraryWidget( this );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
123

124 125 126 127 128 129
    DockWidgetManager::instance()->addDockedWidget( mediaLibraryWidget,
                                                    tr( "Media Library" ),
                                                    Qt::AllDockWidgetAreas,
                                                    QDockWidget::AllDockWidgetFeatures,
                                                    Qt::LeftDockWidgetArea );

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
130
    //Connecting GUI and Frontend :
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
131 132
    connect( mediaLibraryWidget, SIGNAL( mediaSelected( Media* ) ),
             m_clipPreview->getGenericRenderer(), SLOT( setMedia( Media* ) ) );
133

134 135
    connect( Library::getInstance(), SIGNAL( mediaRemoved( const QUuid& ) ),
             m_clipPreview->getGenericRenderer(), SLOT( mediaUnloaded( QUuid ) ) );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
136 137
}

138 139 140 141 142 143 144 145 146 147
void    MainWindow::on_actionSave_triggered()
{
    QString outputFileName =
            QFileDialog::getSaveFileName( NULL, "Enter the output file name",
                                          QString(), "VLMC project file(*.vlmc)" );
    if ( outputFileName.length() == 0 )
        return ;
    else
    {
        //Project manager will destroy itself.
148 149 150 151 152 153 154
        QStringList list = outputFileName.split( "." );
        if ( list.at( list.size() - 1 ) != "vlmc" )
        {
            list.append( "vlmc" );
            outputFileName = list.join(".");
        }

155 156 157 158 159
        ProjectManager* pm = new ProjectManager( outputFileName );
        pm->saveProject();
    }
}

160 161 162
void    MainWindow::on_actionLoad_Project_triggered()
{
    QString outputFileName =
163
            QFileDialog::getOpenFileName( NULL, "Enter the output file name",
164 165 166 167 168 169 170 171 172 173 174
                                          QString(), "VLMC project file(*.vlmc)" );
    if ( outputFileName.length() == 0 )
        return ;
    else
    {
        //Project manager will destroy itself.
        ProjectManager* pm = new ProjectManager( outputFileName );
        pm->loadProject();
    }
}

175 176
void MainWindow::createStatusBar()
{
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
    // Mouse (default) tool
    QToolButton* mouseTool = new QToolButton( this );
    mouseTool->setCheckable( true );
    mouseTool->setIcon( QIcon( ":/images/mouse" ) );
    m_ui.statusbar->addPermanentWidget( mouseTool );

    // Cut/Split tool
    QToolButton* splitTool = new QToolButton( this );
    splitTool->setCheckable( true );
    splitTool->setIcon( QIcon( ":/images/editcut" ) );
    m_ui.statusbar->addPermanentWidget( splitTool );

    // Group the two previous buttons
    QButtonGroup* toolButtonGroup = new QButtonGroup( this );
    toolButtonGroup->addButton( mouseTool, TOOL_DEFAULT);
    toolButtonGroup->addButton( splitTool, TOOL_CUT );
    toolButtonGroup->setExclusive( true );
    mouseTool->setChecked( true );

    connect( toolButtonGroup, SIGNAL( buttonClicked( int ) ),
             this, SLOT( toolButtonClicked( int ) ) );

    // Spacer
    QWidget* spacer = new QWidget( this );
    spacer->setFixedWidth( 20 );
    m_ui.statusbar->addPermanentWidget( spacer );

    // Zoom IN
    QToolButton* zoomInButton = new QToolButton( this );
    zoomInButton->setIcon( QIcon( ":/images/zoomin" ) );
    m_ui.statusbar->addPermanentWidget( zoomInButton );
    connect( zoomInButton, SIGNAL( clicked() ),
             this, SLOT( zoomIn() ) );

    // Zoom slider
212 213 214 215 216 217 218 219 220 221
    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 );
    m_ui.statusbar->addPermanentWidget( m_zoomSlider );
222 223 224 225 226 227 228

    // Zoom Out
    QToolButton* zoomOutButton = new QToolButton( this );
    zoomOutButton->setIcon( QIcon( ":/images/zoomout" ) );
    m_ui.statusbar->addPermanentWidget( zoomOutButton );
    connect( zoomOutButton, SIGNAL( clicked() ),
             this, SLOT( zoomOut() ) );
229 230
}

231
void MainWindow::initializeDockWidgets( void )
232
{
233 234 235 236
    m_timeline = new Timeline( this );
    m_timeline->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    m_timeline->show();
    setCentralWidget( m_timeline );
237

238
    DockWidgetManager *dockManager = DockWidgetManager::instance();
239 240 241 242 243
    dockManager->addDockedWidget( new FileBrowser( this ),
                                  tr( "FileBrowser" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::TopDockWidgetArea);
244

245 246
    m_clipPreview = new PreviewWidget( new ClipRenderer, this );
    dockManager->addDockedWidget( m_clipPreview,
247
                                  tr( "Clip Preview" ),
geoff's avatar
geoff committed
248 249 250
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::TopDockWidgetArea );
251

252
    m_projectPreview = new PreviewWidget( new WorkflowRenderer(), this );
253
    dockManager->addDockedWidget( m_projectPreview,
254 255 256
                                  tr( "Project Preview" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
257
                                  Qt::TopDockWidgetArea );
258

259
    dockManager->addDockedWidget( UndoStack::getInstance( this ),
260 261 262 263
                                  tr( "History" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
                                  Qt::LeftDockWidgetArea );
264
    setupLibrary();
265
    m_metaDataManager = MetaDataManager::getInstance();
266 267
}

268 269
void        MainWindow::createGlobalPreferences()
{
Ludovic Fauvet's avatar
Ludovic Fauvet committed
270
    m_globalPreferences = new Settings( this );
271
    m_globalPreferences->addWidget("VLMC",
Ludovic Fauvet's avatar
Ludovic Fauvet committed
272
                                   new VLMCPreferences( m_globalPreferences ),
273 274
                                   "../images/vlmc.png",
                                   "VLMC settings");
275 276 277
    m_globalPreferences->build();
}

278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
void	    MainWindow::createProjectPreferences()
{
    m_projectPreferences = new Settings(  );
    m_projectPreferences->addWidget("Project",
                                   new ProjectPreferences,
                                   "../images/vlmc.png",
                                   "Project settings");
    m_projectPreferences->addWidget("Video",
                                   new VideoProjectPreferences,
                                   "../images/scalable/video.svg",
                                   "Video settings");
    m_projectPreferences->addWidget("Audio",
                                   new AudioProjectPreferences,
                                   "../images/scalable/audio.svg",
                                   "Audio settings");
    m_projectPreferences->build();
}

296 297
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
298 299 300 301
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
302 303 304

void MainWindow::on_actionPreferences_triggered()
{
305
   m_globalPreferences->show();
306
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
307 308 309 310 311

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

313
void MainWindow::on_actionTranscode_triggered()
314
{
315 316
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
317
    //Transcode::instance( this )->exec();
318
}
319

320 321 322 323 324 325 326 327 328
void    MainWindow::on_actionRender_triggered()
{
    if ( MainWorkflow::getInstance()->getLength() <= 0 )
    {
        QMessageBox::warning( NULL, "VLMC Renderer", "There is nothing to render." );
        return ;
    }
    QString outputFileName =
            QFileDialog::getSaveFileName( NULL, "Enter the output file name",
329
                                          QDir::currentPath(), "Videos(*.avi *.mpg)" );
330 331 332 333 334 335
    if ( outputFileName.length() == 0 )
        return ;
    else
    {
        if ( m_renderer )
            delete m_renderer;
336
        m_renderer = new WorkflowFileRenderer( outputFileName );
337 338 339 340
        m_renderer->run();
    }
}

341 342 343 344
void MainWindow::on_actionNew_Project_triggered()
{
    //TODO : clear the library, the timeline, and show the configuration box
    //of the newly created project
345 346

    m_projectPreferences->show();
347 348
}

349
void    MainWindow::on_actionHelp_triggered()
350 351
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
352 353
}

354 355
void    MainWindow::on_actionImport_triggered()
{
Thomas Boquet's avatar
Thomas Boquet committed
356 357
    //Import* import = new Import( );
    //import->exec();
358 359
}

360
void    MainWindow::zoomIn()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
361 362 363 364
{
    m_zoomSlider->setValue( m_zoomSlider->value() - 1 );
}

365
void    MainWindow::zoomOut()
Ludovic Fauvet's avatar
Ludovic Fauvet committed
366 367 368
{
    m_zoomSlider->setValue( m_zoomSlider->value() + 1 );
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
369

370
void    MainWindow::on_actionFullscreen_triggered( bool checked )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
371 372 373 374 375 376
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
377

378
void    MainWindow::registerWidgetInWindowMenu( QDockWidget* widget )
379
{
380
    m_ui.menuWindow->addAction( widget->toggleViewAction() );
381
}
382 383 384 385

void    MainWindow::mediaListItemDoubleClicked( QListWidgetItem* qItem )
{
    ListViewMediaItem* item = static_cast<ListViewMediaItem*>( qItem );
386
    ClipProperty* mp = new ClipProperty( item->getClip(), this );
387 388
    mp->show();
}
389

390
void    MainWindow::toolButtonClicked( int id )
391 392 393
{
    emit toolChanged( (ToolButtons)id );
}
394

395 396 397 398 399 400 401 402 403 404 405
void MainWindow::on_actionBypass_effects_engine_toggled(bool toggled)
{
    EffectsEngine*  ee;

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

407 408
void MainWindow::on_actionProject_Preferences_triggered()
{
Vincent Carrubba's avatar
Vincent Carrubba committed
409
    m_projectPreferences->show();
410
}