MainWindow.cpp 12.6 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>
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
30

Ludovic Fauvet's avatar
Ludovic Fauvet committed
31
#include "MainWindow.h"
32
#include "MediaListWidget.h"
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
33 34
#include "LibraryWidget.h"
#include "Library.h"
35
#include "Timeline.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
36
#include "About.h"
37
#include "Transcode.h"
38
#include "FileBrowser.h"
39
#include "WorkflowRenderer.h"
40
#include "ClipRenderer.h"
41
#include "UndoStack.h"
42
#include "ClipProperty.h"
43
#include "PreviewWidget.h"
44 45
#include "PreferenceWidget.h"
#include "ProjectPreferences.h"
46
#include "ProjectManager.h"
47 48 49
#include "AudioProjectPreferences.h"
#include "VideoProjectPreferences.h"
#include "VLMCPreferences.h"
Ludovic Fauvet's avatar
Ludovic Fauvet committed
50 51

MainWindow::MainWindow( QWidget *parent ) :
52
    QMainWindow( parent ), m_renderer( NULL )
Ludovic Fauvet's avatar
Ludovic Fauvet committed
53 54
{
    m_ui.setupUi( this );
55
    DockWidgetManager::instance( this )->setMainWindow( this );
56
    initializeDockWidgets();
57
    createStatusBar();
58
    createGlobalPreferences();
59

Ludovic Fauvet's avatar
Ludovic Fauvet committed
60
    // Translation
61 62
    connect( this, SIGNAL( translateDockWidgetTitle() ),
             DockWidgetManager::instance(), SLOT( transLateWidgetTitle() ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
63 64

    // Zoom
65 66
    connect( m_zoomSlider, SIGNAL( valueChanged( int ) ),
             m_timeline, SLOT( changeZoom( int ) ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
67 68 69 70
    connect( m_timeline->tracksView(), SIGNAL( zoomIn() ),
             this, SLOT( zoomIn() ) );
    connect( m_timeline->tracksView(), SIGNAL( zoomOut() ),
             this, SLOT( zoomOut() ) );
71 72
    connect( this, SIGNAL( toolChanged( ToolButtons ) ),
             m_timeline, SLOT( setTool( ToolButtons ) ) );
73 74 75 76 77 78

    //Global Preferences
    QObject::connect( qApp,
                      SIGNAL( aboutToQuit() ),
                      m_globalPreferences,
                      SLOT( deleteLater() ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
79 80
}

81 82
MainWindow::~MainWindow()
{
83 84
    if ( m_renderer )
        delete m_renderer;
85
    MetaDataManager::destroyInstance();
86
    LibVLCpp::Instance::kill();
87 88
}

Ludovic Fauvet's avatar
Ludovic Fauvet committed
89 90 91 92 93 94
void MainWindow::changeEvent( QEvent *e )
{
    switch ( e->type() )
    {
    case QEvent::LanguageChange:
        m_ui.retranslateUi( this );
95
        emit translateDockWidgetTitle();
Ludovic Fauvet's avatar
Ludovic Fauvet committed
96 97 98 99 100 101
        break;
    default:
        break;
    }
}

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
102 103 104 105 106 107 108 109 110 111 112 113
void        MainWindow::setupLibrary()
{
    //Library part :
    Library*    library = Library::getInstance();

    //GUI part :
    LibraryWidget* libraryWidget = new LibraryWidget( this );

    DockWidgetManager::instance()->addDockedWidget( libraryWidget,
                                  tr( "Media Library" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
Christophe Courtaut's avatar
Christophe Courtaut committed
114
                                  Qt::LeftDockWidgetArea );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
115 116

    //Connecting GUI and Frontend :
117
    connect( libraryWidget,
118
             SIGNAL( newMediaLoadingAsked(const QString& ) ),
119
             library,
120
             SLOT( newMediaLoadingAsked( const QString& ) ) );
121 122

    connect( library,
123
             SIGNAL( newClipLoaded( Clip* ) ),
124
             libraryWidget,
125
             SLOT( newClipLoaded( Clip* ) ) );
126 127

    connect( libraryWidget,
128
             SIGNAL( removingMediaAsked( const QUuid& ) ),
129
             library,
130
             SLOT( removingMediaAsked( const QUuid& ) ) );
131 132

    connect( library,
133
             SIGNAL( mediaRemoved( const QUuid& ) ),
134
             libraryWidget,
135
             SLOT( mediaRemoved( const QUuid& ) ) );
136

137 138
    connect( libraryWidget->getVideoListWidget(), SIGNAL( selectedClipChanged( Clip* ) ),
              m_clipPreview->getGenericRenderer(), SLOT( setClip( Clip* ) ) );
139 140
    connect( Library::getInstance(), SIGNAL( mediaRemoved( const QUuid& ) ),
             m_clipPreview->getGenericRenderer(), SLOT( mediaUnloaded( QUuid ) ) );
141 142
    connect( libraryWidget->getVideoListWidget(), SIGNAL( itemDoubleClicked( QListWidgetItem* ) ),
             this, SLOT( mediaListItemDoubleClicked( QListWidgetItem* ) ) );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
143 144
}

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
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.
        ProjectManager* pm = new ProjectManager( outputFileName );
        pm->saveProject();
    }
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
void    MainWindow::on_actionLoad_Project_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.
        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()
{
270
    m_globalPreferences = new Settings(  );
271 272 273 274
    m_globalPreferences->addWidget("VLMC",
                                   new VLMCPreferences,
                                   "../images/vlmc.png",
                                   "VLMC settings");
275 276 277 278 279
    ////For debugging purpose
    //m_globalPreferences->addWidget("Test",
    //                               new QLabel("This is a test"),
    //                               "images/vlmc.png",
    //                               "Test");
280 281 282
    m_globalPreferences->build();
}

283 284
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
285 286 287 288
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
289 290 291

void MainWindow::on_actionPreferences_triggered()
{
292
   m_globalPreferences->show();
293
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
294 295 296 297 298

void MainWindow::on_actionAbout_triggered()
{
    About::instance()->exec();
}
299 300 301

void MainWindow::on_actionTranscode_File_triggered()
{
302
    //Transcode::instance( this )->exec();
303
}
304

305 306 307 308 309 310 311 312 313
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",
314
                                          QDir::currentPath(), "Videos(*.avi *.mpg)" );
315 316 317 318 319 320
    if ( outputFileName.length() == 0 )
        return ;
    else
    {
        if ( m_renderer )
            delete m_renderer;
321
        m_renderer = new WorkflowFileRenderer( outputFileName );
322 323 324 325
        m_renderer->run();
    }
}

326 327 328 329
void MainWindow::on_actionNew_Project_triggered()
{
    //TODO : clear the library, the timeline, and show the configuration box
    //of the newly created project
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
    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();
    m_projectPreferences->show();
345 346
}

Ludovic Fauvet's avatar
Ludovic Fauvet committed
347 348 349 350 351 352 353 354 355
void MainWindow::zoomIn()
{
    m_zoomSlider->setValue( m_zoomSlider->value() - 1 );
}

void MainWindow::zoomOut()
{
    m_zoomSlider->setValue( m_zoomSlider->value() + 1 );
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
356 357 358 359 360 361 362 363

void MainWindow::on_actionFullscreen_triggered( bool checked )
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
364 365 366 367 368

void MainWindow::registerWidgetInViewMenu( QDockWidget* widget )
{
    m_ui.menuView->addAction( widget->toggleViewAction() );
}
369 370 371 372

void    MainWindow::mediaListItemDoubleClicked( QListWidgetItem* qItem )
{
    ListViewMediaItem* item = static_cast<ListViewMediaItem*>( qItem );
373
    ClipProperty* mp = new ClipProperty( item->getClip(), this );
374 375
    mp->show();
}
376 377 378 379 380

void MainWindow::toolButtonClicked( int id )
{
    emit toolChanged( (ToolButtons)id );
}