UBFeaturesController.cpp 35.5 KB
Newer Older
Anna Udovichenko's avatar
Anna Udovichenko committed
1 2
#include <QGraphicsItem>
#include <QPointF>
3
#include <QtGui>
Anna Udovichenko's avatar
Anna Udovichenko committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

#include "core/UBApplication.h"
#include "board/UBBoardController.h"
#include "UBFeaturesController.h"
#include "core/UBSettings.h"
#include "tools/UBToolsManager.h"
#include "frameworks/UBFileSystemUtils.h"
#include "frameworks/UBPlatformUtils.h"

#include "core/UBDownloadManager.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsSvgItem.h"
#include "domain/UBGraphicsPixmapItem.h"
#include "domain/UBGraphicsVideoItem.h"
#include "domain/UBGraphicsWidgetItem.h"

20 21 22
#include "gui/UBFeaturesWidget.h"

const QString UBFeaturesController::virtualRootName = "root";
Ilia Ryabokon's avatar
Ilia Ryabokon committed
23 24 25 26 27 28 29 30 31 32 33 34 35
const QString UBFeaturesController::rootPath  = "/" + virtualRootName;

const QString UBFeaturesController::appPath = rootPath + "/Applications";
const QString UBFeaturesController::audiosPath = rootPath + "/Audios";
const QString UBFeaturesController::moviesPath = rootPath + "/Movies";
const QString UBFeaturesController::picturesPath = rootPath + "/Pictures";
const QString UBFeaturesController::flashPath = rootPath + "/Animations";
const QString UBFeaturesController::interactPath = rootPath + "/Interactivities";
const QString UBFeaturesController::shapesPath = rootPath + "/Shapes";
const QString UBFeaturesController::trashPath = rootPath + "/Trash";
const QString UBFeaturesController::favoritePath = rootPath + "/Favorites";
const QString UBFeaturesController::webSearchPath = rootPath + "/Web search";

36

37
void UBFeaturesComputingThread::scanFS(const QUrl & currentPath, const QString & currVirtualPath, const QSet<QUrl> &pFavoriteSet)
Anna Udovichenko's avatar
Anna Udovichenko committed
38
{
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    Q_ASSERT(QFileInfo(currentPath.toLocalFile()).exists());

    QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(currentPath.toLocalFile());

    QFileInfoList::iterator fileInfo;
    for ( fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end(); fileInfo +=  1) {
        if (abort) {
            return;
        }

        QString fullFileName = fileInfo->absoluteFilePath();
        UBFeatureElementType featureType = UBFeaturesController::fileTypeFromUrl(fullFileName);
        QString fileName = fileInfo->fileName();

        QImage icon = UBFeaturesController::getIcon(fullFileName, featureType);

        if ( fullFileName.contains(".thumbnail."))
            continue;

Ilia Ryabokon's avatar
Ilia Ryabokon committed
58
        UBFeature testFeature(currVirtualPath + "/" + fileName, icon, fileName, QUrl::fromLocalFile(fullFileName), featureType);
59 60 61

        emit sendFeature(testFeature);
        emit featureSent();
62
        emit scanPath(fullFileName);
63

64 65
        if ( pFavoriteSet.find(QUrl::fromLocalFile(fullFileName)) != pFavoriteSet.end()) {
            //TODO send favoritePath from the controller or make favoritePath public and static
Ilia Ryabokon's avatar
Ilia Ryabokon committed
66
            emit sendFeature(UBFeature( UBFeaturesController::favoritePath + "/" + fileName, icon, fileName, QUrl::fromLocalFile(fullFileName), featureType));
67
        }
68 69

        if (featureType == FEATURE_FOLDER) {
70
            scanFS(QUrl::fromLocalFile(fullFileName), currVirtualPath + "/" + fileName, pFavoriteSet);
71 72
        }
    }
Anna Udovichenko's avatar
Anna Udovichenko committed
73 74
}

75
void UBFeaturesComputingThread::scanAll(QList<QPair<QUrl, UBFeature> > pScanningData, const QSet<QUrl> &pFavoriteSet)
76 77 78 79 80
{
    for (int i = 0; i < pScanningData.count(); i++) {
        if (abort) {
            return;
        }
81
        QPair<QUrl, UBFeature> curPair = pScanningData.at(i);
82

83 84
        emit scanCategory(curPair.second.getDisplayName());
        scanFS(curPair.first, curPair.second.getFullVirtualPath(), pFavoriteSet);
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
    }
}

int UBFeaturesComputingThread::featuresCount(const QUrl &pPath)
{
    int noItems = 0;

    QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(pPath.toLocalFile());

    QFileInfoList::iterator fileInfo;
    for ( fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end(); fileInfo +=  1) {
        QString fullFileName = fileInfo->absoluteFilePath();
        UBFeatureElementType featureType = UBFeaturesController::fileTypeFromUrl(fullFileName);

        if (featureType != FEATURE_INVALID && !fullFileName.contains(".thumbnail.")) {
            noItems++;
        }

        if (featureType == FEATURE_FOLDER) {
            noItems += featuresCount(QUrl::fromLocalFile(fullFileName));
        }
    }

    return noItems;
}

111
int UBFeaturesComputingThread::featuresCountAll(QList<QPair<QUrl, UBFeature> > pScanningData)
112
{
113 114
    int noItems = 0;
    for (int i = 0; i < pScanningData.count(); i++) {
115
        QPair<QUrl, UBFeature> curPair = pScanningData.at(i);
116
        noItems += featuresCount(curPair.first);
117 118
    }

119 120 121 122 123 124 125 126 127 128
    return noItems;
}

UBFeaturesComputingThread::UBFeaturesComputingThread(QObject *parent) :
QThread(parent)
{
    restart = false;
    abort = false;
}

129
void UBFeaturesComputingThread::compute(const QList<QPair<QUrl, UBFeature> > &pScanningData, QSet<QUrl> *pFavoritesSet)
130 131 132 133
{
    QMutexLocker curLocker(&mMutex);

    mScanningData = pScanningData;
134
    mFavoriteSet = *pFavoritesSet;
135 136 137 138 139 140 141 142 143 144 145 146

    if (!isRunning()) {
        start(LowPriority);
    } else {
        restart = true;
        mWaitCondition.wakeOne();
    }
}

