rewardswidget.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. /*
  2. * rewardswidget.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 "rewardswidget.h"
  12. #include "ui_rewardswidget.h"
  13. #include "../lib/VCMI_Lib.h"
  14. #include "../lib/CSkillHandler.h"
  15. #include "../lib/spells/CSpellHandler.h"
  16. #include "../lib/CArtHandler.h"
  17. #include "../lib/CCreatureHandler.h"
  18. #include "../lib/constants/StringConstants.h"
  19. #include "../lib/mapping/CMap.h"
  20. #include "../lib/rewardable/Configuration.h"
  21. #include "../lib/rewardable/Limiter.h"
  22. #include "../lib/rewardable/Reward.h"
  23. #include "../lib/mapObjects/CGPandoraBox.h"
  24. #include "../lib/mapObjects/CQuest.h"
  25. #include <vcmi/HeroTypeService.h>
  26. #include <vcmi/HeroType.h>
  27. #include <vcmi/HeroClassService.h>
  28. #include <vcmi/HeroClass.h>
  29. RewardsWidget::RewardsWidget(CMap & m, CRewardableObject & p, QWidget *parent) :
  30. QDialog(parent),
  31. map(m),
  32. object(p),
  33. ui(new Ui::RewardsWidget)
  34. {
  35. ui->setupUi(this);
  36. //fill core elements
  37. for(const auto & s : Rewardable::VisitModeString)
  38. ui->visitMode->addItem(QString::fromUtf8(s.data(), s.size()));
  39. for(const auto & s : Rewardable::SelectModeString)
  40. ui->selectMode->addItem(QString::fromUtf8(s.data(), s.size()));
  41. for(auto s : {"AUTO", "MODAL", "INFO"})
  42. ui->windowMode->addItem(QString::fromStdString(s));
  43. ui->lDayOfWeek->addItem(tr("None"));
  44. for(int i = 1; i <= 7; ++i)
  45. ui->lDayOfWeek->addItem(tr("Day %1").arg(i));
  46. //fill resources
  47. ui->rResources->setRowCount(GameConstants::RESOURCE_QUANTITY - 1);
  48. ui->lResources->setRowCount(GameConstants::RESOURCE_QUANTITY - 1);
  49. for(int i = 0; i < GameConstants::RESOURCE_QUANTITY - 1; ++i)
  50. {
  51. for(auto * w : {ui->rResources, ui->lResources})
  52. {
  53. auto * item = new QTableWidgetItem(QString::fromStdString(GameConstants::RESOURCE_NAMES[i]));
  54. item->setData(Qt::UserRole, QVariant::fromValue(i));
  55. w->setItem(i, 0, item);
  56. auto * spinBox = new QSpinBox;
  57. spinBox->setMaximum(i == GameResID::GOLD ? 999999 : 999);
  58. if(w == ui->rResources)
  59. spinBox->setMinimum(i == GameResID::GOLD ? -999999 : -999);
  60. w->setCellWidget(i, 1, spinBox);
  61. }
  62. }
  63. //fill artifacts
  64. for(int i = 0; i < map.allowedArtifact.size(); ++i)
  65. {
  66. for(auto * w : {ui->rArtifacts, ui->lArtifacts})
  67. {
  68. auto * item = new QListWidgetItem(QString::fromStdString(VLC->artifacts()->getByIndex(i)->getNameTranslated()));
  69. item->setData(Qt::UserRole, QVariant::fromValue(i));
  70. item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
  71. item->setCheckState(Qt::Unchecked);
  72. if(map.allowedArtifact.count(i) == 0)
  73. item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
  74. w->addItem(item);
  75. }
  76. }
  77. //fill spells
  78. for(int i = 0; i < map.allowedSpells.size(); ++i)
  79. {
  80. for(auto * w : {ui->rSpells, ui->lSpells})
  81. {
  82. auto * item = new QListWidgetItem(QString::fromStdString(VLC->spells()->getByIndex(i)->getNameTranslated()));
  83. item->setData(Qt::UserRole, QVariant::fromValue(i));
  84. item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
  85. item->setCheckState(Qt::Unchecked);
  86. if(map.allowedSpells.count(i) == 0)
  87. item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
  88. w->addItem(item);
  89. }
  90. //spell cast
  91. if(VLC->spells()->getByIndex(i)->isAdventure())
  92. {
  93. ui->castSpell->addItem(QString::fromStdString(VLC->spells()->getByIndex(i)->getNameTranslated()));
  94. ui->castSpell->setItemData(ui->castSpell->count() - 1, QVariant::fromValue(i));
  95. }
  96. }
  97. //fill skills
  98. ui->rSkills->setRowCount(map.allowedAbilities.size());
  99. ui->lSkills->setRowCount(map.allowedAbilities.size());
  100. for(int i = 0; i < map.allowedAbilities.size(); ++i)
  101. {
  102. for(auto * w : {ui->rSkills, ui->lSkills})
  103. {
  104. auto * item = new QTableWidgetItem(QString::fromStdString(VLC->skills()->getByIndex(i)->getNameTranslated()));
  105. item->setData(Qt::UserRole, QVariant::fromValue(i));
  106. auto * widget = new QComboBox;
  107. for(auto & s : NSecondarySkill::levels)
  108. widget->addItem(QString::fromStdString(s));
  109. if(map.allowedAbilities.count(i) == 0)
  110. {
  111. item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
  112. widget->setEnabled(false);
  113. }
  114. w->setItem(i, 0, item);
  115. w->setCellWidget(i, 1, widget);
  116. }
  117. }
  118. //fill creatures
  119. for(auto & creature : VLC->creh->objects)
  120. {
  121. for(auto * w : {ui->rCreatureId, ui->lCreatureId})
  122. {
  123. w->addItem(QString::fromStdString(creature->getNameSingularTranslated()));
  124. w->setItemData(w->count() - 1, creature->getIndex());
  125. }
  126. }
  127. //fill heroes
  128. VLC->heroTypes()->forEach([this](const HeroType * hero, bool &)
  129. {
  130. auto * item = new QListWidgetItem(QString::fromStdString(hero->getNameTranslated()));
  131. item->setData(Qt::UserRole, QVariant::fromValue(hero->getId().getNum()));
  132. item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
  133. item->setCheckState(Qt::Unchecked);
  134. ui->lHeroes->addItem(item);
  135. });
  136. //fill hero classes
  137. VLC->heroClasses()->forEach([this](const HeroClass * heroClass, bool &)
  138. {
  139. auto * item = new QListWidgetItem(QString::fromStdString(heroClass->getNameTranslated()));
  140. item->setData(Qt::UserRole, QVariant::fromValue(heroClass->getId().getNum()));
  141. item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
  142. item->setCheckState(Qt::Unchecked);
  143. ui->lHeroClasses->addItem(item);
  144. });
  145. //fill players
  146. for(auto color = PlayerColor(0); color < PlayerColor::PLAYER_LIMIT; ++color)
  147. {
  148. auto * item = new QListWidgetItem(QString::fromStdString(GameConstants::PLAYER_COLOR_NAMES[color.getNum()]));
  149. item->setData(Qt::UserRole, QVariant::fromValue(color.getNum()));
  150. item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
  151. item->setCheckState(Qt::Unchecked);
  152. ui->lPlayers->addItem(item);
  153. }
  154. //fill spell cast
  155. for(auto & s : NSecondarySkill::levels)
  156. ui->castLevel->addItem(QString::fromStdString(s));
  157. on_castSpellCheck_toggled(false);
  158. //fill bonuses
  159. for(auto & s : bonusDurationMap)
  160. ui->bonusDuration->addItem(QString::fromStdString(s.first));
  161. for(auto & s : bonusNameMap)
  162. ui->bonusType->addItem(QString::fromStdString(s.first));
  163. //set default values
  164. if(dynamic_cast<CGPandoraBox*>(&object))
  165. {
  166. ui->visitMode->setCurrentIndex(vstd::find_pos(Rewardable::VisitModeString, "once"));
  167. ui->visitMode->setEnabled(false);
  168. ui->selectMode->setCurrentIndex(vstd::find_pos(Rewardable::SelectModeString, "selectFirst"));
  169. ui->selectMode->setEnabled(false);
  170. ui->windowMode->setEnabled(false);
  171. ui->canRefuse->setEnabled(false);
  172. }
  173. if(auto * e = dynamic_cast<CGEvent*>(&object))
  174. {
  175. ui->selectMode->setEnabled(true);
  176. if(!e->removeAfterVisit)
  177. ui->visitMode->setCurrentIndex(vstd::find_pos(Rewardable::VisitModeString, "unlimited"));
  178. }
  179. if(dynamic_cast<CGSeerHut*>(&object))
  180. {
  181. ui->visitMode->setCurrentIndex(vstd::find_pos(Rewardable::VisitModeString, "once"));
  182. ui->visitMode->setEnabled(false);
  183. ui->windowMode->setEnabled(false);
  184. ui->canRefuse->setChecked(true);
  185. ui->canRefuse->setEnabled(false);
  186. }
  187. //hide elements
  188. ui->eventInfoGroup->hide();
  189. }
  190. RewardsWidget::~RewardsWidget()
  191. {
  192. delete ui;
  193. }
  194. void RewardsWidget::obtainData()
  195. {
  196. //common parameters
  197. ui->visitMode->setCurrentIndex(object.configuration.visitMode);
  198. ui->selectMode->setCurrentIndex(object.configuration.selectMode);
  199. ui->windowMode->setCurrentIndex(int(object.configuration.infoWindowType));
  200. ui->onSelectText->setText(QString::fromStdString(object.configuration.onSelect.toString()));
  201. ui->canRefuse->setChecked(object.configuration.canRefuse);
  202. //reset parameters
  203. ui->resetPeriod->setValue(object.configuration.resetParameters.period);
  204. ui->resetVisitors->setChecked(object.configuration.resetParameters.visitors);
  205. ui->resetRewards->setChecked(object.configuration.resetParameters.rewards);
  206. ui->visitInfoList->clear();
  207. for([[maybe_unused]] auto & a : object.configuration.info)
  208. ui->visitInfoList->addItem(tr("Reward %1").arg(ui->visitInfoList->count() + 1));
  209. if(ui->visitInfoList->currentItem())
  210. loadCurrentVisitInfo(ui->visitInfoList->currentRow());
  211. }
  212. bool RewardsWidget::commitChanges()
  213. {
  214. //common parameters
  215. object.configuration.visitMode = ui->visitMode->currentIndex();
  216. object.configuration.selectMode = ui->selectMode->currentIndex();
  217. object.configuration.infoWindowType = EInfoWindowMode(ui->windowMode->currentIndex());
  218. if(ui->onSelectText->text().isEmpty())
  219. object.configuration.onSelect.clear();
  220. else
  221. object.configuration.onSelect = MetaString::createFromTextID(mapRegisterLocalizedString("map", map, TextIdentifier("reward", object.instanceName, "onSelect"), ui->onSelectText->text().toStdString()));
  222. object.configuration.canRefuse = ui->canRefuse->isChecked();
  223. //reset parameters
  224. object.configuration.resetParameters.period = ui->resetPeriod->value();
  225. object.configuration.resetParameters.visitors = ui->resetVisitors->isChecked();
  226. object.configuration.resetParameters.rewards = ui->resetRewards->isChecked();
  227. if(ui->visitInfoList->currentItem())
  228. saveCurrentVisitInfo(ui->visitInfoList->currentRow());
  229. return true;
  230. }
  231. void RewardsWidget::saveCurrentVisitInfo(int index)
  232. {
  233. auto & vinfo = object.configuration.info.at(index);
  234. vinfo.visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
  235. if(ui->rewardMessage->text().isEmpty())
  236. vinfo.message.clear();
  237. else
  238. vinfo.message = MetaString::createFromTextID(mapRegisterLocalizedString("map", map, TextIdentifier("reward", object.instanceName, "info", index, "message"), ui->rewardMessage->text().toStdString()));
  239. vinfo.reward.heroLevel = ui->rHeroLevel->value();
  240. vinfo.reward.heroExperience = ui->rHeroExperience->value();
  241. vinfo.reward.manaDiff = ui->rManaDiff->value();
  242. vinfo.reward.manaPercentage = ui->rManaPercentage->value();
  243. vinfo.reward.manaOverflowFactor = ui->rOverflowFactor->value();
  244. vinfo.reward.movePoints = ui->rMovePoints->value();
  245. vinfo.reward.movePercentage = ui->rMovePercentage->value();
  246. vinfo.reward.removeObject = ui->removeObject->isChecked();
  247. vinfo.reward.primary.resize(4);
  248. vinfo.reward.primary[0] = ui->rAttack->value();
  249. vinfo.reward.primary[1] = ui->rDefence->value();
  250. vinfo.reward.primary[2] = ui->rPower->value();
  251. vinfo.reward.primary[3] = ui->rKnowledge->value();
  252. for(int i = 0; i < ui->rResources->rowCount(); ++i)
  253. {
  254. if(auto * widget = qobject_cast<QSpinBox*>(ui->rResources->cellWidget(i, 1)))
  255. vinfo.reward.resources[i] = widget->value();
  256. }
  257. vinfo.reward.artifacts.clear();
  258. for(int i = 0; i < ui->rArtifacts->count(); ++i)
  259. {
  260. if(ui->rArtifacts->item(i)->checkState() == Qt::Checked)
  261. vinfo.reward.artifacts.push_back(VLC->artifacts()->getByIndex(i)->getId());
  262. }
  263. vinfo.reward.spells.clear();
  264. for(int i = 0; i < ui->rSpells->count(); ++i)
  265. {
  266. if(ui->rSpells->item(i)->checkState() == Qt::Checked)
  267. vinfo.reward.spells.push_back(VLC->spells()->getByIndex(i)->getId());
  268. }
  269. vinfo.reward.secondary.clear();
  270. for(int i = 0; i < ui->rSkills->rowCount(); ++i)
  271. {
  272. if(auto * widget = qobject_cast<QComboBox*>(ui->rSkills->cellWidget(i, 1)))
  273. {
  274. if(widget->currentIndex() > 0)
  275. vinfo.reward.secondary[VLC->skills()->getByIndex(i)->getId()] = widget->currentIndex();
  276. }
  277. }
  278. vinfo.reward.creatures.clear();
  279. for(int i = 0; i < ui->rCreatures->rowCount(); ++i)
  280. {
  281. int index = ui->rCreatures->item(i, 0)->data(Qt::UserRole).toInt();
  282. if(auto * widget = qobject_cast<QSpinBox*>(ui->rCreatures->cellWidget(i, 1)))
  283. if(widget->value())
  284. vinfo.reward.creatures.emplace_back(VLC->creatures()->getByIndex(index)->getId(), widget->value());
  285. }
  286. vinfo.reward.spellCast.first = SpellID::NONE;
  287. if(ui->castSpellCheck->isChecked())
  288. {
  289. vinfo.reward.spellCast.first = VLC->spells()->getByIndex(ui->castSpell->itemData(ui->castSpell->currentIndex()).toInt())->getId();
  290. vinfo.reward.spellCast.second = ui->castLevel->currentIndex();
  291. }
  292. vinfo.reward.bonuses.clear();
  293. for(int i = 0; i < ui->bonuses->rowCount(); ++i)
  294. {
  295. auto dur = bonusDurationMap.at(ui->bonuses->item(i, 0)->text().toStdString());
  296. auto typ = bonusNameMap.at(ui->bonuses->item(i, 1)->text().toStdString());
  297. auto val = ui->bonuses->item(i, 2)->data(Qt::UserRole).toInt();
  298. vinfo.reward.bonuses.emplace_back(dur, typ, BonusSource::OBJECT_INSTANCE, val, BonusSourceID(object.id));
  299. }
  300. vinfo.limiter.dayOfWeek = ui->lDayOfWeek->currentIndex();
  301. vinfo.limiter.daysPassed = ui->lDaysPassed->value();
  302. vinfo.limiter.heroLevel = ui->lHeroLevel->value();
  303. vinfo.limiter.heroExperience = ui->lHeroExperience->value();
  304. vinfo.limiter.manaPoints = ui->lManaPoints->value();
  305. vinfo.limiter.manaPercentage = ui->lManaPercentage->value();
  306. vinfo.limiter.primary.resize(4);
  307. vinfo.limiter.primary[0] = ui->lAttack->value();
  308. vinfo.limiter.primary[1] = ui->lDefence->value();
  309. vinfo.limiter.primary[2] = ui->lPower->value();
  310. vinfo.limiter.primary[3] = ui->lKnowledge->value();
  311. for(int i = 0; i < ui->lResources->rowCount(); ++i)
  312. {
  313. if(auto * widget = qobject_cast<QSpinBox*>(ui->lResources->cellWidget(i, 1)))
  314. vinfo.limiter.resources[i] = widget->value();
  315. }
  316. vinfo.limiter.artifacts.clear();
  317. for(int i = 0; i < ui->lArtifacts->count(); ++i)
  318. {
  319. if(ui->lArtifacts->item(i)->checkState() == Qt::Checked)
  320. vinfo.limiter.artifacts.push_back(VLC->artifacts()->getByIndex(i)->getId());
  321. }
  322. vinfo.limiter.spells.clear();
  323. for(int i = 0; i < ui->lSpells->count(); ++i)
  324. {
  325. if(ui->lSpells->item(i)->checkState() == Qt::Checked)
  326. vinfo.limiter.spells.push_back(VLC->spells()->getByIndex(i)->getId());
  327. }
  328. vinfo.limiter.secondary.clear();
  329. for(int i = 0; i < ui->lSkills->rowCount(); ++i)
  330. {
  331. if(auto * widget = qobject_cast<QComboBox*>(ui->lSkills->cellWidget(i, 1)))
  332. {
  333. if(widget->currentIndex() > 0)
  334. vinfo.limiter.secondary[VLC->skills()->getByIndex(i)->getId()] = widget->currentIndex();
  335. }
  336. }
  337. vinfo.limiter.creatures.clear();
  338. for(int i = 0; i < ui->lCreatures->rowCount(); ++i)
  339. {
  340. int index = ui->lCreatures->item(i, 0)->data(Qt::UserRole).toInt();
  341. if(auto * widget = qobject_cast<QSpinBox*>(ui->lCreatures->cellWidget(i, 1)))
  342. if(widget->value())
  343. vinfo.limiter.creatures.emplace_back(VLC->creatures()->getByIndex(index)->getId(), widget->value());
  344. }
  345. vinfo.limiter.heroes.clear();
  346. for(int i = 0; i < ui->lHeroes->count(); ++i)
  347. {
  348. if(ui->lHeroes->item(i)->checkState() == Qt::Checked)
  349. vinfo.limiter.heroes.emplace_back(ui->lHeroes->item(i)->data(Qt::UserRole).toInt());
  350. }
  351. vinfo.limiter.heroClasses.clear();
  352. for(int i = 0; i < ui->lHeroClasses->count(); ++i)
  353. {
  354. if(ui->lHeroClasses->item(i)->checkState() == Qt::Checked)
  355. vinfo.limiter.heroClasses.emplace_back(ui->lHeroClasses->item(i)->data(Qt::UserRole).toInt());
  356. }
  357. vinfo.limiter.players.clear();
  358. for(int i = 0; i < ui->lPlayers->count(); ++i)
  359. {
  360. if(ui->lPlayers->item(i)->checkState() == Qt::Checked)
  361. vinfo.limiter.players.emplace_back(ui->lPlayers->item(i)->data(Qt::UserRole).toInt());
  362. }
  363. }
  364. void RewardsWidget::loadCurrentVisitInfo(int index)
  365. {
  366. for(auto * w : {ui->rArtifacts, ui->rSpells, ui->lArtifacts, ui->lSpells})
  367. for(int i = 0; i < w->count(); ++i)
  368. w->item(i)->setCheckState(Qt::Unchecked);
  369. for(auto * w : {ui->rSkills, ui->lSkills})
  370. for(int i = 0; i < w->rowCount(); ++i)
  371. if(auto * widget = qobject_cast<QComboBox*>(ui->rSkills->cellWidget(i, 1)))
  372. widget->setCurrentIndex(0);
  373. ui->rCreatures->setRowCount(0);
  374. ui->lCreatures->setRowCount(0);
  375. ui->bonuses->setRowCount(0);
  376. const auto & vinfo = object.configuration.info.at(index);
  377. ui->rewardMessage->setText(QString::fromStdString(vinfo.message.toString()));
  378. ui->rHeroLevel->setValue(vinfo.reward.heroLevel);
  379. ui->rHeroExperience->setValue(vinfo.reward.heroExperience);
  380. ui->rManaDiff->setValue(vinfo.reward.manaDiff);
  381. ui->rManaPercentage->setValue(vinfo.reward.manaPercentage);
  382. ui->rOverflowFactor->setValue(vinfo.reward.manaOverflowFactor);
  383. ui->rMovePoints->setValue(vinfo.reward.movePoints);
  384. ui->rMovePercentage->setValue(vinfo.reward.movePercentage);
  385. ui->removeObject->setChecked(vinfo.reward.removeObject);
  386. ui->rAttack->setValue(vinfo.reward.primary[0]);
  387. ui->rDefence->setValue(vinfo.reward.primary[1]);
  388. ui->rPower->setValue(vinfo.reward.primary[2]);
  389. ui->rKnowledge->setValue(vinfo.reward.primary[3]);
  390. for(int i = 0; i < ui->rResources->rowCount(); ++i)
  391. {
  392. if(auto * widget = qobject_cast<QSpinBox*>(ui->rResources->cellWidget(i, 1)))
  393. widget->setValue(vinfo.reward.resources[i]);
  394. }
  395. for(auto i : vinfo.reward.artifacts)
  396. ui->rArtifacts->item(VLC->artifacts()->getById(i)->getIndex())->setCheckState(Qt::Checked);
  397. for(auto i : vinfo.reward.spells)
  398. ui->rArtifacts->item(VLC->spells()->getById(i)->getIndex())->setCheckState(Qt::Checked);
  399. for(auto & i : vinfo.reward.secondary)
  400. {
  401. int index = VLC->skills()->getById(i.first)->getIndex();
  402. if(auto * widget = qobject_cast<QComboBox*>(ui->rSkills->cellWidget(index, 1)))
  403. widget->setCurrentIndex(i.second);
  404. }
  405. for(auto & i : vinfo.reward.creatures)
  406. {
  407. int index = i.getType()->getIndex();
  408. ui->rCreatureId->setCurrentIndex(index);
  409. ui->rCreatureAmount->setValue(i.count);
  410. onCreatureAdd(ui->rCreatures, ui->rCreatureId, ui->rCreatureAmount);
  411. }
  412. ui->castSpellCheck->setChecked(vinfo.reward.spellCast.first != SpellID::NONE);
  413. if(ui->castSpellCheck->isChecked())
  414. {
  415. int index = VLC->spells()->getById(vinfo.reward.spellCast.first)->getIndex();
  416. ui->castSpell->setCurrentIndex(index);
  417. ui->castLevel->setCurrentIndex(vinfo.reward.spellCast.second);
  418. }
  419. for(auto & i : vinfo.reward.bonuses)
  420. {
  421. auto dur = vstd::findKey(bonusDurationMap, i.duration);
  422. for(int i = 0; i < ui->bonusDuration->count(); ++i)
  423. {
  424. if(ui->bonusDuration->itemText(i) == QString::fromStdString(dur))
  425. {
  426. ui->bonusDuration->setCurrentIndex(i);
  427. break;
  428. }
  429. }
  430. auto typ = vstd::findKey(bonusNameMap, i.type);
  431. for(int i = 0; i < ui->bonusType->count(); ++i)
  432. {
  433. if(ui->bonusType->itemText(i) == QString::fromStdString(typ))
  434. {
  435. ui->bonusType->setCurrentIndex(i);
  436. break;
  437. }
  438. }
  439. ui->bonusValue->setValue(i.val);
  440. on_bonusAdd_clicked();
  441. }
  442. ui->lDayOfWeek->setCurrentIndex(vinfo.limiter.dayOfWeek);
  443. ui->lDaysPassed->setValue(vinfo.limiter.daysPassed);
  444. ui->lHeroLevel->setValue(vinfo.limiter.heroLevel);
  445. ui->lHeroExperience->setValue(vinfo.limiter.heroExperience);
  446. ui->lManaPoints->setValue(vinfo.limiter.manaPoints);
  447. ui->lManaPercentage->setValue(vinfo.limiter.manaPercentage);
  448. ui->lAttack->setValue(vinfo.limiter.primary[0]);
  449. ui->lDefence->setValue(vinfo.limiter.primary[1]);
  450. ui->lPower->setValue(vinfo.limiter.primary[2]);
  451. ui->lKnowledge->setValue(vinfo.limiter.primary[3]);
  452. for(int i = 0; i < ui->lResources->rowCount(); ++i)
  453. {
  454. if(auto * widget = qobject_cast<QSpinBox*>(ui->lResources->cellWidget(i, 1)))
  455. widget->setValue(vinfo.limiter.resources[i]);
  456. }
  457. for(auto i : vinfo.limiter.artifacts)
  458. ui->lArtifacts->item(VLC->artifacts()->getById(i)->getIndex())->setCheckState(Qt::Checked);
  459. for(auto i : vinfo.limiter.spells)
  460. ui->lArtifacts->item(VLC->spells()->getById(i)->getIndex())->setCheckState(Qt::Checked);
  461. for(auto & i : vinfo.limiter.secondary)
  462. {
  463. int index = VLC->skills()->getById(i.first)->getIndex();
  464. if(auto * widget = qobject_cast<QComboBox*>(ui->lSkills->cellWidget(index, 1)))
  465. widget->setCurrentIndex(i.second);
  466. }
  467. for(auto & i : vinfo.limiter.creatures)
  468. {
  469. int index = i.getType()->getIndex();
  470. ui->lCreatureId->setCurrentIndex(index);
  471. ui->lCreatureAmount->setValue(i.count);
  472. onCreatureAdd(ui->lCreatures, ui->lCreatureId, ui->lCreatureAmount);
  473. }
  474. for(auto & i : vinfo.limiter.heroes)
  475. {
  476. for(int e = 0; e < ui->lHeroes->count(); ++e)
  477. {
  478. if(ui->lHeroes->item(e)->data(Qt::UserRole).toInt() == i.getNum())
  479. {
  480. ui->lHeroes->item(e)->setCheckState(Qt::Checked);
  481. break;
  482. }
  483. }
  484. }
  485. for(auto & i : vinfo.limiter.heroClasses)
  486. {
  487. for(int e = 0; e < ui->lHeroClasses->count(); ++e)
  488. {
  489. if(ui->lHeroClasses->item(e)->data(Qt::UserRole).toInt() == i.getNum())
  490. {
  491. ui->lHeroClasses->item(e)->setCheckState(Qt::Checked);
  492. break;
  493. }
  494. }
  495. }
  496. for(auto & i : vinfo.limiter.players)
  497. {
  498. for(int e = 0; e < ui->lPlayers->count(); ++e)
  499. {
  500. if(ui->lPlayers->item(e)->data(Qt::UserRole).toInt() == i.getNum())
  501. {
  502. ui->lPlayers->item(e)->setCheckState(Qt::Checked);
  503. break;
  504. }
  505. }
  506. }
  507. }
  508. void RewardsWidget::onCreatureAdd(QTableWidget * listWidget, QComboBox * comboWidget, QSpinBox * spinWidget)
  509. {
  510. QTableWidgetItem * item = nullptr;
  511. QSpinBox * widget = nullptr;
  512. for(int i = 0; i < listWidget->rowCount(); ++i)
  513. {
  514. if(auto * cname = listWidget->item(i, 0))
  515. {
  516. if(cname->data(Qt::UserRole).toInt() == comboWidget->currentData().toInt())
  517. {
  518. item = cname;
  519. widget = qobject_cast<QSpinBox*>(listWidget->cellWidget(i, 1));
  520. break;
  521. }
  522. }
  523. }
  524. if(!item)
  525. {
  526. listWidget->setRowCount(listWidget->rowCount() + 1);
  527. item = new QTableWidgetItem(comboWidget->currentText());
  528. listWidget->setItem(listWidget->rowCount() - 1, 0, item);
  529. }
  530. item->setData(Qt::UserRole, comboWidget->currentData());
  531. if(!widget)
  532. {
  533. widget = new QSpinBox;
  534. widget->setRange(spinWidget->minimum(), spinWidget->maximum());
  535. listWidget->setCellWidget(listWidget->rowCount() - 1, 1, widget);
  536. }
  537. widget->setValue(spinWidget->value());
  538. }
  539. void RewardsWidget::on_addVisitInfo_clicked()
  540. {
  541. ui->visitInfoList->addItem(tr("Reward %1").arg(ui->visitInfoList->count() + 1));
  542. object.configuration.info.emplace_back();
  543. }
  544. void RewardsWidget::on_removeVisitInfo_clicked()
  545. {
  546. int index = ui->visitInfoList->currentRow();
  547. object.configuration.info.erase(std::next(object.configuration.info.begin(), index));
  548. ui->visitInfoList->blockSignals(true);
  549. delete ui->visitInfoList->currentItem();
  550. ui->visitInfoList->blockSignals(false);
  551. on_visitInfoList_itemSelectionChanged();
  552. if(ui->visitInfoList->currentItem())
  553. loadCurrentVisitInfo(ui->visitInfoList->currentRow());
  554. }
  555. void RewardsWidget::on_selectMode_currentIndexChanged(int index)
  556. {
  557. ui->onSelectText->setEnabled(index == vstd::find_pos(Rewardable::SelectModeString, "selectPlayer"));
  558. }
  559. void RewardsWidget::on_resetPeriod_valueChanged(int arg1)
  560. {
  561. ui->resetRewards->setEnabled(arg1);
  562. ui->resetVisitors->setEnabled(arg1);
  563. }
  564. void RewardsWidget::on_visitInfoList_itemSelectionChanged()
  565. {
  566. if(ui->visitInfoList->currentItem() == nullptr)
  567. {
  568. ui->eventInfoGroup->hide();
  569. ui->removeVisitInfo->setEnabled(false);
  570. return;
  571. }
  572. ui->eventInfoGroup->show();
  573. ui->removeVisitInfo->setEnabled(true);
  574. }
  575. void RewardsWidget::on_visitInfoList_currentItemChanged(QListWidgetItem * current, QListWidgetItem * previous)
  576. {
  577. if(previous)
  578. saveCurrentVisitInfo(ui->visitInfoList->row(previous));
  579. if(current)
  580. loadCurrentVisitInfo(ui->visitInfoList->currentRow());
  581. }
  582. void RewardsWidget::on_rCreatureAdd_clicked()
  583. {
  584. onCreatureAdd(ui->rCreatures, ui->rCreatureId, ui->rCreatureAmount);
  585. }
  586. void RewardsWidget::on_rCreatureRemove_clicked()
  587. {
  588. std::set<int, std::greater<int>> rowsToRemove;
  589. for(auto * i : ui->rCreatures->selectedItems())
  590. rowsToRemove.insert(i->row());
  591. for(auto i : rowsToRemove)
  592. ui->rCreatures->removeRow(i);
  593. }
  594. void RewardsWidget::on_lCreatureAdd_clicked()
  595. {
  596. onCreatureAdd(ui->lCreatures, ui->lCreatureId, ui->lCreatureAmount);
  597. }
  598. void RewardsWidget::on_lCreatureRemove_clicked()
  599. {
  600. std::set<int, std::greater<int>> rowsToRemove;
  601. for(auto * i : ui->lCreatures->selectedItems())
  602. rowsToRemove.insert(i->row());
  603. for(auto i : rowsToRemove)
  604. ui->lCreatures->removeRow(i);
  605. }
  606. void RewardsWidget::on_castSpellCheck_toggled(bool checked)
  607. {
  608. ui->castSpell->setEnabled(checked);
  609. ui->castLevel->setEnabled(checked);
  610. }
  611. void RewardsWidget::on_bonusAdd_clicked()
  612. {
  613. auto * itemType = new QTableWidgetItem(ui->bonusType->currentText());
  614. auto * itemDur = new QTableWidgetItem(ui->bonusDuration->currentText());
  615. auto * itemVal = new QTableWidgetItem(QString::number(ui->bonusValue->value()));
  616. itemVal->setData(Qt::UserRole, ui->bonusValue->value());
  617. ui->bonuses->setRowCount(ui->bonuses->rowCount() + 1);
  618. ui->bonuses->setItem(ui->bonuses->rowCount() - 1, 0, itemDur);
  619. ui->bonuses->setItem(ui->bonuses->rowCount() - 1, 1, itemType);
  620. ui->bonuses->setItem(ui->bonuses->rowCount() - 1, 2, itemVal);
  621. }
  622. void RewardsWidget::on_bonusRemove_clicked()
  623. {
  624. std::set<int, std::greater<int>> rowsToRemove;
  625. for(auto * i : ui->bonuses->selectedItems())
  626. rowsToRemove.insert(i->row());
  627. for(auto i : rowsToRemove)
  628. ui->bonuses->removeRow(i);
  629. }
  630. void RewardsDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
  631. {
  632. if(auto * ed = qobject_cast<RewardsWidget *>(editor))
  633. {
  634. ed->obtainData();
  635. }
  636. else
  637. {
  638. QStyledItemDelegate::setEditorData(editor, index);
  639. }
  640. }
  641. void RewardsDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
  642. {
  643. if(auto * ed = qobject_cast<RewardsWidget *>(editor))
  644. {
  645. ed->commitChanges();
  646. }
  647. else
  648. {
  649. QStyledItemDelegate::setModelData(editor, model, index);
  650. }
  651. }
  652. RewardsDelegate::RewardsDelegate(CMap & m, CRewardableObject & t): map(m), object(t)
  653. {
  654. }
  655. QWidget * RewardsDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
  656. {
  657. return new RewardsWidget(map, object, parent);
  658. }