CArtifactHolder.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * CArtifactHolder.h, 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. #pragma once
  11. #include "MiscWidgets.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. struct ArtifactLocation;
  14. class CArtifactSet;
  15. VCMI_LIB_NAMESPACE_END
  16. class CAnimImage;
  17. class CButton;
  18. class CArtifactHolder
  19. {
  20. public:
  21. virtual void artifactRemoved(const ArtifactLocation & artLoc)=0;
  22. virtual void artifactMoved(const ArtifactLocation & artLoc, const ArtifactLocation & destLoc, bool withRedraw)=0;
  23. virtual void artifactDisassembled(const ArtifactLocation & artLoc)=0;
  24. virtual void artifactAssembled(const ArtifactLocation & artLoc)=0;
  25. };
  26. class CArtPlace : public LRClickableAreaWTextComp
  27. {
  28. protected:
  29. std::shared_ptr<CAnimImage> image;
  30. const CArtifactInstance * ourArt;
  31. void setInternals(const CArtifactInstance * artInst);
  32. virtual void createImage()=0;
  33. public:
  34. CArtPlace(Point position, const CArtifactInstance * Art = nullptr);
  35. void clickLeft(tribool down, bool previousState) override;
  36. void clickRight(tribool down, bool previousState) override;
  37. const CArtifactInstance * getArt();
  38. virtual void setArtifact(const CArtifactInstance * art)=0;
  39. };
  40. class CCommanderArtPlace : public CArtPlace
  41. {
  42. protected:
  43. const CGHeroInstance * commanderOwner;
  44. ArtifactPosition commanderSlotID;
  45. void createImage() override;
  46. void returnArtToHeroCallback();
  47. public:
  48. CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot, const CArtifactInstance * Art = nullptr);
  49. void clickLeft(tribool down, bool previousState) override;
  50. void clickRight(tribool down, bool previousState) override;
  51. void setArtifact(const CArtifactInstance * art) override;
  52. };
  53. class CHeroArtPlace: public CArtPlace
  54. {
  55. public:
  56. using ClickHandler = std::function<void(CHeroArtPlace&)>;
  57. ArtifactPosition slot;
  58. ClickHandler leftClickCallback;
  59. ClickHandler rightClickCallback;
  60. CHeroArtPlace(Point position, const CArtifactInstance * Art = nullptr);
  61. void lockSlot(bool on);
  62. bool isLocked();
  63. void selectSlot(bool on);
  64. bool isMarked() const;
  65. void clickLeft(tribool down, bool previousState) override;
  66. void clickRight(tribool down, bool previousState) override;
  67. void showAll(SDL_Surface * to) override;
  68. void setArtifact(const CArtifactInstance * art) override;
  69. void addCombinedArtInfo(std::map<const CArtifact*, int> & arts);
  70. protected:
  71. std::shared_ptr<CAnimImage> selection;
  72. bool locked;
  73. bool marked;
  74. void createImage() override;
  75. };
  76. namespace ArtifactUtilsClient
  77. {
  78. bool askToAssemble(const CGHeroInstance * hero, const ArtifactPosition & slot);
  79. bool askToDisassemble(const CGHeroInstance * hero, const ArtifactPosition & slot);
  80. }