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 );
}