Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkColoredNodeDescriptor.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
15 #include <QFile>
16 
17 static QString ConvertRGBTripletToHexColorCode(float rgbTriplet[3])
18 {
19  return QString("#%1%2%3")
20  .arg(std::max(0, std::min(255, static_cast<int>(rgbTriplet[0] * 255))), 2, 16, QLatin1Char('0'))
21  .arg(std::max(0, std::min(255, static_cast<int>(rgbTriplet[1] * 255))), 2, 16, QLatin1Char('0'))
22  .arg(std::max(0, std::min(255, static_cast<int>(rgbTriplet[2] * 255))), 2, 16, QLatin1Char('0'));
23 }
24 
25 struct QmitkColoredNodeDescriptor::Impl
26 {
27  void CreateCachedIcon(const QString &hexColorCode);
28 
29  QHash<QString, QIcon> IconCache;
30  QString IconTemplate;
31 };
32 
33 void QmitkColoredNodeDescriptor::Impl::CreateCachedIcon(const QString &hexColorCode)
34 {
35  auto icon = this->IconTemplate;
36  icon.replace(QStringLiteral("#00ff00"), hexColorCode, Qt::CaseInsensitive);
37  this->IconCache[hexColorCode] = QPixmap::fromImage(QImage::fromData(icon.toLatin1()));
38 }
39 
40 QmitkColoredNodeDescriptor::QmitkColoredNodeDescriptor(const QString &className, const QString &pathToIcon, mitk::NodePredicateBase *predicate, QObject *parent)
41  : QmitkNodeDescriptor(className, QStringLiteral(""), predicate, parent),
42  m_Impl(new Impl)
43 {
44  QFile iconTemplateFile(pathToIcon);
45 
46  if (iconTemplateFile.open(QIODevice::ReadOnly))
47  m_Impl->IconTemplate = iconTemplateFile.readAll();
48 }
49 
51 {
52  delete m_Impl;
53 }
54 
56 {
57  if (nullptr == node)
58  return QIcon();
59 
60  float rgbTriplet[] = { 1.0f, 1.0f, 1.0f };
61  node->GetColor(rgbTriplet);
62 
63  auto hexColorCode = ConvertRGBTripletToHexColorCode(rgbTriplet);
64 
65  if (!m_Impl->IconCache.contains(hexColorCode))
66  m_Impl->CreateCachedIcon(hexColorCode);
67 
68  return m_Impl->IconCache[hexColorCode];
69 }
QmitkColoredNodeDescriptor(const QString &className, const QString &pathToIcon, mitk::NodePredicateBase *predicate, QObject *parent=nullptr)
Decorator class for mitk::DataNode.
static QString ConvertRGBTripletToHexColorCode(float rgbTriplet[3])
bool GetColor(float rgb[3], const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="color") const
Convenience access method for color properties (instances of ColorProperty)
static T max(T x, T y)
Definition: svm.cpp:56
static T min(T x, T y)
Definition: svm.cpp:53
Interface for evaluation conditions used in the DataStorage class GetSubset() method.
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57
QIcon GetIcon(const mitk::DataNode *node) const override