diff options
author | Arno <am@disconnect.de> | 2010-08-12 19:40:33 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-08-12 19:40:33 +0200 |
commit | 91cf2978ba97bc8ebda2da9df01d3dde22b99f14 (patch) | |
tree | 27dbafd0df752982535e12fc6eb847221649a83d /filestreemodel.cpp | |
parent | 3af9f3f8b900b9dd5e09300e74d6ce49018be98e (diff) | |
download | SheMov-91cf2978ba97bc8ebda2da9df01d3dde22b99f14.tar.gz SheMov-91cf2978ba97bc8ebda2da9df01d3dde22b99f14.tar.bz2 SheMov-91cf2978ba97bc8ebda2da9df01d3dde22b99f14.zip |
Show picture size or duration in FilesTreeView
Finally managed to view size of pictures or duration for movies in the
file view. That values are not held in the database, they're created on
the fly. For this to perform I created a disk based cache.
I also had to create some convenience functions:
FilesTreeModel::streamInfo(const QString &)
FilesTreeModel::pictureInfo(const QString &)
The cache is a QDataStream and will be deleted if the magic doesn't fit.
Diffstat (limited to 'filestreemodel.cpp')
-rw-r--r-- | filestreemodel.cpp | 125 |
1 files changed, 103 insertions, 22 deletions
diff --git a/filestreemodel.cpp b/filestreemodel.cpp index c44e449..fd42802 100644 --- a/filestreemodel.cpp +++ b/filestreemodel.cpp @@ -13,6 +13,9 @@ #include <QSettings> #include <QProcess> #include <QImage> +#include <QDataStream> +#include <QDesktopServices> +#include <QDir> #include "filestreemodel.h" #include "smtreeitem.h" @@ -20,7 +23,7 @@ #include "seriestreemodel.h" #include "smglobals.h" -FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mMode(Normal){ +FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mMode(Normal), mMagic(0xAABBCCDD){ //database setup mDb = QSqlDatabase::database("treedb"); mUpdateDvdQuery = new QSqlQuery(mDb); @@ -51,6 +54,7 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo //misc mSeriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); + readCache(); } FilesTreeModel::~FilesTreeModel(){ @@ -265,16 +269,12 @@ QHash<QString, QString> FilesTreeModel::filesBySeriesPartId(int seriesPartId) co return retval; } -QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx){ +QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QString &path) const{ QList<QMap<QString, QString> > retval; - if(!idx.isValid()){ - return retval; - } QSettings s; QString ffProbe = s.value("paths/ffprobe").toString(); - QString fullPath = idx.data(FullPathRole).toString(); QStringList args; - args << "-show_streams" << fullPath; + args << "-show_streams" << path; QProcess ffproc; ffproc.start(ffProbe, args); if(!ffproc.waitForStarted()){ @@ -301,13 +301,13 @@ QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx return retval; } -QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx){ +QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx) const{ + return streamInfo(idx.data(FullPathRole).toString()); +} + +QMap<QString, QString> FilesTreeModel::pictureInfo(const QString &path) const{ QMap<QString, QString> retval; - if(!idx.isValid()){ - return retval; - } - QString fullPath = idx.data(FullPathRole).toString(); - QImage img(fullPath); + QImage img(path); if(img.isNull()){ return retval; } @@ -322,6 +322,10 @@ QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx){ return retval; } +QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx) const{ + return pictureInfo(idx.data(FullPathRole).toString()); +} + QMap<QString, QString> FilesTreeModel::pictureMetaInfo(const QModelIndex &idx){ QMap<QString, QString> retval; if(!idx.isValid()){ @@ -404,12 +408,55 @@ bool FilesTreeModel::deleteFiles(const QModelIndexList &files){ return true; } +void FilesTreeModel::readCache(){ + QString settingsDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); + QString cacheFile = QString("%1/%2").arg(settingsDir).arg("sizeduration.cache"); + QFileInfo fi(cacheFile); + if(!fi.exists()){ + return; + } + QFile cache(cacheFile); + cache.open(QIODevice::ReadOnly); + QDataStream stream(&cache); + qint32 magic; + stream >> magic; + if(magic != mMagic){ + QFile::remove(cacheFile); + return; + } + while(!stream.atEnd()){ + QString key, value; + stream >> key; + stream >> value; + mPicsDurationCache.insert(key, value); + } +} + +void FilesTreeModel::writeCache(){ + QString settingsDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); + QFileInfo fi(settingsDir); + if(!fi.exists()){ + QDir root = QDir::root(); + root.mkpath(settingsDir); + } + QString cacheFile = QString("%1/%2").arg(settingsDir).arg("sizeduration.cache"); + QFile cache(cacheFile); + cache.open(QIODevice::WriteOnly); + QDataStream stream(&cache); + stream << mMagic; + QHash<QString, QString>::const_iterator it = mPicsDurationCache.constBegin(); + while(it != mPicsDurationCache.constEnd()){ + stream << it.key() << it.value(); + ++it; + } +} + void FilesTreeModel::populate(QSqlQuery &filesQuery){ - SmTreeItem *root = new SmTreeItem(11); - SmTreeItem *files = new SmTreeItem(11, root); + SmTreeItem *root = new SmTreeItem(14); + SmTreeItem *files = new SmTreeItem(14, root); files->setData(FileName, tr("Movies")); root->appendChild(files); - SmTreeItem *covers = new SmTreeItem(11, root); + SmTreeItem *covers = new SmTreeItem(14, root); covers->setData(FileName, tr("Covers")); root->appendChild(covers); QLocale l; @@ -430,19 +477,53 @@ void FilesTreeModel::populate(QSqlQuery &filesQuery){ data << filesQuery.value(10); //seriespart QString displayName = QString("%1 %2").arg(filesQuery.value(9).toString()).arg(filesQuery.value(10).toString()); data << displayName; + data << tr("N/A"); // duration or size + QString fullPath = data.at(FullPath).toString(); + QFileInfo fi(fullPath); switch(filesQuery.value(5).toInt()){ case Movie:{ - SmTreeItem *item = new SmTreeItem(data, files); - files->appendChild(item); - break; + if(fi.exists()){ + if(mPicsDurationCache.contains(fullPath)){ + data[SizeDuration] = mPicsDurationCache.value(fullPath); + SmTreeItem *item = new SmTreeItem(data, files); + files->appendChild(item); + break; + } + QList<QMap<QString, QString> > sInfo = streamInfo(fullPath); + for(int i = 0; i < sInfo.size(); ++i){ + QString duration = sInfo.at(i).value("duration"); + if(!duration.isEmpty() && (duration != "N/A")){ + QString durFromSeconds = Helper::durationFromSecs(duration.toFloat()); + mPicsDurationCache.insert(fullPath, durFromSeconds); + data[SizeDuration] = durFromSeconds; + } + } } + SmTreeItem *item = new SmTreeItem(data, files); + files->appendChild(item); + break; + } case FrontCover: case BackCover: case GeneralCover:{ - SmTreeItem *item = new SmTreeItem(data, covers); - covers->appendChild(item); - break; + if(fi.exists()){ + if(mPicsDurationCache.contains(fullPath)){ + data[SizeDuration] = mPicsDurationCache.value(fullPath); + SmTreeItem *item = new SmTreeItem(data, files); + covers->appendChild(item); + break; + } } + QMap<QString, QString> pInfo = pictureInfo(fullPath); + if(!pInfo.isEmpty()){ + QString setVal = QString("%1x%2").arg(pInfo.value("Width")).arg(pInfo.value("Height")); + mPicsDurationCache.insert(fullPath, setVal); + data[SizeDuration] = setVal; + } + SmTreeItem *item = new SmTreeItem(data, covers); + covers->appendChild(item); + break; + } default: ; } |