void UBFeaturesComputingThread::run()
{
    forever {
Ilia Ryabokon's avatar
Ilia Ryabokon committed
147
//        qDebug() << "Custom thread started execution";
148 149

        mMutex.lock();
150
        QList<QPair<QUrl, UBFeature> > searchData = mScanningData;
151
        QSet<QUrl> favoriteSet = mFavoriteSet;
152 153 154 155 156 157 158 159 160
        mMutex.unlock();

        if (abort) {
            return;
        }
        if (restart) {
            break;
        }

Ilia Ryabokon's avatar
Ilia Ryabokon committed
161
//        QTime curTime = QTime::currentTime();
162
        int fsCnt = featuresCountAll(searchData);
Ilia Ryabokon's avatar
Ilia Ryabokon committed
163 164
//        int msecsto = curTime.msecsTo(QTime::currentTime());
//        qDebug() << "time on evaluation" << msecsto;
165 166 167 168

        emit maxFilesCountEvaluated(fsCnt);

        emit scanStarted();
Ilia Ryabokon's avatar
Ilia Ryabokon committed
169
//        curTime = QTime::currentTime();
170
        scanAll(searchData, favoriteSet);
Ilia Ryabokon's avatar
Ilia Ryabokon committed
171
//        qDebug() << "Time on finishing" << curTime.msecsTo(QTime::currentTime());
172 173 174
        emit scanFinished();

        mMutex.lock();
175
        if (!abort) {
176 177 178 179 180
            mWaitCondition.wait(&mMutex);
        }
        restart = false;
        mMutex.unlock();

181 182 183
    }
}

184 185
UBFeaturesComputingThread::~UBFeaturesComputingThread()
{
Ilia Ryabokon's avatar
Ilia Ryabokon committed
186
//    qDebug() <<  "thread destructor catched";
187 188 189 190 191 192

    mMutex.lock();
    abort = true;
    mWaitCondition.wakeOne();
    mMutex.unlock();

Ilia Ryabokon's avatar
Ilia Ryabokon committed
193
    wait();
194 195 196
}

UBFeature::UBFeature(const QString &url, const QImage &icon, const QString &name, const QUrl &realPath, UBFeatureElementType type)
Ilia Ryabokon's avatar
Ilia Ryabokon committed
197
    : mThumbnail(icon), mDisplayName(name), mPath(realPath), elementType(type)
198
{
Ilia Ryabokon's avatar
Ilia Ryabokon committed
199 200
    mName = getNameFromVirtualPath(url);
    virtualDir = getVirtualDirFromVirtualPath(url);
201 202 203 204 205 206
}

UBFeature::~UBFeature()
{
}

Ilia Ryabokon's avatar
Ilia Ryabokon committed
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
QString UBFeature::getNameFromVirtualPath(const QString &pVirtPath)
{
    QString result;
    int slashPos = pVirtPath.lastIndexOf("/");
    if (slashPos != -1) {
        result = pVirtPath.right(pVirtPath.count() - slashPos - 1);
    } else {
        qDebug() << "UBFeature: incorrect virtual path parameter specified";
    }

    return result;
}

QString UBFeature::getVirtualDirFromVirtualPath(const QString &pVirtPath)
{
    QString result;
    int slashPos = pVirtPath.lastIndexOf("/");
    if (slashPos != -1) {
        result = pVirtPath.left(slashPos);
    } else {
        qDebug() << "UBFeature: incorrect virtual path parameter specified";
    }

    return result;
}

233 234 235 236
QString UBFeature::getUrl() const
{
	if ( elementType == FEATURE_INTERNAL )
        return getFullPath().toString();
237

238 239 240
    return getFullPath().toLocalFile();
}

Anna Udovichenko's avatar
Anna Udovichenko committed
241 242
bool UBFeature::operator ==( const UBFeature &f )const
{
243
    return virtualDir == f.getVirtualPath() && mName == f.getName() && mPath == f.getFullPath() && elementType == f.getType();
Anna Udovichenko's avatar
Anna Udovichenko committed
244
}
245

Anna Udovichenko's avatar
Anna Udovichenko committed
246 247 248 249
bool UBFeature::operator !=( const UBFeature &f )const
{
	return !(*this == f);
}
250 251

bool UBFeature::isFolder() const
Anna Udovichenko's avatar
Anna Udovichenko committed
252
{
253 254
	return elementType == FEATURE_CATEGORY || elementType == FEATURE_TRASH || elementType == FEATURE_FAVORITE
		|| elementType == FEATURE_FOLDER;
Anna Udovichenko's avatar
Anna Udovichenko committed
255 256
}

257
bool UBFeature::isDeletable() const
258
{
259
    return elementType == FEATURE_ITEM
260 261 262
            || elementType == FEATURE_AUDIO
            || elementType == FEATURE_VIDEO
            || elementType == FEATURE_IMAGE
263 264 265 266 267 268
            || elementType == FEATURE_FOLDER;
}

bool UBFeature::inTrash() const
{
    return getFullPath().toLocalFile().startsWith(QUrl::fromLocalFile(UBSettings::userTrashDirPath()).toLocalFile() );
269
}
Anna Udovichenko's avatar
Anna Udovichenko committed
270 271

UBFeaturesController::UBFeaturesController(QWidget *pParentWidget) :
272 273 274
    QObject(pParentWidget)
    ,featuresList(0)
    ,mLastItemOffsetIndex(0)
Anna Udovichenko's avatar
Anna Udovichenko committed
275
{
276 277 278 279 280 281 282 283
    //Initializing physical directories from UBSettings
    mUserAudioDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->userAudioDirectory());
    mUserVideoDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->userVideoDirectory());
    mUserPicturesDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->userImageDirectory());
    mUserInteractiveDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->userInteractiveDirectory());
    mUserAnimationDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->userAnimationDirectory());

    mLibPicturesDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->applicationImageLibraryDirectory());
284 285 286
    mLibAudiosDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->applicationAudiosLibraryDirectory());
    mLibVideosDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->applicationVideosLibraryDirectory());
    mLibAnimationsDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->applicationAnimationsLibraryDirectory());
