summaryrefslogtreecommitdiff
path: root/core/settings/light-and-power/calibration.cpp
Unidiff
Diffstat (limited to 'core/settings/light-and-power/calibration.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/settings/light-and-power/calibration.cpp111
1 files changed, 90 insertions, 21 deletions
diff --git a/core/settings/light-and-power/calibration.cpp b/core/settings/light-and-power/calibration.cpp
index 6a3360f..aed2bc8 100644
--- a/core/settings/light-and-power/calibration.cpp
+++ b/core/settings/light-and-power/calibration.cpp
@@ -26,18 +26,21 @@
26 26
27*/ 27*/
28#include "calibration.h" 28#include "calibration.h"
29 29
30#include <qpainter.h> 30#include <qpainter.h>
31#include <qpalette.h> 31#include <qpalette.h>
32#include <qpixmap.h>
32 33
33#define BRD 2 34#define BRD 3
34 35
35Calibration::Calibration ( QWidget *parent, const char *name, WFlags fl ) 36Calibration::Calibration ( QWidget *parent, const char *name, WFlags fl )
36 : QWidget ( parent, name, fl ) 37 : QWidget ( parent, name, fl | WRepaintNoErase )
37{ 38{
39 setBackgroundMode ( NoBackground );
40
38 m_scale = QSize ( 256, 256 ); 41 m_scale = QSize ( 256, 256 );
39 m_steps = 5; 42 m_steps = 5;
40 m_dragged = -1; 43 m_dragged = -1;
41 m_interval = 5; 44 m_interval = 5;
42 45
43 m_p [0] = QPoint ( 0, 0 ); 46 m_p [0] = QPoint ( 0, 0 );
@@ -118,26 +121,34 @@ QPoint Calibration::endPoint ( ) const
118 121
119void Calibration::checkPoints ( ) 122void Calibration::checkPoints ( )
120{ 123{
121 int dx = m_scale. width ( ); 124 int dx = m_scale. width ( );
122 int dy = m_scale. height ( ); 125 int dy = m_scale. height ( );
123 126
127 if ( m_p [1]. x ( ) < 0 )
128 m_p [1]. setX ( 0 );
124 if ( m_p [1]. x ( ) >= dx ) 129 if ( m_p [1]. x ( ) >= dx )
125 m_p [1]. setX ( dx - 1 ); 130 m_p [1]. setX ( dx - 1 );
131 if ( m_p [0]. x ( ) < 0 )
132 m_p [0]. setX ( 0 );
126 if ( m_p [0]. x ( ) > m_p [1]. x ( )) 133 if ( m_p [0]. x ( ) > m_p [1]. x ( ))
127 m_p [0]. setX ( m_p [1]. x ( )); 134 m_p [0]. setX ( m_p [1]. x ( ));
128 135
136 if ( m_p [1]. y ( ) < 0 )
137 m_p [1]. setY ( 0 );
129 if ( m_p [1]. y ( ) >= dy ) 138 if ( m_p [1]. y ( ) >= dy )
130 m_p [1]. setY ( dy - 1 ); 139 m_p [1]. setY ( dy - 1 );
140 if ( m_p [0]. y ( ) < 0 )
141 m_p [0]. setY ( 0 );
131 if ( m_p [0]. y ( ) > m_p [1]. y ( )) 142 if ( m_p [0]. y ( ) > m_p [1]. y ( ))
132 m_p [0]. setY ( m_p [1]. y ( )); 143 m_p [0]. setY ( m_p [1]. y ( ));
133} 144}
134 145
135 146
136#define SCALEX(x) (BRD+x*(width()- 2*BRD)/m_scale.width()) 147#define SCALEX(x) (BRD+(x)*(width()- 2*BRD)/m_scale.width())
137#define SCALEY(y) (BRD+y*(height()-2*BRD)/m_scale.height()) 148#define SCALEY(y) (BRD+(y)*(height()-2*BRD)/m_scale.height())
138 149
139 150
140static QRect around ( int x, int y ) 151static QRect around ( int x, int y )
141{ 152{
142 return QRect ( x - BRD, y - BRD, 2 * BRD + 1, 2 * BRD + 1 ); 153 return QRect ( x - BRD, y - BRD, 2 * BRD + 1, 2 * BRD + 1 );
143} 154}
@@ -152,27 +163,27 @@ void Calibration::mousePressEvent ( QMouseEvent *e )
152 163
153 m_dragged = -1; 164 m_dragged = -1;
154 for ( int i = 0; i < 2; i++ ) { 165 for ( int i = 0; i < 2; i++ ) {
155 x [i] = SCALEX( m_p [i]. x ( )); 166 x [i] = SCALEX( m_p [i]. x ( ));
156 y [i] = SCALEY( m_p [i]. y ( )); 167 y [i] = SCALEY( m_p [i]. y ( ));
157 168
158 if (( QABS( e-> x ( ) - x [i] ) <= BRD ) && 169 if (( QABS( e-> x ( ) - x [i] ) <= 2 * BRD ) &&
159 ( QABS( e-> y ( ) - y [i] ) <= BRD )) { 170 ( QABS( e-> y ( ) - y [i] ) <= 2 * BRD )) {
160 m_dragged = i; 171 m_dragged = i;
161 break; 172 break;
162 } 173 }
163 } 174 }
164 175
165 if ( m_dragged != olddragged ) { 176 if ( m_dragged != olddragged ) {
166 QRect r; 177 QRect r;
167 178
168 if ( olddragged >= 0 ) 179 if ( olddragged >= 0 )
169 r |= around ( x [olddragged], y [olddragged] ); 180 r |= around ( x [olddragged], y [olddragged] );
170 if ( m_dragged >= 0 ) 181 if ( m_dragged >= 0 )
171 r |= around ( x [m_dragged], y [m_dragged] ); 182 r |= around ( x [m_dragged], y [m_dragged] );
172 repaint ( r ); 183 repaint ( r, false );
173 } 184 }
174} 185}
175 186
176void Calibration::mouseMoveEvent ( QMouseEvent *e ) 187void Calibration::mouseMoveEvent ( QMouseEvent *e )
177{ 188{
178 if ( m_dragged < 0 ) 189 if ( m_dragged < 0 )
@@ -181,16 +192,24 @@ void Calibration::mouseMoveEvent ( QMouseEvent *e )
181 QPoint n [2]; 192 QPoint n [2];
182 193
183 n [m_dragged]. setX (( e-> x ( ) - BRD ) * m_scale. width ( ) / ( width ( ) - 2 * BRD )); 194 n [m_dragged]. setX (( e-> x ( ) - BRD ) * m_scale. width ( ) / ( width ( ) - 2 * BRD ));
184 n [m_dragged]. setY (( e-> y ( ) - BRD ) * m_scale. height ( ) / ( height ( ) - 2 * BRD )); 195 n [m_dragged]. setY (( e-> y ( ) - BRD ) * m_scale. height ( ) / ( height ( ) - 2 * BRD ));
185 n [1 - m_dragged] = m_p [1 - m_dragged]; 196 n [1 - m_dragged] = m_p [1 - m_dragged];
186 197
187 if (( n [0]. x ( ) > n [1]. x ( )) || ( n [m_dragged]. x ( ) < 0 ) || ( n [m_dragged]. x ( ) >= m_scale. width ( ))) 198 if ( n [m_dragged]. x ( ) < 0 )
188 n [m_dragged]. setX ( m_p [m_dragged]. x ( )); 199 n [m_dragged]. setX ( 0 );
189 if (( n [0]. y ( ) > n [1]. y ( )) || ( n [m_dragged]. y ( ) < 0 ) || ( n [m_dragged]. y ( ) >= m_scale. height ( ))) 200 if ( n [m_dragged]. x ( ) >= m_scale. width ( ))
190 n [m_dragged]. setY ( m_p [m_dragged]. y ( )); 201 n [m_dragged]. setX ( m_scale. width ( ) - 1 );
202 if ( n [0]. x ( ) > n [1]. x ( ))
203 n [m_dragged]. setX ( n [1 - m_dragged]. x ( ));
204 if ( n [m_dragged]. y ( ) < 0 )
205 n [m_dragged]. setY ( 0 );
206 if ( n [m_dragged]. y ( ) >= m_scale. height ( ))
207 n [m_dragged]. setY ( m_scale. height ( ) - 1 );
208 if ( n [0]. y ( ) > n [1]. y ( ))
209 n [m_dragged]. setY ( n [1 - m_dragged]. y ( ));
191 210
192 QRect r; 211 QRect r;
193 int ox [2], oy [2], nx [2], ny [2]; 212 int ox [2], oy [2], nx [2], ny [2];
194 213
195 for ( int i = 0; i < 2; i++ ) { 214 for ( int i = 0; i < 2; i++ ) {
196 nx [i] = SCALEX( n [i]. x ( )); 215 nx [i] = SCALEX( n [i]. x ( ));
@@ -203,24 +222,28 @@ void Calibration::mouseMoveEvent ( QMouseEvent *e )
203 r |= around ( ox [i], oy [i] ); 222 r |= around ( ox [i], oy [i] );
204 m_p [i] = n [i]; 223 m_p [i] = n [i];
205 224
206 if ( i == 0 ) { 225 if ( i == 0 ) {
207 r |= QRect ( 0, ny [0], nx [0] - 0 + 1, 1 ); 226 r |= QRect ( 0, ny [0], nx [0] - 0 + 1, 1 );
208 r |= QRect ( 0, oy [0], ox [0] - 0 + 1, 1 ); 227 r |= QRect ( 0, oy [0], ox [0] - 0 + 1, 1 );
228
229 emit startPointChanged ( startPoint ( ));
209 } 230 }
210 else if ( i == 1 ) { 231 else if ( i == 1 ) {
211 r |= QRect ( nx [1], ny [1], width ( ) - nx [1], 1 ); 232 r |= QRect ( nx [1], ny [1], width ( ) - nx [1], 1 );
212 r |= QRect ( ox [1], oy [1], width ( ) - ox [1], 1 ); 233 r |= QRect ( ox [1], oy [1], width ( ) - ox [1], 1 );
234
235 emit endPointChanged ( endPoint ( ));
213 } 236 }
214 } 237 }
215 } 238 }
216 if ( r. isValid ( )) { 239 if ( r. isValid ( )) {
217 r |= QRect ( nx [0], ny [0], nx [1] - nx [0] + 1, ny [1] - ny [0] + 1 ); 240 r |= QRect ( nx [0], ny [0], nx [1] - nx [0] + 1, ny [1] - ny [0] + 1 );
218 r |= QRect ( ox [0], oy [0], ox [1] - ox [0] + 1, oy [1] - oy [0] + 1 ); 241 r |= QRect ( ox [0], oy [0], ox [1] - ox [0] + 1, oy [1] - oy [0] + 1 );
219 242
220 repaint ( r ); 243 repaint ( r, false );
221 } 244 }
222} 245}
223 246
224void Calibration::mouseReleaseEvent ( QMouseEvent *e ) 247void Calibration::mouseReleaseEvent ( QMouseEvent *e )
225{ 248{
226 if ( e-> button ( ) != LeftButton ) 249 if ( e-> button ( ) != LeftButton )
@@ -230,48 +253,94 @@ void Calibration::mouseReleaseEvent ( QMouseEvent *e )
230 return; 253 return;
231 254
232 int x = SCALEX( m_p [m_dragged]. x ( )); 255 int x = SCALEX( m_p [m_dragged]. x ( ));
233 int y = SCALEY( m_p [m_dragged]. y ( )); 256 int y = SCALEY( m_p [m_dragged]. y ( ));
234 m_dragged = -1; 257 m_dragged = -1;
235 258
236 repaint ( around ( x, y )); 259 repaint ( around ( x, y ), false );
237} 260}
238 261
239void Calibration::paintEvent ( QPaintEvent * ) 262void Calibration::paintEvent ( QPaintEvent *pe )
240{ 263{
241 QPainter p ( this ); 264 QPixmap pix ( size ( ));
242 QColorGroup g = colorGroup ( ); 265 QPainter p ( &pix, this );
243 266 QRect cr = pe-> rect ( );
267
244 int x0 = SCALEX( m_p [0]. x ( )); 268 int x0 = SCALEX( m_p [0]. x ( ));
245 int y0 = SCALEY( m_p [0]. y ( )); 269 int y0 = SCALEY( m_p [0]. y ( ));
246 int x1 = SCALEX( m_p [1]. x ( )); 270 int x1 = SCALEX( m_p [1]. x ( ));
247 int y1 = SCALEY( m_p [1]. y ( )); 271 int y1 = SCALEY( m_p [1]. y ( ));
248 272
249 int dx = x1 - x0; 273 int dx = x1 - x0;
250 int dy = y1 - y0; 274 int dy = y1 - y0;
251 275
276 // restrict steps to real x and y resolution
277 int st = QMIN( QMIN( m_steps, ( dx + 1 )), ( dy + 1 ));
278
279 QString stepstr = tr( "%1 Steps" ). arg ( st );
280 QRect tr = p. boundingRect ( BRD, BRD, width ( ) - 2*BRD, height() - 2*BRD, AlignTop | AlignRight, stepstr );
281 tr. setLeft ( tr. left ( ) - 20 );
282 if ( p. hasClipping ( ))
283 p. setClipRegion ( p. clipRegion ( ) | QRegion ( tr ));
284
285 QColorGroup g = colorGroup ( );
286
287 p. fillRect ( cr, g. base ( ));
288 p. fillRect ( tr, g. base ( ));
289
252 int ex = x0, ey = y0; 290 int ex = x0, ey = y0;
253 291
292 p. setPen ( g. mid ( ));
293
294 int gx0 = SCALEX( 0 );
295 int gy0 = SCALEY( 0 );
296 int gx1 = SCALEX( m_scale. width ( ) - 1 );
297 int gy1 = SCALEY( m_scale. height ( ) - 1 );
298
299 int xdiv = QMIN( 4, m_scale. width ( ));
300 int ydiv = QMIN( 4, m_scale. height ( ));
301
302 xdiv = ( gx1 - gx0 + 1 ) / xdiv;
303 ydiv = ( gy1 - gy0 + 1 ) / ydiv;
304
305 for ( int i = gx0 + xdiv; i <= ( gx1 - xdiv ); i += xdiv )
306 p. drawLine ( i, gy0, i, gy1 );
307
308 for ( int i = gy0 + ydiv; i <= ( gy1 - ydiv ); i += ydiv )
309 p. drawLine ( gx0, i, gx1, i );
310
254 p. setPen ( g. highlight ( )); 311 p. setPen ( g. highlight ( ));
255 312
256 p. drawLine ( BRD, ey, ex, ey ); 313 p. drawLine ( BRD, ey, ex, ey );
257 314
258 for ( int i = 1; i < m_steps; i++ ) { 315 for ( int i = 1; i < st; i++ ) {
259 int fx = x0 + dx * i / m_steps; 316 int fx = x0 + dx * i / st;
260 int fy = y0 + dy * i / ( m_steps - 1 ); 317 int fy = y0 + dy * i / ( st - 1 );
261 318
262 p. drawLine ( ex, ey, fx, ey ); 319 p. drawLine ( ex, ey, fx, ey );
263 p. drawLine ( fx, ey, fx, fy ); 320 p. drawLine ( fx, ey, fx, fy );
264 321
265 ex = fx; 322 ex = fx;
266 ey = fy; 323 ey = fy;
267 } 324 }
325 if ( st == 1 ) {
326 p. drawLine ( ex, ey, ex, y1 );
327 ey = y1;
328 }
268 329
269 p. drawLine ( ex, ey, width ( ) - 1 - BRD, ey ); 330 p. drawLine ( ex, ey, width ( ) - 1 - BRD, ey );
270 331
332
271 p. fillRect ( around ( x0, y0 ), m_dragged == 0 ? g. highlightedText ( ) : g. text ( )); 333 p. fillRect ( around ( x0, y0 ), m_dragged == 0 ? g. highlightedText ( ) : g. text ( ));
334 p. drawRect ( around ( x0, y0 ));
272 p. fillRect ( around ( x1, y1 ), m_dragged == 1 ? g. highlightedText ( ) : g. text ( )); 335 p. fillRect ( around ( x1, y1 ), m_dragged == 1 ? g. highlightedText ( ) : g. text ( ));
336 p. drawRect ( around ( x1, y1 ));
273 337
274 p. setPen ( g. text ( )); 338 p. setPen ( g. text ( ));
275 p. drawText ( QRect ( BRD, BRD, width ( ) - 2*BRD, height() - 2*BRD ), AlignTop | AlignRight, tr( "%1 Steps" ). arg ( m_steps )); 339 p. drawText ( tr, AlignTop | AlignRight, stepstr );
340
341 p. end ( );
342 bitBlt ( this, cr. topLeft ( ), &pix, cr );
343 if ( !cr. contains ( tr ))
344 bitBlt ( this, tr. topLeft ( ), &pix, tr );
276} 345}
277 346