questwidget.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * questwidget.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "questwidget.h"
  12. #include "ui_questwidget.h"
  13. #include "../lib/VCMI_Lib.h"
  14. #include "../lib/CSkillHandler.h"
  15. #include "../lib/CArtHandler.h"
  16. #include "../lib/CCreatureHandler.h"
  17. #include "../lib/CHeroHandler.h"
  18. #include "../lib/StringConstants.h"
  19. QuestWidget::QuestWidget(const CMap & _map, CGSeerHut & _sh, QWidget *parent) :
  20. QDialog(parent),
  21. map(_map),
  22. seerhut(_sh),
  23. ui(new Ui::QuestWidget)
  24. {
  25. ui->setupUi(this);
  26. }
  27. QuestWidget::~QuestWidget()
  28. {
  29. delete ui;
  30. }
  31. void QuestWidget::obtainData()
  32. {
  33. assert(seerhut.quest);
  34. bool activeId = false;
  35. bool activeAmount = false;
  36. switch(seerhut.quest->missionType) {
  37. case CQuest::Emission::MISSION_LEVEL:
  38. activeAmount = true;
  39. ui->targetId->addItem("Reach level");
  40. ui->targetAmount->setText(QString::number(seerhut.quest->m13489val));
  41. break;
  42. case CQuest::Emission::MISSION_PRIMARY_STAT:
  43. activeId = true;
  44. activeAmount = true;
  45. for(auto s : PrimarySkill::names)
  46. ui->targetId->addItem(QString::fromStdString(s));
  47. for(int i = 0; i < seerhut.quest->m2stats.size(); ++i)
  48. {
  49. if(seerhut.quest->m2stats[i] > 0)
  50. {
  51. ui->targetId->setCurrentIndex(i);
  52. ui->targetAmount->setText(QString::number(seerhut.quest->m2stats[i]));
  53. break; //TODO: support multiple stats
  54. }
  55. }
  56. break;
  57. case CQuest::Emission::MISSION_KILL_HERO:
  58. activeId = true;
  59. //TODO: implement
  60. break;
  61. case CQuest::Emission::MISSION_KILL_CREATURE:
  62. activeId = true;
  63. //TODO: implement
  64. break;
  65. case CQuest::Emission::MISSION_ART:
  66. activeId = true;
  67. for(int i = 0; i < map.allowedArtifact.size(); ++i)
  68. ui->targetId->addItem(QString::fromStdString(VLC->arth->objects.at(i)->getName()));
  69. if(!seerhut.quest->m5arts.empty())
  70. ui->targetId->setCurrentIndex(seerhut.quest->m5arts.front());
  71. //TODO: support multiple artifacts
  72. break;
  73. case CQuest::Emission::MISSION_ARMY:
  74. activeId = true;
  75. activeAmount = true;
  76. break;
  77. case CQuest::Emission::MISSION_RESOURCES:
  78. activeId = true;
  79. activeAmount = true;
  80. for(auto s : GameConstants::RESOURCE_NAMES)
  81. ui->targetId->addItem(QString::fromStdString(s));
  82. for(int i = 0; i < seerhut.quest->m7resources.size(); ++i)
  83. {
  84. if(seerhut.quest->m7resources[i] > 0)
  85. {
  86. ui->targetId->setCurrentIndex(i);
  87. ui->targetAmount->setText(QString::number(seerhut.quest->m7resources[i]));
  88. break; //TODO: support multiple resources
  89. }
  90. }
  91. break;
  92. case CQuest::Emission::MISSION_HERO:
  93. activeId = true;
  94. for(int i = 0; i < map.allowedHeroes.size(); ++i)
  95. ui->targetId->addItem(QString::fromStdString(VLC->heroh->objects.at(i)->getName()));
  96. ui->targetId->setCurrentIndex(seerhut.quest->m13489val);
  97. break;
  98. case CQuest::Emission::MISSION_PLAYER:
  99. activeId = true;
  100. for(auto s : GameConstants::PLAYER_COLOR_NAMES)
  101. ui->targetId->addItem(QString::fromStdString(s));
  102. ui->targetId->setCurrentIndex(seerhut.quest->m13489val);
  103. break;
  104. case CQuest::Emission::MISSION_KEYMASTER:
  105. break;
  106. default:
  107. break;
  108. }
  109. ui->targetId->setEnabled(activeId);
  110. ui->targetAmount->setEnabled(activeAmount);
  111. }
  112. QString QuestWidget::commitChanges()
  113. {
  114. assert(seerhut.quest);
  115. switch(seerhut.quest->missionType) {
  116. case CQuest::Emission::MISSION_LEVEL:
  117. seerhut.quest->m13489val = ui->targetAmount->text().toInt();
  118. return QString("Reach lvl ").append(ui->targetAmount->text());
  119. case CQuest::Emission::MISSION_PRIMARY_STAT:
  120. seerhut.quest->m2stats.resize(sizeof(PrimarySkill::names), 0);
  121. seerhut.quest->m2stats[ui->targetId->currentIndex()] = ui->targetAmount->text().toInt();
  122. //TODO: support multiple stats
  123. return ui->targetId->currentText().append(ui->targetAmount->text());
  124. case CQuest::Emission::MISSION_KILL_HERO:
  125. //TODO: implement
  126. return QString("N/A");
  127. case CQuest::Emission::MISSION_KILL_CREATURE:
  128. //TODO: implement
  129. return QString("N/A");
  130. case CQuest::Emission::MISSION_ART:
  131. seerhut.quest->m5arts.clear();
  132. seerhut.quest->m5arts.push_back(ui->targetId->currentIndex());
  133. //TODO: support multiple artifacts
  134. return ui->targetId->currentText();
  135. case CQuest::Emission::MISSION_ARMY:
  136. //TODO: implement
  137. return QString("N/A");
  138. case CQuest::Emission::MISSION_RESOURCES:
  139. seerhut.quest->m7resources.resize(sizeof(GameConstants::RESOURCE_NAMES), 0);
  140. seerhut.quest->m7resources[ui->targetId->currentIndex()] = ui->targetAmount->text().toInt();
  141. //TODO: support resources
  142. return ui->targetId->currentText().append(ui->targetAmount->text());
  143. case CQuest::Emission::MISSION_HERO:
  144. seerhut.quest->m13489val = ui->targetId->currentIndex();
  145. return ui->targetId->currentText();
  146. case CQuest::Emission::MISSION_PLAYER:
  147. seerhut.quest->m13489val = ui->targetId->currentIndex();
  148. return ui->targetId->currentText();
  149. case CQuest::Emission::MISSION_KEYMASTER:
  150. return QString("N/A");
  151. default:
  152. return QString("N/A");
  153. }
  154. }
  155. QuestDelegate::QuestDelegate(const CMap & m, CGSeerHut & t): map(m), seerhut(t), QStyledItemDelegate()
  156. {
  157. }
  158. QWidget * QuestDelegate::createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const
  159. {
  160. return new QuestWidget(map, seerhut, parent);
  161. }
  162. void QuestDelegate::setEditorData(QWidget * editor, const QModelIndex & index) const
  163. {
  164. if(auto *ed = qobject_cast<QuestWidget *>(editor))
  165. {
  166. ed->obtainData();
  167. }
  168. else
  169. {
  170. QStyledItemDelegate::setEditorData(editor, index);
  171. }
  172. }
  173. void QuestDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
  174. {
  175. if(auto *ed = qobject_cast<QuestWidget *>(editor))
  176. {
  177. auto quest = ed->commitChanges();
  178. model->setData(index, quest);
  179. }
  180. else
  181. {
  182. QStyledItemDelegate::setModelData(editor, model, index);
  183. }
  184. }