/* 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 #include #include "pictureviewer2.h" #include "pictureswidget.h" PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0), mCurPos(0), mDefaultFile(":/picgone.png"), mFnItem(0) { //behave like QDialog, but don't be one... setWindowFlags(QFlags(0x1|0x2|0x1000|0x2000|0x10000|0x8000000)); //initial file list PicData initialData; for(int i = 0; i < PicFilesModel::NumFields; ++i){ initialData << QVariant(); } initialData[PicFilesModel::FullPath] = mDefaultFile; mFiles << initialData; //picture show mSlideTimer = new QTimer(this); connect(mSlideTimer, SIGNAL(timeout()), this, SLOT(next())); //setup gui mScene = new QGraphicsScene(this); setScene(mScene); QDesktopWidget *dw = QApplication::desktop(); QSize screenSize = dw->availableGeometry().size(); mMinimunSize = QSize(screenSize.width() - 100, screenSize.height() - 100); setMinimumSize(mMinimunSize); move(50, 50); setVisible(false); mScene->setSceneRect(QRectF(0, 0, width() - 10, height() - 10)); showFile(mFiles.at(mCurPos)); } void PictureViewer2::addFiles(const PicDataList &files, bool clear){ if(clear){ mFiles.clear(); mFiles = files; mCurPos = 0; return; } foreach(const PicData &f, files){ if(!mFiles.contains(f)){ mFiles.append(f); } } } void PictureViewer2::setFile(const PicData &file){ addFiles(PicDataList() << file, true); showFile(mFiles.at(mCurPos)); } QSize PictureViewer2::sizeHint() const{ return mMinimunSize; } void PictureViewer2::next(){ if(mCurPos + 1 >= mFiles.size()){ mCurPos = 0; }else{ ++mCurPos; } showFile(mFiles.at(mCurPos)); } void PictureViewer2::previous(){ if(mCurPos - 1 < 0){ mCurPos = mFiles.size() - 1; }else{ --mCurPos; } showFile(mFiles.at(mCurPos)); } void PictureViewer2::slide(){ if(mSlideTimer->isActive()){ mSlideTimer->stop(); }else{ mSlideTimer->start(5000); } } void PictureViewer2::wheelEvent(QWheelEvent *event){ int steps = event->delta() / 8 / 15; if(steps < 0){ next(); }else{ previous(); } } void PictureViewer2::contextMenuEvent(QContextMenuEvent *e){ QMenu ctxMenu; foreach(QAction *a, actions()){ ctxMenu.addAction(a); } ctxMenu.exec(e->globalPos()); } void PictureViewer2::showFile(const PicData &file){ QPixmap pixmap(file.at(PicFilesModel::FullPath).toString()); if(pixmap.isNull()){ return; } setCurPalette(pixmap); if((pixmap.height() > height()) || (pixmap.width() > width())){ pixmap = pixmap.scaled(QSize(width() - 3, height() - 10), Qt::KeepAspectRatio, Qt::SmoothTransformation); } if(mCur){ mScene->removeItem(mCur); delete mCur; mCur = 0; } mCur = new QGraphicsPixmapItem(pixmap); float cX = (width() / 2) - (pixmap.width() / 2); float cY = height() / 2 - pixmap.height() / 2; mScene->addItem(mCur); mCur->setPos(cX, cY); setWindowTitle(constructWindowTitle()); constructFilenameItem(mFiles.at(mCurPos).at(PicFilesModel::FileName).toString()); } void PictureViewer2::constructFilenameItem(const QString &filename){ if(mFnItem){ mScene->removeItem(mFnItem); delete mFnItem; } mFnItem = new PictureViewer2FilenameItem(filename); QSizeF itemSize = mFnItem->boundingRect().size(); int thisWidth = size().width(); int xPos = (thisWidth / 2) - (itemSize.width() / 2); mFnItem->setPos(xPos, 0); mScene->addItem(mFnItem); } void PictureViewer2::setCurPalette(const QPixmap &pic){ QPoint val1 = QPoint(qrand() % pic.width(), qrand() % pic.height()); QPoint val2 = QPoint(qrand() % pic.width(), qrand() % pic.height()); QImage img = pic.toImage(); QColor c1(img.pixel(val1)); QColor c2(img.pixel(val2)); QLinearGradient g(QPoint(0,0), QPoint(rect().bottomRight())); g.setColorAt(0, c1); g.setColorAt(1, c2); setBackgroundBrush(QBrush(g)); } QString PictureViewer2::constructWindowTitle() const { QString retval = QString(tr("PicViewer 2 - [%1]")).arg(mFiles.at(mCurPos).at(PicFilesModel::FileName).toString()); return retval; } PictureViewer2FilenameItem::PictureViewer2FilenameItem(const QString &fileName, QGraphicsItem *parent) : QGraphicsItem(parent), mFilename(fileName) { setZValue(1); } QRectF PictureViewer2FilenameItem::boundingRect() const { QSize size = qApp->fontMetrics().size(Qt::TextSingleLine, mFilename); size += QSize(2, 2); QRectF retval; retval.setWidth(size.width()); retval.setHeight(size.height()); return retval; } void PictureViewer2FilenameItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ Q_UNUSED(option); Q_UNUSED(widget); painter->save(); painter->setRenderHint(QPainter::Antialiasing, false); painter->setRenderHint(QPainter::TextAntialiasing, true); QColor bgColor = QColor(237, 12, 102); bgColor.setAlpha(70); QColor fgColor = QColor(209, 207, 232); QBrush brush(bgColor); painter->setPen(QColor(Qt::yellow)); painter->setBrush(brush); painter->drawRect(boundingRect()); painter->setPen(QPen(fgColor)); QPoint start(1, qApp->fontMetrics().ascent() + 1); painter->drawText(start, mFilename); painter->restore(); }