00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkColorTransferFunctionCanvas.h"
00019
00020 #include <QPainter>
00021 #include <QLineEdit>
00022 #include <QColorDialog>
00023
00024 QmitkColorTransferFunctionCanvas::QmitkColorTransferFunctionCanvas(
00025 QWidget * parent, Qt::WindowFlags f) :
00026 QmitkTransferFunctionCanvas(parent, f), m_ColorTransferFunction(0)
00027 {
00028
00029 setContentsMargins(1,1,1,1);
00030 }
00031
00032 void QmitkColorTransferFunctionCanvas::SetTitle(std::string title)
00033 {
00034 m_Title=title;
00035 }
00036
00037
00038 void QmitkColorTransferFunctionCanvas::paintEvent(QPaintEvent*)
00039 {
00040 QPainter painter(this);
00041
00042
00043 QRect contentsRect = this->contentsRect();
00044 painter.setPen(Qt::gray);
00045 painter.drawRect(0, 0, contentsRect.width()+1, contentsRect.height()+1);
00046
00047 if( ! this->isEnabled() )
00048 return;
00049
00050 if (m_ColorTransferFunction)
00051 {
00052 for (int x = contentsRect.x(); x < contentsRect.x() + contentsRect.width(); x++)
00053 {
00054 vtkFloatingPointType xVal = m_Min + ((float) x) / contentsRect.width() * (m_Max
00055 - m_Min);
00056 QColor col((int) (m_ColorTransferFunction->GetRedValue(xVal) * 255),
00057 (int) (m_ColorTransferFunction->GetGreenValue(xVal) * 255),
00058 (int) (m_ColorTransferFunction->GetBlueValue(xVal) * 255));
00059 painter.setPen(col);
00060 painter.drawLine(x, 1, x, contentsRect.height());
00061 }
00062 }
00063
00064
00065 if (m_Title.size()>0)
00066 {
00067 painter.setPen(Qt::black);
00068 painter.drawText(QPoint(11,21),QString( m_Title.c_str() ));
00069 painter.setPen(Qt::white);
00070 painter.drawText(QPoint(10,20),QString( m_Title.c_str() ));
00071 }
00072
00073
00074 QString qs_min = QString::number( m_Min );
00075 QString qs_max = QString::number( m_Max );
00076
00077 QRect qr_min = painter.fontMetrics().boundingRect( qs_min );
00078 QRect qr_max = painter.fontMetrics().boundingRect( qs_max );
00079
00080 int y,x;
00081
00082 y=this->contentsRect().height()-qr_min.height()+5;
00083 x=10;
00084
00085 painter.setPen(Qt::black);
00086 painter.drawText(QPoint(x+1,y+1),qs_min);
00087 painter.setPen(Qt::white);
00088 painter.drawText(QPoint(x ,y ),qs_min);
00089
00090 y=this->contentsRect().height()-qr_max.height()+5;
00091 x=this->contentsRect().width()-qr_max.width()-6;
00092
00093 painter.setPen(Qt::black);
00094 painter.drawText(QPoint(x,y+1),qs_max);
00095 painter.setPen(Qt::white);
00096 painter.drawText(QPoint(x,y ),qs_max);
00097
00098 if (m_ColorTransferFunction)
00099 {
00100
00101 painter.setBrush(Qt::black);
00102 painter.setPen(Qt::black);
00103 for (int i = 0; i < this->GetFunctionSize(); i++)
00104 {
00105 int handleHeight = (i == m_GrabbedHandle) ? (int) (contentsRect.height() / 1.5)
00106 : contentsRect.height() / 2;
00107 int handleWidth = (i == m_GrabbedHandle) ? 6 : 4;
00108 std::pair<int,int> point = this->FunctionToCanvas(std::make_pair(
00109 GetFunctionX(i), 0.0f));
00110 int y = height() / 2;
00111 painter.drawRoundRect(point.first - handleWidth / 2,
00112 y - handleHeight / 2, handleWidth, handleHeight, 50, 50);
00113
00114 if (i == m_GrabbedHandle)
00115 {
00116 if (m_LineEditAvailable)
00117 {
00118 m_XEdit->setText(QString::number(GetFunctionX(m_GrabbedHandle)));
00119
00120 }
00121 }
00122
00123 }
00124 }
00125 }
00126
00127 int QmitkColorTransferFunctionCanvas::GetNearHandle(int x, int ,
00128 unsigned int maxSquaredDistance)
00129 {
00130 for (int i = 0; i < this->GetFunctionSize(); i++)
00131 {
00132 std::pair<int,int> point = this->FunctionToCanvas(std::make_pair(
00133 GetFunctionX(i), (vtkFloatingPointType) 0.0));
00134 if ((unsigned int) ((point.first - x) * (point.first - x))
00135 < maxSquaredDistance)
00136 {
00137 return i;
00138 }
00139 }
00140 return -1;
00141 }
00142
00143 void QmitkColorTransferFunctionCanvas::DoubleClickOnHandle(int handle)
00144 {
00145 vtkFloatingPointType xVal = GetFunctionX(handle);
00146 QColor col((int) (m_ColorTransferFunction->GetRedValue(xVal) * 255),
00147 (int) (m_ColorTransferFunction->GetGreenValue(xVal) * 255),
00148 (int) (m_ColorTransferFunction->GetBlueValue(xVal) * 255));
00149 QColor result = QColorDialog::getColor(col);
00150 if (result.isValid())
00151 {
00152 m_ColorTransferFunction->AddRGBPoint(xVal, result.red() / 255.0,
00153 result.green() / 255.0, result.blue() / 255.0);
00154 this->update();
00155 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00156 }
00157 }
00158
00159 void QmitkColorTransferFunctionCanvas::MoveFunctionPoint(int index,
00160 std::pair<vtkFloatingPointType,vtkFloatingPointType> pos)
00161 {
00162 vtkFloatingPointType color[3];
00163 m_ColorTransferFunction->GetColor(GetFunctionX(index), color);
00164 RemoveFunctionPoint( GetFunctionX(index));
00165 m_ColorTransferFunction->AddRGBPoint(pos.first, color[0], color[1], color[2]);
00166 }
00167
00168 void QmitkColorTransferFunctionCanvas::AddRGB(double x, double r, double g,
00169 double b)
00170 {
00171 m_ColorTransferFunction->AddRGBPoint(x, r, g, b);
00172 }