diff options
-rw-r--r-- | filewidget.cpp | 25 | ||||
-rw-r--r-- | filewidget.h | 2 | ||||
-rw-r--r-- | helper.cpp | 56 | ||||
-rw-r--r-- | helper.h | 3 | ||||
-rw-r--r-- | shemovcleaner.qrc | 1 | ||||
-rw-r--r-- | snapshot.png | bin | 0 -> 1988 bytes | |||
-rw-r--r-- | viewer.cpp | 15 | ||||
-rw-r--r-- | viewer.h | 1 |
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; @@ -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){ @@ -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 Binary files differnew file mode 100644 index 0000000..d2e8880 --- /dev/null +++ b/snapshot.png @@ -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()){ @@ -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); |