ImportController.cpp 12.3 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 71 72 73
    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 );
    m_ui->forwardButton->setEnabled( false );

    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
    done( Rejected );
275 276
}

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

286 287
void
ImportController::mediaDeletion( const QUuid& uuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
288
{
289
    Library::getInstance()->deleteMedia( uuid );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
290
    m_mediaListController->removeMedia( uuid );
291

Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
292
    if ( uuid == m_currentUuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
293
    {
294
        setUIMetaData( static_cast<Media*>( 0 ) );
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
295
        m_currentUuid = QUuid();
296
        m_preview->stop();
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
297
    }
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
298 299
}

300 301
void
ImportController::clipDeletion( const QUuid& uuid )
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
302
{
303
    m_clipListController->removeClip( uuid );
304
    QUuid id;
305
    foreach( id, Library::getInstance()->temporaryMedias()->keys() )
306
    {
307 308
        Media* media = Library::getInstance()->temporaryMedias()->value( id );
        if ( media != NULL && media->clip( uuid ) )
309 310
            media->removeClip( uuid );
    }
Geoffroy Lacarriere's avatar
Geoffroy Lacarriere committed
311
}
312

313 314
void
ImportController::showClipList( const QUuid& uuid )
315
{
316 317
    Media* media = Library::getInstance()->temporaryMedia( uuid );
    if ( media == NULL || media->clips()->size() == 0 )
318
        return ;
319

320
    m_clipListController = new ImportMediaListController( m_stackNav );
321 322 323 324
    connect( m_clipListController, SIGNAL( clipSelected( const QUuid& ) ),
             this, SLOT( clipSelection( const QUuid& ) ) );
    connect( m_clipListController, SIGNAL( clipDeleted( const QUuid& ) ),
             this, SLOT( clipDeletion( const QUuid& ) ) );
325 326 327 328 329 330 331
    m_clipListController->addClipsFromMedia( media );
    if ( !m_currentUuid.isNull() )
        m_savedUuid = m_currentUuid;
    m_controllerSwitched = true;
    m_stackNav->pushViewController( m_clipListController );
}

332 333
void
ImportController::restoreContext()
334
{
335
    if ( m_clipListController->nbDeletions() != 0 )
336
    {
337 338 339 340 341
        if ( !m_savedUuid.isNull() && m_mediaListController->cell( m_savedUuid ) != NULL )
        {
            ImportMediaCellView* cell = m_mediaListController->cell( m_savedUuid );
            cell->decrementClipCount( m_clipListController->nbDeletions() );
        }
342
    }
343 344 345
    if ( !m_savedUuid.isNull() )
        m_currentUuid = m_savedUuid;
    m_controllerSwitched = false;
346
}
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363

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