287 288 289 290 291 292
    mLibInteractiveDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->applicationInteractivesDirectory());
    mLibApplicationsDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->applicationApplicationsLibraryDirectory());
    mLibShapesDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->applicationShapeLibraryDirectory());
    mLibSearchDirectoryPath =QUrl::fromLocalFile(UBSettings::settings()->userSearchDirectory());
    trashDirectoryPath = QUrl::fromLocalFile(UBSettings::userTrashDirPath());

Ilia Ryabokon's avatar
Ilia Ryabokon committed
293 294 295 296 297 298 299 300 301 302
    rootElement = UBFeature(rootPath, QImage( ":images/libpalette/home.png" ), "root", QUrl());
    audiosElement = UBFeature( audiosPath, QImage(":images/libpalette/AudiosCategory.svg"), tr("Audios") , mUserAudioDirectoryPath, FEATURE_CATEGORY);
    moviesElement = UBFeature( moviesPath, QImage(":images/libpalette/MoviesCategory.svg"), tr("Movies") , mUserVideoDirectoryPath, FEATURE_CATEGORY);
    picturesElement = UBFeature( picturesPath, QImage(":images/libpalette/PicturesCategory.svg"), tr("Pictures") , mUserPicturesDirectoryPath, FEATURE_CATEGORY);
    flashElement = UBFeature( flashPath, QImage(":images/libpalette/FlashCategory.svg"), tr("Animations") , mUserAnimationDirectoryPath, FEATURE_CATEGORY);
    interactElement = UBFeature( interactPath, QImage(":images/libpalette/InteractivesCategory.svg"), tr("Interactivities") ,  mLibInteractiveDirectoryPath, FEATURE_CATEGORY);
    applicationsElement = UBFeature( appPath, QImage(":images/libpalette/ApplicationsCategory.svg"), tr("Applications") , mUserInteractiveDirectoryPath, FEATURE_CATEGORY);
    shapesElement = UBFeature( shapesPath, QImage(":images/libpalette/ShapesCategory.svg"), tr("Shapes") , mLibShapesDirectoryPath, FEATURE_CATEGORY );
    favoriteElement = UBFeature( favoritePath, QImage(":images/libpalette/FavoritesCategory.svg"), tr("Favorites"), QUrl("favorites"), FEATURE_FAVORITE );
    webSearchElement = UBFeature( webSearchPath, QImage(":images/libpalette/WebSearchCategory.svg"), tr("Web search"), mLibSearchDirectoryPath, FEATURE_CATEGORY);
Claudio Valerio's avatar
Claudio Valerio committed
303

Ilia Ryabokon's avatar
Ilia Ryabokon committed
304
    trashElement = UBFeature( trashPath, QImage(":images/libpalette/TrashCategory.svg"), tr("Trash"), trashDirectoryPath, FEATURE_TRASH);
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326

    featuresList = new QList <UBFeature>();

    scanFS();

    featuresModel = new UBFeaturesModel(featuresList, this);
    featuresModel->setSupportedDragActions(Qt::CopyAction | Qt::MoveAction);

    featuresProxyModel = new UBFeaturesProxyModel(this);
    featuresProxyModel->setFilterFixedString(rootPath);
    featuresProxyModel->setSourceModel(featuresModel);
    featuresProxyModel->setFilterCaseSensitivity( Qt::CaseInsensitive );

    featuresSearchModel = new UBFeaturesSearchProxyModel(this);
    featuresSearchModel->setSourceModel(featuresModel);
    featuresSearchModel->setFilterCaseSensitivity( Qt::CaseInsensitive );

    featuresPathModel = new UBFeaturesPathProxyModel(this);
    featuresPathModel->setPath(rootPath);
    featuresPathModel->setSourceModel(featuresModel);

    connect(featuresModel, SIGNAL(dataRestructured()), featuresProxyModel, SLOT(invalidate()));
327 328 329 330 331
    connect(&mCThread, SIGNAL(sendFeature(UBFeature)), featuresModel, SLOT(addItem(UBFeature)));
    connect(&mCThread, SIGNAL(featureSent()), this, SIGNAL(featureAddedFromThread()));
    connect(&mCThread, SIGNAL(scanStarted()), this, SIGNAL(scanStarted()));
    connect(&mCThread, SIGNAL(scanFinished()), this, SIGNAL(scanFinished()));
    connect(&mCThread, SIGNAL(maxFilesCountEvaluated(int)), this, SIGNAL(maxFilesCountEvaluated(int)));
332 333
    connect(&mCThread, SIGNAL(scanCategory(QString)), this, SIGNAL(scanCategory(QString)));
    connect(&mCThread, SIGNAL(scanPath(QString)), this, SIGNAL(scanPath(QString)));
334
    connect(UBApplication::boardController, SIGNAL(npapiWidgetCreated(QString)), this, SLOT(createNpApiFeature(QString)));
335 336 337 338 339 340

    QTimer::singleShot(0, this, SLOT(startThread()));
}

void UBFeaturesController::startThread()
{
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
    QList<QPair<QUrl, UBFeature> > computingData;

    computingData << QPair<QUrl, UBFeature>(mLibAudiosDirectoryPath, audiosElement)
            <<  QPair<QUrl, UBFeature>(mLibVideosDirectoryPath, moviesElement)
            <<  QPair<QUrl, UBFeature>(mLibAnimationsDirectoryPath, flashElement)
            <<  QPair<QUrl, UBFeature>(mLibPicturesDirectoryPath, picturesElement)

            <<  QPair<QUrl, UBFeature>(mUserInteractiveDirectoryPath, applicationsElement)
            <<  QPair<QUrl, UBFeature>(mUserAudioDirectoryPath, audiosElement)
            <<  QPair<QUrl, UBFeature>(mUserPicturesDirectoryPath, picturesElement)
            <<  QPair<QUrl, UBFeature>(mUserVideoDirectoryPath, moviesElement)
            <<  QPair<QUrl, UBFeature>(mUserAnimationDirectoryPath, flashElement)

            <<  QPair<QUrl, UBFeature>(mLibApplicationsDirectoryPath, applicationsElement)
            <<  QPair<QUrl, UBFeature>(mLibShapesDirectoryPath, shapesElement)
            <<  QPair<QUrl, UBFeature>(mLibInteractiveDirectoryPath, interactElement)
            <<  QPair<QUrl, UBFeature>(trashDirectoryPath, trashElement)
            <<  QPair<QUrl, UBFeature>(mLibSearchDirectoryPath, webSearchElement);
359

360
    mCThread.compute(computingData, favoriteSet);
Anna Udovichenko's avatar
Anna Udovichenko committed
361 362
}

