Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkNodeSelectionDialog.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 
14 
15 #include <berryQtStyleManager.h>
16 
21 
22 QmitkNodeSelectionDialog::QmitkNodeSelectionDialog(QWidget* parent, QString title, QString hint) : QDialog(parent),
23  m_NodePredicate(nullptr), m_SelectOnlyVisibleNodes(false), m_SelectedNodes(NodeList()), m_SelectionMode(QAbstractItemView::SingleSelection)
24 {
25  m_Controls.setupUi(this);
26 
27  m_CheckFunction = [](const NodeList &) { return ""; };
28 
30  auto visibleProviders = mitk::GetVisibleDataStorageInspectors();
31  auto preferredID = mitk::GetPreferredDataStorageInspector();
32 
33  if (visibleProviders.empty())
34  {
35  MITK_DEBUG << "No presets for visible node selection inspectors available. Use fallback (show all available inspectors)";
36  unsigned int order = 0;
37  for (auto proIter : providers)
38  {
39  visibleProviders.insert(std::make_pair(order, proIter.first));
40  ++order;
41  }
42  }
43 
44  int preferredIndex = 0;
45  bool preferredFound = false;
46  for (auto proIter : visibleProviders)
47  {
48  auto finding = providers.find(proIter.second);
49  if (finding != providers.end())
50  {
51  if (finding->second->GetInspectorID() != QmitkDataStorageFavoriteNodesInspector::INSPECTOR_ID() && finding->second->GetInspectorID() != QmitkDataStorageSelectionHistoryInspector::INSPECTOR_ID())
52  {
53  auto provider = finding->second;
54  this->AddPanel(provider, preferredID, preferredFound, preferredIndex);
55  }
56  }
57  else
58  {
59  MITK_DEBUG << "No provider registered for inspector that is defined as visible in the preferences. Illegal inspector ID: " << proIter.second;
60  }
61  }
62 
64  {
66  if (favoritesPorvider != nullptr)
67  {
68  this->AddPanel(favoritesPorvider, preferredID, preferredFound, preferredIndex);
69  }
70  }
71 
73  {
75  if (historyPorvider != nullptr)
76  {
77  this->AddPanel(historyPorvider, preferredID, preferredFound, preferredIndex);
78  }
79  }
80 
81  m_Controls.tabWidget->setCurrentIndex(preferredIndex);
82  this->setWindowTitle(title);
83  this->setToolTip(hint);
84 
85  m_Controls.hint->setText(hint);
86  m_Controls.hint->setVisible(!hint.isEmpty());
87  if(hint.isEmpty())
88  {
89  m_Controls.layoutHint->setContentsMargins(0, 0, 0, 0);
90  }
91  else
92  {
93  m_Controls.layoutHint->setContentsMargins(6, 6, 6, 6);
94  }
95 
96  this->SetErrorText("");
97 
98  m_Controls.btnAddToFav->setIcon(berry::QtStyleManager::ThemeIcon(QStringLiteral(":/Qmitk/favorite_add.svg")));
99 
100  connect(m_Controls.btnAddToFav, &QPushButton::clicked, this, &QmitkNodeSelectionDialog::OnFavoriteNodesButtonClicked);
101  connect(m_Controls.buttonBox, &QDialogButtonBox::accepted, this, &QmitkNodeSelectionDialog::OnOK);
102  connect(m_Controls.buttonBox, &QDialogButtonBox::rejected, this, &QmitkNodeSelectionDialog::OnCancel);
103 }
104 
106 {
107  if (m_DataStorage != dataStorage)
108  {
109  m_DataStorage = dataStorage;
110 
111  if (!m_DataStorage.IsExpired())
112  {
113  for (auto panel : m_Panels)
114  {
115  panel->SetDataStorage(dataStorage);
116  }
117  }
118  }
119 }
120 
122 {
123  if (m_NodePredicate != nodePredicate)
124  {
125  m_NodePredicate = nodePredicate;
126 
127  for (auto panel : m_Panels)
128  {
129  panel->SetNodePredicate(m_NodePredicate);
130  }
131  }
132 }
133 
135 {
136  return m_NodePredicate;
137 }
138 
140 {
141  return m_SelectedNodes;
142 }
143 
145 {
146  m_CheckFunction = checkFunction;
147  auto checkResponse = m_CheckFunction(m_SelectedNodes);
148 
149  SetErrorText(checkResponse);
150 
151  m_Controls.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(checkResponse.empty());
152 }
153 
154 void QmitkNodeSelectionDialog::SetErrorText(const std::string& checkResponse)
155 {
156  m_Controls.error->setText(QString::fromStdString(checkResponse));
157  m_Controls.error->setVisible(!checkResponse.empty());
158  if (checkResponse.empty())
159  {
160  m_Controls.layoutError->setContentsMargins(0, 0, 0, 0);
161  }
162  else
163  {
164  m_Controls.layoutError->setContentsMargins(6, 6, 6, 6);
165  }
166 }
167 
169 {
171 }
172 
174 {
175  m_SelectionMode = mode;
176  for (auto panel : m_Panels)
177  {
178  panel->SetSelectionMode(mode);
179  }
180 }
181 
183 {
184  return m_SelectionMode;
185 }
186 
188 {
189  if (m_SelectOnlyVisibleNodes != selectOnlyVisibleNodes)
190  {
191  m_SelectOnlyVisibleNodes = selectOnlyVisibleNodes;
192 
193  for (auto panel : m_Panels)
194  {
195  panel->SetSelectOnlyVisibleNodes(m_SelectOnlyVisibleNodes);
196  }
197  }
198 }
199 
201 {
202  m_SelectedNodes = selectedNodes;
203  auto checkResponse = m_CheckFunction(m_SelectedNodes);
204 
205  SetErrorText(checkResponse);
206 
207  m_Controls.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(checkResponse.empty());
208 
209  for (auto panel : m_Panels)
210  {
211  panel->SetCurrentSelection(selectedNodes);
212  }
213 }
214 
216 {
217  SetCurrentSelection(selectedNodes);
218  emit CurrentSelectionChanged(selectedNodes);
219 }
220 
222 {
223  for (auto node : m_SelectedNodes)
224  {
225  node->SetBoolProperty("org.mitk.selection.favorite", true);
226  }
227 }
228 
230 {
231  for (auto node : m_SelectedNodes)
232  {
234  }
235 
236  this->accept();
237 }
238 
240 {
241  this->reject();
242 }
243 
244 void QmitkNodeSelectionDialog::AddPanel(const mitk::IDataStorageInspectorProvider * provider, const mitk::IDataStorageInspectorProvider::InspectorIDType& preferredID, bool &preferredFound, int &preferredIndex)
245 {
246  auto inspector = provider->CreateInspector();
247  QString name = QString::fromStdString(provider->GetInspectorDisplayName());
248  QString desc = QString::fromStdString(provider->GetInspectorDescription());
249 
250  inspector->setParent(this);
251  inspector->SetSelectionMode(m_SelectionMode);
252 
253  auto tabPanel = new QWidget();
254  tabPanel->setObjectName(QString("tab_") + name);
255  tabPanel->setToolTip(desc);
256 
257  auto verticalLayout = new QVBoxLayout(tabPanel);
258  verticalLayout->setSpacing(0);
259  verticalLayout->setContentsMargins(0, 0, 0, 0);
260  verticalLayout->addWidget(inspector);
261 
262  auto panelPos = m_Controls.tabWidget->insertTab(m_Controls.tabWidget->count(), tabPanel, name);
263 
264  auto icon = provider->GetInspectorIcon();
265  if (!icon.isNull())
266  {
267  m_Controls.tabWidget->setTabIcon(panelPos, icon);
268  }
269 
270  m_Panels.push_back(inspector);
272 
273  preferredFound = preferredFound || provider->GetInspectorID() == preferredID;
274  if (!preferredFound)
275  {
276  ++preferredIndex;
277  }
278 }
QmitkNodeSelectionDialog(QWidget *parent=nullptr, QString caption="", QString hint="")
QList< mitk::DataNode::Pointer > NodeList
Data management class that handles &#39;was created by&#39; relations.
mitk::NodePredicateBase::ConstPointer m_NodePredicate
const mitk::NodePredicateBase * GetNodePredicate() const
QAbstractItemView::SelectionMode SelectionMode
static QIcon ThemeIcon(const QByteArray &originalSVG)
#define MITK_DEBUG
Definition: mitkLogMacros.h:22
void SetSelectionCheckFunction(const SelectionCheckFunctionType &checkFunction)
A selection check function can be set. If set the dialog uses this function to check the made/set sel...
mitk::WeakPointer< mitk::DataStorage > m_DataStorage
virtual QmitkAbstractDataStorageInspector * CreateInspector() const =0
returns an inspector instance represented by the provider.
void SetSelectOnlyVisibleNodes(bool selectOnlyVisibleNodes)
static mitk::IDataStorageInspectorProvider * GetProvider(const IDType &id)
void AddPanel(const mitk::IDataStorageInspectorProvider *provider, const mitk::IDataStorageInspectorProvider::InspectorIDType &preferredID, bool &preferredFound, int &preferredIndex)
virtual QIcon GetInspectorIcon() const =0
The common interface for all DataStorage inspector providers.
void CurrentSelectionChanged(NodeList nodes)
A signal that will be emitted if the selected node has changed.
void SetSelectionMode(SelectionMode mode)
virtual std::string GetInspectorDisplayName() const =0
VisibleDataStorageInspectorMapType GetVisibleDataStorageInspectors()
DataStorageInspectorIDType GetPreferredDataStorageInspector()
bool IsExpired() const noexcept
SelectionCheckFunctionType m_CheckFunction
void SetDataStorage(mitk::DataStorage *dataStorage)
Sets the data storage that will be used /monitored by widget.
Ui_QmitkNodeSelectionDialog m_Controls
void OnSelectionChanged(NodeList selectedNodes)
void SetErrorText(const std::string &checkResponse)
virtual std::string GetInspectorDescription() const =0
virtual void SetSelectionMode(SelectionMode mode)=0
virtual InspectorIDType GetInspectorID() const =0
Interface for evaluation conditions used in the DataStorage class GetSubset() method.
virtual void SetNodePredicate(const mitk::NodePredicateBase *nodePredicate)
Sets the node predicate and updates the widget, according to the node predicate.
void SetCurrentSelection(NodeList selectedNodes)
SelectionMode GetSelectionMode() const
std::function< std::string(const NodeList &)> SelectionCheckFunctionType
Helper function that is used to check the given selection for consistency. Returning an empty string ...
void CurrentSelectionChanged(NodeList nodes)