ImportController.cpp 12.9 KB
Newer Older
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
1
2
3
4
5
6
7
/*****************************************************************************
 * ImportController.cpp
 *****************************************************************************
 * Copyright (C) 2008-2009 the VLMC team
 *
 * Authors: Geoffroy Lacarriere <geoffroylaca@gmail.com>
 *          Thomas Boquet <thomas.boquet@gmail.com>
8
 *          Clement Chavance <chavance.c@gmail.com>
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 *
 * 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.
 *****************************************************************************/

Thomas Boquet's avatar
Thomas Boquet committed
25
#include "ui_ImportController.h"
26

Thomas Boquet's avatar
Thomas Boquet committed
27
#include "ClipRenderer.h"
28
#include "ImportController.h"
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
29
#include "Library.h"
30
31

#include <QPalette>
32
#include <QSettings>
33
#include <QTime>
Thomas Boquet's avatar
Thomas Boquet committed
34
35
36

ImportController::ImportController(QWidget *parent) :
    QDialog(parent),
37
38
39
    m_ui(new Ui::ImportController),
    m_clipListController( 0 ),
    m_controllerSwitched( false )
Thomas Boquet's avatar
Thomas Boquet committed
40
41
42
43
44
45
{
    m_ui->setupUi(this);
    m_preview = new PreviewWidget( new ClipRenderer, m_ui->previewContainer );
    m_stackNav = new StackViewController( m_ui->stackViewContainer, false );
    m_mediaListController = new ImportMediaListController( m_stackNav );
    m_tag = new TagWidget( m_ui->tagContainer, 6 );
46
    m_filesModel = new QFileSystemModel();
Thomas Boquet's avatar
Thomas Boquet committed
47
48
49
    m_stackNav->pushViewController( m_mediaListController );

    QStringList filters;
50
51
    filters << "*.mov" << "*.avi" << "*.mkv" << "*.mpg" << "*.mpeg" << "*.wmv" << "*.mp4"
            << "*.ogg" << "*.ogv";
Thomas Boquet's avatar
Thomas Boquet committed
52
53
    filters << "*.mp3" << "*.oga" << "*.flac" << "*.aac" << "*.wav";
    filters << "*.gif" << "*.png" << "*.jpg";
54
    m_filesModel->setFilter( QDir::AllDirs | QDir::Files | QDir::Readable | QDir::Drives |
55
                             QDir::NoDotAndDotDot );
Thomas Boquet's avatar
Thomas Boquet committed
56
57
58
59
    m_filesModel->sort( 2, Qt::AscendingOrder );
    m_filesModel->sort( 0, Qt::AscendingOrder );
    m_filesModel->setNameFilters( filters );

60
    Library::getInstance()->setFilter( filters );
61
62
63

    restoreCurrentPath();

Thomas Boquet's avatar
Thomas Boquet committed
64
    m_ui->treeView->setModel( m_filesModel );
65
    m_ui->treeView->setHeaderHidden( true );
66
    m_ui->treeView->setCurrentIndex( m_filesModel->index( m_currentlyWatchedDir ) );
Thomas Boquet's avatar
Thomas Boquet committed
67
68
69
70
    m_ui->treeView->setExpanded( m_ui->treeView->currentIndex() , true );
    m_ui->treeView->setColumnHidden( 1, true );
    m_ui->treeView->setColumnHidden( 2, true );
    m_ui->treeView->setColumnHidden( 3, true );
71
    m_ui->forwardButton->setEnabled( true );
Thomas Boquet's avatar
Thomas Boquet committed
72
73

    m_fsWatcher = new QFileSystemWatcher();
74
    m_fsWatcher->addPath( m_currentlyWatchedDir );
Thomas Boquet's avatar
Thomas Boquet committed
75

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
    connect( m_fsWatcher, SIGNAL( directoryChanged( QString ) ),
             m_filesModel, SLOT( refresh() ) );
    connect( m_ui->treeView, SIGNAL( clicked( QModelIndex ) ),
             this, SLOT( treeViewClicked( QModelIndex ) ) );
    connect( m_ui->treeView, SIGNAL( doubleClicked( QModelIndex ) ),
             this, SLOT( treeViewDoubleClicked( QModelIndex ) ) );
    connect( m_ui->forwardButton, SIGNAL( clicked() ),
             this, SLOT( forwardButtonClicked() ) );

    connect( Library::getInstance(), SIGNAL( newMediaLoaded( const QUuid& ) ),
             this, SLOT( newMediaLoaded( const QUuid& ) ) );
    connect( Library::getInstance(), SIGNAL( updateMediaRequested( const QUuid& ) ),
             this, SLOT( updateMediaRequested( const QUuid& ) ) );

    connect( this, SIGNAL( mediaSelected( Media* ) ),
             m_preview->getGenericRenderer(), SLOT( setMedia( Media* ) ) );
    connect( this, SIGNAL( mediaSelected( Media* ) ),
             m_tag, SLOT( mediaSelected( Media* ) ) );

    connect( m_mediaListController, SIGNAL( mediaSelected( const QUuid& ) ),
             this, SLOT( mediaSelection( const QUuid& ) ) );
    connect( m_mediaListController, SIGNAL( mediaDeleted( const QUuid& ) ),
             this, SLOT( mediaDeletion( const QUuid& ) ) );

    connect( m_mediaListController, SIGNAL( showClipListAsked( const QUuid& ) ),
             this, SLOT( showClipList( const QUuid& ) ) );
    connect( m_preview, SIGNAL( addClip( Clip* ) ),
             m_mediaListController, SLOT( clipAdded( Clip* ) ) ); //StackViewController
    connect( m_stackNav, SIGNAL( previousButtonPushed() ),
             this, SLOT( restoreContext() ) );
Thomas Boquet's avatar
Thomas Boquet committed
106
107
108
109
110
111
112
113
114
}

