PSQt/src/LabColorRing.cpp

Go to the documentation of this file.
00001 //---------------------------------------------------------------------
00002 // File and Version Information:
00003 //   $Id: LabColorRing.cpp 9841 2015-03-26 18:35:44Z dubrovin@SLAC.STANFORD.EDU $
00004 //
00005 // Author: Mikhail S. Dubrovin
00006 //---------------------------------------------------------------------
00007 
00008 //--------------------------
00009 
00010 #include "PSQt/LabColorRing.h"
00011 #include "PSQt/QGUtils.h"
00012 #include "PSQt/Logger.h"
00013 
00014 #include <math.h>    // atan2, abs, fmod
00015 #include <iostream>    // cout
00016 
00017 //using namespace std; // for cout without std::
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   //this -> setFrame();
00033   this -> setMargin(0);
00034   this -> setMinimumSize(m_ssize, m_ssize);
00035   this -> setAlignment(Qt::AlignTop | Qt::AlignLeft);
00036   //this -> setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
00037 
00038   //////////////////////////////////
00039   //this -> setScaledContents (false);
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   //installEventFilter(this);
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); // or
00076   //m_frame -> setFrameStyle ( QFrame::Box );    // NoFrame, Box, Panel, WinPanel, ..., StyledPanel 
00077   //m_frame -> setFrameShadow( QFrame::Sunken ); // Plain, Sunken, Raised 
00078   m_frame -> setLineWidth(0);
00079   m_frame -> setMidLineWidth(1);
00080   //m_frame -> setCursor(Qt::PointingHandCursor);     // Qt::WaitCursor, Qt::PointingHandCursor
00081   //m_frame -> setStyleSheet("background-color: rgb(0, 255, 255); color: rgb(255, 255, 100)");
00082 }
00083 
00084 //--------------------------
00085 
00086 void
00087 LabColorRing::setStyle() 
00088 {
00089   this -> setFixedSize(m_ssize, m_ssize);
00090   this -> setCursor(Qt::ArrowCursor);     // Qt::WaitCursor, Qt::PointingHandCursor
00091   //this -> setCursor(Qt::PointingHandCursor);     // Qt::WaitCursor, Qt::PointingHandCursor
00092 }
00093 
00094 //--------------------------
00095 //--------------------------
00096 
00097 void
00098 LabColorRing::setPens() 
00099 {
00100   //QPen pen(Qt::black, 1, Qt::SolidLine); // Qt::DashLine
00101   //pen.setStyle(Qt::DashLine);
00102   //pen.setColor(QColor (200,200,200));
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   //QPainter painter(m_lab_cring);
00124   static unsigned count=0; count++;
00125   QLabel::paintEvent(event);
00126 
00127   //m_painter = new QPainter(this);
00128 
00129   m_painter.begin(this);
00130   //-----------
00131   setPoints();
00132 
00133   drawLines();
00134   drawCircs();
00135   //-----------
00136   m_painter.end();
00137 
00138   //std::cout << "WdgImage::paintEvent counter = " << count << '\n';
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   //m_painter.setBrush(Qt::Dense6Pattern);
00179   m_painter.setPen(*m_pen_w3);
00180   //m_painter.drawEllipse(m_poi1, rm, rm);
00181   //m_painter.drawEllipse(m_poi2, rm, rm);  
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 //  m_frame->setGeometry(0, 0, event->size().width(), event->size().height());
00205   //setWindowTitle("Window is resized");
00206 
00207   //this->setPixmap(m_pixmap_cring->scaled(this->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
00208 }
00209 
00210 //--------------------------
00211 
00212 void 
00213 LabColorRing::closeEvent(QCloseEvent *event)
00214 {
00215   QWidget::closeEvent(event);
00216 
00217   //stringstream ss; ss << "closeEvent(...): type = " << event -> type();
00218   //MsgInLog("LabColorRing", INFO, ss.str());
00219 }
00220 
00221 //--------------------------
00222 
00223 void
00224 LabColorRing::moveEvent(QMoveEvent *event)
00225 {
00226   //int x = event->pos().x();
00227   //int y = event->pos().y();
00228   //QString text = QString::number(x) + "," + QString::number(y);
00229   //setWindowTitle(text);
00230 }
00231 
00232 //--------------------------
00233 
00234 void 
00235 LabColorRing::mousePressEvent(QMouseEvent *e)
00236 {
00237   /*
00238   std::cout << "mousePressEvent:"
00239             << "  button: " << e->button()
00240             << "  x(),y() = " << e->x() << ", " << e->y()
00241             << "  isActiveWindow(): " << this->isActiveWindow()
00242             << '\n';
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   //m_ang_old = fmod(m_ang,360);
00262 
00263   //std::cout << "mousePressEvent: selected = " << m_selected << '\n';
00264 
00265   //QApplication::setOverrideCursor(Qt::ClosedHandCursor);
00266   //m_parent -> setCursor(Qt::ClosedHandCursor);
00267   this -> setCursor(Qt::ClosedHandCursor);
00268 }
00269 
00270 //--------------------------
00271 
00272 void 
00273 LabColorRing::mouseMoveEvent(QMouseEvent *e)
00274 {
00275   //std::cout << "LabColorRing::mouseMoveEvent: "
00276   //          << "  x(),y() = "  << e->x() << ", " << e->y()
00277   //          << '\n';
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(); // this->setCursor(Qt::ArrowCursor);
00283   }
00284 
00285   setHueAngle(e);
00286 }
00287 
00288 //--------------------------
00289 
00290 void 
00291 LabColorRing::mouseReleaseEvent(QMouseEvent *e)
00292 {
00293   //std::cout << "mouseReleaseEvent:"
00294   //          << "  button: " << e->button()
00295   //          << "  x(),y() = " << e->x() << ", " << e->y()
00296   //          << '\n';
00297 
00298   //QApplication::restoreOverrideCursor();
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   //std::cout << "LabColorRing::enterEvent(.)\n";
00313 }
00314 
00315 //--------------------------
00316 
00317 void 
00318 LabColorRing::leaveEvent(QEvent *e)
00319 {
00320   //std::cout << "LabColorRing::leaveEvent(.)\n";
00321 }
00322 
00323 //--------------------------
00324 
00325 //bool 
00326 //LabColorRing::eventFilter(QObject *obj, QEvent *e)
00327 //{
00328 //  //if(obj==this && (e->type()==QEvent::Enter || e->type()==QEvent::Leave)) 
00329 //  std::cout << "LabColorRing::eventFilter(...) type: " << e->type()<< '\n';
00330 //  if(obj!=this) return true;
00331 //  if(e->type()==QEvent::MouseMove) return false; 
00332 //  if(e->type()==QEvent::MouseButtonPress) return false; 
00333 //  if(e->type()==QEvent::MouseButtonRelease) return false; 
00334 //  if(e->type()==QEvent::Paint) return false; 
00335 //  return true;
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; // [0,360)
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     //std::cout << "LabColorRing::mouseReleaseEvent: emit signal hueAngleIsMoving()\n";
00363     emit hueAngleIsMoving(m_selected);
00364   }
00365 
00366 }
00367 
00368 //--------------------------
00369 //--------------------------
00370 
00371 void 
00372 LabColorRing::onSetShifter(const unsigned& edited)
00373 {
00374   //std::cout << "LabColorRing::onSetShifter() h1:" << m_h1 << " h2:" << m_h2 
00375   //          << " edited:" << edited << '\n';
00376   update();
00377 }
00378 
00379 //--------------------------
00380 
00381 void 
00382 LabColorRing::onButExit()
00383 {
00384   //std::cout << "LabColorRing::onButExit()\n";
00385   this->close(); // will call closeEvent(...)
00386 }
00387 
00388 //--------------------------
00389 /*
00390 void 
00391 LabColorRing::setPixmapForLabel(const QImage& image, QPixmap*& pixmap, QLabel*& label)
00392 {
00393   if(pixmap) delete pixmap;
00394   pixmap = new QPixmap(QPixmap::fromImage(image));
00395   //else pixmap -> loadFromData ( (const uchar*) &dimg[0], unsigned(rows*cols) );
00396 
00397   label->setPixmap(pixmap->scaled(label->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
00398   //label->setPixmap(*pixmap);
00399 }
00400 */
00401 //--------------------------
00402 
00403 void 
00404 LabColorRing::setColorRing(const int& ssize)
00405 {
00406   //std::cout << "LabColorRing::setColorRing() for ssize = " << ssize << '\n';
00407   //clear();
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   //std::fill_n(&dimg[0][0], int(isize), uint32_t(0xFF000000));
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; // reflected
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     //if(0.5<r && r<1) dimg[i][j] = HSV2RGBA(hue, 1, r);
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   //setPixmapForLabel(image, m_pixmap_cring, this);
00436 
00437   if(m_pixmap_cring) delete m_pixmap_cring;
00438   m_pixmap_cring = new QPixmap(QPixmap::fromImage(image));
00439   //else pixmap -> loadFromData ( (const uchar*) &dimg[0], unsigned(rows*cols) );
00440 
00441   this->setPixmap(m_pixmap_cring->scaled(this->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
00442 }
00443 
00444 //--------------------------
00445 
00446 //--------------------------
00447 
00448 //--------------------------
00449 
00450 } // namespace PSQt
00451 
00452 //--------------------------

Generated on 19 Dec 2016 for PSANAmodules by  doxygen 1.4.7