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