/Libs/qMRMLWidgets/qMRMLDisplayNodeWidget.cxx

https://github.com/LinjieChen/Slicer-1 · C++ · 390 lines · 283 code · 46 blank · 61 comment · 16 complexity · b11b4b831c05c1e9b6d8c7420cf59d11 MD5 · raw file

  1. /*==============================================================================
  2. Program: 3D Slicer
  3. Copyright (c) Kitware Inc.
  4. See COPYRIGHT.txt
  5. or http://www.slicer.org/copyright/copyright.txt for details.
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. This file was originally developed by Julien Finet, Kitware Inc.
  12. and was partially funded by NIH grant 3P41RR013218-12S1
  13. ==============================================================================*/
  14. // QT includes
  15. // qMRML includes
  16. #include "qMRMLDisplayNodeWidget.h"
  17. #include "ui_qMRMLDisplayNodeWidget.h"
  18. // MRML includes
  19. #include <vtkMRMLDisplayableNode.h>
  20. #include <vtkMRMLDisplayNode.h>
  21. // VTK includes
  22. #include <vtkSmartPointer.h>
  23. //------------------------------------------------------------------------------
  24. class qMRMLDisplayNodeWidgetPrivate: public Ui_qMRMLDisplayNodeWidget
  25. {
  26. Q_DECLARE_PUBLIC(qMRMLDisplayNodeWidget);
  27. protected:
  28. qMRMLDisplayNodeWidget* const q_ptr;
  29. public:
  30. qMRMLDisplayNodeWidgetPrivate(qMRMLDisplayNodeWidget& object);
  31. void init();
  32. vtkSmartPointer<vtkMRMLDisplayNode> MRMLDisplayNode;
  33. };
  34. //------------------------------------------------------------------------------
  35. qMRMLDisplayNodeWidgetPrivate::qMRMLDisplayNodeWidgetPrivate(qMRMLDisplayNodeWidget& object)
  36. : q_ptr(&object)
  37. {
  38. }
  39. //------------------------------------------------------------------------------
  40. void qMRMLDisplayNodeWidgetPrivate::init()
  41. {
  42. Q_Q(qMRMLDisplayNodeWidget);
  43. this->setupUi(q);
  44. QObject::connect(this->VisibilityCheckBox, SIGNAL(toggled(bool)),
  45. q, SLOT(setVisibility(bool)));
  46. QObject::connect(this->SelectedCheckBox, SIGNAL(toggled(bool)),
  47. q, SLOT(setSelected(bool)));
  48. QObject::connect(this->ClippingCheckBox, SIGNAL(toggled(bool)),
  49. q, SLOT(setClipping(bool)));
  50. QObject::connect(this->SliceIntersectionVisibilityCheckBox, SIGNAL(toggled(bool)),
  51. q, SLOT(setSliceIntersectionVisible(bool)));
  52. QObject::connect(this->MaterialPropertyWidget, SIGNAL(colorChanged(QColor)),
  53. q, SLOT(setColor(QColor)));
  54. QObject::connect(this->MaterialPropertyWidget, SIGNAL(opacityChanged(double)),
  55. q, SLOT(setOpacity(double)));
  56. QObject::connect(this->MaterialPropertyWidget, SIGNAL(ambientChanged(double)),
  57. q, SLOT(setAmbient(double)));
  58. QObject::connect(this->MaterialPropertyWidget, SIGNAL(diffuseChanged(double)),
  59. q, SLOT(setDiffuse(double)));
  60. QObject::connect(this->MaterialPropertyWidget, SIGNAL(specularChanged(double)),
  61. q, SLOT(setSpecular(double)));
  62. QObject::connect(this->MaterialPropertyWidget, SIGNAL(specularPowerChanged(double)),
  63. q, SLOT(setSpecularPower(double)));
  64. QObject::connect(this->MaterialPropertyWidget, SIGNAL(backfaceCullingChanged(bool)),
  65. q, SLOT(setBackfaceCulling(bool)));
  66. q->setEnabled(this->MRMLDisplayNode.GetPointer() != 0);
  67. }
  68. //------------------------------------------------------------------------------
  69. qMRMLDisplayNodeWidget::qMRMLDisplayNodeWidget(QWidget *_parent)
  70. : QWidget(_parent)
  71. , d_ptr(new qMRMLDisplayNodeWidgetPrivate(*this))
  72. {
  73. Q_D(qMRMLDisplayNodeWidget);
  74. d->init();
  75. }
  76. //------------------------------------------------------------------------------
  77. qMRMLDisplayNodeWidget::~qMRMLDisplayNodeWidget()
  78. {
  79. }
  80. //------------------------------------------------------------------------------
  81. vtkMRMLDisplayNode* qMRMLDisplayNodeWidget::mrmlDisplayNode()const
  82. {
  83. Q_D(const qMRMLDisplayNodeWidget);
  84. return d->MRMLDisplayNode;
  85. }
  86. //------------------------------------------------------------------------------
  87. void qMRMLDisplayNodeWidget::setMRMLDisplayableNode(vtkMRMLNode* node)
  88. {
  89. vtkMRMLDisplayableNode* displayableNode =
  90. vtkMRMLDisplayableNode::SafeDownCast(node);
  91. this->setMRMLDisplayNode(displayableNode ? displayableNode->GetDisplayNode() : 0);
  92. }
  93. //------------------------------------------------------------------------------
  94. void qMRMLDisplayNodeWidget::setMRMLDisplayNode(vtkMRMLNode* node)
  95. {
  96. this->setMRMLDisplayNode(vtkMRMLDisplayNode::SafeDownCast(node));
  97. }
  98. //------------------------------------------------------------------------------
  99. void qMRMLDisplayNodeWidget::setMRMLDisplayNode(vtkMRMLDisplayNode* displayNode)
  100. {
  101. Q_D(qMRMLDisplayNodeWidget);
  102. qvtkReconnect(d->MRMLDisplayNode, displayNode, vtkCommand::ModifiedEvent,
  103. this, SLOT(updateWidgetFromMRML()));
  104. d->MRMLDisplayNode = displayNode;
  105. this->updateWidgetFromMRML();
  106. }
  107. //------------------------------------------------------------------------------
  108. void qMRMLDisplayNodeWidget::setVisibility(bool visible)
  109. {
  110. Q_D(qMRMLDisplayNodeWidget);
  111. if (!d->MRMLDisplayNode.GetPointer())
  112. {
  113. return;
  114. }
  115. d->MRMLDisplayNode->SetVisibility(visible);
  116. }
  117. //------------------------------------------------------------------------------
  118. bool qMRMLDisplayNodeWidget::visibility()const
  119. {
  120. Q_D(const qMRMLDisplayNodeWidget);
  121. return d->VisibilityCheckBox->isChecked();
  122. }
  123. //------------------------------------------------------------------------------
  124. void qMRMLDisplayNodeWidget::setVisibilityVisible(bool visible)
  125. {
  126. Q_D(const qMRMLDisplayNodeWidget);
  127. d->VisibilityCheckBox->setVisible(visible);
  128. }
  129. //------------------------------------------------------------------------------
  130. void qMRMLDisplayNodeWidget::setSelected(bool selected)
  131. {
  132. Q_D(qMRMLDisplayNodeWidget);
  133. if (!d->MRMLDisplayNode.GetPointer())
  134. {
  135. return;
  136. }
  137. d->MRMLDisplayNode->SetSelected(selected);
  138. }
  139. //------------------------------------------------------------------------------
  140. bool qMRMLDisplayNodeWidget::selected()const
  141. {
  142. Q_D(const qMRMLDisplayNodeWidget);
  143. return d->SelectedCheckBox->isChecked();
  144. }
  145. //------------------------------------------------------------------------------
  146. void qMRMLDisplayNodeWidget::setSelectedVisible(bool visible)
  147. {
  148. Q_D(const qMRMLDisplayNodeWidget);
  149. d->SelectedCheckBox->setVisible(visible);
  150. }
  151. //------------------------------------------------------------------------------
  152. void qMRMLDisplayNodeWidget::setClipping(bool clip)
  153. {
  154. Q_D(qMRMLDisplayNodeWidget);
  155. if (!d->MRMLDisplayNode.GetPointer())
  156. {
  157. return;
  158. }
  159. d->MRMLDisplayNode->SetClipping(clip);
  160. }
  161. //------------------------------------------------------------------------------
  162. bool qMRMLDisplayNodeWidget::clipping()const
  163. {
  164. Q_D(const qMRMLDisplayNodeWidget);
  165. return d->ClippingCheckBox->isChecked();
  166. }
  167. //------------------------------------------------------------------------------
  168. void qMRMLDisplayNodeWidget::setClippingVisible(bool visible)
  169. {
  170. Q_D(qMRMLDisplayNodeWidget);
  171. d->ClippingCheckBox->setVisible(visible);
  172. }
  173. //------------------------------------------------------------------------------
  174. void qMRMLDisplayNodeWidget::setSliceIntersectionVisible(bool visible)
  175. {
  176. Q_D(qMRMLDisplayNodeWidget);
  177. if (!d->MRMLDisplayNode.GetPointer())
  178. {
  179. return;
  180. }
  181. d->MRMLDisplayNode->SetSliceIntersectionVisibility(visible);
  182. }
  183. //------------------------------------------------------------------------------
  184. bool qMRMLDisplayNodeWidget::sliceIntersectionVisible()const
  185. {
  186. Q_D(const qMRMLDisplayNodeWidget);
  187. return d->SliceIntersectionVisibilityCheckBox->isChecked();
  188. }
  189. //------------------------------------------------------------------------------
  190. void qMRMLDisplayNodeWidget::setSliceIntersectionVisibleVisible(bool visible)
  191. {
  192. Q_D(qMRMLDisplayNodeWidget);
  193. d->SliceIntersectionVisibilityCheckBox->setVisible(visible);
  194. }
  195. //------------------------------------------------------------------------------
  196. void qMRMLDisplayNodeWidget::setColor(const QColor& color)
  197. {
  198. Q_D(qMRMLDisplayNodeWidget);
  199. if (!d->MRMLDisplayNode.GetPointer())
  200. {
  201. return;
  202. }
  203. // QColors loose precision in the numbers, don't reset the color if it didn't
  204. // "really" change.
  205. double* oldColor = d->MRMLDisplayNode->GetColor();
  206. if (QColor::fromRgbF(oldColor[0], oldColor[1], oldColor[2]) != color)
  207. {
  208. d->MRMLDisplayNode->SetColor(color.redF(), color.greenF(), color.blueF());
  209. }
  210. }
  211. //------------------------------------------------------------------------------
  212. QColor qMRMLDisplayNodeWidget::color()const
  213. {
  214. Q_D(const qMRMLDisplayNodeWidget);
  215. return d->MaterialPropertyWidget->color();
  216. }
  217. //------------------------------------------------------------------------------
  218. void qMRMLDisplayNodeWidget::setOpacity(double opacity)
  219. {
  220. Q_D(qMRMLDisplayNodeWidget);
  221. if (!d->MRMLDisplayNode.GetPointer())
  222. {
  223. return;
  224. }
  225. d->MRMLDisplayNode->SetOpacity(opacity);
  226. }
  227. //------------------------------------------------------------------------------
  228. double qMRMLDisplayNodeWidget::opacity()const
  229. {
  230. Q_D(const qMRMLDisplayNodeWidget);
  231. return d->MaterialPropertyWidget->opacity();
  232. }
  233. //------------------------------------------------------------------------------
  234. void qMRMLDisplayNodeWidget::setAmbient(double ambient)
  235. {
  236. Q_D(qMRMLDisplayNodeWidget);
  237. if (!d->MRMLDisplayNode.GetPointer())
  238. {
  239. return;
  240. }
  241. d->MRMLDisplayNode->SetAmbient(ambient);
  242. }
  243. //------------------------------------------------------------------------------
  244. double qMRMLDisplayNodeWidget::ambient()const
  245. {
  246. Q_D(const qMRMLDisplayNodeWidget);
  247. return d->MaterialPropertyWidget->ambient();
  248. }
  249. //------------------------------------------------------------------------------
  250. void qMRMLDisplayNodeWidget::setDiffuse(double diffuse)
  251. {
  252. Q_D(qMRMLDisplayNodeWidget);
  253. if (!d->MRMLDisplayNode.GetPointer())
  254. {
  255. return;
  256. }
  257. d->MRMLDisplayNode->SetDiffuse(diffuse);
  258. }
  259. //------------------------------------------------------------------------------
  260. double qMRMLDisplayNodeWidget::diffuse()const
  261. {
  262. Q_D(const qMRMLDisplayNodeWidget);
  263. return d->MaterialPropertyWidget->diffuse();
  264. }
  265. //------------------------------------------------------------------------------
  266. void qMRMLDisplayNodeWidget::setSpecular(double specular)
  267. {
  268. Q_D(qMRMLDisplayNodeWidget);
  269. if (!d->MRMLDisplayNode.GetPointer())
  270. {
  271. return;
  272. }
  273. d->MRMLDisplayNode->SetSpecular(specular);
  274. }
  275. //------------------------------------------------------------------------------
  276. double qMRMLDisplayNodeWidget::specular()const
  277. {
  278. Q_D(const qMRMLDisplayNodeWidget);
  279. return d->MaterialPropertyWidget->specular();
  280. }
  281. //------------------------------------------------------------------------------
  282. void qMRMLDisplayNodeWidget::setSpecularPower(double specularPower)
  283. {
  284. Q_D(qMRMLDisplayNodeWidget);
  285. if (!d->MRMLDisplayNode.GetPointer())
  286. {
  287. return;
  288. }
  289. d->MRMLDisplayNode->SetPower(specularPower);
  290. }
  291. //------------------------------------------------------------------------------
  292. double qMRMLDisplayNodeWidget::specularPower()const
  293. {
  294. Q_D(const qMRMLDisplayNodeWidget);
  295. return d->MaterialPropertyWidget->specularPower();
  296. }
  297. //------------------------------------------------------------------------------
  298. void qMRMLDisplayNodeWidget::setBackfaceCulling(bool backfaceCulling)
  299. {
  300. Q_D(qMRMLDisplayNodeWidget);
  301. if (!d->MRMLDisplayNode.GetPointer())
  302. {
  303. return;
  304. }
  305. d->MRMLDisplayNode->SetBackfaceCulling(backfaceCulling);
  306. }
  307. //------------------------------------------------------------------------------
  308. bool qMRMLDisplayNodeWidget::backfaceCulling()const
  309. {
  310. Q_D(const qMRMLDisplayNodeWidget);
  311. return d->MaterialPropertyWidget->backfaceCulling();
  312. }
  313. //------------------------------------------------------------------------------
  314. void qMRMLDisplayNodeWidget::updateWidgetFromMRML()
  315. {
  316. Q_D(qMRMLDisplayNodeWidget);
  317. this->setEnabled(d->MRMLDisplayNode.GetPointer() != 0);
  318. if (!d->MRMLDisplayNode.GetPointer())
  319. {
  320. return;
  321. }
  322. d->VisibilityCheckBox->setChecked(d->MRMLDisplayNode->GetVisibility());
  323. d->SelectedCheckBox->setEnabled(d->MRMLDisplayNode->GetSelectable());
  324. d->SelectedCheckBox->setChecked(d->MRMLDisplayNode->GetSelected());
  325. d->ClippingCheckBox->setChecked(d->MRMLDisplayNode->GetClipping());
  326. d->SliceIntersectionVisibilityCheckBox->setChecked(
  327. d->MRMLDisplayNode->GetSliceIntersectionVisibility());
  328. d->MaterialPropertyWidget->setColor(
  329. QColor::fromRgbF(d->MRMLDisplayNode->GetColor()[0],
  330. d->MRMLDisplayNode->GetColor()[1],
  331. d->MRMLDisplayNode->GetColor()[2]));
  332. d->MaterialPropertyWidget->setOpacity(d->MRMLDisplayNode->GetOpacity());
  333. d->MaterialPropertyWidget->setAmbient(d->MRMLDisplayNode->GetAmbient());
  334. d->MaterialPropertyWidget->setDiffuse(d->MRMLDisplayNode->GetDiffuse());
  335. d->MaterialPropertyWidget->setSpecular(d->MRMLDisplayNode->GetSpecular());
  336. d->MaterialPropertyWidget->setSpecularPower(d->MRMLDisplayNode->GetPower());
  337. d->MaterialPropertyWidget->setBackfaceCulling(d->MRMLDisplayNode->GetBackfaceCulling());
  338. }