363 364 365 366 367 368
void UBFeaturesController::createNpApiFeature(const QString &str)
{
    Q_ASSERT(QFileInfo(str).exists() && QFileInfo(str).isDir());

    QString widgetName = QFileInfo(str).fileName();

Ilia Ryabokon's avatar
Ilia Ryabokon committed
369
    featuresModel->addItem(UBFeature(QString(appPath + "/Web/" + widgetName), QImage(UBGraphicsWidgetItem::iconFilePath(QUrl::fromLocalFile(str))), widgetName, QUrl::fromLocalFile(str), FEATURE_INTERACTIVE));
370 371
}

372
void UBFeaturesController::scanFS()
Anna Udovichenko's avatar
Anna Udovichenko committed
373
{
374 375
    featuresList->clear();
    featuresList->append(rootElement);
376

377 378 379 380 381 382 383 384 385 386
    *featuresList << audiosElement
                    << moviesElement
                    << picturesElement
                    << flashElement
                    << interactElement
                    << applicationsElement
                    << shapesElement
                    << favoriteElement
                    << webSearchElement
                    << trashElement;
Anna Udovichenko's avatar
Anna Udovichenko committed
387

388
    //filling favoriteList
389
    loadFavoriteList();
Anna Udovichenko's avatar
Anna Udovichenko committed
390

391
    QList <UBToolsManager::UBToolDescriptor> tools = UBToolsManager::manager()->allTools();
Anna Udovichenko's avatar
Anna Udovichenko committed
392

393
    foreach (UBToolsManager::UBToolDescriptor tool, tools) {
Ilia Ryabokon's avatar
Ilia Ryabokon committed
394
        featuresList->append(UBFeature(appPath + "/" + tool.label, tool.icon.toImage(), tool.label, QUrl(tool.id), FEATURE_INTERNAL));
395
        if (favoriteSet->find(QUrl(tool.id)) != favoriteSet->end()) {
Ilia Ryabokon's avatar
Ilia Ryabokon committed
396
            featuresList->append(UBFeature(favoritePath + "/" + tool.label, tool.icon.toImage(), tool.label, QUrl(tool.id), FEATURE_INTERNAL));
397 398
        }
    }
Anna Udovichenko's avatar
Anna Udovichenko committed
399
}
400
void UBFeaturesController::fileSystemScan(const QUrl & currentPath, const QString & currVirtualPath)
Anna Udovichenko's avatar
Anna Udovichenko committed
401
{
402
    QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(currentPath.toLocalFile());
Anna Udovichenko's avatar
Anna Udovichenko committed
403 404

    QFileInfoList::iterator fileInfo;
405 406 407
    for ( fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end(); fileInfo +=  1) {
        QString fullFileName = fileInfo->absoluteFilePath();
        UBFeatureElementType featureType = fileTypeFromUrl(fullFileName);
Anna Udovichenko's avatar
Anna Udovichenko committed
408
        QString fileName = fileInfo->fileName();
409

410
        QImage icon = getIcon(fullFileName, featureType);
411

412 413 414
        if ( fullFileName.contains(".thumbnail."))
            continue;
 
Ilia Ryabokon's avatar
Ilia Ryabokon committed
415
        UBFeature testFeature(currVirtualPath + "/" + fileName, icon, fileName, QUrl::fromLocalFile(fullFileName), featureType);
416 417

        featuresList->append(testFeature);
Anna Udovichenko's avatar
Anna Udovichenko committed
418

419
        if ( favoriteSet->find( QUrl::fromLocalFile( fullFileName ) ) != favoriteSet->end() ) {
Ilia Ryabokon's avatar
Ilia Ryabokon committed
420
            featuresList->append( UBFeature( favoritePath + "/" + fileName, icon, fileName, QUrl::fromLocalFile( fullFileName ), featureType ) );
Anna Udovichenko's avatar
Anna Udovichenko committed
421 422
		}

423 424 425 426
        if (featureType == FEATURE_FOLDER) {
            fileSystemScan(QUrl::fromLocalFile(fullFileName), currVirtualPath + "/" + fileName);
		}
    }
Anna Udovichenko's avatar
Anna Udovichenko committed
427 428
}

429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
int UBFeaturesController::featuresCount(const QUrl &currPath)
{
    int noItems = 0;

    QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(currPath.toLocalFile());

    QFileInfoList::iterator fileInfo;
    for ( fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end(); fileInfo +=  1) {
        QString fullFileName = fileInfo->absoluteFilePath();
        UBFeatureElementType featureType = fileTypeFromUrl(fullFileName);

        if (featureType != FEATURE_INVALID && !fullFileName.contains(".thumbnail.")) {
            noItems++;
        } else {
            continue;
        }

        if (featureType == FEATURE_FOLDER) {
            noItems += featuresCount(QUrl::fromLocalFile(fullFileName));
        }
    }

    return noItems;
}

454 455
void UBFeaturesController::loadFavoriteList()
{
456
	favoriteSet = new QSet<QUrl>();
457 458 459 460 461 462 463 464 465
	QFile file( UBSettings::userDataDirectory() + "/favorites.dat" );
	if ( file.exists() )
	{
		file.open(QIODevice::ReadOnly);
		QDataStream in(&file);
		int elementsNumber;
		in >> elementsNumber;
		for ( int i = 0; i < elementsNumber; ++i)
		{
466
			QUrl path;
467
			in >> path;
468
            favoriteSet->insert( path );
469 470 471 472 473 474 475 476 477 478 479
		}
	}
}

