00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "QmitkColorPropertyEditor.h"
00018
00019 #include <QLayout>
00020 #include <QPainter>
00021 #include <QApplication>
00022 #include <QMouseEvent>
00023 #include <QCloseEvent>
00024 #include <QDesktopWidget>
00025 #include <mitkRenderingManager.h>
00026
00027
00028
00029 QmitkPopupColorChooser::QmitkPopupColorChooser(QWidget* parent, unsigned int steps, unsigned int size)
00030 : QFrame (parent, Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::Tool | Qt::X11BypassWindowManagerHint),
00031 my_parent(parent)
00032 {
00033 setSteps(steps);
00034
00035 setLineWidth(2);
00036 setMouseTracking ( TRUE );
00037
00038
00039
00040 setFrameStyle ( QFrame::Panel | QFrame::Raised );
00041 setLineWidth( 1 );
00042 ensurePolished();
00043 resize(size, size);
00044
00045 hide();
00046 }
00047
00048 QmitkPopupColorChooser::~QmitkPopupColorChooser()
00049 {
00050 }
00051
00052 void QmitkPopupColorChooser::setSteps(int steps)
00053 {
00054 m_Steps = steps;
00055 m_Steps2 = m_Steps / 2;
00056 m_HStep = 360 / m_Steps;
00057 m_SStep = 512 / m_Steps;
00058 m_VStep = 512 / m_Steps;
00059 }
00060
00061 void QmitkPopupColorChooser::keyReleaseEvent(QKeyEvent*)
00062 {
00063 emit colorSelected( m_OriginalColor );
00064 close();
00065 }
00066
00067 void QmitkPopupColorChooser::mouseMoveEvent (QMouseEvent* e)
00068 {
00069 double x(e->pos().x());
00070 double y(e->pos().y());
00071 x /= width();
00072
00073 if ( x >= 0.0 )
00074 {
00075
00076 x = (int)(x * (float)(m_Steps-1)) / (float)(m_Steps-1);
00077 if (x > 1.0) x = 1.0;
00078 if (x < 0.0) x = 0.0;
00079 }
00080
00081 y /= height();
00082 if (y >= 1.0) y = 0.9;
00083 if (y < 0.0) y = 0.0;
00084 y = (int)(y * (float)m_Steps) / (float)m_Steps;
00085
00086 m_H = static_cast<int>( y * 359.0 );
00087 if ( x >= 0.5 )
00088 {
00089 m_S = static_cast<int>( (1.0 - x) * 511.0 );
00090 if ( m_S > 255 ) m_S = 255;
00091 m_V = 255;
00092 }
00093 else
00094 {
00095 m_S = 255;
00096 if ( x < 0.0 )
00097 m_V = 0;
00098 else
00099 {
00100 m_V = static_cast<int>( x * 511.0 + 511.0 / (float)(m_Steps-1) );
00101 if ( m_V > 255 ) m_V = 255;
00102 }
00103 }
00104
00105 QColor color;
00106 color.setHsv(m_H, m_S, m_V);
00107
00108 emit colorSelected( color );
00109 }
00110
00111 void QmitkPopupColorChooser::mouseReleaseEvent (QMouseEvent*)
00112 {
00113 close ();
00114 }
00115
00116 void QmitkPopupColorChooser::closeEvent (QCloseEvent*e)
00117 {
00118 e->accept ();
00119
00120 releaseKeyboard();
00121 releaseMouse();
00122
00123 if (!m_popupParent) return;
00124
00125
00126
00127
00128
00129
00130
00131 QMouseEvent me( QEvent::MouseButtonRelease, QPoint(0,0), QPoint(0,0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
00132 QApplication::sendEvent ( m_popupParent, &me );
00133 }
00134
00135 void QmitkPopupColorChooser::popup(QWidget* parent, const QPoint& point, const mitk::Color* color)
00136 {
00137 m_popupParent = parent;
00138 if (m_popupParent)
00139 {
00140 QPoint newPos;
00141
00142 if (color)
00143 {
00144 QColor qcolor( (int)((*color)[0] * 255.0) , (int)((*color)[1] * 255.0) , (int)((*color)[2] * 255.0) );
00145 int h,s,v;
00146 qcolor.getHsv(&h, &s, &v);
00147
00148 if ( h == -1 )
00149 h = 10;
00150
00151 int x, y;
00152 float cellwidth = (float)width() / (float)(m_Steps);
00153
00154 if ( s > v )
00155 {
00156 s = 255;
00157 x = (int)(
00158 (
00159 ((float)v / 255.0)
00160 *
00161 ((float)m_Steps2)
00162 -
00163 1.0
00164 )
00165 *
00166 cellwidth
00167 + cellwidth/2
00168 );
00169 }
00170 else
00171 {
00172 v = 255;
00173 x = (int)(
00174 (
00175 (1.0 - ((float)s / 255.0))
00176 *
00177 ((float)m_Steps2)
00178 )
00179 *
00180 cellwidth
00181 + cellwidth/2
00182
00183 + width() / 2
00184 );
00185 }
00186
00187 y = (int)( (float)h/360.0 * (float)m_Steps * cellwidth );
00188
00189 m_OriginalColor.setHsv(h,s,v);
00190
00191
00192 newPos.setX( point.x() - x );
00193 newPos.setY( point.y() - y );
00194 }
00195 else
00196 {
00197
00198 m_OriginalColor.setHsv(-1, 0, 0);
00199
00200 newPos.setX( point.x() - width() / 2 );
00201 newPos.setY( point.y() - height() / 2 );
00202 }
00203 move ( m_popupParent->mapToGlobal( newPos ) );
00204 }
00205
00206 show();
00207 raise();
00208 grabMouse();
00209 grabKeyboard();
00210 }
00211
00212 void QmitkPopupColorChooser::paintEvent(QPaintEvent*)
00213 {
00214 QPainter painter(this);
00215 drawGradient( &painter );
00216 }
00217
00218 void QmitkPopupColorChooser::drawGradient( QPainter* p)
00219 {
00220 p->setWindow( 0, 0, m_Steps-1, m_Steps );
00221 p->setPen( Qt::NoPen );
00222
00223 QColor c;
00224 for ( unsigned int h = 0; h < m_Steps; ++h )
00225 {
00226 for ( unsigned int v = 1; v < m_Steps2; ++v )
00227 {
00228 c.setHsv( h*m_HStep, 255, v*m_VStep );
00229 p->setBrush( c );
00230 p->drawRect( v-1, h, m_Steps2, m_Steps );
00231 }
00232 for ( unsigned int s = 0; s < m_Steps2; ++s )
00233 {
00234 c.setHsv( h*m_HStep, 255 - s*m_SStep, 255 );
00235 p->setBrush( c );
00236 p->drawRect( m_Steps2+s-1, h, m_Steps2, m_Steps );
00237 }
00238 }
00239 }
00240
00241
00242
00243
00244 QmitkPopupColorChooser* QmitkColorPropertyEditor::colorChooser = NULL;
00245 int QmitkColorPropertyEditor::colorChooserRefCount = 0;
00246
00247 QmitkColorPropertyEditor::QmitkColorPropertyEditor( const mitk::ColorProperty* property, QWidget* parent )
00248 : QmitkColorPropertyView( property, parent )
00249 {
00250
00251 int scr;
00252 if ( QApplication::desktop()->isVirtualDesktop() )
00253 scr = QApplication::desktop()->screenNumber( parent->mapToGlobal( pos() ) );
00254 else
00255 scr = QApplication::desktop()->screenNumber( parent );
00256
00257 if ( colorChooserRefCount == 0 )
00258 {
00259 colorChooser = new QmitkPopupColorChooser( QApplication::desktop()->screen( scr ), 50 );
00260 }
00261 ++colorChooserRefCount;
00262 }
00263
00264 QmitkColorPropertyEditor::~QmitkColorPropertyEditor()
00265 {
00266 --colorChooserRefCount;
00267 if (!colorChooserRefCount)
00268 {
00269 delete colorChooser;
00270 colorChooser = NULL;
00271 }
00272 }
00273
00274 void QmitkColorPropertyEditor::mousePressEvent(QMouseEvent* e)
00275 {
00276 connect( colorChooser, SIGNAL(colorSelected(QColor)), this, SLOT(onColorSelected(QColor)) );
00277 if (m_ColorProperty)
00278 {
00279 colorChooser->popup( this, e->pos(), &(m_ColorProperty->GetColor()) );
00280 }
00281 }
00282
00283 void QmitkColorPropertyEditor::mouseReleaseEvent(QMouseEvent*)
00284 {
00285 disconnect( colorChooser, SIGNAL(colorSelected(QColor)), this, SLOT(onColorSelected(QColor)) );
00286 }
00287
00288 void QmitkColorPropertyEditor::onColorSelected(QColor c)
00289 {
00290 if (m_ColorProperty)
00291 {
00292 int r,g,b;
00293 c.getRgb( &r, &g, &b );
00294 const_cast<mitk::ColorProperty*>(m_ColorProperty)->SetColor( r / 255.0, g / 255.0, b / 255.0 );
00295 const_cast<mitk::ColorProperty*>(m_ColorProperty)->Modified();
00296
00297 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00298 }
00299 }
00300