summaryrefslogtreecommitdiffstats
path: root/pictureviewer.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-05-24 14:14:00 +0200
committerArno <am@disconnect.de>2010-05-24 14:14:00 +0200
commit199bf012a87ace47044627189012b854570e3970 (patch)
tree735966e8d8843c3f5beddaaff6c657d8c5bba030 /pictureviewer.cpp
parentf3b7e335c988cadd463063ca72790a638e44970e (diff)
downloadSheMov-199bf012a87ace47044627189012b854570e3970.tar.gz
SheMov-199bf012a87ace47044627189012b854570e3970.tar.bz2
SheMov-199bf012a87ace47044627189012b854570e3970.zip
Implemented PictureViewer class
Don't call an external program for showing a picture. When an image is doubleclicked a new windows shows the picture. Pictures can still be opened in an exteral program by using the "Open with..." context menu item.
Diffstat (limited to 'pictureviewer.cpp')
-rw-r--r--pictureviewer.cpp170
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);
+}