Developer documentation | Axl-2.5.1

axlInspectorToolManager.cpp
Go to the documentation of this file.
1 /* axlInspectorToolManager.cpp ---
2  *
3  * Author: Julien Wintz
4  * Copyright (C) 2008 - Julien Wintz, Inria.
5  * Created: Mon Mar 14 19:39:10 2011 (+0100)
6  * Version: $Id$
7  * Last-Updated: Tue Apr 3 14:19:11 2012 (+0200)
8  * By: Julien Wintz
9  * Update #: 167
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
20 #include "axlInspectorTool.h"
21 
25 #include "axlInspectorSeparator.h"
26 
27 #include <dtkCoreSupport/dtkAbstractProcess.h>
28 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
29 #include <dtkCoreSupport/dtkGlobal.h>
30 #include <dtkCoreSupport/dtkPlugin.h>
31 #include <dtkCoreSupport/dtkPluginManager.h>
32 
33 #include <dtkGuiSupport/dtkTagCloud.h>
34 
35 // /////////////////////////////////////////////////////////////////
36 // axlInspectorToolManagerView
37 // /////////////////////////////////////////////////////////////////
38 
39 axlInspectorToolManagerView::axlInspectorToolManagerView(QWidget *parent) : QTreeWidget(parent)
40 {
41  this->setAlternatingRowColors(false);
42  this->setAttribute(Qt::WA_MacShowFocusRect, false);
43  this->setColumnHidden(1, true);
44  this->setFrameShape(QFrame::NoFrame);
45  this->setHeaderHidden(true);
46 
47  connect(this, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(onItemDoubleClicked(QTreeWidgetItem *, int)));
48 }
49 
51 {
52 
53 }
54 
55 void axlInspectorToolManagerView::onItemDoubleClicked(QTreeWidgetItem *item, int column)
56 {
57  DTK_UNUSED(column);
58 
59  emit clicked(item->text(0), item->text(1));
60 }
61 
62 // /////////////////////////////////////////////////////////////////
63 // axlInspectorToolManagerController helper
64 // /////////////////////////////////////////////////////////////////
65 static bool filterNum3sisPlugins(QString item_name)
66 {
67  QRegExp rx("^num[A-Z]");
68 
69  if(!(rx.indexIn(item_name) == 0))
70  return true;
71  else
72  return false;
73 }
74 
75 // /////////////////////////////////////////////////////////////////
76 // axlInspectorToolManagerController
77 // /////////////////////////////////////////////////////////////////
78 
80 {
81  this->view = NULL;
82  this->cloud = NULL;
83  this->scope = NULL;
84  this->union_mode = false;
85 
86 }
87 
89 {
90 
91 }
92 
94 {
95  this->view = view;
96 }
97 
99 {
100  this->cloud = cloud;
101 
102  connect(this->cloud, SIGNAL(tagClicked(QString)), this, SLOT(setFilter(QString)));
103 }
104 
106 {
107  this->scope = scope;
108 
109  connect(this->scope, SIGNAL(tagSet(QString)), this, SLOT(setFilter(QString)));
110  connect(this->scope, SIGNAL(tagAdded(QString)), this, SLOT(addFilter(QString)));
111  connect(this->scope, SIGNAL(cleared(void)), this, SLOT(clear()));
112  connect(this->scope, SIGNAL(unionMode(bool)), this, SLOT(onUnionMode(bool)));
113 }
114 
116 {
117  this->items << dtkItem(name, "", QStringList());
118 
119  this->update();
120  this->render();
121 }
122 
123 void axlInspectorToolManagerController::addItem(QString name, QString description)
124 {
125  this->items << dtkItem(name, description, QStringList());
126 
127  this->update();
128  this->render();
129 }
130 
131 void axlInspectorToolManagerController::addItem(QString name, QString description, QStringList tags)
132 {
133  this->items << dtkItem(name, description, tags);
134 
135  this->update();
136  this->render();
137 }
138 
139 // void axlInspectorToolManagerController::addItem(QString name, QString description, QStringList tags, QStringList types)
140 // {
141 // this->items << dtkItem(name, description, tags, types);
142 
143 // this->update();
144 // this->render();
145 // }
146 
148 {
149  this->tags.clear();
150 
151  QHash<QString, QStringList> tags;
152 
153  foreach(dtkItem item, this->items)
154  foreach(QString tag, item.tags())
155  tags[tag] << item.name();
156 
157  foreach(QString tag, tags.keys())
158  this->tags << dtkTag(tag, tags[tag].count(), tags[tag]);
159 }
160 
161 static bool axlInspectorToolManagerControllerFilter(QStringList l1, QStringList l2)
162 {
163  QStringList ll1; foreach(QString s1, l1) ll1 << s1.toLower();
164  QStringList ll2; foreach(QString s2, l2) ll2 << s2.toLower();
165 
166  bool pass = true;
167 
168  foreach(QString s, ll1)
169  if(!ll2.contains(s))
170  pass = false;
171 
172  return pass;
173 }
174 
175 void axlInspectorToolManagerController::clear(void)
176 {
177  this->filters.clear();
178 
179  this->render();
180 }
181 
182 
183 void axlInspectorToolManagerController::onUnionMode(bool mode){
184 
185  this->union_mode = !mode;
186  this->render();
187 }
188 
189 static bool intersect(QStringList l1, QStringList l2) {
190  bool pass = true;
191  foreach(QString s, l1) if(!l2.contains(s)) pass = false;
192  return pass;
193 }
194 
195 static bool unite(QStringList l1, QStringList l2) {
196  if(l1.isEmpty()) return true;
197  bool pass = false;
198  foreach(QString s, l1) if(l2.contains(s)) pass = true;
199  return pass;
200 }
201 
203 {
204  this->tags.clear();
205 
206  // if (this->view) {
207  // this->view->clear();
208  // foreach(dtkItem item, this->items)
209  // if(axlInspectorToolManagerControllerFilter(this->filters, item.tags()))
210  // this->view->addTopLevelItem(new QTreeWidgetItem(this->view, QStringList() << item.name() << item.description()));
211 
212  // if (this->cloud) {
213  // this->cloud->clear();
214 
215  // for(int i = 0 ; i < this->tags.count(); i++)
216  // this->cloud->addTag(this->tags.at(i));
217  // this->cloud->render();
218  // }
219 
220  // if (this->scope) {
221  // this->scope->clear();
222  // foreach(QString filter, this->filters)
223  // this->scope->addTag(filter);
224  // this->scope->render();
225  // }
226 
227  QHash<QString, QStringList> tags;
228 
229  foreach(dtkItem item, this->items)
230  foreach(QString tag, item.tags())
231  tags[tag] << item.name();
232 
233  foreach(QString tag, tags.keys())
234  this->tags << dtkTag(tag, tags[tag].count(), tags[tag]);
235 
236 
237  if (this->view) {
238  this->view->clear();
239  foreach(dtkItem item, this->items)
240  if((this->union_mode && unite(this->filters, item.tags())) || (!this->union_mode && intersect(this->filters, item.tags())) || axlInspectorToolManagerControllerFilter(this->filters, item.tags()))
241  this->view->addTopLevelItem(new QTreeWidgetItem(this->view, QStringList() << item.name() << item.description()));
242  }
243 
244  if (this->cloud) {
245  this->cloud->clear();
246  foreach(dtkTag tag, this->tags)
247  this->cloud->addTag(tag);
248  this->cloud->render();
249  }
250 
251  if (this->scope) {
252  this->scope->clear();
253  foreach(QString filter, this->filters){
254  if(filter.at(0).isLower())
255  filter.replace(0,1,filter.at(0).toUpper());
256  this->scope->addTag(filter, tags[filter].count());
257  }
258  this->scope->render();
259  }
260 
261  if (this->scope)
262  this->scope->setTags(tags.keys());
263 }
264 
265 void axlInspectorToolManagerController::addFilter(QString filter)
266 {
267  this->filters << filter;
268 
269  this->render();
270 }
271 
272 void axlInspectorToolManagerController::setFilter(QString filter)
273 {
274  this->filters.clear();
275  this->filters << filter;
276 
277  this->render();
278 }
279 
280 // /////////////////////////////////////////////////////////////////
281 // axlInspectorToolManager
282 // /////////////////////////////////////////////////////////////////
283 
284 static QString axlInspectorToolManager_cloud_stylesheet =
285  "body { color: rgb(230, 230, 230); background-color: rgb(230, 230, 230); }"
286  "a:link { color: rgb(70, 70, 70); text-decoration:none; }"
287  "a:active { color: rgb(70, 70, 70); text-decoration:none; }"
288  "a:hover { color: rgb(90, 90, 90); text-decoration:none; }";
289 
290 static QString axlInspectorToolManager_scope_stylesheet =
291  "body { background-color: rgb(230, 230, 230); }"
292  "input.text { background-color: rgb(230, 230, 230); border: 1px solid rgb(100, 100, 100); }";
293 
294 axlInspectorToolManager::axlInspectorToolManager(QWidget *parent) : QFrame(parent), d(new axlInspectorToolManagerPrivate)
295 {
296  d->cloud = new dtkTagCloud(this);
297  d->cloud->setSortingType(dtkTagCloud::Alpha);
298  d->cloud->setSortingOrder(dtkTagCloud::Asc);
299  d->cloud->setFontSize(18);
300  d->cloud->setFontRange(10);
301  d->cloud->setMinimumHeight(100);
302  d->cloud->setMinimumWidth(300);
303  d->cloud->setMaximumHeight(130);
304  d->cloud->setStyleSheet(axlInspectorToolManager_cloud_stylesheet);
305  d->cloud->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
306 
307  d->scope = new dtkTagScope(this);
308  d->scope->setStyleSheet(axlInspectorToolManager_scope_stylesheet);
309 
310  d->view = new axlInspectorToolManagerView(this);
311  d->view->setMinimumHeight(25);
312  d->view->setMinimumWidth(300);
313  d->view->setMaximumHeight(400);
314  d->view->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
315  d->view->setSortingEnabled(1);
316  d->view->header()->setSortIndicator(0, Qt::AscendingOrder);
317 
318  d->inspector_tool = new axlInspectorTool(this);
319  d->inspector_tool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
320 
321  d->controller = new axlInspectorToolManagerController(this);
322  d->controller->attach(d->view);
323  d->controller->attach(d->scope);
324  d->controller->attach(d->cloud);
325 
326  QStringList interfaceList;
327 
328  foreach(QString interface_name, dtkAbstractProcessFactory::instance()->interfaces())
329  {
330  if(!interfaceList.contains(interface_name) )
331  {
332  interfaceList << interface_name;
333 
334  foreach(QString implementation, dtkAbstractProcessFactory::instance()->implementations(interface_name))
335  {
336  if(filterNum3sisPlugins(implementation))
337  d->controller->addItem(implementation, interface_name, QStringList() << interface_name.remove("axlAbstract"));
338  }
339  }
340  }
341 
342  // registered of atomics data
343  d->controller->addItem("axlCircleArcCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
344  d->controller->addItem("axlConeCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
345  d->controller->addItem("axlCylinderCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
346  d->controller->addItem("axlDataDynamicCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
347  d->controller->addItem("axlEllipsoidCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
348  d->controller->addItem("axlLineCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
349  d->controller->addItem("axlPlaneCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
350  d->controller->addItem("axlPointCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
351  //d->controller->addItem("axlCreatePointSet", "axlAbstractCreator", QStringList() << QString("Creator"));
352  d->controller->addItem("axlSphereCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
353  d->controller->addItem("axlTorusCreator", "axlAbstractCreator", QStringList() << QString("Creator"));
354 
355 
356 
357  //d->controller->addItem("axlCreateBSplineCurve", "axlAbstractCreator", QStringList() << QString("Creator"));
358  //d->controller->addItem("axlCreateBSplineSurface", "axlAbstractCreator", QStringList() << QString("Creator"));
359 
360  //d->controller->addItem("axlProcessSpatialDistanceField", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Spatial" << "Distance");
361  //d->controller->addItem("axlProcessZScalarField", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "ZScalar");
362  //d->controller->addItem("axlProcessTangentVectorField", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Tangent" << "Vector");
363  d->controller->addItem("axlBarycenterProcess", "axlAbstractProcess", QStringList() << "Barycenter");
364  d->controller->addItem("axlIntersection", "axlAbstractProcess", QStringList() << "Intersection");
365  d->controller->addItem("axlProcessProjection", "axlAbstractProcess", QStringList() << "Projection");
366 
367  d->controller->addItem("axlFieldSpatialCoordinatesCreator", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Creator");
368  d->controller->addItem("axlFieldSpatialPointDistanceCreator", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Spatial" << "Distance" << "Creator");
369  d->controller->addItem("axlFieldParametricNormalVectorCreator", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Parametric"<< "Creator");
370  d->controller->addItem("axlFieldParametricCurveTangentVectorCreator", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Parametric"<< "Creator");
371  d->controller->addItem("axlFieldParametricSurfaceTangentVectorCreator", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Parametric"<< "Creator");
372  d->controller->addItem("axlFieldParametricVolumeTangentVectorCreator", "axlAbstractProcess", QStringList() << "FieldGenerator" << "Field" << "Generator" << "Parametric"<< "Creator");
373 
374 
375 
376  QVBoxLayout *layout = new QVBoxLayout(this);
377  layout->setAlignment(Qt::AlignTop);
378  layout->setContentsMargins(0, 0, 0, 0);
379  layout->setSpacing(0);
380 
381  layout->addWidget(d->cloud);
382  layout->addWidget(new axlInspectorSeparator(this));
383  layout->addWidget(d->scope);
384  layout->addWidget(new axlInspectorSeparator(this));
385  layout->addWidget(d->view);
386  layout->addWidget(new axlInspectorSeparator(this));
387 
388  layout->addWidget(d->inspector_tool);
389 
390 
391  connect(d->view, SIGNAL(clicked(QString, QString)), this, SIGNAL(selected(QString, QString)));
392  connect(d->inspector_tool, SIGNAL(update()), this, SIGNAL(update()));
393  connect(d->inspector_tool, SIGNAL(dataInserted(axlAbstractData *)), this, SIGNAL(dataInserted(axlAbstractData *)));
394  connect(d->inspector_tool, SIGNAL(dataSetToRemove(QList<dtkAbstractData*>)), this, SIGNAL(dataSetToRemove(QList<dtkAbstractData*>)));
395  connect(d->inspector_tool, SIGNAL(dataChanged(dtkAbstractData *)), this, SIGNAL(dataChanged(dtkAbstractData *)));
396  connect(d->inspector_tool, SIGNAL(dataChangedByControlPoints(dtkAbstractData *)), this, SIGNAL(dataChangedByControlPoints(dtkAbstractData *)));
397  // connect(d->inspector_tool, SIGNAL(dataChangedByShader(dtkAbstractData*,QString)), this, SIGNAL(dataChangedByShader(dtkAbstractData * ,QString)));
398  // connect(d->inspector_tool, SIGNAL(dataChangedByShaderFromString(dtkAbstractData*,QString)), this, SIGNAL(dataChangedByShaderFromString(dtkAbstractData * ,QString)));
399  connect(d->inspector_tool, SIGNAL(fieldsCreatedOnData(QList<axlAbstractData*>, QString)), this, SIGNAL(fieldsCreatedOnData(QList<axlAbstractData*>, QString)));
400  // connect(d->inspector_tool, SIGNAL(doubleInputInserted(QList<axlDouble*>)), this, SIGNAL(doubleInputInserted(QList<axlDouble*>)));
401  connect(d->inspector_tool, SIGNAL(modifiedProperty(dtkAbstractData*,int)), this, SIGNAL(modifiedProperty(dtkAbstractData*,int)));
402  connect(this, SIGNAL(selected(QString,QString)), d->inspector_tool, SLOT(onProcessSelected(QString,QString)));
403 }
404 
406 {
407  delete d;
408 
409  d = NULL;
410 }
411 
413 {
414  return QSize(300, 1000);
415 }
416 
418 {
419  d->ObjectController = controller;
420  d->inspector_tool->setController(controller);
421 }
422 
424 {
425  d->inspector_tool->setView(view);
426 }
axlInspectorToolManagerView(QWidget *parent=0)
void modifiedProperty(dtkAbstractData *, int)
void clicked(QString implementation, QString interface_name)
void setView(axlAbstractView *view)
void dataChangedByControlPoints(dtkAbstractData *data)
axlInspectorToolManager(QWidget *parent=0)
void fieldsCreatedOnData(QList< axlAbstractData * > dataList, QString fieldName)
void dataInserted(axlAbstractData *data)
void dataChanged(dtkAbstractData *data)
void attach(axlInspectorToolManagerView *view)
void selected(QString, QString)
void onItemDoubleClicked(QTreeWidgetItem *item, int column)
void setController(axlInspectorObjectController *controller)
void dataSetToRemove(QList< dtkAbstractData * >)
Class axlAbstractData defines an API for all type of axel data.