/* 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 #include #include #include #include #include #include #include #include #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, bool enableDirEntries){ 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; } if(enableDirEntries){ setDir(path); }else{ mDirEntries = QFileInfoList(); mCurrentEntry = mDirEntries.constEnd(); } 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); setWindowTitle(fi.fileName()); } 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); }