|
|
|
@ -22,7 +22,7 @@ |
|
|
|
|
|
|
|
|
|
const QString UBFeaturesController::virtualRootName = "root"; |
|
|
|
|
|
|
|
|
|
void UBFeaturesComputingThread::scanFS(const QUrl & currentPath, const QString & currVirtualPath) |
|
|
|
|
void UBFeaturesComputingThread::scanFS(const QUrl & currentPath, const QString & currVirtualPath, const QSet<QUrl> &pFavoriteSet) |
|
|
|
|
{ |
|
|
|
|
Q_ASSERT(QFileInfo(currentPath.toLocalFile()).exists()); |
|
|
|
|
|
|
|
|
@ -47,27 +47,29 @@ void UBFeaturesComputingThread::scanFS(const QUrl & currentPath, const QString & |
|
|
|
|
|
|
|
|
|
emit sendFeature(testFeature); |
|
|
|
|
emit featureSent(); |
|
|
|
|
emit scanPath(fullFileName); |
|
|
|
|
|
|
|
|
|
// featuresList->append(testFeature);
|
|
|
|
|
|
|
|
|
|
// if ( favoriteSet->find( QUrl::fromLocalFile( fullFileName ) ) != favoriteSet->end() ) {
|
|
|
|
|
// featuresList->append( UBFeature( favoritePath, icon, fileName, QUrl::fromLocalFile( fullFileName ), featureType ) );
|
|
|
|
|
// }
|
|
|
|
|
if ( pFavoriteSet.find(QUrl::fromLocalFile(fullFileName)) != pFavoriteSet.end()) { |
|
|
|
|
//TODO send favoritePath from the controller or make favoritePath public and static
|
|
|
|
|
emit sendFeature(UBFeature( "/root/Favorites", icon, fileName, QUrl::fromLocalFile(fullFileName), featureType)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (featureType == FEATURE_FOLDER) { |
|
|
|
|
scanFS(QUrl::fromLocalFile(fullFileName), currVirtualPath + "/" + fileName); |
|
|
|
|
scanFS(QUrl::fromLocalFile(fullFileName), currVirtualPath + "/" + fileName, pFavoriteSet); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UBFeaturesComputingThread::scanAll(QList<QPair<QUrl, QString> > pScanningData) |
|
|
|
|
void UBFeaturesComputingThread::scanAll(QList<QPair<QUrl, QString> > pScanningData, const QSet<QUrl> &pFavoriteSet) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < pScanningData.count(); i++) { |
|
|
|
|
if (abort) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
QPair<QUrl, QString> curPair = pScanningData.at(i); |
|
|
|
|
scanFS(curPair.first, curPair.second); |
|
|
|
|
|
|
|
|
|
emit scanCategory(UBFeaturesController::categoryNameForVirtualPath(curPair.second)); |
|
|
|
|
scanFS(curPair.first, curPair.second, pFavoriteSet); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -84,8 +86,6 @@ int UBFeaturesComputingThread::featuresCount(const QUrl &pPath) |
|
|
|
|
|
|
|
|
|
if (featureType != FEATURE_INVALID && !fullFileName.contains(".thumbnail.")) { |
|
|
|
|
noItems++; |
|
|
|
|
} else { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (featureType == FEATURE_FOLDER) { |
|
|
|
@ -114,11 +114,12 @@ QThread(parent) |
|
|
|
|
abort = false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UBFeaturesComputingThread::compute(const QList<QPair<QUrl, QString> > &pScanningData) |
|
|
|
|
void UBFeaturesComputingThread::compute(const QList<QPair<QUrl, QString> > &pScanningData, QSet<QUrl> *pFavoritesSet) |
|
|
|
|
{ |
|
|
|
|
QMutexLocker curLocker(&mMutex); |
|
|
|
|
|
|
|
|
|
mScanningData = pScanningData; |
|
|
|
|
mFavoriteSet = *pFavoritesSet; |
|
|
|
|
|
|
|
|
|
if (!isRunning()) { |
|
|
|
|
start(LowPriority); |
|
|
|
@ -135,6 +136,7 @@ void UBFeaturesComputingThread::run() |
|
|
|
|
|
|
|
|
|
mMutex.lock(); |
|
|
|
|
QList<QPair<QUrl, QString> > searchData = mScanningData; |
|
|
|
|
QSet<QUrl> favoriteSet = mFavoriteSet; |
|
|
|
|
mMutex.unlock(); |
|
|
|
|
|
|
|
|
|
if (abort) { |
|
|
|
@ -152,7 +154,7 @@ void UBFeaturesComputingThread::run() |
|
|
|
|
emit maxFilesCountEvaluated(fsCnt); |
|
|
|
|
|
|
|
|
|
emit scanStarted(); |
|
|
|
|
scanAll(searchData); |
|
|
|
|
scanAll(searchData, favoriteSet); |
|
|
|
|
emit scanFinished(); |
|
|
|
|
|
|
|
|
|
mMutex.lock(); |
|
|
|
@ -210,9 +212,12 @@ bool UBFeature::isFolder() const |
|
|
|
|
|| elementType == FEATURE_FOLDER; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool UBFeature::isDeletable()const |
|
|
|
|
bool UBFeature::isDeletable() const |
|
|
|
|
{ |
|
|
|
|
return elementType == FEATURE_ITEM |
|
|
|
|
|| elementType == FEATURE_AUDIO |
|
|
|
|
|| elementType == FEATURE_VIDEO |
|
|
|
|
|| elementType == FEATURE_IMAGE |
|
|
|
|
|| elementType == FEATURE_FOLDER; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -238,6 +243,7 @@ UBFeaturesController::UBFeaturesController(QWidget *pParentWidget) : |
|
|
|
|
shapesPath = rootPath + "/Shapes"; |
|
|
|
|
trashPath = rootPath + "/Trash"; |
|
|
|
|
favoritePath = rootPath + "/Favorites"; |
|
|
|
|
webSearchPath = rootPath + "/Web search"; |
|
|
|
|
|
|
|
|
|
//Initializing physical directories from UBSettings
|
|
|
|
|
mUserAudioDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->userAudioDirectory()); |
|
|
|
@ -295,11 +301,10 @@ UBFeaturesController::UBFeaturesController(QWidget *pParentWidget) : |
|
|
|
|
connect(&mCThread, SIGNAL(scanStarted()), this, SIGNAL(scanStarted())); |
|
|
|
|
connect(&mCThread, SIGNAL(scanFinished()), this, SIGNAL(scanFinished())); |
|
|
|
|
connect(&mCThread, SIGNAL(maxFilesCountEvaluated(int)), this, SIGNAL(maxFilesCountEvaluated(int))); |
|
|
|
|
//Very unsafe function. Considering using deleteLater() instead
|
|
|
|
|
// connect(qApp, SIGNAL(aboutToQuit()), &mCThread, SLOT(terminate()));
|
|
|
|
|
connect(&mCThread, SIGNAL(scanCategory(QString)), this, SIGNAL(scanCategory(QString))); |
|
|
|
|
connect(&mCThread, SIGNAL(scanPath(QString)), this, SIGNAL(scanPath(QString))); |
|
|
|
|
|
|
|
|
|
QTimer::singleShot(0, this, SLOT(startThread())); |
|
|
|
|
// startThread();
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UBFeaturesController::startThread() |
|
|
|
@ -323,7 +328,7 @@ void UBFeaturesController::startThread() |
|
|
|
|
<< QPair<QUrl, QString>(trashDirectoryPath, trashPath) |
|
|
|
|
<< QPair<QUrl, QString>(mLibSearchDirectoryPath, rootPath + "/" + "Web search" ); |
|
|
|
|
|
|
|
|
|
mCThread.compute(computingData); |
|
|
|
|
mCThread.compute(computingData, favoriteSet); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UBFeaturesController::scanFS() |
|
|
|
@ -342,6 +347,7 @@ void UBFeaturesController::scanFS() |
|
|
|
|
<< webSearchElement |
|
|
|
|
<< trashElement; |
|
|
|
|
|
|
|
|
|
//filling favoriteList
|
|
|
|
|
loadFavoriteList(); |
|
|
|
|
|
|
|
|
|
QList <UBToolsManager::UBToolDescriptor> tools = UBToolsManager::manager()->allTools(); |
|
|
|
@ -350,54 +356,9 @@ void UBFeaturesController::scanFS() |
|
|
|
|
featuresList->append(UBFeature(appPath, tool.icon.toImage(), tool.label, QUrl(tool.id), FEATURE_INTERNAL)); |
|
|
|
|
if (favoriteSet->find(QUrl(tool.id)) != favoriteSet->end()) { |
|
|
|
|
featuresList->append(UBFeature(favoritePath, tool.icon.toImage(), tool.label, QUrl(tool.id), FEATURE_INTERNAL)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
QTime time = QTime::currentTime(); |
|
|
|
|
//Claudio:
|
|
|
|
|
// don't change the order of the scans
|
|
|
|
|
// fileSystemScan( mLibAudiosDirectoryPath, audiosPath);
|
|
|
|
|
// fileSystemScan( mLibVideosDirectoryPath, moviesPath);
|
|
|
|
|
// fileSystemScan( mLibAnimationsDirectoryPath, flashPath);
|
|
|
|
|
// fileSystemScan( mLibPicturesDirectoryPath, picturesPath );
|
|
|
|
|
|
|
|
|
|
// fileSystemScan( mUserInteractiveDirectoryPath, appPath );
|
|
|
|
|
// fileSystemScan( mUserAudioDirectoryPath, audiosPath );
|
|
|
|
|
// fileSystemScan( mUserPicturesDirectoryPath, picturesPath );
|
|
|
|
|
// fileSystemScan( mUserVideoDirectoryPath, moviesPath );
|
|
|
|
|
// fileSystemScan( mUserAnimationDirectoryPath, flashPath );
|
|
|
|
|
|
|
|
|
|
// fileSystemScan( mLibApplicationsDirectoryPath, appPath );
|
|
|
|
|
// fileSystemScan( mLibShapesDirectoryPath, shapesPath );
|
|
|
|
|
// fileSystemScan( mLibInteractiveDirectoryPath, interactPath );
|
|
|
|
|
// fileSystemScan( trashDirectoryPath, trashPath );
|
|
|
|
|
// fileSystemScan( mLibSearchDirectoryPath, rootPath + "/" + "Web search" );
|
|
|
|
|
|
|
|
|
|
int i =0; |
|
|
|
|
|
|
|
|
|
i += featuresCount(mLibAudiosDirectoryPath); |
|
|
|
|
i += featuresCount(mLibVideosDirectoryPath); |
|
|
|
|
i += featuresCount(mLibAnimationsDirectoryPath); |
|
|
|
|
i += featuresCount(mLibPicturesDirectoryPath); |
|
|
|
|
|
|
|
|
|
i += featuresCount(mUserInteractiveDirectoryPath); |
|
|
|
|
i += featuresCount(mUserAudioDirectoryPath); |
|
|
|
|
i += featuresCount(mUserPicturesDirectoryPath); |
|
|
|
|
i += featuresCount(mUserVideoDirectoryPath); |
|
|
|
|
i += featuresCount(mUserAnimationDirectoryPath); |
|
|
|
|
|
|
|
|
|
i += featuresCount(mLibApplicationsDirectoryPath); |
|
|
|
|
i += featuresCount(mLibShapesDirectoryPath); |
|
|
|
|
i += featuresCount(mLibInteractiveDirectoryPath); |
|
|
|
|
i += featuresCount(trashDirectoryPath); |
|
|
|
|
i += featuresCount(mLibSearchDirectoryPath); |
|
|
|
|
|
|
|
|
|
int msecs = QTime(time).msecsTo(QTime::currentTime()); |
|
|
|
|
qDebug() << "Loading library" << msecs << "msecs\nNumber of elements" << i; |
|
|
|
|
|
|
|
|
|
// emit TopIndexingLimitSet(i);
|
|
|
|
|
// emit indexingProgressValueChanged(i / 4);
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UBFeaturesController::fileSystemScan(const QUrl & currentPath, const QString & currVirtualPath) |
|
|
|
|
{ |
|
|
|
|
QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(currentPath.toLocalFile()); |
|
|
|
@ -492,7 +453,8 @@ void UBFeaturesController::addToFavorite( const QUrl &path ) |
|
|
|
|
{ |
|
|
|
|
QFileInfo fileInfo( filePath ); |
|
|
|
|
QString fileName = fileInfo.fileName(); |
|
|
|
|
UBFeature elem(favoritePath, getIcon( filePath, FEATURE_CATEGORY ), fileName, path, fileTypeFromUrl(filePath) ); |
|
|
|
|
UBFeatureElementType type = fileTypeFromUrl(fileInfo.absoluteFilePath()); |
|
|
|
|
UBFeature elem(favoritePath, getIcon(filePath, type), fileName, path, fileTypeFromUrl(filePath) ); |
|
|
|
|
favoriteSet->insert( path ); |
|
|
|
|
saveFavoriteList(); |
|
|
|
|
|
|
|
|
@ -524,7 +486,7 @@ QString UBFeaturesController::fileNameFromUrl( const QUrl &url ) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UBFeatureElementType UBFeaturesController::fileTypeFromUrl( const QString &path ) |
|
|
|
|
UBFeatureElementType UBFeaturesController::fileTypeFromUrl(const QString &path) |
|
|
|
|
{ |
|
|
|
|
QFileInfo fileInfo(path); |
|
|
|
|
|
|
|
|
@ -535,7 +497,7 @@ UBFeatureElementType UBFeaturesController::fileTypeFromUrl( const QString &path |
|
|
|
|
QString fileName = fileInfo.fileName(); |
|
|
|
|
QString mimeString = UBFileSystemUtils::mimeTypeFromFileName(fileName); |
|
|
|
|
|
|
|
|
|
UBFeatureElementType fileType = fileInfo.isDir() ? FEATURE_FOLDER : FEATURE_ITEM; |
|
|
|
|
UBFeatureElementType fileType = FEATURE_INVALID; |
|
|
|
|
|
|
|
|
|
if ( mimeString.contains("application")) { |
|
|
|
|
if (mimeString.contains("application/search")) { |
|
|
|
@ -545,7 +507,17 @@ UBFeatureElementType UBFeaturesController::fileTypeFromUrl( const QString &path |
|
|
|
|
} |
|
|
|
|
} else if ( path.contains("uniboardTool://")) { |
|
|
|
|
fileType = FEATURE_INTERNAL; |
|
|
|
|
} |
|
|
|
|
} 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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return fileType; |
|
|
|
|
} |
|
|
|
@ -554,64 +526,65 @@ QImage UBFeaturesController::getIcon(const QString &path, UBFeatureElementType p |
|
|
|
|
{ |
|
|
|
|
if (pFType == FEATURE_FOLDER) { |
|
|
|
|
return QImage(":images/libpalette/folder.svg"); |
|
|
|
|
|
|
|
|
|
} else if (pFType == FEATURE_INTERACTIVE) { |
|
|
|
|
} else if (pFType == FEATURE_INTERACTIVE || pFType == FEATURE_SEARCH) { |
|
|
|
|
return QImage(UBAbstractWidget::iconFilePath(QUrl::fromLocalFile(path))); |
|
|
|
|
} else if (pFType == FEATURE_INTERNAL) { |
|
|
|
|
return QImage(UBToolsManager::manager()->iconFromToolId(path)); |
|
|
|
|
} 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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( path.contains("uniboardTool://") ) { |
|
|
|
|
return QImage( UBToolsManager::manager()->iconFromToolId(path) ); |
|
|
|
|
|
|
|
|
|
} if ( UBFileSystemUtils::mimeTypeFromFileName(path).contains("application")) { |
|
|
|
|
return QImage( UBAbstractWidget::iconFilePath( QUrl::fromLocalFile(path) ) ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QImage thumb; |
|
|
|
|
QString thumbnailPath = UBFileSystemUtils::thumbnailPath(path); |
|
|
|
|
|
|
|
|
|
if ( QFileInfo( thumbnailPath ).exists() ) |
|
|
|
|
thumb = QImage( thumbnailPath ); |
|
|
|
|
else thumb = createThumbnail( path ); |
|
|
|
|
|
|
|
|
|
return thumb; |
|
|
|
|
return QImage(":images/libpalette/notFound.png"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool UBFeaturesController::isDeletable( const QUrl &url ) |
|
|
|
|
{ |
|
|
|
|
UBFeatureElementType type = fileTypeFromUrl( fileNameFromUrl(url) ); |
|
|
|
|
return type == FEATURE_ITEM; |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QImage UBFeaturesController::createThumbnail(const QString &path) |
|
|
|
|
{ |
|
|
|
|
QString thumbnailPath = UBFileSystemUtils::thumbnailPath(path); |
|
|
|
|
QString thumbnailPath = path; |
|
|
|
|
QString mimetype = UBFileSystemUtils::mimeTypeFromFileName(path); |
|
|
|
|
QString extension = QFileInfo(path).completeSuffix(); |
|
|
|
|
|
|
|
|
|
if ( mimetype.contains("audio" )) |
|
|
|
|
if ( mimetype.contains("audio" )) { |
|
|
|
|
thumbnailPath = ":images/libpalette/soundIcon.svg"; |
|
|
|
|
else if ( mimetype.contains("video") ) |
|
|
|
|
} else if ( mimetype.contains("video")) { |
|
|
|
|
thumbnailPath = ":images/libpalette/movieIcon.svg"; |
|
|
|
|
else
|
|
|
|
|
{ |
|
|
|
|
if ( extension.startsWith("svg", Qt::CaseInsensitive) || extension.startsWith("svgz", Qt::CaseInsensitive) )
|
|
|
|
|
{ |
|
|
|
|
thumbnailPath = path; |
|
|
|
|
} |
|
|
|
|
else
|
|
|
|
|
{ |
|
|
|
|
QImage pix(path); |
|
|
|
|
if (!pix.isNull())
|
|
|
|
|
{ |
|
|
|
|
pix = pix.scaledToWidth(qMin(UBSettings::maxThumbnailWidth, pix.width()), Qt::SmoothTransformation); |
|
|
|
|
pix.save(thumbnailPath); |
|
|
|
|
UBPlatformUtils::hideFile(thumbnailPath); |
|
|
|
|
} |
|
|
|
|
else{ |
|
|
|
|
thumbnailPath = ":images/libpalette/notFound.png"; |
|
|
|
|
} |
|
|
|
|
} 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"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return QImage(thumbnailPath); |
|
|
|
|