diff options
author | Arno <am@disconnect.de> | 2010-07-31 16:26:10 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-07-31 16:26:10 +0200 |
commit | 8eba6e7f033617f3e7ea3bd9913105df0de74ae2 (patch) | |
tree | 8d4b93a4a686e6e57526b77033bb985fa9545036 /filestreemodel.cpp | |
parent | 6d3b28f9b12964b161b5a7ac0038435cfdd6e27b (diff) | |
download | SheMov-8eba6e7f033617f3e7ea3bd9913105df0de74ae2.tar.gz SheMov-8eba6e7f033617f3e7ea3bd9913105df0de74ae2.tar.bz2 SheMov-8eba6e7f033617f3e7ea3bd9913105df0de74ae2.zip |
Implement FilePropertiesDialog
Implemented a dialog for file properties. When the mime type says it's a
video, fork ffprobe to read the properties of all streams and show them
in a QTreeView powered by a SmTreeModel. If the mime type is image, use
QImage to read some properties and show them in the same dialog.
This commit introduces the new class FilePropertiesDialog. I also had to
implement a copy constructor for SmTreeItem. It obsoletes classes
ActorWidget, ActorModel and MoviePropertiesDialog.
Diffstat (limited to 'filestreemodel.cpp')
-rw-r--r-- | filestreemodel.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/filestreemodel.cpp b/filestreemodel.cpp index 1f224fd..9c17084 100644 --- a/filestreemodel.cpp +++ b/filestreemodel.cpp @@ -10,6 +10,9 @@ #include <QIcon> #include <QFileInfo> #include <QFile> +#include <QSettings> +#include <QProcess> +#include <QImage> #include "filestreemodel.h" #include "smtreeitem.h" @@ -235,6 +238,79 @@ QHash<QString, QString> FilesTreeModel::filesBySeriesPartId(int seriesPartId){ return retval; } +QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx){ + 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; + QProcess ffproc; + ffproc.start(ffProbe, args); + if(!ffproc.waitForStarted()){ + return retval; + } + ffproc.waitForFinished(); + QByteArray ffData = ffproc.readAllStandardOutput(); + QList<QByteArray> lines = ffData.split('\n'); + QMap<QString, QString> current; + foreach(QString l, lines){ + if(l.startsWith("[STREAM]")){ + continue; + } + if(l.startsWith("[/STREAM]")){ + retval << current; + current.clear(); + continue; + } + QStringList parts = l.split('='); + if(parts.size() == 2){ + current.insert(parts.at(0), parts.at(1)); + } + } + return retval; +} + +QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx){ + QMap<QString, QString> retval; + if(!idx.isValid()){ + return retval; + } + QString fullPath = idx.data(FullPathRole).toString(); + QImage img(fullPath); + if(img.isNull()){ + return retval; + } + retval.insert("Width", QString::number(img.width())); + retval.insert("Height", QString::number(img.height())); + retval.insert("Colors", QString::number(img.colorCount())); + retval.insert("Color depth", QString::number(img.depth())); + retval.insert("Byte count", QString::number(img.byteCount())); + retval.insert("Bytes per line", QString::number(img.bytesPerLine())); + retval.insert("Alpha channel", img.hasAlphaChannel() ? tr("yes") : tr("no")); + retval.insert("Gray scale", img.isGrayscale() ? tr("yes") : tr("no")); + return retval; +} + +QMap<QString, QString> FilesTreeModel::pictureMetaInfo(const QModelIndex &idx){ + QMap<QString, QString> retval; + if(!idx.isValid()){ + return retval; + } + QString fullPath = idx.data(FullPathRole).toString(); + QImage img(fullPath); + if(img.isNull()){ + return retval; + } + foreach(QString v, img.textKeys()){ + retval.insert(v, img.text(v)); + } + return retval; +} + bool FilesTreeModel::addFile(const QString &fullPath, int type, int quality, int filePart, int seriesPartId, int dvd){ QFileInfo fi(fullPath); qint64 size = fi.size(); |