Crossfire Server, Trunk
CREPrePostPanel.cpp
Go to the documentation of this file.
1 #include <QtWidgets>
2 #include "CREPrePostPanel.h"
3 #include "QuestConditionScript.h"
4 #include "assets.h"
5 #include "AssetsManager.h"
6 #include "CREPixmap.h"
7 extern "C" {
8 #include "quest.h"
9 }
10 
12 {
13  QGridLayout* layout = new QGridLayout(this);
14 
15  mySubItems = new QListWidget(this);
16  mySubItems->setViewMode(QListView::ListMode);
17  layout->addWidget(mySubItems, 0, 0, 1, 2);
18 
19  QPushButton* addSubItem = new QPushButton(tr("add"), this);
20  connect(addSubItem, SIGNAL(clicked(bool)), this, SLOT(onAddSubItem(bool)));
21  layout->addWidget(addSubItem, 1, 0);
22 
23  QPushButton* delSubItem = new QPushButton(tr("delete"), this);
24  connect(delSubItem, SIGNAL(clicked(bool)), this, SLOT(onDeleteSubItem(bool)));
25  layout->addWidget(delSubItem, 1, 1);
26 
27  connect(mySubItems->itemDelegate(), SIGNAL(closeEditor(QWidget*, QAbstractItemDelegate::EndEditHint)), this, SLOT(endEdition(QWidget*, QAbstractItemDelegate::EndEditHint)));
28 }
29 
30 void CRESubItemList::addItem(const QString& item)
31 {
32  QListWidgetItem* wi = new QListWidgetItem(item);
33  wi->setFlags(wi->flags() | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
34  mySubItems->addItem(wi);
35 }
36 
37 void CRESubItemList::setData(const QStringList& data)
38 {
39  QStringList d(data);
40  d.takeFirst();
41  mySubItems->clear();
42  for (const QString& item : d)
43  addItem(item);
44 }
45 
46 QStringList CRESubItemList::data() const
47 {
48  QStringList values;
49  for (int i = 0; i < mySubItems->count(); i++)
50  values.append(mySubItems->item(i)->text());
51  return values;
52 }
53 
54 void CRESubItemList::endEdition(QWidget*, QAbstractItemDelegate::EndEditHint)
55 {
56  emit dataModified(data());
57 }
58 
60 {
61  addItem("(item)");
62  mySubItems->setCurrentRow(mySubItems->count() - 1);
63  mySubItems->editItem(mySubItems->currentItem());
64 
65  emit dataModified(data());
66 }
67 
69 {
70  if (mySubItems->currentRow() < 0)
71  return;
72 
73  delete mySubItems->takeItem(mySubItems->currentRow());
74  mySubItems->setCurrentRow(0);
75  emit dataModified(data());
76 }
77 
79 {
80  QVBoxLayout* layout = new QVBoxLayout(this);
81 
82  layout->addWidget(new QLabel(tr("Connection number:"), this));
83  myEdit = new QLineEdit(this);
84  myEdit->setValidator(new QIntValidator(1, 65000, myEdit));
85  connect(myEdit, SIGNAL(textChanged(const QString&)), this, SLOT(editChanged(const QString&)));
86  layout->addWidget(myEdit);
87  myWarning = new QLabel(this);
88  myWarning->setVisible(false);
89  layout->addWidget(myWarning);
90  layout->addStretch();
91 }
92 
93 void CRESubItemConnection::setData(const QStringList& data)
94 {
95  if (data.size() < 2)
96  {
97  showWarning(tr("Not enough arguments"));
98  return;
99  }
100 
101  bool ok = false;
102  int value = data[1].toInt(&ok);
103  if (!ok || value <= 0 || value > 65000)
104  {
105  showWarning(tr("Invalid number %1, must be a number between 1 and 65000").arg(data[1]));
106  value = 1;
107  }
108 
109  myWarning->setVisible(false);
110  myEdit->setText(QString::number(value));
111 }
112 
113 void CRESubItemConnection::showWarning(const QString& warning)
114 {
115  myWarning->setText(warning);
116  myWarning->setVisible(true);
117 }
118 
120 {
121  bool ok = false;
122  int value = text.toInt(&ok);
123  if (!ok || value <= 0 || value > 65000)
124  {
125  showWarning(tr("Invalid number %1, must be a number between 1 and 65000").arg(text));
126  return;
127  }
128 
129  myWarning->setVisible(false);
130  emit dataModified(QStringList(text));
131 }
132 
133 CRESubItemQuest::CRESubItemQuest(CREPrePostList::Mode mode, QWidget* parent) : CRESubItemWidget(parent), myMode(mode)
134 {
135  myInit = true;
136 
137  QVBoxLayout* layout = new QVBoxLayout(this);
138 
139  layout->addWidget(new QLabel(tr("Quest:"), this));
140 
141  myQuestList = new QComboBox(this);
142  layout->addWidget(myQuestList);
143 
144  if (mode != CREPrePostList::PostConditions)
145  {
146  myAtStep = new QRadioButton(tr("at step"), this);
147  layout->addWidget(myAtStep);
148  myBelowStep = new QRadioButton(tr("below step"), this);
149  layout->addWidget(myBelowStep);
150  myBelowStep->setVisible(mode == CREPrePostList::SetWhen);
151  myFromStep = new QRadioButton(tr("from step"), this);
152  layout->addWidget(myFromStep);
153  myFromStep->setVisible(mode == CREPrePostList::PreConditions);
154  myStepRange = new QRadioButton(tr("from step to step"), this);
155  layout->addWidget(myStepRange);
156 
157  connect(myAtStep, SIGNAL(toggled(bool)), this, SLOT(checkToggled(bool)));
158  connect(myBelowStep, SIGNAL(toggled(bool)), this, SLOT(checkToggled(bool)));
159  connect(myFromStep, SIGNAL(toggled(bool)), this, SLOT(checkToggled(bool)));
160  connect(myStepRange, SIGNAL(toggled(bool)), this, SLOT(checkToggled(bool)));
161  }
162  else
163  {
164  layout->addWidget(new QLabel(tr("New step:"), this));
165  myAtStep = NULL;
166  myBelowStep = nullptr;
167  myFromStep = NULL;
168  }
169 
170  myFirstStep = new QComboBox(this);
171  layout->addWidget(myFirstStep);
172 
173  if (mode != CREPrePostList::PostConditions)
174  {
175  mySecondStep = new QComboBox(this);
176  layout->addWidget(mySecondStep);
177  }
178  else
179  mySecondStep = NULL;
180 
181  layout->addStretch();
182 
183  connect(myQuestList, SIGNAL(currentIndexChanged(int)), this, SLOT(selectedQuestChanged(int)));
184  getManager()->quests()->each([&] (auto quest) {
185  myQuestList->addItem(QString(quest->quest_title) + " [" + quest->quest_code + "]", quest->quest_code);
186  myQuestList->setItemData(myQuestList->count() - 1, QString(quest->quest_description), Qt::ToolTipRole);
187  if (quest->face) {
188  myQuestList->setItemIcon(myQuestList->count() - 1, CREPixmap::getIcon(quest->face->number));
189  }
190  });
191  connect(myFirstStep, SIGNAL(currentIndexChanged(int)), this, SLOT(selectedStepChanged(int)));
192  if (mySecondStep)
193  connect(mySecondStep, SIGNAL(currentIndexChanged(int)), this, SLOT(selectedStepChanged(int)));
194 
195  myInit = false;
196 }
197 
198 void CRESubItemQuest::setData(const QStringList& data)
199 {
200  if (data.size() < 3)
201  {
202  if (myAtStep)
203  myAtStep->setChecked(true);
204  return;
205  }
206 
207  int index = myQuestList->findData(data[1], Qt::UserRole);
208  if (index == -1)
209  {
210  return;
211  }
212 
213  myInit = true;
214  myQuestList->setCurrentIndex(index);
215 
217  {
218  myFirstStep->setCurrentIndex(myFirstStep->findData(data[2], Qt::UserRole));
219  myInit = false;
220  return;
221  }
222 
223  QString steps = data[2];
224  int idx = steps.indexOf('-');
225 
226  if (idx == -1)
227  {
228  int start = 0;
229  if (steps.startsWith("<="))
230  {
231  myBelowStep->setChecked(true);
232  start = 2;
233  }
234  else if (steps.startsWith('=') || myMode == CREPrePostList::SetWhen)
235  {
236  myAtStep->setChecked(true);
237  start = myMode == CREPrePostList::SetWhen ? 0 : 1;
238  }
239  else
240  {
241  myFromStep->setChecked(true);
242  }
243 
244  myFirstStep->setCurrentIndex(myFirstStep->findData(steps.mid(start), Qt::UserRole));
245  }
246  else
247  {
248  myStepRange->setChecked(true);
249  myFirstStep->setCurrentIndex(myFirstStep->findData(steps.left(idx), Qt::UserRole));
250  mySecondStep->setCurrentIndex(mySecondStep->findData(steps.mid(idx + 1), Qt::UserRole));
251  }
252 
253  myInit = false;
254 }
255 
257 {
258  myFirstStep->clear();
260  myFirstStep->addItem("(not started)", "0");
261 
262  if (mySecondStep)
263  mySecondStep->clear();
264 
265  if (index < 0 || index >= myQuestList->count())
266  return;
267 
268  auto quest = getManager()->quests()->find(myQuestList->currentData().toString().toStdString());
269  if (!quest)
270  return;
271 
272  QString desc;
273  auto step = quest->steps;
274  while (step) {
275  desc = tr("%1 (%2)").arg(QString(step->step_description).left(50), QString::number(step->step));
276  if (step->is_completion_step)
277  desc += " (end)";
278  myFirstStep->addItem(desc, QString::number(step->step));
279  myFirstStep->setItemData(myFirstStep->count() - 1, QString(step->step_description), Qt::ToolTipRole);
280  if (mySecondStep)
281  mySecondStep->addItem(desc, QString::number(step->step));
282 
283  step = step->next;
284  }
285 }
286 
288 {
289  if (myInit)
290  return;
291 
292  QStringList data;
293 
294  data << myQuestList->itemData(myQuestList->currentIndex(), Qt::UserRole).toString();
295 
297  {
298  QString value;
299  if (myStepRange->isChecked())
300  {
301  value = myFirstStep->itemData(myFirstStep->currentIndex(), Qt::UserRole).toString();
302  value += "-";
303  value += mySecondStep->itemData(mySecondStep->currentIndex(), Qt::UserRole).toString();
304  }
305  else
306  {
307  if (myAtStep->isChecked() && myMode != CREPrePostList::SetWhen)
308  value = "=";
309  else if (myBelowStep->isChecked())
310  value = "<=";
311  value += myFirstStep->itemData(myFirstStep->currentIndex(), Qt::UserRole).toString();
312  }
313 
314  data << value;
315  }
316  else
317  {
318  data << myFirstStep->itemData(myFirstStep->currentIndex(), Qt::UserRole).toString();
319  }
320 
321  emit dataModified(data);
322 }
323 
325 {
326  if (checked == false)
327  return;
328 
329  mySecondStep->setEnabled(myStepRange->isChecked());
330  updateData();
331 }
332 
334 {
335  if (index == -1)
336  return;
337 
338  updateData();
339 }
340 
341 CRESubItemToken::CRESubItemToken(bool isPre, QWidget* parent) : CRESubItemWidget(parent)
342 {
343  QVBoxLayout* layout = new QVBoxLayout(this);
344 
345  layout->addWidget(new QLabel(tr("Token:"), this));
346  myToken = new QLineEdit(this);
347  layout->addWidget(myToken);
348  connect(myToken, SIGNAL(textChanged(const QString&)), this, SLOT(tokenChanged(const QString&)));
349 
350  if (isPre)
351  {
352  layout->addWidget(new QLabel(tr("Values the token can be (one per line):"), this));
353  myValues = new QTextEdit(this);
354  myValues->setAcceptRichText(false);
355  layout->addWidget(myValues);
356  connect(myValues, SIGNAL(textChanged()), this, SLOT(valuesChanged()));
357  myValue = NULL;
358  }
359  else
360  {
361  layout->addWidget(new QLabel(tr("Value to set for the token:"), this));
362  myValue = new QLineEdit(this);
363  layout->addWidget(myValue);
364  connect(myValue, SIGNAL(textChanged(const QString&)), this, SLOT(tokenChanged(const QString&)));
365  myValues = NULL;
366  }
367  layout->addStretch();
368 }
369 
370 void CRESubItemToken::setData(const QStringList& data)
371 {
372  QStringList copy(data);
373 
374  if (data.size() < 2)
375  {
376  myToken->clear();
377  if (myValues != NULL)
378  myValues->clear();
379  if (myValue != NULL)
380  myValue->clear();
381 
382  return;
383  }
384  copy.removeFirst();
385  myToken->setText(copy.takeFirst());
386  if (myValues != NULL)
387  myValues->setText(copy.join("\n"));
388  else if (copy.size() > 0)
389  myValue->setText(copy[0]);
390  else
391  myValue->clear();
392 }
393 
395 {
396  QStringList values;
397  values.append(myToken->text());
398  if (myValues != NULL)
399  values.append(myValues->toPlainText().split("\n"));
400  else
401  values.append(myValue->text());
402  emit dataModified(values);
403 }
404 
405 void CRESubItemToken::tokenChanged(const QString&)
406 {
407  updateData();
408 }
409 
411 {
412  updateData();
413 }
414 
415 CREPrePostPanel::CREPrePostPanel(CREPrePostList::Mode mode, const QList<QuestConditionScript*> scripts, QWidget* parent) : QDialog(parent), myMode(mode)
416 {
417  setModal(true);
418  switch (mode) {
420  setWindowTitle(tr("Message pre-condition"));
421  break;
423  setWindowTitle(tr("Message post-condition"));
424  break;
426  setWindowTitle(tr("Step set when"));
427  break;
428  }
429 
430  QVBoxLayout* layout = new QVBoxLayout(this);
431 
432  layout->addWidget(new QLabel(tr("Script:"), this));
433 
434  myChoices = new QComboBox(this);
435  layout->addWidget(myChoices);
436 
437  mySubItemsStack = new QStackedWidget(this);
438 
439  for(int script = 0; script < scripts.size(); script++)
440  {
441  if (mode == CREPrePostList::SetWhen && scripts[script]->name() != "quest")
442  continue;
443  myChoices->addItem(scripts[script]->name());
444  myChoices->setItemData(script, scripts[script]->comment(), Qt::ToolTipRole);
445  mySubWidgets.append(createSubItemWidget(scripts[script]));
446  mySubItemsStack->addWidget(mySubWidgets.last());
447  connect(mySubWidgets.last(), SIGNAL(dataModified(const QStringList&)), this, SLOT(subItemChanged(const QStringList&)));
448  }
449 
450  layout->addWidget(mySubItemsStack);
451 
452  QPushButton* reset = new QPushButton(tr("reset changes"), this);
453  connect(reset, SIGNAL(clicked(bool)), this, SLOT(onReset(bool)));
454  layout->addWidget(reset);
455 
456  connect(myChoices, SIGNAL(currentIndexChanged(int)), this, SLOT(currentChoiceChanged(int)));
457 
458  if (CREPrePostList::SetWhen == mode) {
459  myChoices->setVisible(false);
460  layout->itemAt(0)->widget()->setVisible(false);
461  }
462 }
463 
465 {
466 }
467 
469 {
470  return myData;
471 }
472 
473 void CREPrePostPanel::setData(const QStringList& data)
474 {
475  myData = data;
476  if (myMode == CREPrePostList::SetWhen && !myData.empty() && myData[0] != "quest")
477  myData.push_front("quest");
478  myOriginal = myData;
479  if (myData.isEmpty())
480  return;
481 
482  myChoices->setCurrentIndex(myChoices->findText(myOriginal[0]));
483 
484  mySubWidgets[myChoices->currentIndex()]->setData(myOriginal);
485 }
486 
488 {
489  if (myData.size() == 0)
490  myData.append(myChoices->currentText());
491  else
492  myData[0] = myChoices->currentText();
493 
494  mySubItemsStack->setCurrentIndex(myChoices->currentIndex());
495  mySubWidgets[myChoices->currentIndex()]->setData(myData);
496 }
497 
498 void CREPrePostPanel::subItemChanged(const QStringList& data)
499 {
500  while (myData.size() > 1)
501  myData.removeLast();
502  myData.append(data);
503 }
504 
506 {
507  if (myMode == CREPrePostList::PostConditions && script->name() == "connection")
508  return new CRESubItemConnection(this);
509 
510  if (script->name() == "quest")
511  return new CRESubItemQuest(myMode, this);
512 
513  if (script->name() == "token" || script->name() == "settoken" || script->name() == "npctoken" || script->name() == "setnpctoken")
515 
516  return new CRESubItemList(this);
517 }
518 
520 {
521  if (QMessageBox::question(this, "Confirm reset", "Reset the condition to initial initial values, losing all changes?") != QMessageBox::StandardButton::Yes)
522  return;
524 }
CRESubItemQuest
Definition: CREPrePostPanel.h:57
CRESubItemList::addItem
void addItem(const QString &item)
Definition: CREPrePostPanel.cpp:30
layout
Definition: main.c:85
QuestConditionScript
Definition: QuestConditionScript.h:9
CRESubItemToken
Definition: CREPrePostPanel.h:92
CRESubItemQuest::selectedStepChanged
void selectedStepChanged(int index)
Definition: CREPrePostPanel.cpp:333
CREPrePostPanel::myChoices
QComboBox * myChoices
Definition: CREPrePostPanel.h:163
CRESubItemToken::myValues
QTextEdit * myValues
Definition: CREPrePostPanel.h:104
AssetsManager.h
CRESubItemList::data
QStringList data() const
Definition: CREPrePostPanel.cpp:46
CRESubItemList::CRESubItemList
CRESubItemList(QWidget *parent)
Definition: CREPrePostPanel.cpp:11
CREPrePostPanel::getData
QStringList getData()
Definition: CREPrePostPanel.cpp:468
CRESubItemConnection::CRESubItemConnection
CRESubItemConnection(QWidget *parent)
Definition: CREPrePostPanel.cpp:78
CRESubItemQuest::myMode
CREPrePostList::Mode myMode
Definition: CREPrePostPanel.h:67
CRESubItemToken::valuesChanged
void valuesChanged()
Definition: CREPrePostPanel.cpp:410
CRESubItemToken::setData
virtual void setData(const QStringList &data)
Definition: CREPrePostPanel.cpp:370
CRESubItemList::onDeleteSubItem
void onDeleteSubItem(bool)
Definition: CREPrePostPanel.cpp:68
CRESubItemQuest::mySecondStep
QComboBox * mySecondStep
Definition: CREPrePostPanel.h:73
CRESubItemConnection
Definition: CREPrePostPanel.h:35
CRESubItemList::mySubItems
QListWidget * mySubItems
Definition: CREPrePostPanel.h:129
CREPrePostPanel::mySubItemsStack
QStackedWidget * mySubItemsStack
Definition: CREPrePostPanel.h:167
getManager
AssetsManager * getManager()
Definition: assets.cpp:333
CRESubItemToken::updateData
void updateData()
Definition: CREPrePostPanel.cpp:394
AssetsCollection::find
T * find(const Key &name)
Definition: AssetsCollection.h:85
CRESubItemList::setData
void setData(const QStringList &data)
Definition: CREPrePostPanel.cpp:37
quest
Definition: quest.py:1
CREPrePostList::PostConditions
@ PostConditions
Definition: CREPrePostList.h:18
CRESubItemConnection::editChanged
void editChanged(const QString &text)
Definition: CREPrePostPanel.cpp:119
CREPrePostPanel::onReset
void onReset(bool)
Definition: CREPrePostPanel.cpp:519
CREPrePostPanel.h
CRESubItemToken::myToken
QLineEdit * myToken
Definition: CREPrePostPanel.h:102
CREPrePostPanel::myOriginal
QStringList myOriginal
Definition: CREPrePostPanel.h:161
CRESubItemConnection::myEdit
QLineEdit * myEdit
Definition: CREPrePostPanel.h:45
CRESubItemToken::CRESubItemToken
CRESubItemToken(bool isPre, QWidget *parent)
Definition: CREPrePostPanel.cpp:341
AssetsManager::quests
Quests * quests()
Definition: AssetsManager.h:71
CREPrePostPanel::mySubWidgets
QList< CRESubItemWidget * > mySubWidgets
Definition: CREPrePostPanel.h:165
navar-midane_time.data
data
Definition: navar-midane_time.py:11
QuestConditionScript::name
const QString & name() const
Definition: QuestConditionScript.cpp:12
CREPrePostList::Mode
Mode
Definition: CREPrePostList.h:18
python_event.scripts
scripts
Definition: python_event.py:14
CRESubItemConnection::setData
virtual void setData(const QStringList &data)
Definition: CREPrePostPanel.cpp:93
CRESubItemQuest::updateData
void updateData()
Definition: CREPrePostPanel.cpp:287
AssetsCollection::each
void each(std::function< void(T *)> op)
Definition: AssetsCollection.h:135
guild_entry.text
text
Definition: guild_entry.py:44
CREPrePostList::SetWhen
@ SetWhen
Definition: CREPrePostList.h:18
CRESubItemConnection::myWarning
QLabel * myWarning
Definition: CREPrePostPanel.h:46
CRESubItemQuest::myFromStep
QRadioButton * myFromStep
Definition: CREPrePostPanel.h:76
CREPrePostPanel::CREPrePostPanel
CREPrePostPanel(CREPrePostList::Mode mode, const QList< QuestConditionScript * > scripts, QWidget *parent)
Definition: CREPrePostPanel.cpp:415
CRESubItemToken::tokenChanged
void tokenChanged(const QString &)
Definition: CREPrePostPanel.cpp:405
quest.h
CRESubItemQuest::myInit
bool myInit
Definition: CREPrePostPanel.h:78
item
Definition: item.py:1
CRESubItemQuest::myAtStep
QRadioButton * myAtStep
Definition: CREPrePostPanel.h:74
CREPrePostPanel::setData
void setData(const QStringList &data)
Definition: CREPrePostPanel.cpp:473
autojail.value
value
Definition: autojail.py:6
CRESubItemList
Definition: CREPrePostPanel.h:116
CRESubItemList::endEdition
void endEdition(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
Definition: CREPrePostPanel.cpp:54
CRESubItemQuest::selectedQuestChanged
void selectedQuestChanged(int index)
Definition: CREPrePostPanel.cpp:256
assets.h
npc_dialog.index
int index
Definition: npc_dialog.py:102
QuestConditionScript.h
CRESubItemQuest::setData
virtual void setData(const QStringList &data)
Definition: CREPrePostPanel.cpp:198
CRESubItemQuest::CRESubItemQuest
CRESubItemQuest(CREPrePostList::Mode mode, QWidget *parent)
Definition: CREPrePostPanel.cpp:133
CREPrePostPanel::subItemChanged
void subItemChanged(const QStringList &data)
Definition: CREPrePostPanel.cpp:498
CRESubItemConnection::showWarning
void showWarning(const QString &warning)
Definition: CREPrePostPanel.cpp:113
CRESubItemToken::myValue
QLineEdit * myValue
Definition: CREPrePostPanel.h:103
CRESubItemWidget::dataModified
void dataModified(const QStringList &data)
CRESubItemList::onAddSubItem
void onAddSubItem(bool)
Definition: CREPrePostPanel.cpp:59
CREPrePostPanel::currentChoiceChanged
void currentChoiceChanged(int index)
Definition: CREPrePostPanel.cpp:487
CREPrePostPanel::myData
QStringList myData
Definition: CREPrePostPanel.h:159
CRESubItemWidget
Definition: CREPrePostPanel.h:19
CREPrePostPanel::~CREPrePostPanel
virtual ~CREPrePostPanel()
Definition: CREPrePostPanel.cpp:464
CRESubItemQuest::myStepRange
QRadioButton * myStepRange
Definition: CREPrePostPanel.h:77
CREPrePostPanel::myMode
CREPrePostList::Mode myMode
Definition: CREPrePostPanel.h:169
connect
Definition: connect.py:1
CRESubItemQuest::myBelowStep
QRadioButton * myBelowStep
Definition: CREPrePostPanel.h:75
CREPrePostList::PreConditions
@ PreConditions
Definition: CREPrePostList.h:18
CREPixmap.h
if
if(!(yy_init))
Definition: loader.c:2626
CRESubItemQuest::checkToggled
void checkToggled(bool checked)
Definition: CREPrePostPanel.cpp:324
CREPrePostPanel::createSubItemWidget
CRESubItemWidget * createSubItemWidget(const QuestConditionScript *script)
Definition: CREPrePostPanel.cpp:505
CRESubItemQuest::myQuestList
QComboBox * myQuestList
Definition: CREPrePostPanel.h:69
CRESubItemQuest::myFirstStep
QComboBox * myFirstStep
Definition: CREPrePostPanel.h:71
give.name
name
Definition: give.py:27