diff options
author | Arno <am@disconnect.de> | 2013-07-28 07:46:16 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-07-28 07:46:16 +0200 |
commit | d6b178b1fdcdac519ded25e3f253d9eeffa84053 (patch) | |
tree | ba9a03e041fa72ccde37367ef07864884f0ced7b /filepropertiesdialog.cpp | |
parent | 5cfaa2c755c52c2ccbdd88ea3239dafb120a179b (diff) | |
download | SheMov-d6b178b1fdcdac519ded25e3f253d9eeffa84053.tar.gz SheMov-d6b178b1fdcdac519ded25e3f253d9eeffa84053.tar.bz2 SheMov-d6b178b1fdcdac519ded25e3f253d9eeffa84053.zip |
Implement file properties dialog
Show file properties in Filemanager and Archive, if the file is
available.
Also get rid of the palette stuff in SmGlobals. Just call setPalette()
early enough and set it in SmTreeView.
Diffstat (limited to 'filepropertiesdialog.cpp')
-rw-r--r-- | filepropertiesdialog.cpp | 214 |
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); } |