void UBFeaturesController::saveFavoriteList()
{
	QFile file( UBSettings::userDataDirectory() + "/favorites.dat" );
	file.resize(0);
	file.open(QIODevice::WriteOnly);
	QDataStream out(&file);
	out << favoriteSet->size();
480
	for ( QSet<QUrl>::iterator it = favoriteSet->begin(); it != favoriteSet->end(); ++it )
481 482 483 484 485 486
	{
		out << (*it);
	}
	file.close();
}

487
void UBFeaturesController::addToFavorite( const QUrl &path )
488 489
{
	QString filePath = fileNameFromUrl( path );
490
	if ( favoriteSet->find( path ) == favoriteSet->end() )
491 492 493
	{
		QFileInfo fileInfo( filePath );
		QString fileName = fileInfo.fileName();
494
        UBFeatureElementType type = fileTypeFromUrl(fileInfo.absoluteFilePath());
Ilia Ryabokon's avatar
Ilia Ryabokon committed
495
        UBFeature elem(favoritePath + "/" + fileName, getIcon(filePath, type), fileName, path, fileTypeFromUrl(filePath) );
496
		favoriteSet->insert( path );
497
		saveFavoriteList();
498 499 500

        if ( !elem.getVirtualPath().isEmpty() && !elem.getVirtualPath().isNull())
        featuresModel->addItem( elem );
501 502 503
	}
}

504
void UBFeaturesController::removeFromFavorite( const QUrl &path, bool deleteManualy)
505
{
506
//	QString filePath = fileNameFromUrl( path );
507
	if ( favoriteSet->find( path ) != favoriteSet->end() )
508
	{
509
		favoriteSet->erase( favoriteSet->find( path ) );
510 511
		saveFavoriteList();
	}
512 513 514 515

    if (deleteManualy) {
        featuresModel->deleteFavoriteItem(path.toString());
    }
516 517
}

518 519 520 521 522 523 524 525
QString UBFeaturesController::fileNameFromUrl( const QUrl &url )
{
	QString fileName = url.toString();
	if ( fileName.contains( "uniboardTool://" ) )
		return fileName;
	return url.toLocalFile();
}

526

527
UBFeatureElementType UBFeaturesController::fileTypeFromUrl(const QString &path)
528
{
529
    QFileInfo fileInfo(path);
530

531 532 533 534 535 536 537
    if (!fileInfo.exists()) {
        return FEATURE_INVALID;
    }

    QString fileName = fileInfo.fileName();
    QString mimeString = UBFileSystemUtils::mimeTypeFromFileName(fileName);

538
    UBFeatureElementType fileType = FEATURE_INVALID;
539 540 541 542

    if ( mimeString.contains("application")) {
        if (mimeString.contains("application/search")) {
            fileType = FEATURE_SEARCH;
543 544
        } else if (mimeString.contains("application/x-shockwave-flash")) {
            fileType = FEATURE_FLASH;
545 546 547 548
        } else {
            fileType = FEATURE_INTERACTIVE;
        }
    } else if ( path.contains("uniboardTool://")) {
549
		fileType = FEATURE_INTERNAL;
550 551 552 553 554 555 556 557 558 559 560
    } else if (mimeString.contains("audio")) {
        fileType = FEATURE_AUDIO;
    } else if (mimeString.contains("video")) {
        fileType = FEATURE_VIDEO;
    } else if (mimeString.contains("image")) {
        fileType = FEATURE_IMAGE;
    } else if (fileInfo.isDir()) {
        fileType = FEATURE_FOLDER;
    } else {
        fileType = FEATURE_INVALID;
    }
561

562 563 564
	return fileType;
}

565
QImage UBFeaturesController::getIcon(const QString &path, UBFeatureElementType pFType = FEATURE_INVALID)
Anna Udovichenko's avatar
Anna Udovichenko committed
566
{
567 568
    if (pFType == FEATURE_FOLDER) {
        return QImage(":images/libpalette/folder.svg");
569
    } else if (pFType == FEATURE_INTERACTIVE || pFType == FEATURE_SEARCH) {
Yimgo's avatar
Yimgo committed
570
        return QImage(UBGraphicsWidgetItem::iconFilePath(QUrl::fromLocalFile(path)));
571 572
    } else if (pFType == FEATURE_INTERNAL) {
        return QImage(UBToolsManager::manager()->iconFromToolId(path));
573 574
    } else if (pFType == FEATURE_FLASH) {
        return QImage(":images/libpalette/FlashIcon.svg");
575 576 577 578 579 580 581 582 583 584 585 586
    } else if (pFType == FEATURE_AUDIO) {
        return QImage(":images/libpalette/soundIcon.svg");
    } else if (pFType == FEATURE_VIDEO) {
        return QImage(":images/libpalette/movieIcon.svg");
    } else if (pFType == FEATURE_IMAGE) {
        QImage pix(path);
        if (pix.isNull()) {
            pix = QImage(":images/libpalette/notFound.png");
        } else {
            pix = pix.scaledToWidth(qMin(UBSettings::maxThumbnailWidth, pix.width()));
        }
        return pix;
587 588
    }

589
    return QImage(":images/libpalette/notFound.png");
Anna Udovichenko's avatar
Anna Udovichenko committed
590 591
}

592 593
bool UBFeaturesController::isDeletable( const QUrl &url )
{
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
    UBFeatureElementType type = fileTypeFromUrl(fileNameFromUrl(url));
    return type == FEATURE_AUDIO
            || type == FEATURE_VIDEO
            || type == FEATURE_IMAGE
            || type == FEATURE_ITEM;
}

QString UBFeaturesController::categoryNameForVirtualPath(const QString &str)
{
    QString result;
    int ind = str.lastIndexOf("/");
    if (ind != -1) {
        result = str.right(str.count() - ind - 1);
    }
    return result;
609 610
}

