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