CArtifactsOfHeroBackpack.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * CArtifactsOfHeroBackpack.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 "CArtifactsOfHeroBackpack.h"
  12. #include "../gui/CGuiHandler.h"
  13. #include "Images.h"
  14. #include "GameSettings.h"
  15. #include "ObjectLists.h"
  16. #include "../CPlayerInterface.h"
  17. #include "../../lib/mapObjects/CGHeroInstance.h"
  18. #include "../../CCallback.h"
  19. CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position)
  20. {
  21. OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
  22. pos += position;
  23. setRedrawParent(true);
  24. const auto backpackCap = VLC->settings()->getInteger(EGameSettings::HEROES_BACKPACK_CAP);
  25. auto visibleCapacityMax = HERO_BACKPACK_WINDOW_SLOT_ROWS * HERO_BACKPACK_WINDOW_SLOT_COLUMNS;
  26. if(backpackCap >= 0)
  27. visibleCapacityMax = visibleCapacityMax > backpackCap ? backpackCap : visibleCapacityMax;
  28. backpack.resize(visibleCapacityMax);
  29. size_t artPlaceIdx = 0;
  30. for(auto & artPlace : backpack)
  31. {
  32. const auto pos = Point(slotSizeWithMargin * (artPlaceIdx % HERO_BACKPACK_WINDOW_SLOT_COLUMNS),
  33. slotSizeWithMargin * (artPlaceIdx / HERO_BACKPACK_WINDOW_SLOT_COLUMNS));
  34. backpackSlotsBackgrounds.emplace_back(std::make_shared<CPicture>(ImagePath::builtin("heroWindow/artifactSlotEmpty"), pos));
  35. artPlace = std::make_shared<CHeroArtPlace>(pos);
  36. artPlace->setArtifact(nullptr);
  37. artPlace->leftClickCallback = std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1);
  38. artPlace->showPopupCallback = std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1);
  39. artPlaceIdx++;
  40. }
  41. if(backpackCap < 0 || visibleCapacityMax < backpackCap)
  42. {
  43. auto onCreate = [](size_t index) -> std::shared_ptr<CIntObject>
  44. {
  45. return std::make_shared<CIntObject>();
  46. };
  47. CListBoxWithCallback::MovedPosCallback posMoved = [this](size_t pos) -> void
  48. {
  49. scrollBackpack(static_cast<int>(pos) * HERO_BACKPACK_WINDOW_SLOT_COLUMNS - backpackPos);
  50. };
  51. backpackListBox = std::make_shared<CListBoxWithCallback>(
  52. posMoved, onCreate, Point(0, 0), Point(0, 0), HERO_BACKPACK_WINDOW_SLOT_ROWS, 0, 0, 1,
  53. Rect(HERO_BACKPACK_WINDOW_SLOT_COLUMNS * slotSizeWithMargin + sliderPosOffsetX, 0, HERO_BACKPACK_WINDOW_SLOT_ROWS * slotSizeWithMargin - 2, 0));
  54. }
  55. pos.w = visibleCapacityMax > HERO_BACKPACK_WINDOW_SLOT_COLUMNS ? HERO_BACKPACK_WINDOW_SLOT_COLUMNS : visibleCapacityMax;
  56. pos.w *= slotSizeWithMargin;
  57. if(backpackListBox)
  58. pos.w += sliderPosOffsetX + 16; // 16 is slider width. TODO: get it from CListBox directly;
  59. pos.h = (visibleCapacityMax / HERO_BACKPACK_WINDOW_SLOT_COLUMNS);
  60. if(visibleCapacityMax % HERO_BACKPACK_WINDOW_SLOT_COLUMNS != 0)
  61. pos.h += 1;
  62. pos.h *= slotSizeWithMargin;
  63. }
  64. void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc)
  65. {
  66. LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
  67. }
  68. void CArtifactsOfHeroBackpack::pickUpArtifact(CHeroArtPlace & artPlace)
  69. {
  70. LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero, artPlace.slot),
  71. ArtifactLocation(curHero, ArtifactPosition::TRANSITION_POS));
  72. }
  73. void CArtifactsOfHeroBackpack::scrollBackpack(int offset)
  74. {
  75. if(backpackListBox)
  76. backpackListBox->resize(getActiveSlotRowsNum());
  77. backpackPos += offset;
  78. auto slot = ArtifactPosition::BACKPACK_START + backpackPos;
  79. for(auto artPlace : backpack)
  80. {
  81. setSlotData(artPlace, slot, *curHero);
  82. slot = slot + 1;
  83. }
  84. redraw();
  85. }
  86. void CArtifactsOfHeroBackpack::updateBackpackSlots()
  87. {
  88. if(backpackListBox)
  89. backpackListBox->resize(getActiveSlotRowsNum());
  90. CArtifactsOfHeroBase::updateBackpackSlots();
  91. }
  92. size_t CArtifactsOfHeroBackpack::getActiveSlotRowsNum()
  93. {
  94. return (curHero->artifactsInBackpack.size() + HERO_BACKPACK_WINDOW_SLOT_COLUMNS - 1) / HERO_BACKPACK_WINDOW_SLOT_COLUMNS;
  95. }