diff options
Diffstat (limited to 'pictureviewer.cpp')
-rw-r--r-- | pictureviewer.cpp | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/pictureviewer.cpp b/pictureviewer.cpp new file mode 100644 index 0000000..74a06c5 --- /dev/null +++ b/pictureviewer.cpp @@ -0,0 +1,170 @@ +/* + 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 <QGraphicsScene> +#include <QGraphicsPixmapItem> +#include <QFileInfo> +#include <QLinearGradient> +#include <QDesktopWidget> +#include <QApplication> +#include <QDir> +#include <QWheelEvent> + +#include <algorithm> + +#include "pictureviewer.h" +#include "pictureviewerinfoitem.h" +#include "helper.h" + +PictureViewer::PictureViewer(QWidget *parent) : QGraphicsView(parent), mCurrentPic(0), mInfoItem(0) { + mScene = new QGraphicsScene(this); + setScene(mScene); +} + +void PictureViewer::showPic(const QString &path){ + QFileInfo fi(path); + if(!fi.exists() || fi.isDir()){ + return; + } + QPixmap img(path); + if(img.isNull()){ + return; + } + + if(mCurrentPic){ + mScene->removeItem(mCurrentPic); + mScene->removeItem(mInfoItem); + delete mCurrentPic; + delete mInfoItem; + mCurrentPic = 0; + mInfoItem = 0; + } + + setDir(path); + if(!isVisible()){ + show(); + } + + QSize maxSize; + QDesktopWidget *desktopWidget = QApplication::desktop(); + QSize desktopSize = desktopWidget->availableGeometry().size(); + if((img.height() > desktopSize.height()) || (img.width() > desktopSize.height())){ + maxSize = desktopSize; + }else{ + maxSize = img.size(); + } + + if(img.width() > maxSize.width() || img.height() > maxSize.height()){ + img = img.scaled(maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + } + + resize(img.size() + QSize(20, 20)); + setSceneRect(viewport()->rect()); + QGraphicsPixmapItem *item = new QGraphicsPixmapItem(img); + mCurrentPic = item; + item->setPos(center(img)); + mScene->addItem(item); + + PictureviewerInfoItem *infoItem = new PictureviewerInfoItem(fi.fileName()); + QRectF infoItemRect = infoItem->boundingRect(); + int infoWidth = infoItemRect.size().width(); + int viewportWidth = viewport()->size().width(); + int center = (viewportWidth - infoWidth) / 2; + mInfoItem = infoItem; + QPoint infoPoint = QPoint(center, 10); + infoItem->setPos(infoPoint); + mScene->addItem(infoItem); +} + +void PictureViewer::next(){ + if(mCurrentEntry == mDirEntries.constEnd()){ + return; + } + QString nextPath; + while(mCurrentEntry != mDirEntries.constEnd()){ + ++mCurrentEntry; + if(mCurrentEntry == mDirEntries.constEnd()){ + break; + } + QFileInfo fi = *mCurrentEntry; + if(isPic(fi.absoluteFilePath())){ + nextPath = fi.absoluteFilePath(); + break; + } + } + if(!nextPath.isEmpty()){ + showPic(nextPath); + } +} + +void PictureViewer::previous(){ + if(mCurrentEntry == mDirEntries.constBegin()){ + return; + } + QString nextPath; + while(mCurrentEntry != mDirEntries.constBegin()){ + --mCurrentEntry; + QFileInfo fi = *mCurrentEntry; + if(isPic(fi.absoluteFilePath())){ + nextPath = fi.absoluteFilePath(); + break; + } + } + if(!nextPath.isEmpty()){ + showPic(nextPath); + } +} + +void PictureViewer::wheelEvent(QWheelEvent *event){ + int steps = event->delta() / 8 / 15; + if(steps < 0){ + next(); + }else{ + previous(); + } +} + +void PictureViewer::setGradient(){ + QColor c1(255, 7, 15); + QColor c2(80, 55, 250); + QLinearGradient g(QPointF(0, 0), sceneRect().bottomRight()); + g.setColorAt(0, c1); + g.setColorAt(1, c2); + setBackgroundBrush(QBrush(g)); +} + +void PictureViewer::setDir(const QString &path){ + QFileInfo fi(path); + QString dir = fi.absolutePath(); + if(dir == mCurrentDir || !fi.exists()){ + return; + } + mCurrentDir = dir; + QDir currentDir = QDir(mCurrentDir); + mDirEntries = currentDir.entryInfoList(QDir::Files, QDir::Name); + std::sort(mDirEntries.begin(), mDirEntries.end(), Helper::SortFileInfoList()); + mCurrentEntry = std::find_if(mDirEntries.constBegin(), mDirEntries.constEnd(), std::bind2nd(Helper::FileInfoListContains(), fi.fileName())); +} + +bool PictureViewer::isPic(const QString &path){ + QFileInfo fi(path); + if(!fi.exists() || !fi.isFile()){ + return false; + } + QString mime = Helper::mimeType(path); + if(mime.toLower().startsWith("image")){ + return true; + } + return false; +} + +QPointF PictureViewer::center(const QPixmap &pic){ + QSize viewportSize = viewport()->size(); + float x = (viewportSize.width() - pic.width()) / 2; + float y = (viewportSize.height() - pic.height()) / 2; + return QPointF(x, y); +} |