CArtifactsOfHeroBackpack.cpp 3.8 KB

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