MainWindow.cpp 12.7 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
    // Translations
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 ) ) );
Ludovic Fauvet's avatar
Ludovic Fauvet committed
76 77
}

78 79
MainWindow::~MainWindow()
{
80 81
    if ( m_renderer )
        delete m_renderer;
82
    MetaDataManager::destroyInstance();
83
    LibVLCpp::Instance::kill();
84 85
}

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

Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
99 100 101 102 103 104 105 106 107 108 109 110
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,
111 112
                                  Qt::LeftDockWidgetArea,
                                  m_ui.actionMedia_library );
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
113 114

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

    connect( library,
121
             SIGNAL( newClipLoaded( Clip* ) ),
122
             libraryWidget,
123
             SLOT( newClipLoaded( Clip* ) ) );
124 125

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

    connect( library,
131
             SIGNAL( mediaRemoved( const QUuid& ) ),
132
             libraryWidget,
133
             SLOT( mediaRemoved( const QUuid& ) ) );
134

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

143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
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();
    }
}

158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
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();
    }
}

173 174
void MainWindow::createStatusBar()
{
175 176 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
    // 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
210 211 212 213 214 215 216 217 218 219
    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 );
220 221 222 223 224 225 226

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

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

236
    DockWidgetManager *dockManager = DockWidgetManager::instance();
237

238 239 240 241
    dockManager->addDockedWidget( new FileBrowser( this ),
                                  tr( "FileBrowser" ),
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
242 243
                                  Qt::TopDockWidgetArea,
                                  m_ui.actionFile_browser );
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
                                  Qt::AllDockWidgetAreas,
                                  QDockWidget::AllDockWidgetFeatures,
250 251
                                  Qt::TopDockWidgetArea,
                                  m_ui.actionClip_preview );
252

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

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

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

281 282
//Private slots definition

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

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

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

298
void MainWindow::on_actionTranscode_triggered()
299
{
300 301
    QMessageBox::information( this, tr( "Sorry" ),
                              tr( "This feature is currently disabled." ) );
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
}

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

Ludovic Fauvet's avatar
Ludovic Fauvet committed
352 353 354 355 356 357 358 359 360
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
361 362 363 364 365 366 367 368

void MainWindow::on_actionFullscreen_triggered( bool checked )
{
    if ( checked )
        showFullScreen();
    else
        showNormal();
}
369 370 371 372 373

void MainWindow::registerWidgetInViewMenu( QDockWidget* widget )
{
    m_ui.menuView->addAction( widget->toggleViewAction() );
}
374 375 376 377

void    MainWindow::mediaListItemDoubleClicked( QListWidgetItem* qItem )
{
    ListViewMediaItem* item = static_cast<ListViewMediaItem*>( qItem );
378
    ClipProperty* mp = new ClipProperty( item->getClip(), this );
379 380
    mp->show();
}
381 382 383 384 385

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