From d6b178b1fdcdac519ded25e3f253d9eeffa84053 Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 28 Jul 2013 07:46:16 +0200 Subject: 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. --- filepropertiesdialog.cpp | 214 +++++++++++++++++++++++++---------------------- 1 file changed, 115 insertions(+), 99 deletions(-) (limited to 'filepropertiesdialog.cpp') 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 -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #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("Properties - %1")).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(); - 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() << 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 data = QList() << 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 > &streamData){ - SmTreeItem *root = new SmTreeItem(2); - for(int i = 0; i < streamData.size(); ++i){ - QList titleData; - QString title = QString(tr("Stream %1")).arg(QString::number(i)); - titleData << title << QVariant(); - SmTreeItem *titleItem = new SmTreeItem(titleData, root); - root->appendChild(titleItem); - QMap::const_iterator it = streamData.at(i).constBegin(); - while(it != streamData.at(i).constEnd()){ - QList 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() << tr("width") << img.width(), rootItem); + appendItem(QList() << tr("height") << img.height(), rootItem); + appendItem(QList() << tr("depth") << img.depth(), rootItem); + appendItem(QList() << tr("alpha channel") << (img.hasAlphaChannel() ? tr("yes") : tr("no")), rootItem); + appendItem(QList() << tr("qt format") << img.format(), rootItem); + appendItem(QList() << tr("byte count") << img.byteCount(), rootItem); + mPicModel->setRoot(rootItem); } -void FilePropertiesDialog::addData(const QString &caption, const QMap &data){ - SmTreeItem *root = new SmTreeItem(*mModel->root()); - QList titleData; - titleData << caption << QVariant(); - SmTreeItem *titleItem = new SmTreeItem(titleData, root); - root->appendChild(titleItem); - QMap::const_iterator it = data.constBegin(); - while(it != data.constEnd()){ - QList 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 &data, SmTreeItem *parent){ + SmTreeItem *item = new SmTreeItem(data, parent); + parent->appendChild(item); } -- cgit v1.2.3-70-g09d2