summaryrefslogtreecommitdiffstats
path: root/pictureviewer2.cpp
blob: 3bcc404d7c8cd29dbb67cdd5bef6ada49e640e7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
  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 <QDesktopWidget>
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QImage>
#include <QWheelEvent>

#include "pictureviewer2.h"
#include "pictureswidget.h"

PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0), mCurPos(0), mDefaultFile(":/picgone.png") {
    //behave like QDialog, but don't be one...
    setWindowFlags(QFlags<Qt::WindowType>(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;

    //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);
    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()){
        return;
    }
    ++mCurPos;
    showFile(mFiles.at(mCurPos));
}

void PictureViewer2::previous(){
    if(mCurPos - 1 < 0){
        return;
    }
    --mCurPos;
    showFile(mFiles.at(mCurPos));
}

void PictureViewer2::wheelEvent(QWheelEvent *event){
    int steps = event->delta() / 8 / 15;
    if(steps < 0){
        next();
    }else{
        previous();
    }
}

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);
        mCur = 0;
    }
    mCur = new QGraphicsPixmapItem(pixmap);
    float cX = width() - pixmap.width() / 2;
    float cY = height() - pixmap.height() / 2;
    mCur->setPos(QPointF(cX, cY));
    mScene->addItem(mCur);
}


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));
}