diff options
-rw-r--r-- | archivetreeview.cpp | 11 | ||||
-rw-r--r-- | archivetreeview.h | 1 | ||||
-rw-r--r-- | filestreemodel.cpp | 125 | ||||
-rw-r--r-- | filestreemodel.h | 16 | ||||
-rw-r--r-- | shemov.cpp | 2 | ||||
-rw-r--r-- | smglobals.cpp | 2 |
6 files changed, 124 insertions, 33 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp index 621a7ee..0d91d21 100644 --- a/archivetreeview.cpp +++ b/archivetreeview.cpp @@ -45,7 +45,7 @@ ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){ mFilesWidget = new FilesTreeWidget; QAbstractItemModel *filesModel = SmGlobals::instance()->model("FilesModel"); mFilesModel = static_cast<FilesTreeModel*>(filesModel); - for(int i = 5; i < 11; ++i){ + for(int i = 5; i < 12; ++i){ mFilesWidget->filesTree()->setColumnHidden(i, true); } connect(mSeriesWidget, SIGNAL(filesReload()), mFilesWidget->filesTree(), SLOT(expandAll())); @@ -166,10 +166,11 @@ void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItem mFilesModel->setIds(selectedPartIds); mFilesWidget->filesTree()->expandAll(); - mFilesWidget->filesTree()->resizeColumnToContents(0); - mFilesWidget->filesTree()->resizeColumnToContents(1); - mFilesWidget->filesTree()->resizeColumnToContents(2); - mFilesWidget->filesTree()->resizeColumnToContents(3); + mFilesWidget->filesTree()->resizeColumnToContents(FilesTreeModel::FileName); + mFilesWidget->filesTree()->resizeColumnToContents(FilesTreeModel::PartNo); + mFilesWidget->filesTree()->resizeColumnToContents(FilesTreeModel::Quality); + mFilesWidget->filesTree()->resizeColumnToContents(FilesTreeModel::DvdNo); + mFilesWidget->filesTree()->resizeColumnToContents(FilesTreeModel::DisplayName); setMappingItems(selectedPartIds, mActorsModel, mActorsWidget); setMappingItems(selectedPartIds, mGenresModel, mGenresWidget); } diff --git a/archivetreeview.h b/archivetreeview.h index 9ea2604..ddfad7e 100644 --- a/archivetreeview.h +++ b/archivetreeview.h @@ -12,7 +12,6 @@ #include <QModelIndexList> #include <QList> -class SmUberModel; class SeriesTreeWidget; class FilesTreeWidget; class FilesTreeModel; 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: ; } diff --git a/filestreemodel.h b/filestreemodel.h index 405878b..2a9519f 100644 --- a/filestreemodel.h +++ b/filestreemodel.h @@ -21,9 +21,9 @@ class SeriesTreeModel; class FilesTreeModel : public SmTreeModel { Q_OBJECT public: - enum CustomRoles { FileNameRole = Qt::UserRole + 1, FullPathRole = Qt::UserRole + 2, SizeRole = Qt::UserRole + 3, DvdNoRole = Qt::UserRole + 4, SizeDisplayRole = Qt::UserRole + 5, FileTypeRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, PartNoRole = Qt::UserRole + 8, SeriesPartIdRole = Qt::UserRole + 9, QualityRole = Qt::UserRole + 10, FilesIdRole = Qt::UserRole + 11, SeriesPartRole = Qt::UserRole + 12, DisplayNameRole = Qt::UserRole + 13 }; + enum CustomRoles { FileNameRole = Qt::UserRole + 1, FullPathRole = Qt::UserRole + 2, SizeRole = Qt::UserRole + 3, DvdNoRole = Qt::UserRole + 4, SizeDisplayRole = Qt::UserRole + 5, FileTypeRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, PartNoRole = Qt::UserRole + 8, SeriesPartIdRole = Qt::UserRole + 9, QualityRole = Qt::UserRole + 10, FilesIdRole = Qt::UserRole + 11, SeriesPartRole = Qt::UserRole + 12, DisplayNameRole = Qt::UserRole + 13, SizeDurationRole = Qt::UserRole + 14 }; enum FileTypes { Movie = 1, FrontCover = 2, BackCover = 3, GeneralCover = 4 }; - enum Fields { FileName = 0, PartNo = 1, SizeDisplay = 2, Quality = 3, DvdNo = 4, FullPath = 5, Size = 6, FileType = 7, Md5Sum = 8, SeriesPartId = 9, FilesId = 10, SeriesPart = 11, DisplayName = 12 }; + enum Fields { FileName = 0, PartNo = 1, SizeDisplay = 2, Quality = 3, DvdNo = 4, FullPath = 5, Size = 6, FileType = 7, Md5Sum = 8, SeriesPartId = 9, FilesId = 10, SeriesPart = 11, DisplayName = 12, SizeDuration = 13 }; enum Mode { Normal = 0, Archived = 1, Local = 2 }; explicit FilesTreeModel(QStringList &headers, QObject *parent = 0); const QHash<int, QString> fileTypes() const { return mFileTypes; } @@ -39,8 +39,10 @@ class FilesTreeModel : public SmTreeModel { bool setData(const QModelIndex &index, const QVariant &value, int role); Qt::ItemFlags flags(const QModelIndex &index) const; QHash<QString, QString> filesBySeriesPartId(int seriesPartId) const; - QList<QMap<QString, QString> > streamInfo(const QModelIndex &idx); - QMap<QString, QString> pictureInfo(const QModelIndex &idx); + QList<QMap<QString, QString> > streamInfo(const QModelIndex &idx) const; + QList<QMap<QString, QString> > streamInfo(const QString &path) const; + QMap<QString, QString> pictureInfo(const QString &path) const; + QMap<QString, QString> pictureInfo(const QModelIndex &idx) const; QMap<QString, QString> pictureMetaInfo(const QModelIndex &idx); //file manipulation @@ -48,6 +50,10 @@ class FilesTreeModel : public SmTreeModel { bool deleteFile(const QModelIndex &file); bool deleteFiles(const QModelIndexList &files); + //misc + void readCache(); + void writeCache(); + private: //functions void populate(QSqlQuery &filesQuery); @@ -64,8 +70,10 @@ class FilesTreeModel : public SmTreeModel { QHash<int, QString> mFileTypes; QHash<int, QString> mCoverTypes; QHash<int, QString> mModeNames; + QHash<QString, QString> mPicsDurationCache; SeriesTreeModel *mSeriesModel; int mMode; + const int mMagic; }; #endif // FILESTREEMODEL_H @@ -98,6 +98,8 @@ void SheMov::closeEvent(QCloseEvent *event){ mFSWidget->writeSettings(); mFSWidget->pictureViewer()->close(); mATree->seriesWidget()->writeSettings(); + FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); + filesModel->writeCache(); writeSettings(); delete SmGlobals::instance(); event->accept(); diff --git a/smglobals.cpp b/smglobals.cpp index 61530d1..8c572f1 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -53,7 +53,7 @@ QAbstractItemModel *SmGlobals::model(const QString &which){ } }else if(which == "FilesModel"){ if(!mModels.contains(which)){ - QStringList headers = QStringList() << tr("Name") << tr("Part") << tr("Size") << tr("Qual.") << tr("Dvd") << tr("Full Path") << tr("Size") << tr("Type") << tr("Md5 sum") << tr("Series part ID") << tr("File ID"); + QStringList headers = QStringList() << tr("Name") << tr("Part") << tr("Size") << tr("Qual.") << tr("Dvd") << tr("Full Path") << tr("Size") << tr("Type") << tr("Md5 sum") << tr("Series part ID") << tr("File ID") << tr("Seriespart") << tr("Display name") << tr("Dur./Size"); FilesTreeModel *model = new FilesTreeModel(headers); mModels.insert(which, model); } |