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 46 47 48 49
{
    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 );
    m_filesModel = new QDirModel();
    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 55
    m_filesModel->setFilter( QDir::AllDirs | QDir::Files | QDir::Readable |
                             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 65
    m_ui->treeView->setModel( m_filesModel );
    m_ui->treeView->setRootIndex( m_filesModel->index( QDir::rootPath() ) );
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();
}