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

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

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

Ludovic Fauvet's avatar
Ludovic Fauvet committed
63
    // Translation
64 65
    connect( this, SIGNAL( translateDockWidgetTitle() ),
             DockWidgetManager::instance(), SLOT( transLateWidgetTitle() ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
66 67

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

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

84 85
MainWindow::~MainWindow()
{
86 87
    if ( m_renderer )
        delete m_renderer;
88
    MetaDataManager::destroyInstance();
89
    LibVLCpp::Instance::kill();
90 91
}

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

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
105 106 107 108 109 110 111 112 113 114 115 116
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,
117 118
                                  Qt::LeftDockWidgetArea,
                                  m_ui.actionMedia_library );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
119 120

    //Connecting GUI and Frontend :
121
    connect( libraryWidget,
122
             SIGNAL( newMediaLoadingAsked(const QString& ) ),
123
             library,
124
             SLOT( newMediaLoadingAsked( const QString& ) ) );
125 126

    connect( library,
127
             SIGNAL( newClipLoaded( Clip* ) ),
128
             libraryWidget,
129
             SLOT( newClipLoaded( Clip* ) ) );
130 131

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

    connect( library,
137
             SIGNAL( mediaRemoved( const QUuid& ) ),
138
             libraryWidget,
139
             SLOT( mediaRemoved( const QUuid& ) ) );
140

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

149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
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();
    }
}

164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
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();
    }
}

179 180
void MainWindow::createStatusBar()
{
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 212 213 214 215
    // 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
216 217 218 219 220 221 222 223 224 225
    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 );
226 227 228 229 230 231 232

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

235
void MainWindow::initializeDockWidgets( void )
236
{
237 238 239 240
    m_timeline = new Timeline( this );
    m_timeline->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    m_timeline->show();
    setCentralWidget( m_timeline );
241

242
    DockWidgetManager *dockManager = DockWidgetManager::instance();
243

244 245 246 247
    dockManager->addDockedWidget( new FileBrowser( this ),
                                  tr( "FileBrowser" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
248 249
                                  Qt::TopDockWidgetArea,
                                  m_ui.actionFile_browser );
250

251 252
    m_clipPreview = new PreviewWidget( new ClipRenderer, this );
    dockManager->addDockedWidget( m_clipPreview,
253
                                  tr( "Clip Preview" ),
geoff's avatar
geoff committed
254 255
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
256 257
                                  Qt::TopDockWidgetArea,
                                  m_ui.actionClip_preview );
258

259
    m_projectPreview = new PreviewWidget( new WorkflowRenderer(), this );
260
    dockManager->addDockedWidget( m_projectPreview,
261 262 263
                                  tr( "Project Preview" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
264 265
                                  Qt::TopDockWidgetArea,
                                  m_ui.actionProject_preview );
266

267
    dockManager->addDockedWidget( UndoStack::getInstance( this ),
268 269 270
                                  tr( "History" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
271 272
                                  Qt::LeftDockWidgetArea,
                                  m_ui.actionUndoRedo );
273
    setupLibrary();
274
    m_metaDataManager = MetaDataManager::getInstance();
275 276
}

277 278
void        MainWindow::createGlobalPreferences()
{
279
    m_globalPreferences = new Settings(  );
280 281 282 283
    m_globalPreferences->addWidget("VLMC",
                                   new VLMCPreferences,
                                   "../images/vlmc.png",
                                   "VLMC settings");
284 285 286 287 288
    ////For debugging purpose
    //m_globalPreferences->addWidget("Test",
    //                               new QLabel("This is a test"),
    //                               "images/vlmc.png",
    //                               "Test");
289 290 291
    m_globalPreferences->build();
}

292 293
//Private slots definition

Ludovic Fauvet's avatar
Ludovic Fauvet committed
294 295 296 297
void MainWindow::on_actionQuit_triggered()
{
    QApplication::quit();
}
298 299 300

void MainWindow::on_actionPreferences_triggered()
{
301
   m_globalPreferences->show();
302
}
Ludovic Fauvet's avatar
Ludovic Fauvet committed
303 304 305 306 307

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

309
void MainWindow::on_actionTranscode_triggered()
310
{
311 312
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
313
    //Transcode::instance( this )->exec();
314
}
315

316 317 318 319 320 321 322 323 324
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",
325
                                          QDir::currentPath(), "Videos(*.avi *.mpg)" );
326 327 328 329 330 331
    if ( outputFileName.length() == 0 )
        return ;
    else
    {
        if ( m_renderer )
            delete m_renderer;
332
        m_renderer = new WorkflowFileRenderer( outputFileName );
333 334 335 336
        m_renderer->run();
    }
}

337 338 339 340
void MainWindow::on_actionNew_Project_triggered()
{
    //TODO : clear the library, the timeline, and show the configuration box
    //of the newly created project
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
    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();
356 357
}

358 359 360 361 362
void MainWindow::on_actionHelp_triggered()
{
    QDesktopServices::openUrl( QUrl( "http://vlmc.org" ) );
}

Ludovic Fauvet's avatar
Ludovic Fauvet committed
363 364 365 366 367 368 369 370 371
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
372 373 374 375 376 377 378 379

void MainWindow::on_actionFullscreen_triggered( bool checked )
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
380 381 382 383 384

void MainWindow::registerWidgetInViewMenu( QDockWidget* widget )
{
    m_ui.menuView->addAction( widget->toggleViewAction() );
}
385 386 387 388

void    MainWindow::mediaListItemDoubleClicked( QListWidgetItem* qItem )
{
    ListViewMediaItem* item = static_cast<ListViewMediaItem*>( qItem );
389
    ClipProperty* mp = new ClipProperty( item->getClip(), this );
390 391
    mp->show();
}
392 393 394 395 396

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