611
QImage UBFeaturesController::createThumbnail(const QString &path)
Anna Udovichenko's avatar
Anna Udovichenko committed
612
{
613
    QString thumbnailPath = path;
Anna Udovichenko's avatar
Anna Udovichenko committed
614 615
    QString mimetype = UBFileSystemUtils::mimeTypeFromFileName(path);

616
    if ( mimetype.contains("audio" )) {
Anna Udovichenko's avatar
Anna Udovichenko committed
617
        thumbnailPath = ":images/libpalette/soundIcon.svg";
618
    } else if ( mimetype.contains("video")) {
Anna Udovichenko's avatar
Anna Udovichenko committed
619
        thumbnailPath = ":images/libpalette/movieIcon.svg";
620 621 622 623 624 625 626 627
    } else {
        QImage pix(path);
        if (!pix.isNull()) {
            pix = pix.scaledToWidth(qMin(UBSettings::maxThumbnailWidth, pix.width()), Qt::SmoothTransformation);
            return pix;

        } else {
            thumbnailPath = ":images/libpalette/notFound.png";
Anna Udovichenko's avatar
Anna Udovichenko committed
628
        }
629

Anna Udovichenko's avatar
Anna Udovichenko committed
630 631
    }

632
    return QImage(thumbnailPath);
Anna Udovichenko's avatar
Anna Udovichenko committed
633 634
}

635
void UBFeaturesController::importImage(const QImage &image, const QString &fileName)
636
{
637 638 639
    importImage(image, currentElement, fileName);
}

640

641 642 643 644 645 646 647
void UBFeaturesController::importImage( const QImage &image, const UBFeature &destination, const QString &fileName )
{
    QString mFileName = fileName;
    if (mFileName.isNull()) {
        QDateTime now = QDateTime::currentDateTime();
        mFileName  = tr("ImportedImage") + "-" + now.toString("dd-MM-yyyy hh-mm-ss") + ".png";
    }
648 649 650 651 652 653 654 655

    UBFeature dest = destination;

    if ( !destination.getFullVirtualPath().startsWith( picturesElement.getFullVirtualPath(), Qt::CaseInsensitive ) )
    {
	    dest = picturesElement;
    }

656
    QString filePath = dest.getFullPath().toLocalFile() + "/" + mFileName;
657 658
    image.save(filePath);

659
    QImage thumb = createThumbnail( filePath );
Ilia Ryabokon's avatar
Ilia Ryabokon committed
660
    UBFeature resultItem =  UBFeature( dest.getFullVirtualPath() + "/" + mFileName, thumb, mFileName,
661
        QUrl::fromLocalFile( filePath ), FEATURE_ITEM );
662 663 664

    featuresModel->addItem(resultItem);

665 666
}

667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687
QStringList UBFeaturesController::getFileNamesInFolders()
{
    QStringList strList;

    Q_ASSERT(curListModel);

    for (int i = 0; i < curListModel->rowCount(QModelIndex()); i++) {
        QModelIndex ind = curListModel->index(i, 0);
        if (!ind.isValid()) {
            qDebug() << "incorrect model index catched";
            continue;
        }
        UBFeature curFeature = curListModel->data(ind, Qt::UserRole + 1).value<UBFeature>();
        if (curFeature.getType() == FEATURE_FOLDER) {
            strList << QFileInfo(curFeature.getFullPath().toLocalFile()).fileName();
        }
    }

    return strList;
}

688
void UBFeaturesController::addNewFolder(QString name)
689
{
690
    QString path = currentElement.getFullPath().toLocalFile() + "/" + name;
691

Aleksei Kanash's avatar
Aleksei Kanash committed
692 693 694 695 696
    if ("/root" == currentElement.getFullVirtualPath())
    {
        return;
    }

697
    if(!QFileInfo(path).exists()) {
698 699
        QDir().mkpath(path);
	}
Ilia Ryabokon's avatar
Ilia Ryabokon committed
700
    UBFeature newFeatureFolder = UBFeature( currentElement.getFullVirtualPath() + "/" + name, QImage(":images/libpalette/folder.svg"),
701 702
                                            name, QUrl::fromLocalFile( path ), FEATURE_FOLDER );

Ilia Ryabokon's avatar
Ilia Ryabokon committed
703
    featuresModel->addItem(newFeatureFolder);
704
    featuresProxyModel->invalidate();
705 706
}

Anna Udovichenko's avatar
Anna Udovichenko committed
707 708
void UBFeaturesController::addItemToPage(const UBFeature &item)
{
709
    UBApplication::boardController->downloadURL( item.getFullPath() );
Anna Udovichenko's avatar
Anna Udovichenko committed
710 711
}

712 713 714 715 716
void UBFeaturesController::addItemAsBackground(const UBFeature &item)
{
    UBApplication::boardController->downloadURL( item.getFullPath(), QPointF(), QSize(), true );
}

717
UBFeature UBFeaturesController::getDestinationFeatureForUrl( const QUrl &url )
Anna Udovichenko's avatar
Anna Udovichenko committed
718
{
719
    QString mimetype = UBFileSystemUtils::mimeTypeFromFileName( url.toString() );
Anna Udovichenko's avatar
Anna Udovichenko committed
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736

    if ( mimetype.contains("audio") )
        return audiosElement;
    if ( mimetype.contains("video") )
        return moviesElement;
    else if ( mimetype.contains("image") )
        return picturesElement;
    else if ( mimetype.contains("application") )
	{
        if ( mimetype.contains( "x-shockwave-flash") )
            return flashElement;
        else
            return interactElement;
    }
    return UBFeature();
}

737
void UBFeaturesController::addDownloadedFile(const QUrl &sourceUrl, const QByteArray &pData)
738
{
Ilia Ryabokon's avatar
Ilia Ryabokon committed
739
    UBFeature dest = getDestinationFeatureForUrl(sourceUrl);
740

Ilia Ryabokon's avatar
Ilia Ryabokon committed
741
    if (dest == UBFeature())
742 743
        return;

744 745 746 747
    QString fileName = QFileInfo( sourceUrl.toString() ).fileName();
    QString filePath = dest.getFullPath().toLocalFile() + "/" + fileName;

    QFile file( filePath );
748
    if ( file.open(QIODevice::WriteOnly ))
749 750 751
    {
        file.write(pData);
        file.close();
752

Ilia Ryabokon's avatar
Ilia Ryabokon committed
753
        UBFeature downloadedFeature = UBFeature(dest.getFullVirtualPath() + "/" + fileName, getIcon( filePath ),
754 755 756 757
                                                 fileName, QUrl::fromLocalFile(filePath), FEATURE_ITEM);
        if (downloadedFeature != UBFeature()) {
            featuresModel->addItem(downloadedFeature);
        }
758
    }
759

760 761
}

