CTransferResources.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * CTransferResources.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 "CTransferResources.h"
  12. #include "../../gui/CGuiHandler.h"
  13. #include "../../widgets/Buttons.h"
  14. #include "../../widgets/Slider.h"
  15. #include "../../widgets/TextControls.h"
  16. #include "../../CGameInfo.h"
  17. #include "../../CPlayerInterface.h"
  18. #include "../../../CCallback.h"
  19. #include "../../../lib/CGeneralTextHandler.h"
  20. CTransferResources::CTransferResources(const IMarket * market, const CGHeroInstance * hero)
  21. : CTradeBase(market, hero)
  22. {
  23. OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
  24. labels.emplace_back(std::make_shared<CLabel>(299, 27, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[158]));
  25. labels.emplace_back(std::make_shared<CLabel>(445, 56, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->allTexts[169]));
  26. deal = std::make_shared<CButton>(Point(306, 520), AnimationPath::builtin("TPMRKB.DEF"),
  27. CGI->generaltexth->zelp[595], [this]() {CTransferResources::makeDeal();});
  28. maxAmount = std::make_shared<CButton>(Point(228, 520), AnimationPath::builtin("IRCBTNS.DEF"), CGI->generaltexth->zelp[596],
  29. [this]() {offerSlider->scrollToMax();});
  30. offerSlider = std::make_shared<CSlider>(Point(230, 489), 137, [this](int newVal)
  31. {
  32. CTransferResources::onOfferSliderMoved(newVal);
  33. }, 0, 0, 0, Orientation::HORIZONTAL);
  34. // Player's resources
  35. assert(leftTradePanel);
  36. std::for_each(leftTradePanel->slots.cbegin(), leftTradePanel->slots.cend(), [this](auto & slot)
  37. {
  38. slot->clickPressedCallback = [this](const std::shared_ptr<CTradeableItem> & heroSlot)
  39. {
  40. CTransferResources::onSlotClickPressed(heroSlot, hLeft);
  41. };
  42. });
  43. leftTradePanel->moveTo(pos.topLeft() + Point(40, 182));
  44. // Players panel
  45. rightTradePanel = std::make_shared<PlayersPanel>([this](const std::shared_ptr<CTradeableItem> & heroSlot)
  46. {
  47. CTransferResources::onSlotClickPressed(heroSlot, hRight);
  48. });
  49. rightTradePanel->moveTo(pos.topLeft() + Point(333, 83));
  50. CResourcesSelling::updateSlots();
  51. CTransferResources::deselect();
  52. }
  53. void CTransferResources::makeDeal()
  54. {
  55. if(auto toTrade = offerSlider->getValue(); toTrade != 0)
  56. {
  57. LOCPLINT->cb->trade(market, EMarketMode::RESOURCE_PLAYER, GameResID(hLeft->id), PlayerColor(hRight->id), toTrade, hero);
  58. deselect();
  59. }
  60. }
  61. void CTransferResources::deselect()
  62. {
  63. CTradeBase::deselect();
  64. updateSelected();
  65. }
  66. void CTransferResources::updateSelected()
  67. {
  68. std::optional<size_t> lImageIndex = std::nullopt;
  69. std::optional<size_t> rImageIndex = std::nullopt;
  70. if(hLeft && hRight)
  71. {
  72. leftTradePanel->selectedSubtitle->setText(std::to_string(offerSlider->getValue()));
  73. rightTradePanel->selectedSubtitle->setText(CGI->generaltexth->capColors[hRight->id]);
  74. lImageIndex = hLeft->id;
  75. rImageIndex = hRight->id;
  76. }
  77. else
  78. {
  79. leftTradePanel->selectedSubtitle->setText("");
  80. rightTradePanel->selectedSubtitle->setText("");
  81. }
  82. leftTradePanel->setSelectedFrameIndex(lImageIndex);
  83. rightTradePanel->setSelectedFrameIndex(rImageIndex);
  84. }
  85. void CTransferResources::onOfferSliderMoved(int newVal)
  86. {
  87. if(hLeft && hRight)
  88. {
  89. offerSlider->scrollTo(newVal);
  90. updateSelected();
  91. redraw();
  92. }
  93. }
  94. void CTransferResources::onSlotClickPressed(const std::shared_ptr<CTradeableItem> & newSlot, std::shared_ptr<CTradeableItem> & hCurSlot)
  95. {
  96. if(newSlot == hCurSlot)
  97. return;
  98. CTradeBase::onSlotClickPressed(newSlot, hCurSlot);
  99. if(hLeft)
  100. {
  101. if(hRight)
  102. {
  103. offerSlider->setAmount(LOCPLINT->cb->getResourceAmount(GameResID(hLeft->id)));
  104. offerSlider->scrollTo(0);
  105. offerSlider->block(false);
  106. maxAmount->block(false);
  107. deal->block(false);
  108. }
  109. updateSelected();
  110. rightTradePanel->updateSlots();
  111. }
  112. redraw();
  113. }