summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2013-07-27 03:59:47 +0200
committerArno <am@disconnect.de>2013-07-27 04:02:21 +0200
commit0afebd0e3cb3da831cd5ffba1eefbe9e61e408a1 (patch)
treee92bd13b2ddda3af1af51d25c22d5042fb635139
parent46a552d89c70895abc75d94f3c647be29873afd9 (diff)
downloadSheMov-0afebd0e3cb3da831cd5ffba1eefbe9e61e408a1.tar.gz
SheMov-0afebd0e3cb3da831cd5ffba1eefbe9e61e408a1.tar.bz2
SheMov-0afebd0e3cb3da831cd5ffba1eefbe9e61e408a1.zip
Read JSON from ffprobe
Use JSON output from ffprobe instead of string parsing to get some kind of type safety. For doing that, some changes were needed in FileView: Use delegates for displaying Duration and Bitrate instead of mangling output in Qt::Displayrole. To reuse code, move all delegates from the new Archive to a separate file. And, of course, the initial objective: Show the accumulated size and duration of selected files in the status bar from the experimental archive.
-rw-r--r--archivecontroller.cpp26
-rw-r--r--archivecontroller.h5
-rw-r--r--archivemodel.cpp2
-rw-r--r--archiveview.cpp65
-rw-r--r--archiveview.h37
-rw-r--r--delegates.cpp86
-rw-r--r--delegates.h59
-rw-r--r--filesystemwidget.cpp3
-rw-r--r--fileview.cpp28
-rw-r--r--fileview.h8
-rw-r--r--helper.cpp36
-rw-r--r--helper.h3
-rw-r--r--newmoviewizard.cpp8
-rw-r--r--shemov.cpp24
-rw-r--r--shemov.h2
-rw-r--r--shemov.pro6
-rw-r--r--smdirmodel.cpp17
-rw-r--r--smdirwatcher.cpp4
18 files changed, 237 insertions, 182 deletions
diff --git a/archivecontroller.cpp b/archivecontroller.cpp
index 30d94f3..bda54c2 100644
--- a/archivecontroller.cpp
+++ b/archivecontroller.cpp
@@ -61,6 +61,7 @@ void ArchiveController::setMetadata(QTextEdit *metadata){
void ArchiveController::init(){
connect(mArchiveSelection, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(treeSelectionChanged(QItemSelection,QItemSelection)));
connect(mArchiveFiles, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(fileDoubleClicked(QModelIndex)));
+ connect(mFileSelection, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection)));
}
void ArchiveController::playSelectedFiles(){
@@ -211,6 +212,31 @@ void ArchiveController::treeSelectionChanged(const QItemSelection &selected, con
}
}
+void ArchiveController::fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected){
+ Q_UNUSED(selected);
+ Q_UNUSED(deselected);
+ QModelIndexList sel = mapToSource(mArchiveFilesProxy, mFileSelection->selectedRows());
+ if(sel.isEmpty()){
+ return;
+ }
+ qint64 size = 0;
+ qint64 duration = 0;
+ bool maybeMore = false;
+ foreach(QModelIndex i, sel){
+ size += i.data(ArchiveFilesModel::SizeRole).toInt();
+ int type = i.data(ArchiveFilesModel::FileTypeRole).toInt();
+ if(type == ArchiveFilesModel::Movie){
+ int dur = i.data(ArchiveFilesModel::SizeDurRole).toInt();
+ duration += dur;
+ if(dur == 0){
+ maybeMore = true;
+ }
+ }
+ }
+ emit sizeChanged(size);
+ emit durationChanged(duration, maybeMore);
+}
+
void ArchiveController::fileDoubleClicked(const QModelIndex &idx){
if(!idx.isValid()){
return;
diff --git a/archivecontroller.h b/archivecontroller.h
index 750b017..4f24973 100644
--- a/archivecontroller.h
+++ b/archivecontroller.h
@@ -45,6 +45,7 @@ class ArchiveController : public QObject {
public slots:
void treeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+ void fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void playSelectedFiles();
void editQuality();
void editDvdNo();
@@ -56,6 +57,10 @@ class ArchiveController : public QObject {
private slots:
void fileDoubleClicked(const QModelIndex &idx);
+ signals:
+ void sizeChanged(qint64 newSize);
+ void durationChanged(qint64 newDuration, bool maybeMore);
+
private:
QModelIndexList mapToSource(const QSortFilterProxyModel *proxy, const QModelIndexList idxs) const;
ArchiveView *mArchiveView;
diff --git a/archivemodel.cpp b/archivemodel.cpp
index 255910f..2c3dd7c 100644
--- a/archivemodel.cpp
+++ b/archivemodel.cpp
@@ -833,7 +833,7 @@ void ArchiveFilesModel::populate(const QSet<int> &seriesPartIds){
while(q.next()){
QList<QVariant> data;
data << QVariant(); //expansion (empty)
- data << q.value(0) << q.value(1) << q.value(2) << q.value(3) << q.value(4) << q.value(5) << q.value(6) << q.value(7) << q.value(8); // << q.value(9);
+ data << q.value(0) << q.value(1) << q.value(2) << q.value(3) << q.value(4) << q.value(5) << q.value(6) << q.value(7) << q.value(8);
if(!q.value(9).isNull()){
data << q.value(9);
}else if(!q.value(10).isNull()){
diff --git a/archiveview.cpp b/archiveview.cpp
index 3031815..18effbd 100644
--- a/archiveview.cpp
+++ b/archiveview.cpp
@@ -27,6 +27,7 @@
#include "archiveview.h"
#include "archivecontroller.h"
#include "mappingtablewidget.h"
+#include "delegates.h"
#include "smglobals.h"
#include "helper.h"
@@ -674,67 +675,3 @@ QString PartEditor::subtitle() const {
return mSubtitle->text();
}
-/* Delegate for File no. */
-
-QString FileNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{
- Q_UNUSED(locale);
- int no = value.toInt();
- if(no){
- return QString::number(no);
- }
- return QString();
-}
-
-QWidget *FileNoDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
- Q_UNUSED(option);
- QSpinBox *retval = new QSpinBox(parent);
- int no = index.data().toInt();
- retval->setValue(no);
- return retval;
-}
-
-/* Delegate for Dvd no. */
-
-QString DvdNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{
- Q_UNUSED(locale);
- int no = value.toInt();
- if(no < 0){
- return tr("(local)");
- }
- QString retval = QString(tr("#%1")).arg(QString::number(no));
- return retval;
-}
-
-/* Delegate for size */
-
-QString SizeDelegate::displayText(const QVariant &value, const QLocale &locale) const{
- // locale.toString() doesn't work, maybe b/c it's const
- Q_UNUSED(locale);
- QLocale l;
- return l.toString(value.toLongLong());
-}
-
-/* Delegate for duration */
-
-QString DurationDelegate::displayText(const QVariant &value, const QLocale &locale) const{
- Q_UNUSED(locale);
- if(value.toString().contains("x")){
- return value.toString();
- }
- qint64 secs = value.toInt();
- if(secs == 0){
- return tr("n/a");
- }
- Helper::Duration dur(secs);
- return dur.toString();
-}
-
-/* Empty delegate */
-
-QString EmptyDelegate::displayText(const QVariant &value, const QLocale &locale) const{
- int i = value.toInt();
- if(i < 1){
- return QString();
- }
- return QStyledItemDelegate::displayText(value, locale);
-}
diff --git a/archiveview.h b/archiveview.h
index 6627508..48517da 100644
--- a/archiveview.h
+++ b/archiveview.h
@@ -236,41 +236,4 @@ class PartEditor : public QDialog {
QPushButton *mAccept;
};
-class FileNoDelegate : public QStyledItemDelegate {
- Q_OBJECT
- public:
- explicit FileNoDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
- virtual QString displayText(const QVariant &value, const QLocale &locale) const;
- virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
-};
-
-class DvdNoDelegate : public QStyledItemDelegate {
- Q_OBJECT
- public:
- explicit DvdNoDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
- virtual QString displayText(const QVariant &value, const QLocale &locale) const;
-};
-
-class SizeDelegate : public QStyledItemDelegate {
- Q_OBJECT
- public:
- explicit SizeDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
- virtual QString displayText(const QVariant &value, const QLocale &locale) const;
-};
-
-class DurationDelegate : public QStyledItemDelegate {
- Q_OBJECT
- public:
- explicit DurationDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
- virtual QString displayText(const QVariant &value, const QLocale &locale) const;
-};
-
-class EmptyDelegate : public QStyledItemDelegate {
- Q_OBJECT
- public:
- explicit EmptyDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
- virtual QString displayText(const QVariant &value, const QLocale &locale) const;
-};
-
-
#endif // ARCHIVEVIEW_H
diff --git a/delegates.cpp b/delegates.cpp
new file mode 100644
index 0000000..ec1fe54
--- /dev/null
+++ b/delegates.cpp
@@ -0,0 +1,86 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#include <QVariant>
+#include <QSpinBox>
+
+#include "delegates.h"
+#include "helper.h"
+
+/* Delegate for File no. */
+
+QString FileNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{
+ Q_UNUSED(locale);
+ int no = value.toInt();
+ if(no){
+ return QString::number(no);
+ }
+ return QString();
+}
+
+QWidget *FileNoDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
+ Q_UNUSED(option);
+ QSpinBox *retval = new QSpinBox(parent);
+ int no = index.data().toInt();
+ retval->setValue(no);
+ return retval;
+}
+
+/* Delegate for Dvd no. */
+
+QString DvdNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{
+ Q_UNUSED(locale);
+ int no = value.toInt();
+ if(no < 0){
+ return tr("(local)");
+ }
+ QString retval = QString(tr("#%1")).arg(QString::number(no));
+ return retval;
+}
+
+/* Delegate for size */
+
+QString SizeDelegate::displayText(const QVariant &value, const QLocale &locale) const{
+ // locale.toString() doesn't work, maybe b/c it's const
+ Q_UNUSED(locale);
+ QLocale l;
+ return l.toString(value.toLongLong());
+}
+
+/* Delegate for duration */
+
+QString DurationDelegate::displayText(const QVariant &value, const QLocale &locale) const{
+ Q_UNUSED(locale);
+ if(value.toString().contains("x")){
+ return value.toString();
+ }
+ qint64 secs = value.toInt();
+ if(secs == 0){
+ return tr("n/a");
+ }
+ Helper::Duration dur(secs);
+ return dur.toString();
+}
+
+/* Delegate for bitrate */
+
+QString BitrateDelegate::displayText(const QVariant &value, const QLocale &locale) const{
+ Q_UNUSED(locale);
+ int br = value.toInt() / 1000;
+ QString retval = QString("%1 kb/s").arg(QString::number(br));
+ return retval;
+}
+
+/* Empty delegate */
+
+QString EmptyDelegate::displayText(const QVariant &value, const QLocale &locale) const{
+ int i = value.toInt();
+ if(i < 1){
+ return QString();
+ }
+ return QStyledItemDelegate::displayText(value, locale);
+}
diff --git a/delegates.h b/delegates.h
new file mode 100644
index 0000000..86ee94e
--- /dev/null
+++ b/delegates.h
@@ -0,0 +1,59 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#ifndef DELEGATES_H
+#define DELEGATES_H
+
+#include <QString>
+#include <QWidget>
+#include <QStyleOptionViewItem>
+#include <QStyledItemDelegate>
+
+class FileNoDelegate : public QStyledItemDelegate {
+ Q_OBJECT
+ public:
+ explicit FileNoDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual QString displayText(const QVariant &value, const QLocale &locale) const;
+ virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+};
+
+class DvdNoDelegate : public QStyledItemDelegate {
+ Q_OBJECT
+ public:
+ explicit DvdNoDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual QString displayText(const QVariant &value, const QLocale &locale) const;
+};
+
+class SizeDelegate : public QStyledItemDelegate {
+ Q_OBJECT
+ public:
+ explicit SizeDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual QString displayText(const QVariant &value, const QLocale &locale) const;
+};
+
+class DurationDelegate : public QStyledItemDelegate {
+ Q_OBJECT
+ public:
+ explicit DurationDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual QString displayText(const QVariant &value, const QLocale &locale) const;
+};
+
+class BitrateDelegate : public QStyledItemDelegate {
+ Q_OBJECT
+ public:
+ explicit BitrateDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual QString displayText(const QVariant &value, const QLocale &locale) const;
+};
+
+class EmptyDelegate : public QStyledItemDelegate {
+ Q_OBJECT
+ public:
+ explicit EmptyDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual QString displayText(const QVariant &value, const QLocale &locale) const;
+};
+
+#endif // DELEGATES_H
diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp
index 7ded048..9a4efa0 100644
--- a/filesystemwidget.cpp
+++ b/filesystemwidget.cpp
@@ -27,6 +27,7 @@
#include "filesystemfileproxy.h"
#include "pictureviewer2.h"
#include "smglobals.h"
+#include "delegates.h"
#include "smdirmodel.h"
FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent), mClipboardMode(None) {
@@ -65,6 +66,8 @@ FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent), mClipboar
mFileView->setItemsExpandable(false);
mFileView->setSelectionMode(QAbstractItemView::ExtendedSelection);
mFileView->setSelectionBehavior(QAbstractItemView::SelectRows);
+ mFileView->setItemDelegateForColumn(SmDirModel::DurSize, new DurationDelegate(this));
+ mFileView->setItemDelegateForColumn(SmDirModel::Bitrate, new BitrateDelegate(this));
mFileProxy->setDynamicSortFilter(true);
connect(mFileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), mFileView, SLOT(selectedFilesChanged()));
diff --git a/fileview.cpp b/fileview.cpp
index 1720552..336d179 100644
--- a/fileview.cpp
+++ b/fileview.cpp
@@ -6,15 +6,15 @@
*/
#include <QContextMenuEvent>
-#include <QtWidgets/QMenu>
-#include <QtWidgets/QAction>
+#include <QMenu>
+#include <QAction>
#include <QKeyEvent>
#include <QModelIndex>
#include <QRegExp>
-#include <QtWidgets/QFileSystemModel>
+#include <QFileSystemModel>
#include <QSortFilterProxyModel>
-#include <QtWidgets/QAction>
-#include <QtWidgets/QApplication>
+#include <QAction>
+#include <QApplication>
#include <QEvent>
#include <QSettings>
#include <QModelIndex>
@@ -23,7 +23,7 @@
#include <QList>
#include <QDir>
#include <QSortFilterProxyModel>
-#include <QtWidgets/QInputDialog>
+#include <QInputDialog>
#include <QPalette>
#include <QTimer>
#include <QHeaderView>
@@ -50,12 +50,6 @@ void FileView::setModel(QAbstractItemModel *model){
SmTreeView::setModel(model);
}
-const QVariant FileView::duration() const {
- QVariant retval;
- retval.setValue(mDuration);
- return retval;;
-}
-
void FileView::markFiles(){
bool ok;
QString title = QString(tr("%1 - %2")).arg(qApp->applicationName()).arg(tr("Mark files"));
@@ -228,17 +222,13 @@ void FileView::selectedFilesChanged(){
QModelIndexList selected = selectionModel()->selectedRows();
emit numSelected(selected.size());
qint64 selSize = 0;
- Helper::Duration dur;
+ qint64 dur = 0;
foreach(QModelIndex i, selected){
selSize += i.data(SmDirModel::SizeRole).toLongLong();
- Helper::Duration curDur = i.data(SmDirModel::DurSizeRole).value<Helper::Duration>();
- dur = dur + curDur;
+ dur += i.data(SmDirModel::DurSizeRole).toInt();
}
emit selectedSize(selSize);
- mDuration = dur;
- QVariant duration;
- duration.setValue(dur);
- emit selectedDuration(duration);
+ emit selectedDuration(dur, false);
}
void FileView::saveSelection(){
diff --git a/fileview.h b/fileview.h
index ad2b522..2f4a51c 100644
--- a/fileview.h
+++ b/fileview.h
@@ -29,7 +29,6 @@ class FileView : public SmTreeView {
FileView(QWidget *parent = 0);
~FileView() {}
virtual void setModel(QAbstractItemModel *model);
- const QVariant duration() const;
signals:
void upDir();
@@ -39,7 +38,7 @@ class FileView : public SmTreeView {
void editorClosed(const QModelIndex &idx);
void numSelected(int);
void selectedSize(qint64);
- void selectedDuration(QVariant);
+ void selectedDuration(qint64,bool);
public slots:
void markFiles();
@@ -49,6 +48,7 @@ class FileView : public SmTreeView {
void writeConfig();
void saveSelection();
void restoreSelection();
+ void selectedFilesChanged();
protected slots:
virtual void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint);
@@ -59,9 +59,6 @@ class FileView : public SmTreeView {
virtual void resizeEvent(QResizeEvent *e);
virtual bool event(QEvent *event);
- private slots:
- void selectedFilesChanged();
-
private:
enum HoverFileType { Dir, Movie, Image, None };
bool exitHover(bool exitVal = true);
@@ -77,7 +74,6 @@ class FileView : public SmTreeView {
QList<QString> mMd5Sums;
FilesystemFileProxy *mProxy;
SmDirModel *mModel;
- Helper::Duration mDuration;
};
#endif
diff --git a/helper.cpp b/helper.cpp
index b73ea2a..1881102 100644
--- a/helper.cpp
+++ b/helper.cpp
@@ -19,9 +19,11 @@
#include <QProcess>
#include <QRect>
#include <QTime>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QDesktopWidget>
-#include <QtWidgets/QApplication>
+#include <QWidget>
+#include <QDesktopWidget>
+#include <QApplication>
+#include <QJsonDocument>
+#include <QJsonObject>
#include <stdio.h>
@@ -216,32 +218,22 @@ namespace Helper {
widget->move(widgetRect.topLeft());
}
- QList<QVariant> duration(const QString &path){
+
+ QVariantMap ffmpegData(const QString &path){
QSettings s;
QString ffProbe = s.value("paths/ffprobe").toString();
QStringList args;
- QList<QVariant> retval = QList<QVariant>() << QVariant() << QVariant();
- args << "-show_streams" << path;
+ QVariantMap retval;
+ args << "-v" << "quiet" << "-print_format" << "json" << "-show_format" << path;
QProcess ffproc;
ffproc.start(ffProbe, args);
if(!ffproc.waitForStarted()){
- return retval;
+ return QVariantMap();
}
ffproc.waitForFinished();
- QByteArray ffData = ffproc.readAllStandardError();
- QList<QByteArray> lines = ffData.split('\n');
-
- foreach(QString l, lines){
- QString llc = l.toLower();
- if(llc.contains("duration")){
- int idx = llc.indexOf("duration:");
- retval[0].setValue(Duration(llc.mid(idx + 10, 8)));
- idx = llc.indexOf("bitrate:");
- retval[1] = llc.mid(idx + 9);
- break;
- }
- }
- return retval;
+ QByteArray ffData = ffproc.readAllStandardOutput();
+ QJsonDocument jsDoc = QJsonDocument::fromJson(ffData);
+ return jsDoc.object().value("format").toObject().toVariantMap();
}
Duration::Duration() : mHours(0), mMinutes(0), mSeconds(0) {}
@@ -249,7 +241,7 @@ namespace Helper {
Duration::Duration(qint64 seconds){
int sec(0), min(0), h(0);
// get hours
- h = (seconds / 60 / 60) % 24;
+ h = (seconds / 60 / 60);
// remaining minutes
min = (seconds / 60) % 60;
// seconds
diff --git a/helper.h b/helper.h
index f4b00f0..634eb12 100644
--- a/helper.h
+++ b/helper.h
@@ -32,7 +32,7 @@ namespace Helper {
const QStringList toStringList(const QList<QVariant> &list);
const QString colorToHtml(const QColor &color);
void centerWidget(QWidget *widget);
- QList<QVariant> duration(const QString &path);
+ QVariantMap ffmpegData(const QString &path);
class Duration {
public:
Duration();
@@ -50,7 +50,6 @@ namespace Helper {
};
}
-
Q_DECLARE_METATYPE(Helper::Duration)
#endif
diff --git a/newmoviewizard.cpp b/newmoviewizard.cpp
index 9447a6c..a5df22a 100644
--- a/newmoviewizard.cpp
+++ b/newmoviewizard.cpp
@@ -31,6 +31,7 @@
#include "mappingtablemodel.h"
#include "seriesmetadatamodel.h"
#include "filestreemodel.h"
+#include "delegates.h"
#include "helper.h"
#include "pictureviewer2.h"
#include "archivemodel.h"
@@ -124,13 +125,12 @@ void NewMovieWizard::accept(){
qint64 size = fi.size();
QString md5 = Helper::md5Sum(fullPath);
md5Sums.insert(fullPath, md5);
- int secs = 0;
+ qint64 secs = 0;
QString picSize;
int type = fData.value(WizardTreeModel::FileType).toInt();
if(type == ArchiveFilesModel::Movie){
- QVariant v = Helper::duration(fullPath).value(0);
- Helper::Duration dur = v.value<Helper::Duration>();
- secs = dur.toSeconds();
+ QVariantMap m = Helper::ffmpegData(fullPath);
+ secs = m.value("duration").toInt();
}else{
QPixmap pix(fullPath);
picSize = QString("%1x%2").arg(QString::number(pix.width())).arg(QString::number(pix.height()));
diff --git a/shemov.cpp b/shemov.cpp
index 7acf59f..8865d0c 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -102,6 +102,10 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla
connect(mNewMovieWizard, SIGNAL(accepted()), c->archiveTreeModel(), SLOT(refresh()));
mNewPicsDialog = new NewPicsDialog(this);
+ //experimental archive
+ connect(c, SIGNAL(sizeChanged(qint64)), this, SLOT(setSize(qint64)));
+ connect(c, SIGNAL(durationChanged(qint64,bool)), this, SLOT(setDuration(qint64,bool)));
+
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(mTab);
@@ -116,7 +120,7 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla
splash.showMessage(tr("Finishing..."), Qt::AlignHCenter, Qt::yellow);
qApp->processEvents();
connect(mFSWidget->fileView(), SIGNAL(selectedSize(qint64)), this, SLOT(setSize(qint64)));
- connect(mFSWidget->fileView(), SIGNAL(selectedDuration(QVariant)), this, SLOT(setDuration(QVariant)));
+ connect(mFSWidget->fileView(), SIGNAL(selectedDuration(qint64,bool)), this, SLOT(setDuration(qint64,bool)));
connect(mFSWidget->fileView(), SIGNAL(numSelected(int)), this, SLOT(updateSelectedCount(int)));
connect(mFSWidget, SIGNAL(windowTitle(QString)), this, SLOT(setWindowTitle(QString)));
connect(mFSWidget->fileView(), SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &)));
@@ -197,15 +201,19 @@ void SheMov::tabChanged(int newTab){
mPVShowNPDialogA->setEnabled(newTab == FileManager);
mPVAddToNPA->setEnabled(newTab == FileManager);
statusbarMessage(QString());
+ ArchiveController *c = SmGlobals::instance()->archiveController();
switch(newTab){
case FileManager:
connect(mPVSelectAllA, SIGNAL(triggered()), mFSWidget, SLOT(selectAllPV()));
- setDuration(mFSWidget->fileView()->duration());
+ mFSWidget->fileView()->selectedFilesChanged();
+ break;
+ case Experimental:
+ c->fileSelectionChanged(QItemSelection(), QItemSelection());
break;
case Pictures:
connect(mPVSelectAllA, SIGNAL(triggered()), mPicWidget->picView(), SLOT(setPVAll()));
default:
- setDuration(QVariant());
+ setDuration(0x0, false);
;;
}
}
@@ -322,9 +330,13 @@ void SheMov::setSize(qint64 size){
mSelectedSize->setText(val);
}
-void SheMov::setDuration(const QVariant dur){
- Helper::Duration d = dur.value<Helper::Duration>();
- mSelectedDuration->setText(d.toString());
+void SheMov::setDuration(qint64 dur, bool maybeMore){
+ Helper::Duration d(dur);
+ QString t = d.toString();
+ if(maybeMore){
+ t.append("+");
+ }
+ mSelectedDuration->setText(t);
}
QAction *SheMov::createSeparator(){
diff --git a/shemov.h b/shemov.h
index efccaa2..d8f7eef 100644
--- a/shemov.h
+++ b/shemov.h
@@ -45,7 +45,7 @@ class SheMov : public QMainWindow {
void newMovieWizard();
void newMovieWizardWithFiles();
void setSize(qint64 size);
- void setDuration(const QVariant dur);
+ void setDuration(qint64 dur, bool maybeMore);
void checkConsistency();
void toggleHover(QObject *object);
void checkMount(bool mounted);
diff --git a/shemov.pro b/shemov.pro
index b6f83d0..95d0278 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -46,7 +46,8 @@ SOURCES = main.cpp \
smtreeview.cpp \
archivemodel.cpp \
archiveview.cpp \
- archivecontroller.cpp
+ archivecontroller.cpp \
+ delegates.cpp
HEADERS = \
filesystemdirproxy.h \
filesystemwidget.h \
@@ -88,6 +89,7 @@ HEADERS = \
smtreeview.h \
archivemodel.h \
archiveview.h \
- archivecontroller.h
+ archivecontroller.h \
+ delegates.h
LIBS += -lmagic -lXfixes -lX11
RESOURCES = shemov.qrc
diff --git a/smdirmodel.cpp b/smdirmodel.cpp
index f967cf1..16caf02 100644
--- a/smdirmodel.cpp
+++ b/smdirmodel.cpp
@@ -71,23 +71,6 @@ QVariant SmDirModel::data(const QModelIndex &index, int role) const{
return QVariant(QColor(Qt::darkGreen));
}
return SmTreeModel::data(index, role);
- case Qt::DisplayRole: {
- if(index.column() == DurSize){
- QVariant d = i->data(DurSize);
- if(d.canConvert<Helper::Duration>()){
- Helper::Duration dur = d.value<Helper::Duration>();
- return dur.toString();
- }
- if(d.canConvert<QSize>()){
- QSize size = d.value<QSize>();
- QString retval = QString(tr("%1x%2 px").arg(QString::number(size.width())).arg(QString::number(size.height())));
- return retval;
- }
- return QVariant();
- }
- }
-
-
default:
return SmTreeModel::data(index, role);
}
diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp
index 2421b1e..a6163c2 100644
--- a/smdirwatcher.cpp
+++ b/smdirwatcher.cpp
@@ -147,7 +147,9 @@ const QList<QVariant> SmDataColletor::fileData(const QFileInfo &fi){
data << fi.lastModified();
QList<QVariant> si = QList<QVariant>() << QVariant() << QVariant();
if(mime.startsWith("video")){
- si = Helper::duration(fi.absoluteFilePath());
+ QVariantMap ffData = Helper::ffmpegData(fi.absoluteFilePath());
+ si[0] = ffData.value("duration").toDouble();
+ si[1] = ffData.value("bit_rate").toInt();
}else if(mime.startsWith("image")){
QImage img(fi.absoluteFilePath());
si[0] = img.size();