Anna Udovichenko's avatar
Anna Udovichenko committed
762 763
UBFeature UBFeaturesController::moveItemToFolder( const QUrl &url, const UBFeature &destination )
{
Anna Udovichenko's avatar
Anna Udovichenko committed
764
	/*UBFeature newElement = copyItemToFolder( url, destination );
765
	deleteItem( url );
Anna Udovichenko's avatar
Anna Udovichenko committed
766 767 768 769 770
	return newElement;*/
    QString sourcePath = url.toLocalFile();

	Q_ASSERT( QFileInfo( sourcePath ).exists() );

Ilia Ryabokon's avatar
Ilia Ryabokon committed
771
    UBFeature possibleDest = getDestinationFeatureForUrl(url);
Anna Udovichenko's avatar
Anna Udovichenko committed
772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790

	UBFeature dest = destination;

	if ( destination != trashElement && 
		!destination.getFullVirtualPath().startsWith( possibleDest.getFullVirtualPath(), Qt::CaseInsensitive ) )
	{
		dest = possibleDest;
	}

	QString name = QFileInfo( sourcePath ).fileName();
    QString destPath = dest.getFullPath().toLocalFile();
	QString destVirtualPath = dest.getFullVirtualPath();
	QString newFullPath = destPath + "/" + name;
    if ( sourcePath.compare( newFullPath, Qt::CaseInsensitive ) )
    {
	    QFile( sourcePath ).copy( newFullPath );
        deleteItem( url );
    }

791
    QImage thumb = getIcon( newFullPath );
Anna Udovichenko's avatar
Anna Udovichenko committed
792 793 794 795
	
    UBFeatureElementType type = FEATURE_ITEM;
	if ( UBFileSystemUtils::mimeTypeFromFileName( newFullPath ).contains("application") ) 
        type = FEATURE_INTERACTIVE;
Ilia Ryabokon's avatar
Ilia Ryabokon committed
796
    UBFeature newElement( destVirtualPath + "/" + name, thumb, name, QUrl::fromLocalFile( newFullPath ), type );
797 798 799 800 801
    return newElement;
}

void UBFeaturesController::rescanModel()
{
802
    featuresModel->removeRows(0, featuresList->count());
803 804 805 806 807 808 809 810 811 812 813 814 815 816 817

    //Could implement infolder scanning for better perfomance
    scanFS();
    refreshModels();
}

void UBFeaturesController::siftElements(const QString &pSiftValue)
{
    featuresProxyModel->setFilterFixedString(pSiftValue);
    featuresProxyModel->invalidate();

    featuresPathModel->setPath(pSiftValue);
    featuresPathModel->invalidate();
}

818
UBFeature UBFeaturesController::getFeature(const QModelIndex &index, const QString &listName)
819
{
820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
//    QSortFilterProxyModel *model = qobject_cast<QSortFilterProxyModel *>(pOnView->model());
    QAbstractItemModel *model = 0;
    if (listName == UBFeaturesWidget::objNamePathList) {
        model = featuresPathModel;
    } else if (listName == UBFeaturesWidget::objNameFeatureList) {
        model = curListModel;
    }

    if (model) {
        return model->data(index, Qt::UserRole + 1).value<UBFeature>();
    }

    return UBFeature();


//    return pOnView->model()->data(index, Qt::UserRole + 1).value<UBFeature>();  /*featuresSearchModel->data(index, Qt::UserRole + 1).value<UBFeature>()*/;
836 837 838 839 840 841 842 843
}

void UBFeaturesController::searchStarted(const QString &pattern, QListView *pOnView)
{
    if (pattern.isEmpty()) {

        pOnView->setModel(featuresProxyModel);
        featuresProxyModel->invalidate();
844 845
        curListModel = featuresProxyModel;
    } else if ( pattern.size() > 1 ) {
846

847
        //        featuresSearchModel->setFilterPrefix(currentElement.getFullVirtualPath());
848 849 850
        featuresSearchModel->setFilterWildcard( "*" + pattern + "*" );
        pOnView->setModel(featuresSearchModel );
        featuresSearchModel->invalidate();
851
        curListModel = featuresSearchModel;
852 853 854 855 856 857 858 859
    }
}

void UBFeaturesController::refreshModels()
{
    featuresProxyModel->invalidate();
    featuresSearchModel->invalidate();
    featuresPathModel->invalidate();
860 861 862 863
}

UBFeature UBFeaturesController::copyItemToFolder( const QUrl &url, const UBFeature &destination )
{
864
    QString sourcePath = url.toLocalFile();
865

866
    Q_ASSERT( QFileInfo( sourcePath ).exists() );
867

868
    UBFeature possibleDest = getDestinationFeatureForUrl( url );
Anna Udovichenko's avatar
Anna Udovichenko committed
869

870
    UBFeature dest = destination;
Anna Udovichenko's avatar
Anna Udovichenko committed
871

872 873 874 875 876
    if ( destination != trashElement &&
        !destination.getFullVirtualPath().startsWith( possibleDest.getFullVirtualPath(), Qt::CaseInsensitive ) )
    {
        dest = possibleDest;
    }
Anna Udovichenko's avatar
Anna Udovichenko committed
877

878
    QString name = QFileInfo(sourcePath).fileName();
879
    QString destPath = dest.getFullPath().toLocalFile();
880 881
    QString destVirtualPath = dest.getFullVirtualPath();
    QString newFullPath = destPath + "/" + name;
882 883
    if (!sourcePath.compare(newFullPath, Qt::CaseInsensitive))
        QFile(sourcePath).copy(newFullPath);
884

885
    QImage thumb = getIcon(newFullPath);
886

Ivan Ilin's avatar
Ivan Ilin committed
887
    UBFeatureElementType type = FEATURE_ITEM;
888
    if (UBFileSystemUtils::mimeTypeFromFileName(newFullPath).contains("application"))
Ivan Ilin's avatar
Ivan Ilin committed
889
        type = FEATURE_INTERACTIVE;
Ilia Ryabokon's avatar
Ilia Ryabokon committed
890
    UBFeature newElement( destVirtualPath + "/" + name, thumb, name, QUrl::fromLocalFile( newFullPath ), type );
891
    return newElement;
Anna Udovichenko's avatar
Anna Udovichenko committed
892
}
893

