OSDN Git Service

Ver0.21
[gefu/Gefu.git] / simpleimageview.cpp
1 #include "mainwindow.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 ///////////////////////////////////////////////////////////////////////////////
13 /// \brief SimpleImageView::SimpleImageView
14 /// \param parent   親ウィジェット
15 ///
16 /// コンストラクタ
17 ///
18 SimpleImageView::SimpleImageView(QWidget *parent) :
19     QGraphicsView(parent),
20     AbstractView(),
21     m_imgSrc(),
22     m_scene(this),
23     m_scaleFactor(0),
24     m_rotateDeg(0)
25 {
26     setContextMenuPolicy(Qt::NoContextMenu);
27     setDragMode(ScrollHandDrag);
28     setScene(&m_scene);
29 }
30
31 ///////////////////////////////////////////////////////////////////////////////
32 /// \brief SimpleImageView::initialize
33 /// \param w    メインウィンドウオブジェクト
34 ///
35 /// 初期化処理を行います。
36 ///
37 void SimpleImageView::initialize(MainWindow *w)
38 {
39     connect(this, SIGNAL(statusChanged(QString)), w, SLOT(view_statusChanged(QString)));
40     installEventFilter(w);
41 }
42
43 ///////////////////////////////////////////////////////////////////////////////
44 /// \brief SimpleImageView::setSource
45 /// \param pixmap
46 ///
47 void SimpleImageView::setSource(const QPixmap &pixmap)
48 {
49     qDebug() << "SimpleImageView::setSource()";
50
51     m_imgSrc = pixmap;
52     m_rotateDeg = 0;
53     m_scaleFactor = -1;
54
55     resizeImage();
56 }
57
58 ///////////////////////////////////////////////////////////////////////////////
59 /// \brief SimpleImageView::scaleFactor
60 /// \return 倍率を返します。
61 ///
62 double SimpleImageView::scaleFactor()
63 {
64     // すでに倍率が指定されている場合は、そのまま。
65     if (m_scaleFactor > 0) {
66         return m_scaleFactor;
67     }
68
69     // ビューポートに対する適切な倍率を計算する
70     double scaleFactor, scaleX, scaleY;
71     if (m_rotateDeg == 90 || m_rotateDeg == 270) {
72         scaleX = 1.0 * viewport()->width() / m_imgSrc.height();
73         scaleY = 1.0 * viewport()->height() / m_imgSrc.width();
74     }
75     else {
76         scaleX = 1.0 * viewport()->width() / m_imgSrc.width();
77         scaleY = 1.0 * viewport()->height() / m_imgSrc.height();
78     }
79     scaleFactor =  (scaleX > scaleY) ? scaleY : scaleX;
80
81     // 縮小もしくは等倍の場合
82     if (m_scaleFactor == -1) {
83         return (scaleFactor > 1) ? 1 : scaleFactor;
84     }
85
86     return scaleFactor;
87 }
88
89 ///////////////////////////////////////////////////////////////////////////////
90 /// \brief SimpleImageView::sizeChanged
91 ///
92 /// サイズ変更後の処理を行います。
93 ///
94 void SimpleImageView::sizeChanged()
95 {
96     QString str;
97     str = tr("%1 x %2 x %3(%4%)")
98             .arg(m_imgSrc.width())
99             .arg(m_imgSrc.height())
100             .arg(m_imgSrc.depth())
101             .arg(int(scaleFactor() * 100));
102     emit statusChanged(str);
103 }
104
105 ///////////////////////////////////////////////////////////////////////////////
106 /// \brief SimpleImageView::resizeImage
107 /// \return 倍率
108 ///
109 /// イメージの拡大・縮小と回転を行います。
110 ///
111 double SimpleImageView::resizeImage()
112 {
113     double scaleFactor = this->scaleFactor();
114     QPixmap scaledImg = m_imgSrc.scaled(scaleFactor * m_imgSrc.width(),
115                                         scaleFactor * m_imgSrc.height(),
116                                         Qt::IgnoreAspectRatio,
117                                         Qt::SmoothTransformation);
118     this->scene()->clear();
119     this->scene()->addPixmap(scaledImg);
120     this->setSceneRect(scaledImg.rect());
121     this->setTransform(QTransform());
122     this->translate(width() / 2, height() / 2);
123     this->rotate(m_rotateDeg);
124     sizeChanged();
125
126     return scaleFactor;
127 }
128
129 ///////////////////////////////////////////////////////////////////////////////
130 /// \brief SimpleImageView::fitToWindow
131 /// \param checked  メニューのチェック状態
132 ///
133 /// ウィンドウへのフィットを切り替えます。
134 ///
135 void SimpleImageView::fitToWindow(bool checked)
136 {
137     if (checked) {
138         m_scaleFactor = 0;
139     }
140
141     double scaleFactor = resizeImage();
142
143     if (!checked) {
144         m_scaleFactor = scaleFactor;
145     }
146 }
147
148 ///////////////////////////////////////////////////////////////////////////////
149 /// \brief SimpleImageView::scaleNormal
150 ///
151 /// 等倍で表示します。
152 ///
153 void SimpleImageView::scaleNormal()
154 {
155     m_scaleFactor = 1;
156     resizeImage();
157 }
158
159 ///////////////////////////////////////////////////////////////////////////////
160 /// \brief SimpleImageView::rotate90
161 ///
162 /// 右に90度回転します。
163 ///
164 void SimpleImageView::rotate90()
165 {
166     m_rotateDeg += 90;
167     m_rotateDeg %= 360;
168     resizeImage();
169 }
170
171 ///////////////////////////////////////////////////////////////////////////////
172 /// \brief SimpleImageView::rotate180
173 ///
174 /// 180度回転します。
175 ///
176 void SimpleImageView::rotate180()
177 {
178     m_rotateDeg += 180;
179     m_rotateDeg %= 360;
180     resizeImage();
181 }
182
183 ///////////////////////////////////////////////////////////////////////////////
184 /// \brief SimpleImageView::resizeEvent
185 /// \param event
186 ///
187 void SimpleImageView::resizeEvent(QResizeEvent *event)
188 {
189     resizeImage();
190     QGraphicsView::resizeEvent(event);
191 }
192
193 ///////////////////////////////////////////////////////////////////////////////
194 /// \brief SimpleImageView::scaleUp
195 ///
196 void SimpleImageView::scaleUp()
197 {
198     m_scaleFactor = scaleFactor() * 1.25;
199     resizeImage();
200 }
201
202 ///////////////////////////////////////////////////////////////////////////////
203 /// \brief SimpleImageView::scaleDown
204 ///
205 void SimpleImageView::scaleDown()
206 {
207     m_scaleFactor = scaleFactor() * 0.8;
208     resizeImage();
209 }