summaryrefslogtreecommitdiff
path: root/core/settings/light-and-power/calibration.cpp
Side-by-side diff
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
@@ -29,12 +29,15 @@
#include <qpainter.h>
#include <qpalette.h>
+#include <qpixmap.h>
-#define BRD 2
+#define BRD 3
Calibration::Calibration ( QWidget *parent, const char *name, WFlags fl )
- : QWidget ( parent, name, fl )
+ : QWidget ( parent, name, fl | WRepaintNoErase )
{
+ setBackgroundMode ( NoBackground );
+
m_scale = QSize ( 256, 256 );
m_steps = 5;
m_dragged = -1;
@@ -121,20 +124,28 @@ void Calibration::checkPoints ( )
int dx = m_scale. width ( );
int dy = m_scale. height ( );
+ if ( m_p [1]. x ( ) < 0 )
+ m_p [1]. setX ( 0 );
if ( m_p [1]. x ( ) >= dx )
m_p [1]. setX ( dx - 1 );
+ if ( m_p [0]. x ( ) < 0 )
+ m_p [0]. setX ( 0 );
if ( m_p [0]. x ( ) > m_p [1]. x ( ))
m_p [0]. setX ( m_p [1]. x ( ));
+ if ( m_p [1]. y ( ) < 0 )
+ m_p [1]. setY ( 0 );
if ( m_p [1]. y ( ) >= dy )
m_p [1]. setY ( dy - 1 );
+ if ( m_p [0]. y ( ) < 0 )
+ m_p [0]. setY ( 0 );
if ( m_p [0]. y ( ) > m_p [1]. y ( ))
m_p [0]. setY ( m_p [1]. y ( ));
}
-#define SCALEX(x) (BRD+x*(width()- 2*BRD)/m_scale.width())
-#define SCALEY(y) (BRD+y*(height()-2*BRD)/m_scale.height())
+#define SCALEX(x) (BRD+(x)*(width()- 2*BRD)/m_scale.width())
+#define SCALEY(y) (BRD+(y)*(height()-2*BRD)/m_scale.height())
static QRect around ( int x, int y )
@@ -155,8 +166,8 @@ void Calibration::mousePressEvent ( QMouseEvent *e )
x [i] = SCALEX( m_p [i]. x ( ));
y [i] = SCALEY( m_p [i]. y ( ));
- if (( QABS( e-> x ( ) - x [i] ) <= BRD ) &&
- ( QABS( e-> y ( ) - y [i] ) <= BRD )) {
+ if (( QABS( e-> x ( ) - x [i] ) <= 2 * BRD ) &&
+ ( QABS( e-> y ( ) - y [i] ) <= 2 * BRD )) {
m_dragged = i;
break;
}
@@ -169,7 +180,7 @@ void Calibration::mousePressEvent ( QMouseEvent *e )
r |= around ( x [olddragged], y [olddragged] );
if ( m_dragged >= 0 )
r |= around ( x [m_dragged], y [m_dragged] );
- repaint ( r );
+ repaint ( r, false );
}
}
@@ -184,10 +195,18 @@ void Calibration::mouseMoveEvent ( QMouseEvent *e )
n [m_dragged]. setY (( e-> y ( ) - BRD ) * m_scale. height ( ) / ( height ( ) - 2 * BRD ));
n [1 - m_dragged] = m_p [1 - m_dragged];
- if (( n [0]. x ( ) > n [1]. x ( )) || ( n [m_dragged]. x ( ) < 0 ) || ( n [m_dragged]. x ( ) >= m_scale. width ( )))
- n [m_dragged]. setX ( m_p [m_dragged]. x ( ));
- if (( n [0]. y ( ) > n [1]. y ( )) || ( n [m_dragged]. y ( ) < 0 ) || ( n [m_dragged]. y ( ) >= m_scale. height ( )))
- n [m_dragged]. setY ( m_p [m_dragged]. y ( ));
+ if ( n [m_dragged]. x ( ) < 0 )
+ n [m_dragged]. setX ( 0 );
+ if ( n [m_dragged]. x ( ) >= m_scale. width ( ))
+ n [m_dragged]. setX ( m_scale. width ( ) - 1 );
+ if ( n [0]. x ( ) > n [1]. x ( ))
+ n [m_dragged]. setX ( n [1 - m_dragged]. x ( ));
+ if ( n [m_dragged]. y ( ) < 0 )
+ n [m_dragged]. setY ( 0 );
+ if ( n [m_dragged]. y ( ) >= m_scale. height ( ))
+ n [m_dragged]. setY ( m_scale. height ( ) - 1 );
+ if ( n [0]. y ( ) > n [1]. y ( ))
+ n [m_dragged]. setY ( n [1 - m_dragged]. y ( ));
QRect r;
int ox [2], oy [2], nx [2], ny [2];
@@ -206,10 +225,14 @@ void Calibration::mouseMoveEvent ( QMouseEvent *e )
if ( i == 0 ) {
r |= QRect ( 0, ny [0], nx [0] - 0 + 1, 1 );
r |= QRect ( 0, oy [0], ox [0] - 0 + 1, 1 );
+
+ emit startPointChanged ( startPoint ( ));
}
else if ( i == 1 ) {
r |= QRect ( nx [1], ny [1], width ( ) - nx [1], 1 );
r |= QRect ( ox [1], oy [1], width ( ) - ox [1], 1 );
+
+ emit endPointChanged ( endPoint ( ));
}
}
}
@@ -217,7 +240,7 @@ void Calibration::mouseMoveEvent ( QMouseEvent *e )
r |= QRect ( nx [0], ny [0], nx [1] - nx [0] + 1, ny [1] - ny [0] + 1 );
r |= QRect ( ox [0], oy [0], ox [1] - ox [0] + 1, oy [1] - oy [0] + 1 );
- repaint ( r );
+ repaint ( r, false );
}
}
@@ -233,14 +256,15 @@ void Calibration::mouseReleaseEvent ( QMouseEvent *e )
int y = SCALEY( m_p [m_dragged]. y ( ));
m_dragged = -1;
- repaint ( around ( x, y ));
+ repaint ( around ( x, y ), false );
}
-void Calibration::paintEvent ( QPaintEvent * )
+void Calibration::paintEvent ( QPaintEvent *pe )
{
- QPainter p ( this );
- QColorGroup g = colorGroup ( );
-
+ QPixmap pix ( size ( ));
+ QPainter p ( &pix, this );
+ QRect cr = pe-> rect ( );
+
int x0 = SCALEX( m_p [0]. x ( ));
int y0 = SCALEY( m_p [0]. y ( ));
int x1 = SCALEX( m_p [1]. x ( ));
@@ -249,15 +273,48 @@ void Calibration::paintEvent ( QPaintEvent * )
int dx = x1 - x0;
int dy = y1 - y0;
+ // restrict steps to real x and y resolution
+ int st = QMIN( QMIN( m_steps, ( dx + 1 )), ( dy + 1 ));
+
+ QString stepstr = tr( "%1 Steps" ). arg ( st );
+ QRect tr = p. boundingRect ( BRD, BRD, width ( ) - 2*BRD, height() - 2*BRD, AlignTop | AlignRight, stepstr );
+ tr. setLeft ( tr. left ( ) - 20 );
+ if ( p. hasClipping ( ))
+ p. setClipRegion ( p. clipRegion ( ) | QRegion ( tr ));
+
+ QColorGroup g = colorGroup ( );
+
+ p. fillRect ( cr, g. base ( ));
+ p. fillRect ( tr, g. base ( ));
+
int ex = x0, ey = y0;
+ p. setPen ( g. mid ( ));
+
+ int gx0 = SCALEX( 0 );
+ int gy0 = SCALEY( 0 );
+ int gx1 = SCALEX( m_scale. width ( ) - 1 );
+ int gy1 = SCALEY( m_scale. height ( ) - 1 );
+
+ int xdiv = QMIN( 4, m_scale. width ( ));
+ int ydiv = QMIN( 4, m_scale. height ( ));
+
+ xdiv = ( gx1 - gx0 + 1 ) / xdiv;
+ ydiv = ( gy1 - gy0 + 1 ) / ydiv;
+
+ for ( int i = gx0 + xdiv; i <= ( gx1 - xdiv ); i += xdiv )
+ p. drawLine ( i, gy0, i, gy1 );
+
+ for ( int i = gy0 + ydiv; i <= ( gy1 - ydiv ); i += ydiv )
+ p. drawLine ( gx0, i, gx1, i );
+
p. setPen ( g. highlight ( ));
p. drawLine ( BRD, ey, ex, ey );
- for ( int i = 1; i < m_steps; i++ ) {
- int fx = x0 + dx * i / m_steps;
- int fy = y0 + dy * i / ( m_steps - 1 );
+ for ( int i = 1; i < st; i++ ) {
+ int fx = x0 + dx * i / st;
+ int fy = y0 + dy * i / ( st - 1 );
p. drawLine ( ex, ey, fx, ey );
p. drawLine ( fx, ey, fx, fy );
@@ -265,13 +322,25 @@ void Calibration::paintEvent ( QPaintEvent * )
ex = fx;
ey = fy;
}
+ if ( st == 1 ) {
+ p. drawLine ( ex, ey, ex, y1 );
+ ey = y1;
+ }
p. drawLine ( ex, ey, width ( ) - 1 - BRD, ey );
+
p. fillRect ( around ( x0, y0 ), m_dragged == 0 ? g. highlightedText ( ) : g. text ( ));
+ p. drawRect ( around ( x0, y0 ));
p. fillRect ( around ( x1, y1 ), m_dragged == 1 ? g. highlightedText ( ) : g. text ( ));
+ p. drawRect ( around ( x1, y1 ));
p. setPen ( g. text ( ));
- p. drawText ( QRect ( BRD, BRD, width ( ) - 2*BRD, height() - 2*BRD ), AlignTop | AlignRight, tr( "%1 Steps" ). arg ( m_steps ));
+ p. drawText ( tr, AlignTop | AlignRight, stepstr );
+
+ p. end ( );
+ bitBlt ( this, cr. topLeft ( ), &pix, cr );
+ if ( !cr. contains ( tr ))
+ bitBlt ( this, tr. topLeft ( ), &pix, tr );
}