ImportController::~ImportController()
{
    delete m_ui;
    delete m_stackNav;
    delete m_tag;
}

115
116
void
ImportController::changeEvent( QEvent *e )
Thomas Boquet's avatar
Thomas Boquet committed
117
118
{
    QDialog::changeEvent( e );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
119
120
121
122
123
124
125
    switch ( e->type() )
    {
        case QEvent::LanguageChange:
            m_ui->retranslateUi( this );
            break;
        default:
            break;
Thomas Boquet's avatar
Thomas Boquet committed
126
127
128
    }
}

129
130
void
ImportController::mediaSelection( const QUuid& uuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
131
{
132
133
134
    if ( m_mediaListController->contains( uuid ) )
    {
        if ( !m_currentUuid.isNull() && m_mediaListController->contains( m_currentUuid ) )
135
136
            m_mediaListController->cell( m_currentUuid )->setPalette( this->palette() );
        QPalette p = m_mediaListController->cell( uuid )->palette();
137
        p.setColor( QPalette::Window, QColor( Qt::darkBlue ) );
138
        m_mediaListController->cell( uuid )->setPalette( p );
139

140
        setUIMetaData( Library::getInstance()->temporaryMedia( uuid ) );
141
142
143
        if ( uuid != NULL && uuid != m_currentUuid )
            m_preview->stop();
        m_currentUuid = uuid;
144
        emit mediaSelected( Library::getInstance()->temporaryMedia( uuid ) );
145
    }
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
146
147
}

148
149
void
ImportController::clipSelection( const QUuid& uuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
150
{
151
    if ( !m_currentUuid.isNull() && !m_controllerSwitched )
152
        m_clipListController->cell( m_currentUuid )->setPalette( palette() );
153
154
    else
        m_controllerSwitched = false;
155
    QPalette p = m_clipListController->cell( uuid )->palette();
156
    p.setColor( QPalette::Window, QColor( Qt::darkBlue ) );
157
    m_clipListController->cell( uuid )->setPalette( p );
158
    Clip*   clip;
159
    foreach(QUuid id, Library::getInstance()->temporaryMedias()->keys() )
160
    {
161
        Media* media = Library::getInstance()->temporaryMedias()->value( id );
162
163
        if ( ( clip = media->clip( uuid ) ) != 0 )
            break;
164
    }
165
166
    if ( clip == 0 )
        return ;
167
    setUIMetaData( clip );
168
169
170
171
    if ( uuid != m_currentUuid )
        m_preview->stop();
    emit clipSelected( clip );
    m_currentUuid = uuid;
Thomas Boquet's avatar
Thomas Boquet committed
172
173
}

174
175
void
ImportController::newMediaLoaded( const QUuid& uuid )
Thomas Boquet's avatar
Thomas Boquet committed
176
{
177
178
179
180
    Media* media = Library::getInstance()->temporaryMedia( uuid );
    if ( media == NULL )
        return;
    m_mediaListController->addMedia( media );
Thomas Boquet's avatar
Thomas Boquet committed
181
}
182

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
void
ImportController::updateMediaRequested( const QUuid& uuid )
{
    Media* media = Library::getInstance()->temporaryMedia( uuid );
    if ( media == NULL )
        return;
    ImportMediaCellView*    cell = m_mediaListController->cell( media->getUuid() );
    if ( cell == NULL )
        return;
    cell->setThumbnail( media->getSnapshot() );
    cell->setLength( media->getLengthMS() );
}

void
ImportController::setUIMetaData( Media* media )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
198
{
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
199
200
201
202
    if ( media != NULL )
    {
        //Duration
        QTime   duration;
Hugo Beauzee-Luyssen's avatar
Hugo Beauzee-Luyssen committed
203
        duration = duration.addMSecs( media->getLengthMS() );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
204
205
206
207
208
209
210
        m_ui->durationValueLabel->setText( duration.toString( "hh:mm:ss" ) );
        //Filename || title
        m_ui->nameValueLabel->setText( media->getFileInfo()->fileName() );
        m_ui->nameValueLabel->setWordWrap( true );
        setWindowTitle( media->getFileInfo()->fileName() + " " + tr( "properties" ) );
        //Resolution
        m_ui->resolutionValueLabel->setText( QString::number( media->getWidth() )
211
                                        + " x " + QString::number( media->getHeight() ) );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
212
213
214
215
216
217
218
219
220
221
        //FPS
        m_ui->fpsValueLabel->setText( QString::number( media->getFps() ) );
    }
    else
    {
            m_ui->durationValueLabel->setText( "--:--:--" );
            m_ui->nameValueLabel->setText( "none" );
            m_ui->resolutionValueLabel->setText( "-- x --" );
            m_ui->fpsValueLabel->setText( "--" );
    }
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
222
223
}

224
225
void
ImportController::setUIMetaData( Clip* clip )
226
227
228
229
230
231
232
{
    QTime   time;
    qint64  length = clip->getLengthSecond();
    time = time.addSecs( length );
    m_ui->durationValueLabel->setText( time.toString( "hh:mm:ss" ) );
    m_ui->nameValueLabel->setText( clip->getParent()->getFileInfo()->fileName() );
    m_ui->nameValueLabel->setWordWrap( true );
233
234
    setWindowTitle( clip->getParent()->getFileInfo()->fileName() + " " +
                    tr( "properties" ) );
235
236
237
238
    m_ui->resolutionValueLabel->setText( QString::number( clip->getParent()->getWidth() )
            + " x " + QString::number( clip->getParent()->getHeight() ) );
    m_ui->fpsValueLabel->setText( QString::number( clip->getParent()->getFps() ) );
}
Thomas Boquet's avatar
Thomas Boquet committed
239

240
241
void
ImportController::forwardButtonClicked()
Thomas Boquet's avatar
Thomas Boquet committed
242
{
243
244
245
    QModelIndex index = m_ui->treeView->selectionModel()->currentIndex();
    QString filePath =  m_filesModel->fileInfo( index ).filePath();
    Library::getInstance()->loadFile( filePath );
Thomas Boquet's avatar
Thomas Boquet committed
246
247
}

248
249
void
ImportController::treeViewClicked( const QModelIndex& index )
Thomas Boquet's avatar
Thomas Boquet committed
250
251
252
253
254
255
{
    if ( m_filesModel->isDir( index ) )
    {
        m_fsWatcher->removePath( m_currentlyWatchedDir );
        m_currentlyWatchedDir = m_filesModel->filePath( index );
        m_fsWatcher->addPath( m_filesModel->filePath( index ) );
256
        saveCurrentPath();
Thomas Boquet's avatar
Thomas Boquet committed
257
258
259
260
    }
    m_ui->forwardButton->setEnabled( true );
}

261
262
void
ImportController::treeViewDoubleClicked( const QModelIndex& index )
Thomas Boquet's avatar
Thomas Boquet committed
263
264
265
266
{
    if ( !m_filesModel->isDir( index ) )
        forwardButtonClicked();
}
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
267

268
269
void
ImportController::reject()
270
271
{
    m_preview->stop();
272
273
    m_mediaListController->cleanAll();
    Library::getInstance()->deleteTemporaryMedias();
274
    collapseAllButCurrentPath();
275
    done( Rejected );
276
277
}

278
279
void
ImportController::accept()
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
280
{
281
282
    m_mediaListController->cleanAll();
    Library::getInstance()->importDone();
283
    m_preview->stop();
284
    collapseAllButCurrentPath();
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
285
286
    done( Accepted );
}
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
287

288
289
290
291
292
293
294
295
296
297
298
299
void
ImportController::collapseAllButCurrentPath()
{
    m_ui->treeView->collapseAll();
    QStringList paths;
    for ( QDir directory( m_currentlyWatchedDir ); !directory.isRoot(); directory.cdUp() )
        paths.prepend( directory.absolutePath() );
    while ( paths.count() > 0 )
    {
        m_ui->treeView->setCurrentIndex( m_filesModel->index( paths.takeFirst() ) );
        m_ui->treeView->setExpanded( m_ui->treeView->currentIndex() , true );
    }
300
    m_ui->forwardButton->setEnabled( true );
301
302
}

303
304
void
ImportController::mediaDeletion( const QUuid& uuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
305
{
306
    Library::getInstance()->deleteMedia( uuid );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
307
    m_mediaListController->removeMedia( uuid );
308

Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
309
    if ( uuid == m_currentUuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
310
    {
311
        setUIMetaData( static_cast<Media*>( 0 ) );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
312
        m_currentUuid = QUuid();
313
        m_preview->stop();
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
314
    }
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
315
316
}

317
318
void
ImportController::clipDeletion( const QUuid& uuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
319
{
320
    m_clipListController->removeClip( uuid );
321
    QUuid id;
322
    foreach( id, Library::getInstance()->temporaryMedias()->keys() )
323
    {
324
325
        Media* media = Library::getInstance()->temporaryMedias()->value( id );
        if ( media != NULL && media->clip( uuid ) )
326
327
            media->removeClip( uuid );
    }
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
328
}
329

330
331
void
ImportController::showClipList( const QUuid& uuid )
332
{
333
334
    Media* media = Library::getInstance()->temporaryMedia( uuid );
    if ( media == NULL || media->clips()->size() == 0 )
335
        return ;
336

337
    m_clipListController = new ImportMediaListController( m_stackNav );
338
339
340
341
    connect( m_clipListController, SIGNAL( clipSelected( const QUuid& ) ),
             this, SLOT( clipSelection( const QUuid& ) ) );
    connect( m_clipListController, SIGNAL( clipDeleted( const QUuid& ) ),
             this, SLOT( clipDeletion( const QUuid& ) ) );
342
343
344
345
346
347
348
    m_clipListController->addClipsFromMedia( media );
    if ( !m_currentUuid.isNull() )
        m_savedUuid = m_currentUuid;
    m_controllerSwitched = true;
    m_stackNav->pushViewController( m_clipListController );
}

349
350
void
ImportController::restoreContext()
351
{
352
    if ( m_clipListController->nbDeletions() != 0 )
353
    {
354
355
356
357
358
        if ( !m_savedUuid.isNull() && m_mediaListController->cell( m_savedUuid ) != NULL )
        {
            ImportMediaCellView* cell = m_mediaListController->cell( m_savedUuid );
            cell->decrementClipCount( m_clipListController->nbDeletions() );
        }
359
    }
360
361
362
    if ( !m_savedUuid.isNull() )
        m_currentUuid = m_savedUuid;
    m_controllerSwitched = false;
363
}
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380

void
ImportController::saveCurrentPath()
{
    QSettings s;
    s.setValue( "ImportPreviouslySelectPath", m_currentlyWatchedDir );
    s.sync();
}

void
ImportController::restoreCurrentPath()
{
    QSettings s;
    QVariant path = s.value( "ImportPreviouslySelectPath", QDir::homePath() );
    QFileInfo info = path.toString();
    m_currentlyWatchedDir = info.absoluteFilePath();
}