OSDN Git Service

Ver0.18
[gefu/Gefu.git] / simpleimageview.cpp
1 #include "common.h"
2 #include "simpleimageview.h"
3
4 #include <QDebug>
5 #include <QSettings>
6 #include <QKeyEvent>
7 #include <QContextMenuEvent>
8 #include <QResizeEvent>
9 #include <QAction>
10 #include <QMenu>
11
12 SimpleImageView::SimpleImageView(QWidget *parent) :
13     QGraphicsView(parent),
14     m_back(NULL),
15     m_fitToWindow(NULL),
16     m_scaleUp(NULL),
17     m_scaleDown(NULL),
18     m_scaleNormal(NULL),
19     m_rot90(NULL),
20     m_rot180(NULL),
21     m_imgSrc(),
22     m_scaleFactor(0),
23     m_rotateDeg(0)
24 {
25     QSettings settings;
26     QPalette pal = palette();
27     pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
28     setBackgroundRole(QPalette::Base);
29     setPalette(pal);
30
31     setContextMenuPolicy(Qt::DefaultContextMenu);
32
33     QList<QKeySequence> shortcuts;
34     //>>>>> 「戻る」メニュー
35     m_back = new QAction(tr("戻る"), this);
36     m_back->setObjectName("back");
37     shortcuts.clear();
38     shortcuts << QKeySequence("Return");
39     shortcuts << QKeySequence("Backspace");
40     m_back->setShortcuts(shortcuts);
41
42     //>>>>> 「ウィンドウにフィット」メニュー
43     m_fitToWindow = new QAction(tr("ウィンドウにフィット"), this);
44     m_fitToWindow->setObjectName("fitToWindow");
45     m_fitToWindow->setCheckable(true);
46     m_fitToWindow->setChecked(true);
47     m_fitToWindow->setShortcut(QKeySequence("Space"));
48
49     //>>>>> 「拡大」メニュー
50     m_scaleUp = new QAction(tr("拡大"), this);
51     m_scaleUp->setObjectName("scaleUp");
52     shortcuts.clear();
53     shortcuts << QKeySequence("+");
54     shortcuts << QKeySequence("Shift++");
55     m_scaleUp->setShortcuts(shortcuts);
56
57     //>>>>> 「縮小」メニュー
58     m_scaleDown = new QAction(tr("縮小"), this);
59     m_scaleDown->setObjectName("scaleDown");
60     m_scaleDown->setShortcut(QKeySequence("-"));
61
62     //>>>>> 「等倍」メニュー
63     m_scaleNormal = new QAction(tr("等倍"), this);
64     m_scaleNormal->setObjectName("scaleUp");
65     shortcuts.clear();
66     shortcuts << QKeySequence("=");
67     shortcuts << QKeySequence("Shift+=");
68     m_scaleNormal->setShortcuts(shortcuts);
69
70     //>>>>> 「右に90度回転」メニュー
71     m_rot90 = new QAction(tr("右に90度回転"), this);
72     m_rot90->setObjectName("rot90");
73     m_rot90->setShortcut(QKeySequence("9"));
74
75     //>>>>> 「右に180度回転」メニュー
76     m_rot180 = new QAction(tr("右に180度回転"), this);
77     m_rot180->setObjectName("rot180");
78     m_rot180->setShortcut(QKeySequence("0"));
79
80     connect(m_back, SIGNAL(triggered()), this, SIGNAL(viewFinished()));
81     connect(m_fitToWindow, SIGNAL(toggled(bool)), this, SLOT(fitToWindow(bool)));
82     connect(m_scaleDown, SIGNAL(triggered()), this, SLOT(scaleDown()));
83     connect(m_scaleNormal, SIGNAL(triggered()), this, SLOT(scaleNormal()));
84     connect(m_scaleUp, SIGNAL(triggered()), this, SLOT(scaleUp()));
85     connect(m_rot90, SIGNAL(triggered()), this, SLOT(rotate90()));
86     connect(m_rot180, SIGNAL(triggered()), this, SLOT(rotate180()));
87
88     setDragMode(ScrollHandDrag);
89 }
90
91 bool SimpleImageView::setSource(const QString &path)
92 {
93     QPixmap pixmap(path);
94     if (pixmap.isNull()) {
95         return false;
96     }
97
98     m_imgSrc = pixmap;
99     m_rotateDeg = 0;
100     m_scaleFactor = 0;
101     m_fitToWindow->blockSignals(true);
102     m_fitToWindow->setChecked(true);
103     m_fitToWindow->blockSignals(false);
104
105     QGraphicsScene *scene = new QGraphicsScene(this);
106     scene->addPixmap(pixmap);
107     setScene(scene);
108     resizeImage();
109
110     return true;
111 }
112
113 double SimpleImageView::scaleFactor(const QSize &size)
114 {
115     double scaleFactor;
116     if (m_scaleFactor == 0) {
117         double scaleX, scaleY;
118         if (m_rotateDeg == 90 || m_rotateDeg == 270) {
119             scaleX = 1.0 * size.width() / m_imgSrc.height();
120             scaleY = 1.0 * size.height() / m_imgSrc.width();
121         }
122         else {
123             scaleX = 1.0 * size.width() / m_imgSrc.width();
124             scaleY = 1.0 * size.height() / m_imgSrc.height();
125         }
126         scaleFactor =  (scaleX > scaleY) ? scaleY : scaleX;
127     }
128     else {
129         scaleFactor = m_scaleFactor;
130     }
131
132     return scaleFactor;
133 }
134
135 void SimpleImageView::sizeChanged()
136 {
137     QString str;
138     str = tr("%1 x %2 x %3(%4%)")
139             .arg(m_imgSrc.width())
140             .arg(m_imgSrc.height())
141             .arg(m_imgSrc.depth())
142             .arg(int(scaleFactor(viewport()->size()) * 100));
143     emit fileInfo(str);
144 }
145
146 double SimpleImageView::resizeImage()
147 {
148     double scaleFactor = this->scaleFactor(viewport()->size());
149     m_rotateDeg %= 360;
150
151     this->setTransform(QTransform());
152     this->translate(width() / 2, height() / 2);
153     this->rotate(m_rotateDeg);
154     this->scale(scaleFactor, scaleFactor);
155     sizeChanged();
156
157     return scaleFactor;
158 }
159
160 void SimpleImageView::fitToWindow(bool checked)
161 {
162     if (checked) {
163         m_scaleFactor = 0;
164     }
165
166     double scaleFactor = resizeImage();
167
168     if (!checked) {
169         m_scaleFactor = scaleFactor;
170     }
171
172     sizeChanged();
173 }
174
175 void SimpleImageView::scaleNormal()
176 {
177     m_scaleFactor = 1;
178     resizeImage();
179
180     m_fitToWindow->blockSignals(true);
181     m_fitToWindow->setChecked(false);
182     m_fitToWindow->blockSignals(false);
183 }
184
185 void SimpleImageView::scaleUp()
186 {
187     m_scaleFactor = scaleFactor(viewport()->size()) * 1.25;
188     resizeImage();
189
190     m_fitToWindow->blockSignals(true);
191     m_fitToWindow->setChecked(false);
192     m_fitToWindow->blockSignals(false);
193 }
194
195 void SimpleImageView::scaleDown()
196 {
197     m_scaleFactor = scaleFactor(viewport()->size()) * 0.8;
198     resizeImage();
199
200     m_fitToWindow->blockSignals(true);
201     m_fitToWindow->setChecked(false);
202     m_fitToWindow->blockSignals(false);
203 }
204
205 void SimpleImageView::rotate90()
206 {
207     m_rotateDeg += 90;
208     resizeImage();
209 }
210
211 void SimpleImageView::rotate180()
212 {
213     m_rotateDeg += 180;
214     resizeImage();
215 }
216
217 void SimpleImageView::keyPressEvent(QKeyEvent *event)
218 {
219     qDebug() << "SimpleImageView::keyPressEvent();";
220
221     QString ksq = KeyEventToSequence(event);
222
223     if (ProcessShortcut(ksq, this)) {
224         event->accept();
225         return;
226     }
227
228     QGraphicsView::keyReleaseEvent(event);
229
230     // MainWindowへ
231     event->ignore();
232 }
233
234 void SimpleImageView::contextMenuEvent(QContextMenuEvent *event)
235 {
236     qDebug() << "SimpleImageView::contextMenuEvent();";
237
238     QMenu menu(this);
239     menu.addAction(m_fitToWindow);
240     menu.addAction(m_scaleUp);
241     menu.addAction(m_scaleDown);
242     menu.addAction(m_scaleNormal);
243     menu.addSeparator();
244     menu.addAction(m_rot90);
245     menu.addAction(m_rot180);
246     menu.addSeparator();
247     menu.addAction(m_back);
248     menu.exec(event->globalPos());
249 }
250
251 void SimpleImageView::resizeEvent(QResizeEvent *event)
252 {
253     if (!m_imgSrc.isNull()) {
254         resizeImage();
255     }
256     QGraphicsView::resizeEvent(event);
257 }