894 895 896 897 898 899 900 901 902 903
void UBFeaturesController::moveExternalData(const QUrl &url, const UBFeature &destination)
{
    QString sourcePath = url.toLocalFile();

    Q_ASSERT( QFileInfo( sourcePath ).exists() );

    UBFeature possibleDest = getDestinationFeatureForUrl(url);

    UBFeature dest = destination;

Ilia Ryabokon's avatar
Ilia Ryabokon committed
904 905
    if ( destination != trashElement && destination != UBFeature()
       /*&& !destination.getFullVirtualPath().startsWith( possibleDest.getFullVirtualPath(), Qt::CaseInsensitive )*/ )
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926
    {
        dest = possibleDest;
    }

    UBFeatureElementType type = fileTypeFromUrl(sourcePath);

    if (type == FEATURE_FOLDER) {
        return;
    }

    QString name = QFileInfo(sourcePath).fileName();
    QString destPath = dest.getFullPath().toLocalFile();
    QString destVirtualPath = dest.getFullVirtualPath();
    QString newFullPath = destPath + "/" + name;

    if (!sourcePath.compare(newFullPath, Qt::CaseInsensitive) || !UBFileSystemUtils::copy(sourcePath, newFullPath)) {
        return;
    }

    Q_ASSERT(QFileInfo(newFullPath).exists());

927
    QImage thumb = getIcon(newFullPath, type);
Ilia Ryabokon's avatar
Ilia Ryabokon committed
928
    UBFeature newElement(destVirtualPath + "/" + name, thumb, name, QUrl::fromLocalFile(newFullPath), type);
929 930 931 932

    featuresModel->addItem(newElement);
}

933
void UBFeaturesController::deleteItem(const QUrl &url)
Anna Udovichenko's avatar
Anna Udovichenko committed
934
{
935 936
    QString path = url.toLocalFile();
    Q_ASSERT( QFileInfo( path ).exists() );
Anna Udovichenko's avatar
Anna Udovichenko committed
937

938
	QString thumbnailPath = UBFileSystemUtils::thumbnailPath( path );
939 940 941 942 943 944 945 946 947 948 949 950 951 952
    if ( thumbnailPath.length() && QFileInfo( thumbnailPath ).exists()) {
        if (QFileInfo(thumbnailPath).isFile()) {
            QFile::remove(thumbnailPath);
        } else if (QFileInfo(thumbnailPath).isDir()){
            if (!UBFileSystemUtils::deleteDir(thumbnailPath)) {
                qDebug() << "Not able to delete directory";
             }
        }
    }
    if (QFileInfo(path).isFile()) {
        QFile::remove( path );

    } else if (QFileInfo(path).isDir()) {
        UBFileSystemUtils::deleteDir(path);
Anna Udovichenko's avatar
Anna Udovichenko committed
953
    }
954 955 956 957 958 959 960
}

void UBFeaturesController::deleteItem(const UBFeature &pFeature)
{
    QUrl sourceUrl = pFeature.getFullPath();
    featuresModel->deleteItem(pFeature);
    deleteItem(sourceUrl);
961
}
Anna Udovichenko's avatar
Anna Udovichenko committed
962

963 964
bool UBFeaturesController::isTrash( const QUrl &url )
{
965
    return url.toLocalFile().startsWith( trashDirectoryPath.toLocalFile() );
Anna Udovichenko's avatar
Anna Udovichenko committed
966
}
967 968 969 970 971 972
void UBFeaturesController::moveToTrash(UBFeature feature, bool deleteManualy)
{
    featuresModel->moveData(feature, trashElement, Qt::MoveAction, deleteManualy);
    removeFromFavorite(feature.getFullPath());
    featuresModel->deleteFavoriteItem(UBFeaturesController::fileNameFromUrl(feature.getFullPath()));
}
Anna Udovichenko's avatar
Anna Udovichenko committed
973 974 975

UBFeaturesController::~UBFeaturesController()
{
976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995
    if (featuresList) {
        delete featuresList;
    }
}

void UBFeaturesController::assignFeaturesListVeiw(UBFeaturesListView *pList)
{
    pList->setDragDropMode( QAbstractItemView::DragDrop );
    pList->setSelectionMode( QAbstractItemView::ContiguousSelection );

    pList->setResizeMode( QListView::Adjust );
    pList->setViewMode( QListView::IconMode );

    pList->setIconSize(QSize(UBFeaturesWidget::defaultThumbnailSize, UBFeaturesWidget::defaultThumbnailSize));
    pList->setGridSize(QSize(UBFeaturesWidget::defaultThumbnailSize + 20, UBFeaturesWidget::defaultThumbnailSize + 20));

    itemDelegate = new UBFeaturesItemDelegate(this, pList);
    pList->setItemDelegate(itemDelegate);

    pList->setModel(featuresProxyModel);
996
    curListModel = featuresProxyModel;
Anna Udovichenko's avatar
Anna Udovichenko committed
997
}
998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018

void UBFeaturesController::assignPathListView(UBFeaturesListView *pList)
{
    pList->setViewMode(QListView::IconMode );
    pList->setIconSize(QSize(UBFeaturesWidget::defaultThumbnailSize - 10, UBFeaturesWidget::defaultThumbnailSize - 10));
    pList->setGridSize(QSize(UBFeaturesWidget::defaultThumbnailSize + 10, UBFeaturesWidget::defaultThumbnailSize - 10));
    pList->setFixedHeight(60);
    pList->setSelectionMode(QAbstractItemView::NoSelection);
    pList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    pList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    pList->setFlow(QListView::LeftToRight);
    pList->setWrapping(false);
    pList->setDragDropMode(QAbstractItemView::DropOnly);

    pList->setModel( featuresPathModel);

    pathItemDelegate = new UBFeaturesPathItemDelegate(this);
    pList->setItemDelegate(pathItemDelegate);
}