summaryrefslogtreecommitdiffstats
path: root/filepropertiesdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filepropertiesdialog.cpp')
-rw-r--r--filepropertiesdialog.cpp214
1 files changed, 115 insertions, 99 deletions
diff --git a/filepropertiesdialog.cpp b/filepropertiesdialog.cpp
index a22076c..f130b0b 100644
--- a/filepropertiesdialog.cpp
+++ b/filepropertiesdialog.cpp
@@ -5,121 +5,137 @@
2 of the License, or (at your option) any later version.
*/
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QPushButton>
-#include <QSettings>
-#include <QApplication>
+#include <QPushButton>
+#include <QJsonDocument>
+#include <QJsonArray>
+#include <QJsonObject>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QTabWidget>
+#include <QStackedWidget>
+#include <QImage>
#include "filepropertiesdialog.h"
-#include "seriesmetadatamodel.h"
+#include "smtreemodel.h"
#include "smtreeitem.h"
#include "smtreeview.h"
#include "helper.h"
-FilePropertiesDialog::FilePropertiesDialog(/*int seriesPartId, */QWidget *parent, Qt::WindowFlags f) : SmDialog(parent, f){
- //tab
- mTab = new QTabWidget;
+FilePropertiesDialog::FilePropertiesDialog(const QString &file, QWidget *parent, Qt::WindowFlags f) : SmDialog(parent, f), mFile(file){
+ mStack = new QStackedWidget;
+ mTab = new QTabWidget;
+ QString lText = QString(tr("<b>Properties - %1</b>")).arg(mFile);
+ QLabel *l = new QLabel(lText);
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(l);
- //stream data widget
- QVBoxLayout *streamDataLayout = new QVBoxLayout;
- QWidget *streamData = new QWidget;
+ QWidget *formatWidget = new QWidget;
+ mFormatView = new SmTreeView;
+ mFormatModel = new SmTreeModel(QStringList() << tr("Key") << tr("Value"), this);
+ mFormatView->setModel(mFormatModel);
+ QHBoxLayout *formatLayout = new QHBoxLayout;
+ formatLayout->addWidget(mFormatView);
+ formatWidget->setLayout(formatLayout);
+ mTab->addTab(formatWidget, tr("Format"));
- //description
- mDescriptionLabel = new QLabel(tr("Properties for [none]"));
- mDescriptionLabel->setAutoFillBackground(true);
- mDescriptionLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
- streamDataLayout->addWidget(mDescriptionLabel);
- QSettings s;
- QVariant varColor = s.value("ui/alternatecolor");
- QColor labelColor = varColor.value<QColor>();
- QPalette labelPalette = mDescriptionLabel->palette();
- labelPalette.setColor(QPalette::Window, labelColor);
- mDescriptionLabel->setPalette(labelPalette);
+ QWidget *streamWidget = new QWidget;
+ mStreamView = new SmTreeView;
+ mStreamModel = new SmTreeModel(QStringList() << tr("Key") << tr("Value"), this);
+ mStreamView->setModel(mStreamModel);
+ QHBoxLayout *streamLayout = new QHBoxLayout;
+ streamLayout->addWidget(mStreamView);
+ streamWidget->setLayout(streamLayout);
+ mTab->addTab(streamWidget, tr("Streams"));
+ mStack->addWidget(mTab);
- //the view + model
- mModel = new SmTreeModel((QStringList() << QString() << QString()), this);
- mView = new SmTreeView;
- mView->setHeaderHidden(true);
- mView->setEditTriggers(QAbstractItemView::NoEditTriggers);
- mView->setModel(mModel);
- streamDataLayout->addWidget(mView);
- streamData->setLayout(streamDataLayout);
- mTab->addTab(streamData, tr("Stream data"));
+ QWidget *picWidget = new QWidget;
+ mPicView = new SmTreeView;
+ mPicModel = new SmTreeModel(QStringList() << tr("Key") << tr("Value"), this);
+ mPicView->setModel(mPicModel);
+ QHBoxLayout *picLayout = new QHBoxLayout;
+ picLayout->addWidget(mPicView);
+ picWidget->setLayout(picLayout);
+ mStack->addWidget(picWidget);
- //metadata widget
- mMetadata = new MetadataWidget;
- mTab->addTab(mMetadata, tr("Metadata"));
+ mainLayout->addWidget(mStack);
+ mOk = new QPushButton(tr("Ok"));
+ connect(mOk, SIGNAL(clicked()), this, SLOT(accept()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch();
+ buttonLayout->addWidget(mOk);
+ buttonLayout->addStretch();
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
- //buttons
- QHBoxLayout *buttonLayout = new QHBoxLayout;
- mOk = new QPushButton(tr("Ok"));
- connect(mOk, SIGNAL(clicked()), this, SLOT(accept()));
- connect(mOk, SIGNAL(clicked()), mMetadata, SLOT(accept()));
- mCancel = new QPushButton(tr("Cancel"));
- connect(mCancel, SIGNAL(clicked()), this, SLOT(reject()));
- buttonLayout->setAlignment(Qt::AlignRight);
- buttonLayout->addWidget(mOk);
- buttonLayout->addWidget(mCancel);
+ QString mimeType = Helper::mimeType(mFile);
+ if(mimeType.startsWith("video")){
+ mStack->setCurrentIndex(0);
+ movieData();
+ }else if(mimeType.startsWith("image")){
+ mStack->setCurrentIndex(1);
+ pictureData();
+ }
+}
- //main layout
- QVBoxLayout *mainLayout = new QVBoxLayout;
- mainLayout->addWidget(mTab);
- mainLayout->addLayout(buttonLayout);
- setLayout(mainLayout);
- setMinimumWidth(450);
+void FilePropertiesDialog::movieData(){
+ QJsonDocument jsDoc = Helper::streamData(mFile);
+ if(jsDoc.isNull()){
+ return;
+ }
+ QJsonObject obj = jsDoc.object();
+ SmTreeItem *formatItem = new SmTreeItem(2);
+ movieDataRecursive(obj.value("format"), formatItem);
+ mFormatModel->setRoot(formatItem);
+ mFormatView->expandAll();
+ SmTreeItem *streamItem = new SmTreeItem(2);
+ QJsonArray streamA = obj.value("streams").toArray();
+ for(int i = 0; i < streamA.size(); ++i){
+ QString itemName = QString(tr("Stream %1 [%2]")).arg(QString::number(i + 1)).arg(streamA.at(i).toObject().value("codec_type").toString());
+ SmTreeItem *item = new SmTreeItem(QList<QVariant>() << itemName << QVariant(), streamItem);
+ streamItem->appendChild(item);
+ movieDataRecursive(streamA.at(i), item);
+ }
+ mStreamModel->setRoot(streamItem);
+ mStreamView->expandAll();
}
-void FilePropertiesDialog::setFileName(const QString &fileName){
- QString text = QString(tr("Properties for %1")).arg(fileName);
- mDescriptionLabel->setText(text);
- setWindowTitle(text);
+void FilePropertiesDialog::movieDataRecursive(QJsonValue start, SmTreeItem *appendTo){
+ QJsonObject sObject = start.toObject();
+ QJsonObject::const_iterator it;
+ for(it = sObject.constBegin(); it != sObject.constEnd(); ++it){
+ QList<QVariant> data = QList<QVariant>() << it.key() << it.value().toVariant();
+ if(it.key() == "duration"){
+ qint64 seconds = it.value().toString().toDouble();
+ Helper::Duration dur(seconds);
+ data[1] = dur.toString();
+ }
+ if(it.key() == "bit_rate"){
+ qint64 br = it.value().toString().toInt() / 1000;
+ data[1] = QString("%1 kb/s").arg(QString::number(br));
+ }
+ SmTreeItem *newItem = new SmTreeItem(data, appendTo);
+ appendTo->appendChild(newItem);
+ movieDataRecursive(*it, newItem);
+ }
}
-void FilePropertiesDialog::setStreamData(const QList<QMap<QString, QString> > &streamData){
- SmTreeItem *root = new SmTreeItem(2);
- for(int i = 0; i < streamData.size(); ++i){
- QList<QVariant> titleData;
- QString title = QString(tr("Stream %1")).arg(QString::number(i));
- titleData << title << QVariant();
- SmTreeItem *titleItem = new SmTreeItem(titleData, root);
- root->appendChild(titleItem);
- QMap<QString, QString>::const_iterator it = streamData.at(i).constBegin();
- while(it != streamData.at(i).constEnd()){
- QList<QVariant> itemData;
- if(it.key() == "duration" && it.value() != "N/A"){
- qint64 duration = it.value().toFloat();
- itemData << it.key() << Helper::durationFromSecs(duration);
- }else{
- itemData << it.key() << it.value();
- }
- SmTreeItem *item = new SmTreeItem(itemData, titleItem);
- titleItem->appendChild(item);
- ++it;
- }
- }
- mModel->setRoot(root);
- mView->expandAll();
- mView->resizeColumnToContents(0);
- mView->resizeColumnToContents(1);
+void FilePropertiesDialog::pictureData(){
+ QImage img = QImage(mFile);
+ if(img.isNull()){
+ return;
+ }
+ SmTreeItem *rootItem = new SmTreeItem(2);
+ appendItem(QList<QVariant>() << tr("width") << img.width(), rootItem);
+ appendItem(QList<QVariant>() << tr("height") << img.height(), rootItem);
+ appendItem(QList<QVariant>() << tr("depth") << img.depth(), rootItem);
+ appendItem(QList<QVariant>() << tr("alpha channel") << (img.hasAlphaChannel() ? tr("yes") : tr("no")), rootItem);
+ appendItem(QList<QVariant>() << tr("qt format") << img.format(), rootItem);
+ appendItem(QList<QVariant>() << tr("byte count") << img.byteCount(), rootItem);
+ mPicModel->setRoot(rootItem);
}
-void FilePropertiesDialog::addData(const QString &caption, const QMap<QString, QString> &data){
- SmTreeItem *root = new SmTreeItem(*mModel->root());
- QList<QVariant> titleData;
- titleData << caption << QVariant();
- SmTreeItem *titleItem = new SmTreeItem(titleData, root);
- root->appendChild(titleItem);
- QMap<QString, QString>::const_iterator it = data.constBegin();
- while(it != data.constEnd()){
- QList<QVariant> itemData;
- itemData << it.key() << it.value();
- SmTreeItem *item = new SmTreeItem(itemData, titleItem);
- titleItem->appendChild(item);
- ++it;
- }
- mModel->setRoot(root);
- mView->expandAll();
- mView->resizeColumnToContents(0);
- mView->resizeColumnToContents(1);
+void FilePropertiesDialog::appendItem(const QList<QVariant> &data, SmTreeItem *parent){
+ SmTreeItem *item = new SmTreeItem(data, parent);
+ parent->appendChild(item);
}