00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "PSQt/LabColorRing.h"
00011 #include "PSQt/QGUtils.h"
00012 #include "PSQt/Logger.h"
00013
00014 #include <math.h>
00015 #include <iostream>
00016
00017
00018
00019 namespace PSQt {
00020
00021
00022
00023 LabColorRing::LabColorRing(QWidget *parent, const unsigned& ssize, float &h1, float &h2)
00024 : QLabel(parent)
00025 , m_parent(parent)
00026 , m_ssize(ssize)
00027 , m_h1(h1)
00028 , m_h2(h2)
00029 , m_poiC(float(m_ssize/2), float(m_ssize/2))
00030 , m_selected(0)
00031 {
00032
00033 this -> setMargin(0);
00034 this -> setMinimumSize(m_ssize, m_ssize);
00035 this -> setAlignment(Qt::AlignTop | Qt::AlignLeft);
00036
00037
00038
00039
00040 this -> setScaledContents (true);
00041
00042
00043 showTips();
00044 setStyle();
00045
00046 m_R = float(m_ssize/2);
00047 m_frR1 = 0.4;
00048 m_frR2 = 0.9;
00049 m_R1 = m_R * m_frR1;
00050 m_R2 = m_R * m_frR2;
00051
00052 m_rpicker = 10;
00053
00054 m_pixmap_cring=0;
00055 setPens();
00056 setColorRing(512);
00057
00058 this->setMouseTracking(true);
00059
00060 }
00061
00062
00063
00064 void
00065 LabColorRing::showTips()
00066 {
00067 }
00068
00069
00070
00071 void
00072 LabColorRing::setFrame()
00073 {
00074 m_frame = new QFrame(this);
00075 m_frame -> setFrameStyle (QFrame::Box | QFrame::Sunken);
00076
00077
00078 m_frame -> setLineWidth(0);
00079 m_frame -> setMidLineWidth(1);
00080
00081
00082 }
00083
00084
00085
00086 void
00087 LabColorRing::setStyle()
00088 {
00089 this -> setFixedSize(m_ssize, m_ssize);
00090 this -> setCursor(Qt::ArrowCursor);
00091
00092 }
00093
00094
00095
00096
00097 void
00098 LabColorRing::setPens()
00099 {
00100
00101
00102
00103
00104 m_pen_w1 = new QPen(Qt::black, 1, Qt::SolidLine);
00105 m_pen_w3 = new QPen(Qt::black, 3, Qt::SolidLine);
00106
00107 QVector<qreal> dashes;
00108 qreal space = 4;
00109 dashes << 4 << space;
00110
00111 m_pen1 = new QPen(Qt::black, 1, Qt::DashLine);
00112 m_pen2 = new QPen(Qt::white, 1, Qt::DashLine);
00113 m_pen1->setDashPattern(dashes);
00114 m_pen2->setDashPattern(dashes);
00115 m_pen2->setDashOffset(4);
00116 }
00117
00118
00119
00120 void
00121 LabColorRing::paintEvent(QPaintEvent *event)
00122 {
00123
00124 static unsigned count=0; count++;
00125 QLabel::paintEvent(event);
00126
00127
00128
00129 m_painter.begin(this);
00130
00131 setPoints();
00132
00133 drawLines();
00134 drawCircs();
00135
00136 m_painter.end();
00137
00138
00139 }
00140
00141
00142
00143 void
00144 LabColorRing::setPoints()
00145 {
00146 float h1 = DEG2RAD*m_h1;
00147 float h2 = DEG2RAD*m_h2;
00148 float s1 = sin(h1);
00149 float s2 = sin(h2);
00150 float c1 = cos(h1);
00151 float c2 = cos(h2);
00152
00153 m_poi1 .setX( m_poiC.x() + m_R1 * c1 );
00154 m_poi1 .setY( m_poiC.y() - m_R1 * s1 );
00155 m_poi1e.setX( m_poiC.x() + m_R2 * c1 );
00156 m_poi1e.setY( m_poiC.y() - m_R2 * s1 );
00157 m_poi2 .setX( m_poiC.x() + m_R2 * c2 );
00158 m_poi2 .setY( m_poiC.y() - m_R2 * s2 );
00159 m_poi2e.setX( m_poiC.x() + m_R1 * c2 );
00160 m_poi2e.setY( m_poiC.y() - m_R1 * s2 );
00161 }
00162
00163
00164
00165 void
00166 LabColorRing::drawLines()
00167 {
00168 m_painter.setPen(*m_pen1);
00169 m_painter.drawLine(m_poi1, m_poi1e);
00170 m_painter.drawLine(m_poi2, m_poi2e);
00171
00172 m_painter.setPen(*m_pen2);
00173 m_painter.drawLine(m_poi1, m_poi1e);
00174 m_painter.drawLine(m_poi2, m_poi2e);
00175
00176 float rm = m_rpicker;
00177 int rs = int(m_rpicker * 2);
00178
00179 m_painter.setPen(*m_pen_w3);
00180
00181
00182 m_painter.drawRect(int(m_poi1.x()-rm), int(m_poi1.y()-rm), rs, rs );
00183 m_painter.drawRect(int(m_poi2.x()-rm), int(m_poi2.y()-rm), rs, rs );
00184
00185 m_painter.drawText(m_poi1+QPoint(-4,4), QString(QChar(0x25cf)));
00186 m_painter.drawText(m_poi2+QPoint(-4,4), QString(QChar(0x25cf)));
00187 }
00188
00189
00190
00191 void
00192 LabColorRing::drawCircs()
00193 {
00194 m_painter.setPen(*m_pen_w1);
00195 m_painter.drawEllipse(m_poiC, m_R1, m_R1);
00196 m_painter.drawEllipse(m_poiC, m_R2, m_R2);
00197 }
00198
00199
00200
00201 void
00202 LabColorRing::resizeEvent(QResizeEvent *event)
00203 {
00204
00205
00206
00207
00208 }
00209
00210
00211
00212 void
00213 LabColorRing::closeEvent(QCloseEvent *event)
00214 {
00215 QWidget::closeEvent(event);
00216
00217
00218
00219 }
00220
00221
00222
00223 void
00224 LabColorRing::moveEvent(QMoveEvent *event)
00225 {
00226
00227
00228
00229
00230 }
00231
00232
00233
00234 void
00235 LabColorRing::mousePressEvent(QMouseEvent *e)
00236 {
00237
00238
00239
00240
00241
00242
00243
00244
00245 if( (e->pos()-m_poi1).manhattanLength() < 2*m_rpicker ) {
00246 m_selected = 1;
00247 m_ang = m_h1;
00248 }
00249 else if( (e->pos()-m_poi2).manhattanLength() < 2*m_rpicker ) {
00250 m_selected = 2;
00251 m_ang = m_h2;
00252 }
00253 else {
00254 m_selected = 0;
00255 return;
00256 }
00257
00258 m_n360 = int(m_ang/360)*360;
00259 if (m_ang<0) m_n360-=360;
00260 m_ang_old = m_ang-m_n360;
00261
00262
00263
00264
00265
00266
00267 this -> setCursor(Qt::ClosedHandCursor);
00268 }
00269
00270
00271
00272 void
00273 LabColorRing::mouseMoveEvent(QMouseEvent *e)
00274 {
00275
00276
00277
00278
00279 if(! m_selected) {
00280 if((e->pos()-m_poi1).manhattanLength() < 2*m_rpicker
00281 || (e->pos()-m_poi2).manhattanLength() < 2*m_rpicker ) this -> setCursor(Qt::OpenHandCursor);
00282 else this -> unsetCursor();
00283 }
00284
00285 setHueAngle(e);
00286 }
00287
00288
00289
00290 void
00291 LabColorRing::mouseReleaseEvent(QMouseEvent *e)
00292 {
00293
00294
00295
00296
00297
00298
00299 this->setCursor(Qt::ArrowCursor);
00300
00301 setHueAngle(e);
00302
00303 emit hueAngleIsMoved();
00304 m_selected = 0;
00305 }
00306
00307
00308
00309 void
00310 LabColorRing::enterEvent(QEvent *e)
00311 {
00312
00313 }
00314
00315
00316
00317 void
00318 LabColorRing::leaveEvent(QEvent *e)
00319 {
00320
00321 }
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340 void
00341 LabColorRing::setHueAngle(QMouseEvent *e)
00342 {
00343 if( !m_selected ) return;
00344
00345 QPointF dc(e->pos() - m_poiC);
00346
00347 float m_ang = atan2(-dc.y(),dc.x()) * RAD2DEG;
00348 m_ang = (m_ang<0) ? m_ang+360 : m_ang;
00349
00350 if(m_ang_old>330 && m_ang<30) m_n360 += 360;
00351 if(m_ang_old<30 && m_ang>330) m_n360 -= 360;
00352
00353 if ( m_selected == 1 ) m_h1 = roundf(m_ang + m_n360);
00354 else if( m_selected == 2 ) m_h2 = roundf(m_ang + m_n360);
00355 else return;
00356
00357 m_ang_old = m_ang;
00358
00359 update();
00360
00361 if(m_selected) {
00362
00363 emit hueAngleIsMoving(m_selected);
00364 }
00365
00366 }
00367
00368
00369
00370
00371 void
00372 LabColorRing::onSetShifter(const unsigned& edited)
00373 {
00374
00375
00376 update();
00377 }
00378
00379
00380
00381 void
00382 LabColorRing::onButExit()
00383 {
00384
00385 this->close();
00386 }
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 void
00404 LabColorRing::setColorRing(const int& ssize)
00405 {
00406
00407
00408
00409 const int isize = ssize*ssize;
00410
00411 const int xc = ssize/2;
00412 const int yc = ssize/2;
00413 const int rr = int(ssize*0.5);
00414
00415 uint32_t dimg[ssize][ssize];
00416
00417 std::fill_n(&dimg[0][0], int(isize), uint32_t(0xFFFFFFFF));
00418
00419 for(int i=0; i<ssize; ++i) {
00420 for(int j=0; j<ssize; ++j) {
00421
00422 float y = yc-i;
00423 float x = j-xc;
00424 float r = sqrt(x*x + y*y) / rr;
00425
00426 float hue = atan2(y,x) * RAD2DEG;
00427 hue = (hue<0) ? hue+360 : hue;
00428
00429
00430 if(m_frR1<r && r<m_frR2) dimg[i][j] = HSV2RGBA(hue, 1, 1);
00431 }
00432 }
00433
00434 QImage image((const uchar*) &dimg[0], ssize, ssize, QImage::Format_ARGB32);
00435
00436
00437 if(m_pixmap_cring) delete m_pixmap_cring;
00438 m_pixmap_cring = new QPixmap(QPixmap::fromImage(image));
00439
00440
00441 this->setPixmap(m_pixmap_cring->scaled(this->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
00442 }
00443
00444
00445
00446
00447
00448
00449
00450 }
00451
00452