Developer documentation | Axl-2.5.1

axlInspectorObjectPointSet.cpp
Go to the documentation of this file.
1 /* axlInspectorObjectPointSet.cpp ---
2  *
3  * Author: Meriadeg Perrinel
4  * Copyright (C) 2008 - Meriadeg Perrinel, Inria.
5  * Created: Fri Mar 18 11:19:52 2011 (+0100)
6  * Version: $Id$
7  * Last-Updated: Tue Apr 3 14:20:40 2012 (+0200)
8  * By: Julien Wintz
9  * Update #: 60
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
21 
22 #include <axlCore/axlPointSet.h>
24 
25 #include <dtkGuiSupport/dtkColorButton.h>
26 #include <dtkGuiSupport/dtkSplitter.h>
27 
28 #include <QtGui>
29 
30 class axlInspectorObjectPointSetPrivate
31 {
32 public:
33  axlPointSet *pointSet;
34  QSlider *sliderSize;
35 
36  dtkColorButton *colorButton;
37  QComboBox *comboBoxShader;
38 
39  QCheckBox *checkBoxShader;
40  QLineEdit *lineEditShader;
41  QPushButton *buttonShader;
42 
43  QSlider *sliderOpacity;
44 };
45 
46 axlInspectorObjectPointSet::axlInspectorObjectPointSet(QWidget *parent) : QFrame(parent), d(new axlInspectorObjectPointSetPrivate)
47 {
48  d->sliderSize = NULL;
49 
50  d->colorButton = NULL;
51  d->comboBoxShader = NULL;
52 
53  d->checkBoxShader = NULL;
54  d->lineEditShader = NULL;
55  d->buttonShader = NULL;
56 
57  d->sliderOpacity = NULL;
58 }
59 
61 {
62  delete d;
63 
64  d = NULL;
65 }
66 
68 {
69  return QSize(300, 300);
70 }
71 
73  d->pointSet = pointSet;
74  initWidget();
75 }
76 
77 void axlInspectorObjectPointSet::initWidget()
78 {
79  QVBoxLayout *layoutTop = new QVBoxLayout(this);
80  layoutTop->addWidget(new QLabel("axlInspectorObjectPointSet", this));
81 
83 
84  layoutTop->addWidget(new QLabel("NumberOfPoint : " +QString::number(d->pointSet->numberOfPoints()), this));
85 
87 
88  d->sliderSize = new QSlider(Qt::Horizontal, this);
89 
90  QHBoxLayout *layoutSize = new QHBoxLayout;
91  layoutSize->addWidget(new QLabel("Size",this));
92  layoutSize->addWidget(d->sliderSize);
93  d->sliderSize->setMinimum(-300);
94  d->sliderSize->setMaximum(900);
95  d->sliderSize->setValue(initSizeValue());
96 
98  QHBoxLayout *layoutColorButton = new QHBoxLayout;
99  if(d->pointSet->isUniqueColor())
100  {
101  d->colorButton = new dtkColorButton(this);
102 
103  layoutColorButton->addWidget(new QLabel("Color",this));
104  layoutColorButton->addWidget(d->colorButton);
105  d->colorButton->setColor(this->initColorValue());
106  }
108 
109  d->sliderOpacity = new QSlider(Qt::Horizontal, this);
110 
111  QHBoxLayout *layoutOpacity = new QHBoxLayout;
112  layoutOpacity->addWidget(new QLabel("Opacity",this));
113  layoutOpacity->addWidget(d->sliderOpacity);
114  d->sliderOpacity->setMaximum(100);
115  d->sliderOpacity->setValue(initOpacityValue());
116 
118  d->comboBoxShader = new QComboBox(this);
119  d->comboBoxShader->setInsertPolicy(QComboBox::InsertAlphabetically);
120 
121  d->checkBoxShader = new QCheckBox(this);
122  d->lineEditShader = new QLineEdit(this);
123  d->buttonShader = new QPushButton(this);
124  d->buttonShader->setText("open");
125 
126  d->lineEditShader->setText(this->initShaderValue());
127  this->initComboBoxShaderValue();
128 
129  if(d->lineEditShader->text().isEmpty())
130  {
131  d->lineEditShader->setEnabled(false);
132  d->buttonShader->setEnabled(false);
133  d->comboBoxShader->setEnabled(false);
134  }
135  else
136  d->checkBoxShader->setChecked(true);
137 
138 
140 
141  QVBoxLayout *layoutShader = new QVBoxLayout;
142  QHBoxLayout *layoutShader1 = new QHBoxLayout;
143 
144  QLabel *labelShader = new QLabel("Shader",this);
145  layoutShader1->addWidget(labelShader);
146  layoutShader1->addWidget(d->checkBoxShader);
147  layoutShader1->addWidget(d->comboBoxShader);
148  layoutShader1->addWidget(d->buttonShader);
149 
150  layoutShader1->setStretchFactor(labelShader, 2);
151  layoutShader1->setStretchFactor(d->checkBoxShader, 1);
152  layoutShader1->setStretchFactor(d->comboBoxShader, 4);
153  layoutShader1->setStretchFactor(d->buttonShader, 3);
154 
155  layoutShader->addLayout(layoutShader1);
156  layoutShader->addWidget(d->lineEditShader);
157 
158  layoutTop->addLayout(layoutSize);
159 
160  if(d->pointSet->isUniqueColor())
161  layoutTop->addLayout(layoutColorButton);
162  layoutTop->addLayout(layoutOpacity);
163  layoutTop->addLayout(layoutShader);
164 
165  QWidget *top = new QWidget(this);
166  top->setMaximumWidth(295);
167 
168  top->setLayout(layoutTop);
169 
170  // dtkSplitter *splitter = new dtkSplitter(this, true);
171  // splitter->setOrientation(Qt::Vertical);
172  // splitter->addWidget(top);
173 
174  //QVBoxLayout *layout = new QVBoxLayout(this);
175  //layout->setContentsMargins(0, 0, 0, 0);
176  //layout->setSpacing(0);
177  //layout->addWidget(splitter);
178 
179  connect(d->sliderSize, SIGNAL(valueChanged(int)), this, SLOT(onSizeChanged(int)));
180 
181 
182  if(d->pointSet->isUniqueColor())
183  connect(d->colorButton, SIGNAL(colorChanged(QColor)), this, SLOT(onColorChanged(QColor)));
184 
185  connect(d->sliderOpacity, SIGNAL(valueChanged(int)), this, SLOT(onOpacityChanged(int)));
186 
187  connect(d->comboBoxShader, SIGNAL(currentIndexChanged(QString)), this, SLOT(onLineEditShaderChanged(QString)));
188  connect(d->checkBoxShader, SIGNAL(clicked(bool)), this, SLOT(onShaderStateChanged(bool)));
189  connect(d->buttonShader, SIGNAL(clicked()), this, SLOT(openShader()));
190  connect(d->lineEditShader, SIGNAL(textChanged(QString)), this, SLOT(onShaderChanged(QString)));
191 
192 }
193 
194 
195 int axlInspectorObjectPointSet::initSizeValue(void)
196 {
197  double initSize = 100.0 * (log(d->pointSet->size()/0.125))/log(2);
198 
199  return initSize;
200 }
201 
202 void axlInspectorObjectPointSet::initComboBoxShaderValue(void)
203 {
204  if(d->comboBoxShader) {
205 
206  QStringList filters;
207  filters << "*.vs";
208 
209  // First add item of axlShader.qrc, then find shader from shader path
210  QDir dirShader( ":axlShader/shader/");
211  dirShader.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
212 
213  dirShader.setNameFilters(filters);
214 
215  QFileInfoList list = dirShader.entryInfoList();
216  // for (int i = 0; i < list.size(); ++i) {
217  // d->comboBoxShader->addItem(list.at(i).fileName());
218  // }
219 
220  QSettings settings("inria", "dtk");
221  QString defaultPath;
222  settings.beginGroup("shader");
223  QString defaultPathShader = settings.value("path", defaultPath).toString();
224  defaultPathShader.append("/");
225 
226  QDir defaultDirShader(defaultPathShader);
227  defaultDirShader.setNameFilters(filters);
228  QFileInfoList list2 = defaultDirShader.entryInfoList();
229 
230  list.append(list2);
231 
232  QStringList items;
233 
234  for (int i = 0; i < list.size(); ++i) {
235  if(!items.contains(list.at(i).fileName()))
236  items << list.at(i).fileName();
237  }
238 
239  qSort(items.begin(), items.end(), caseInsensitiveLessThan);
240  int indInitShader = -1;
241  int indCurrentShader = -1;
242 
243  foreach(QString item, items) {
244  indCurrentShader++;
245  d->comboBoxShader->addItem(item);
246 
247  QFileInfo currentFileInfo(d->lineEditShader->text());
248 
249  if(currentFileInfo.exists())
250  {
251  if(item == currentFileInfo.fileName())
252  indInitShader =indCurrentShader;
253  }
254  }
255 
256  //init the value from the lineEditShader.
257  if(indInitShader != -1)
258  d->comboBoxShader->setCurrentIndex(indInitShader);
259  }
260 }
261 
263 {
264  // First add item of axlShader.qrc, then find shader from shader path
265  QDir dirShader( ":axlShader/shader/");
266  dirShader.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
267 
268  QFileInfo currentFile(dirShader, shader);
269  if(!currentFile.exists())
270  {
271  QSettings settings("inria", "dtk");
272  QString defaultPath;
273  settings.beginGroup("shader");
274  QString defaultPathShader = settings.value("path", defaultPath).toString();
275  defaultPathShader.append("/");
276 
277  QDir defaultDirShader(defaultPathShader);
278  currentFile = QFileInfo(defaultDirShader, shader);
279 
280  }
281 
282  d->lineEditShader->setText(currentFile.absoluteFilePath());
283 }
284 
285 QString axlInspectorObjectPointSet::initShaderValue(void)
286 {
287  return d->pointSet->shader();
288 }
289 
290 
291 QColor axlInspectorObjectPointSet::initColorValue(void)
292 {
293  return d->pointSet->color();
294 }
295 
296 
297 int axlInspectorObjectPointSet::initOpacityValue(void)
298 {
299  double initOpacity = 0.0;
300  double opacity = d->pointSet->opacity();
301  if(opacity > initOpacity)
302  initOpacity = opacity;
303 
304  return 100 * (1.0 - initOpacity);
305 }
306 
308 {
309  if(d->lineEditShader->isEnabled())
310  {
311  QString fileToOpen;
312  fileToOpen = QFileDialog::getOpenFileName(this, tr("Open shader"), "", tr("vs file (*.vs)"));
313  d->lineEditShader->setText(fileToOpen);
314  }
315 }
316 
318 {
319  d->pointSet->setShader(shader);
320 
321  emit dataChangedByShader(d->pointSet, d->lineEditShader->text());
322 
323  emit update();
324 }
325 
327 {
328  if(isShader)
329  {
330  d->comboBoxShader->setEnabled(true);
331  d->lineEditShader->setEnabled(true);
332  d->buttonShader->setEnabled(true);
333  }
334  else
335  {
336  d->comboBoxShader->setEnabled(false);
337  d->lineEditShader->setEnabled(false);
338  d->buttonShader->setEnabled(false);
339  }
340 }
341 
343 {
344  QVariant variant = d->pointSet->QObject::property("color");
345  if(variant.isValid())
346  {
347  d->pointSet->setColor(color);
348 
349  emit dataChangedByColor(d->pointSet, color.redF(), color.greenF(), color.blueF());
350  }
351 
352  emit update();
353 }
354 
355 
357 {
358  double size_d = pow(2.0, size/100.0 - 3.0); // range from 0.00 to 10.00
359 
360  QVariant variant = d->pointSet->QObject::property("size");
361  if(variant.isValid())
362  {
363  d->pointSet->setSize(size_d);
364 
365  emit dataChangedBySize(d->pointSet, size_d);
366  }
367 
368  emit update();
369 }
370 
372 {
373  double opacity_d = 1.0 - 0.01 * opacity; // range from 0.00 to 1.00
374 
375  QVariant variant = d->pointSet->QObject::property("opacity");
376  if(variant.isValid())
377  {
378  d->pointSet->setOpacity(opacity_d);
379 
380  emit dataChangedByOpacity(d->pointSet, opacity_d);
381  }
382 
383  emit update();
384 }
void colorChanged(QColor color, dtkAbstractData *data)
bool caseInsensitiveLessThan(const QString &s1, const QString &s2)
void dataChangedByOpacity(dtkAbstractData *data, double opacity)
void dataChangedBySize(dtkAbstractData *data, double size)
void dataChangedByColor(dtkAbstractData *data, double red, double green, double blue)
void dataChangedByShader(dtkAbstractData *data, QString isophoteShaderXml)