summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filewidget.cpp25
-rw-r--r--filewidget.h2
-rw-r--r--helper.cpp56
-rw-r--r--helper.h3
-rw-r--r--shemovcleaner.qrc1
-rw-r--r--snapshot.pngbin0 -> 1988 bytes
-rw-r--r--viewer.cpp15
-rw-r--r--viewer.h1
8 files changed, 102 insertions, 1 deletions
diff --git a/filewidget.cpp b/filewidget.cpp
index f56b4ce..ef918f1 100644
--- a/filewidget.cpp
+++ b/filewidget.cpp
@@ -145,6 +145,8 @@ void FileWidget::createActions(){
mPropertiesA = new QAction(QIcon(":/diaper.png"), tr("Properties..."), this);
mPropertiesA->setShortcut(Qt::CTRL + Qt::Key_Return);
connect(mPropertiesA, SIGNAL(triggered()), this, SLOT(properties()));
+ mPreviewA = new QAction(QIcon(":/snapshot.png"), tr("Preview..."), this);
+ connect(mPreviewA, SIGNAL(triggered()), this, SLOT(preview()));
mAddAsOriginA = new QAction(QIcon(":/butt_plug.png"), tr("Add as Origin..."), this);
connect(mAddAsOriginA, SIGNAL(triggered()), this, SLOT(addAsOrigin()));
@@ -164,6 +166,7 @@ void FileWidget::createActions(){
editMenu->addAction(mDeleteA);
editMenu->addSeparator();
editMenu->addAction(mPropertiesA);
+ editMenu->addAction(mPreviewA);
editMenu->addAction(mAddAsOriginA);
editMenu->addSeparator();
editMenu->addAction(Globals::instance()->action(Globals::ConfigAction));
@@ -183,11 +186,13 @@ void FileWidget::createActions(){
mToolBar->addAction(mDeleteA);
mToolBar->addAction(createSeparator());
mToolBar->addAction(mPropertiesA);
+ mToolBar->addAction(mPreviewA);
+ mToolBar->addAction(createSeparator());
mToolBar->addAction(mAddAsOriginA);
mToolBar->addAction(createSeparator());
mToolBar->addAction(Globals::instance()->action(Globals::ConfigAction));
- addActions(QList<QAction*>() << mDirBackA << mDirUpA << createSeparator() << mRefreshA << mSelDirA << createSeparator() << mCopyA << mCutA << mPasteA << mDeleteA << createSeparator() << mAddAsOriginA << mPropertiesA);
+ addActions(QList<QAction*>() << mDirBackA << mDirUpA << createSeparator() << mRefreshA << mSelDirA << createSeparator() << mCopyA << mCutA << mPasteA << mDeleteA << createSeparator() << mAddAsOriginA << createSeparator() << mPreviewA << createSeparator() << mPropertiesA);
}
void FileWidget::fileData(const QString &fullPath, const QString &md5){
@@ -513,6 +518,24 @@ void FileWidget::properties(const QModelIndex &idx){
}
}
+void FileWidget::preview(){
+ QModelIndex idx = mFileView->selectionModel()->currentIndex();
+ if(!idx.isValid()){
+ return;
+ }
+ QString mime = idx.sibling(idx.row(), MimeColumn).data().toString();
+ QString file = idx.data(FullPathRole).toString();
+ qApp->setOverrideCursor(Qt::WaitCursor);
+ Viewer *v = Globals::instance()->viewer();
+ if(mime.startsWith("video")){
+ v->preview(file);
+ }else if(mime.startsWith("image")){
+ v->setFile(file, false);
+ }
+ qApp->restoreOverrideCursor();
+ v->show();
+}
+
void FileWidget::cd(const QString &to){
QString ld = mDir->text();
QDir cur(mDir->text());
diff --git a/filewidget.h b/filewidget.h
index a886914..8304b1a 100644
--- a/filewidget.h
+++ b/filewidget.h
@@ -53,6 +53,7 @@ class FileWidget : public QWidget {
void selectDir();
void properties();
void properties(const QModelIndex &idx);
+ void preview();
void filter();
void clearFilter();
void copy();
@@ -96,6 +97,7 @@ class FileWidget : public QWidget {
QAction *mDirUpA;
QAction *mDirBackA;
QAction *mPropertiesA;
+ QAction *mPreviewA;
QAction *mCopyA;
QAction *mCutA;
QAction *mPasteA;
diff --git a/helper.cpp b/helper.cpp
index db113ec..a895ec4 100644
--- a/helper.cpp
+++ b/helper.cpp
@@ -4,6 +4,11 @@
#include <QByteArray>
#include <QSettings>
#include <QProcess>
+#include <QJsonObject>
+#include <QTemporaryFile>
+#include <QProcess>
+#include <QFontMetrics>
+#include <QPainter>
#include "helper.h"
@@ -66,6 +71,57 @@ namespace Helper {
return QJsonDocument::fromJson(ffData);
}
+ const QPixmap preview(const QString &file){
+ QJsonDocument jDoc = ffpmegData(file);
+ QJsonObject jObj = jDoc.object();
+ QJsonValue durationV = jObj["format"].toObject()["duration"];
+ int seconds = durationV.toVariant().toDouble();
+ int interval = seconds / 4;
+ QImage img1 = snapshot(file, 60);
+ QImage img2 = snapshot(file, interval * 2);
+ QImage img3 = snapshot(file, interval * 3);
+ QImage img4 = snapshot(file, seconds - 60);
+ QImage retval(640 * 2 + 10, img1.height() * 2 + 10, QImage::Format_ARGB32);
+ //retval.fill(Qt::red);
+ QPainter p(&retval);
+ p.drawImage(0, 0, img1);
+ p.drawImage(650, 0, img2);
+ p.drawImage(0, img1.height() + 10, img3);
+ p.drawImage(650, img1.height() + 10, img4);
+ return QPixmap::fromImage(retval);
+ }
+
+ const QImage snapshot(const QString &file, int offset){
+ const int fixedWith = 640;
+ QSettings s;
+ QString ffmpeg = s.value("ext/ffmpeg").toString();
+ QTemporaryFile tempFile;
+ tempFile.open();
+ QStringList ffmpegArgs = QStringList() << "-y" << "-ss" << QString::number(offset) << "-i" << file << "-f" << "image2" << "-vframes" << "1" << tempFile.fileName();
+ QProcess ffproc;
+ ffproc.start(ffmpeg, ffmpegArgs);
+ if(!ffproc.waitForStarted()){
+ return QImage();
+ }
+ if(ffproc.state() == QProcess::Running){
+ ffproc.waitForFinished();
+ }
+ QImage retval(tempFile.fileName());
+ retval = retval.scaledToWidth(fixedWith);
+ Duration dur(offset);
+ QFont font("Monospace", 10);
+ QFontMetrics fm(font);
+ int width = fm.width(dur.toString());
+ int height = fm.height();
+ QPainter p(&retval);
+ p.setBrush(QBrush(QColor(255, 255, 255, 70)));
+ QRect durationRect(fixedWith / 2 - width / 2 - 4, retval.height() - height - 8, width + 4, height + 4);
+ p.drawRect(durationRect);
+ p.setPen(Qt::black);
+ p.drawText(durationRect, Qt::AlignCenter, dur.toString());
+ return retval;
+ }
+
Duration::Duration() : mHours(0), mMinutes(0), mSeconds(0) {}
Duration::Duration(qint64 seconds){
diff --git a/helper.h b/helper.h
index 90bef11..3587183 100644
--- a/helper.h
+++ b/helper.h
@@ -3,10 +3,13 @@
#include <QString>
#include <QJsonDocument>
+#include <QPixmap>
namespace Helper {
const QString md5Sum(const QString &path);
const QJsonDocument ffpmegData(const QString &path);
+ const QPixmap preview(const QString &file);
+ const QImage snapshot(const QString &file, int offset);
class Duration {
public:
Duration();
diff --git a/shemovcleaner.qrc b/shemovcleaner.qrc
index 286aab7..bb88bcb 100644
--- a/shemovcleaner.qrc
+++ b/shemovcleaner.qrc
@@ -16,5 +16,6 @@
<file>edit-paste.png</file>
<file>higheels.png</file>
<file>hourglass_figure.png</file>
+ <file>snapshot.png</file>
</qresource>
</RCC>
diff --git a/snapshot.png b/snapshot.png
new file mode 100644
index 0000000..d2e8880
--- /dev/null
+++ b/snapshot.png
Binary files differ
diff --git a/viewer.cpp b/viewer.cpp
index 5b35b96..cd17b6a 100644
--- a/viewer.cpp
+++ b/viewer.cpp
@@ -7,6 +7,7 @@
#include <QDir>
#include <QWheelEvent>
+#include "helper.h"
#include "viewer.h"
Viewer::Viewer(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f), mCurIndex(-1) {
@@ -43,7 +44,21 @@ void Viewer::setFile(const QString &file, bool allFiles){
}
}
+void Viewer::preview(const QString &file){
+ mFiles.clear();
+ mCurIndex = -1;
+ QPixmap pm = Helper::preview(file);
+ mLabel->setPixmap(pm);
+ QString winTitle = QString(tr("%1 Viewer: [Preview %2]")).arg(qApp->applicationName()).arg(file);
+ setWindowTitle(winTitle);
+ adjustSize();
+}
+
+
void Viewer::wheelEvent(QWheelEvent *event){
+ if(mCurIndex == -1){
+ return;
+ }
QPoint numDeg = event->angleDelta() / 8;
if(numDeg.y() < 0){ //this is scrolling down -> next!
if(mCurIndex + 1 >= mFiles.count()){
diff --git a/viewer.h b/viewer.h
index d95fee3..1b3c969 100644
--- a/viewer.h
+++ b/viewer.h
@@ -9,6 +9,7 @@ class Viewer : public QWidget {
public:
Viewer(QWidget *parent = 0, Qt::WindowFlags f = 0);
void setFile(const QString &file, bool allFiles = true);
+ void preview(const QString &file);
protected:
virtual void wheelEvent(QWheelEvent *event);