mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Merge pull request #3186 from SoundSSGood/quick-backpack-part1
Quick backpack window
This commit is contained in:
@@ -139,7 +139,7 @@ void CCommanderArtPlace::clickPressed(const Point & cursorPosition)
|
|||||||
LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.commanderWindow.artifactMessage"), [this]() { returnArtToHeroCallback(); }, []() {});
|
LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.commanderWindow.artifactMessage"), [this]() { returnArtToHeroCallback(); }, []() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCommanderArtPlace::showPopupWindow(const Point & cursorPosition)
|
void CCommanderArtPlace::showPopupWindow(const Point& cursorPosition)
|
||||||
{
|
{
|
||||||
if(ourArt && text.size())
|
if(ourArt && text.size())
|
||||||
CArtPlace::showPopupWindow(cursorPosition);
|
CArtPlace::showPopupWindow(cursorPosition);
|
||||||
@@ -180,16 +180,25 @@ bool CArtPlace::isSelected() const
|
|||||||
return selection->visible;
|
return selection->visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHeroArtPlace::clickPressed(const Point & cursorPosition)
|
void CArtPlace::clickPressed(const Point & cursorPosition)
|
||||||
{
|
{
|
||||||
if(leftClickCallback)
|
if(clickPressedCallback)
|
||||||
leftClickCallback(*this);
|
clickPressedCallback(*this, cursorPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHeroArtPlace::showPopupWindow(const Point & cursorPosition)
|
void CArtPlace::showPopupWindow(const Point & cursorPosition)
|
||||||
{
|
{
|
||||||
if(showPopupCallback)
|
if(showPopupCallback)
|
||||||
showPopupCallback(*this);
|
showPopupCallback(*this, cursorPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtPlace::gesture(bool on, const Point & initialPosition, const Point & finalPosition)
|
||||||
|
{
|
||||||
|
if(!on)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(gestureCallback)
|
||||||
|
gestureCallback(*this, initialPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtPlace::showAll(Canvas & to)
|
void CArtPlace::showAll(Canvas & to)
|
||||||
@@ -216,6 +225,21 @@ void CArtPlace::setArtifact(const CArtifactInstance * art)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CArtPlace::setClickPressedCallback(ClickFunctor callback)
|
||||||
|
{
|
||||||
|
clickPressedCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtPlace::setShowPopupCallback(ClickFunctor callback)
|
||||||
|
{
|
||||||
|
showPopupCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtPlace::setGestureCallback(ClickFunctor callback)
|
||||||
|
{
|
||||||
|
gestureCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
void CHeroArtPlace::addCombinedArtInfo(std::map<const CArtifact*, int> & arts)
|
void CHeroArtPlace::addCombinedArtInfo(std::map<const CArtifact*, int> & arts)
|
||||||
{
|
{
|
||||||
for(const auto & combinedArt : arts)
|
for(const auto & combinedArt : arts)
|
||||||
|
@@ -32,14 +32,24 @@ public:
|
|||||||
class CArtPlace : public LRClickableAreaWTextComp
|
class CArtPlace : public LRClickableAreaWTextComp
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
using ClickFunctor = std::function<void(CArtPlace&, const Point&)>;
|
||||||
|
|
||||||
|
ArtifactPosition slot;
|
||||||
|
|
||||||
CArtPlace(Point position, const CArtifactInstance * art = nullptr);
|
CArtPlace(Point position, const CArtifactInstance * art = nullptr);
|
||||||
const CArtifactInstance* getArt();
|
const CArtifactInstance * getArt();
|
||||||
void lockSlot(bool on);
|
void lockSlot(bool on);
|
||||||
bool isLocked() const;
|
bool isLocked() const;
|
||||||
void selectSlot(bool on);
|
void selectSlot(bool on);
|
||||||
bool isSelected() const;
|
bool isSelected() const;
|
||||||
void showAll(Canvas & to) override;
|
void showAll(Canvas & to) override;
|
||||||
void setArtifact(const CArtifactInstance * art);
|
void setArtifact(const CArtifactInstance * art);
|
||||||
|
void setClickPressedCallback(ClickFunctor callback);
|
||||||
|
void setShowPopupCallback(ClickFunctor callback);
|
||||||
|
void setGestureCallback(ClickFunctor callback);
|
||||||
|
void clickPressed(const Point & cursorPosition) override;
|
||||||
|
void showPopupWindow(const Point & cursorPosition) override;
|
||||||
|
void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<CAnimImage> image;
|
std::shared_ptr<CAnimImage> image;
|
||||||
@@ -47,6 +57,9 @@ protected:
|
|||||||
int imageIndex;
|
int imageIndex;
|
||||||
std::shared_ptr<CAnimImage> selection;
|
std::shared_ptr<CAnimImage> selection;
|
||||||
bool locked;
|
bool locked;
|
||||||
|
ClickFunctor clickPressedCallback;
|
||||||
|
ClickFunctor showPopupCallback;
|
||||||
|
ClickFunctor gestureCallback;
|
||||||
|
|
||||||
void setInternals(const CArtifactInstance * artInst);
|
void setInternals(const CArtifactInstance * artInst);
|
||||||
};
|
};
|
||||||
@@ -68,15 +81,7 @@ public:
|
|||||||
class CHeroArtPlace: public CArtPlace
|
class CHeroArtPlace: public CArtPlace
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using ClickFunctor = std::function<void(CHeroArtPlace&)>;
|
|
||||||
|
|
||||||
ArtifactPosition slot;
|
|
||||||
ClickFunctor leftClickCallback;
|
|
||||||
ClickFunctor showPopupCallback;
|
|
||||||
|
|
||||||
CHeroArtPlace(Point position, const CArtifactInstance * art = nullptr);
|
CHeroArtPlace(Point position, const CArtifactInstance * art = nullptr);
|
||||||
void clickPressed(const Point & cursorPosition) override;
|
|
||||||
void showPopupWindow(const Point & cursorPosition) override;
|
|
||||||
void addCombinedArtInfo(std::map<const CArtifact*, int> & arts);
|
void addCombinedArtInfo(std::map<const CArtifact*, int> & arts);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -23,8 +23,8 @@ CArtifactsOfHeroAltar::CArtifactsOfHeroAltar(const Point & position)
|
|||||||
: visibleArtSet(ArtBearer::ArtBearer::HERO)
|
: visibleArtSet(ArtBearer::ArtBearer::HERO)
|
||||||
{
|
{
|
||||||
init(
|
init(
|
||||||
std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1),
|
std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2),
|
||||||
std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1),
|
std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2),
|
||||||
position,
|
position,
|
||||||
std::bind(&CArtifactsOfHeroAltar::scrollBackpack, this, _1));
|
std::bind(&CArtifactsOfHeroAltar::scrollBackpack, this, _1));
|
||||||
pickedArtFromSlot = ArtifactPosition::PRE_FIRST;
|
pickedArtFromSlot = ArtifactPosition::PRE_FIRST;
|
||||||
@@ -69,7 +69,7 @@ void CArtifactsOfHeroAltar::scrollBackpack(int offset)
|
|||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroAltar::pickUpArtifact(CHeroArtPlace & artPlace)
|
void CArtifactsOfHeroAltar::pickUpArtifact(CArtPlace & artPlace)
|
||||||
{
|
{
|
||||||
if(const auto art = artPlace.getArt())
|
if(const auto art = artPlace.getArt())
|
||||||
{
|
{
|
||||||
|
@@ -26,7 +26,7 @@ public:
|
|||||||
void updateWornSlots() override;
|
void updateWornSlots() override;
|
||||||
void updateBackpackSlots() override;
|
void updateBackpackSlots() override;
|
||||||
void scrollBackpack(int offset) override;
|
void scrollBackpack(int offset) override;
|
||||||
void pickUpArtifact(CHeroArtPlace & artPlace);
|
void pickUpArtifact(CArtPlace & artPlace);
|
||||||
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
||||||
void pickedArtMoveToAltar(const ArtifactPosition & slot);
|
void pickedArtMoveToAltar(const ArtifactPosition & slot);
|
||||||
void deleteFromVisible(const CArtifactInstance * artInst);
|
void deleteFromVisible(const CArtifactInstance * artInst);
|
||||||
|
@@ -17,60 +17,28 @@
|
|||||||
#include "ObjectLists.h"
|
#include "ObjectLists.h"
|
||||||
|
|
||||||
#include "../CPlayerInterface.h"
|
#include "../CPlayerInterface.h"
|
||||||
|
#include "../../lib/ArtifactUtils.h"
|
||||||
#include "../../lib/mapObjects/CGHeroInstance.h"
|
#include "../../lib/mapObjects/CGHeroInstance.h"
|
||||||
#include "../../lib/networkPacks/ArtifactLocation.h"
|
#include "../../lib/networkPacks/ArtifactLocation.h"
|
||||||
|
|
||||||
#include "../../CCallback.h"
|
#include "../../CCallback.h"
|
||||||
|
|
||||||
CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position)
|
CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(size_t slotsColumnsMax, size_t slotsRowsMax)
|
||||||
|
: slotsColumnsMax(slotsColumnsMax)
|
||||||
|
, slotsRowsMax(slotsRowsMax)
|
||||||
{
|
{
|
||||||
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
|
|
||||||
pos += position;
|
|
||||||
setRedrawParent(true);
|
setRedrawParent(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack()
|
||||||
|
: CArtifactsOfHeroBackpack(8, 8)
|
||||||
|
{
|
||||||
const auto backpackCap = VLC->settings()->getInteger(EGameSettings::HEROES_BACKPACK_CAP);
|
const auto backpackCap = VLC->settings()->getInteger(EGameSettings::HEROES_BACKPACK_CAP);
|
||||||
auto visibleCapacityMax = HERO_BACKPACK_WINDOW_SLOT_ROWS * HERO_BACKPACK_WINDOW_SLOT_COLUMNS;
|
auto visibleCapacityMax = slotsRowsMax * slotsColumnsMax;
|
||||||
if(backpackCap >= 0)
|
if(backpackCap >= 0)
|
||||||
visibleCapacityMax = visibleCapacityMax > backpackCap ? backpackCap : visibleCapacityMax;
|
visibleCapacityMax = visibleCapacityMax > backpackCap ? backpackCap : visibleCapacityMax;
|
||||||
|
|
||||||
backpack.resize(visibleCapacityMax);
|
initAOHbackpack(visibleCapacityMax, backpackCap < 0 || visibleCapacityMax < backpackCap);
|
||||||
size_t artPlaceIdx = 0;
|
|
||||||
for(auto & artPlace : backpack)
|
|
||||||
{
|
|
||||||
const auto pos = Point(slotSizeWithMargin * (artPlaceIdx % HERO_BACKPACK_WINDOW_SLOT_COLUMNS),
|
|
||||||
slotSizeWithMargin * (artPlaceIdx / HERO_BACKPACK_WINDOW_SLOT_COLUMNS));
|
|
||||||
backpackSlotsBackgrounds.emplace_back(std::make_shared<CPicture>(ImagePath::builtin("heroWindow/artifactSlotEmpty"), pos));
|
|
||||||
artPlace = std::make_shared<CHeroArtPlace>(pos);
|
|
||||||
artPlace->setArtifact(nullptr);
|
|
||||||
artPlace->leftClickCallback = std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1);
|
|
||||||
artPlace->showPopupCallback = std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1);
|
|
||||||
artPlaceIdx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(backpackCap < 0 || visibleCapacityMax < backpackCap)
|
|
||||||
{
|
|
||||||
auto onCreate = [](size_t index) -> std::shared_ptr<CIntObject>
|
|
||||||
{
|
|
||||||
return std::make_shared<CIntObject>();
|
|
||||||
};
|
|
||||||
CListBoxWithCallback::MovedPosCallback posMoved = [this](size_t pos) -> void
|
|
||||||
{
|
|
||||||
scrollBackpack(static_cast<int>(pos) * HERO_BACKPACK_WINDOW_SLOT_COLUMNS - backpackPos);
|
|
||||||
};
|
|
||||||
backpackListBox = std::make_shared<CListBoxWithCallback>(
|
|
||||||
posMoved, onCreate, Point(0, 0), Point(0, 0), HERO_BACKPACK_WINDOW_SLOT_ROWS, 0, 0, 1,
|
|
||||||
Rect(HERO_BACKPACK_WINDOW_SLOT_COLUMNS * slotSizeWithMargin + sliderPosOffsetX, 0, HERO_BACKPACK_WINDOW_SLOT_ROWS * slotSizeWithMargin - 2, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
pos.w = visibleCapacityMax > HERO_BACKPACK_WINDOW_SLOT_COLUMNS ? HERO_BACKPACK_WINDOW_SLOT_COLUMNS : visibleCapacityMax;
|
|
||||||
pos.w *= slotSizeWithMargin;
|
|
||||||
if(backpackListBox)
|
|
||||||
pos.w += sliderPosOffsetX + 16; // 16 is slider width. TODO: get it from CListBox directly;
|
|
||||||
|
|
||||||
pos.h = (visibleCapacityMax / HERO_BACKPACK_WINDOW_SLOT_COLUMNS);
|
|
||||||
if(visibleCapacityMax % HERO_BACKPACK_WINDOW_SLOT_COLUMNS != 0)
|
|
||||||
pos.h += 1;
|
|
||||||
pos.h *= slotSizeWithMargin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc)
|
void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc)
|
||||||
@@ -78,7 +46,7 @@ void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, co
|
|||||||
LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
|
LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroBackpack::pickUpArtifact(CHeroArtPlace & artPlace)
|
void CArtifactsOfHeroBackpack::pickUpArtifact(CArtPlace & artPlace)
|
||||||
{
|
{
|
||||||
LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, artPlace.slot),
|
LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, artPlace.slot),
|
||||||
ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS));
|
ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS));
|
||||||
@@ -107,5 +75,145 @@ void CArtifactsOfHeroBackpack::updateBackpackSlots()
|
|||||||
|
|
||||||
size_t CArtifactsOfHeroBackpack::getActiveSlotRowsNum()
|
size_t CArtifactsOfHeroBackpack::getActiveSlotRowsNum()
|
||||||
{
|
{
|
||||||
return (curHero->artifactsInBackpack.size() + HERO_BACKPACK_WINDOW_SLOT_COLUMNS - 1) / HERO_BACKPACK_WINDOW_SLOT_COLUMNS;
|
return (curHero->artifactsInBackpack.size() + slotsColumnsMax - 1) / slotsColumnsMax;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t CArtifactsOfHeroBackpack::getSlotsNum()
|
||||||
|
{
|
||||||
|
return backpack.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactsOfHeroBackpack::initAOHbackpack(size_t slots, bool slider)
|
||||||
|
{
|
||||||
|
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
|
||||||
|
|
||||||
|
backpack.resize(slots);
|
||||||
|
size_t artPlaceIdx = 0;
|
||||||
|
for(auto & artPlace : backpack)
|
||||||
|
{
|
||||||
|
const auto pos = Point(slotSizeWithMargin * (artPlaceIdx % slotsColumnsMax),
|
||||||
|
slotSizeWithMargin * (artPlaceIdx / slotsColumnsMax));
|
||||||
|
backpackSlotsBackgrounds.emplace_back(std::make_shared<CPicture>(ImagePath::builtin("heroWindow/artifactSlotEmpty"), pos));
|
||||||
|
artPlace = std::make_shared<CHeroArtPlace>(pos);
|
||||||
|
artPlace->setArtifact(nullptr);
|
||||||
|
artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||||
|
artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||||
|
artPlaceIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(slider)
|
||||||
|
{
|
||||||
|
auto onCreate = [](size_t index) -> std::shared_ptr<CIntObject>
|
||||||
|
{
|
||||||
|
return std::make_shared<CIntObject>();
|
||||||
|
};
|
||||||
|
CListBoxWithCallback::MovedPosCallback posMoved = [this](size_t pos) -> void
|
||||||
|
{
|
||||||
|
scrollBackpack(static_cast<int>(pos) * slotsColumnsMax - backpackPos);
|
||||||
|
};
|
||||||
|
backpackListBox = std::make_shared<CListBoxWithCallback>(
|
||||||
|
posMoved, onCreate, Point(0, 0), Point(0, 0), slotsRowsMax, 0, 0, 1,
|
||||||
|
Rect(slotsColumnsMax * slotSizeWithMargin + sliderPosOffsetX, 0, slotsRowsMax * slotSizeWithMargin - 2, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
pos.w = slots > slotsColumnsMax ? slotsColumnsMax : slots;
|
||||||
|
pos.w *= slotSizeWithMargin;
|
||||||
|
if(slider)
|
||||||
|
pos.w += sliderPosOffsetX + 16; // 16 is slider width. TODO: get it from CListBox directly;
|
||||||
|
pos.h = calcRows(slots) * slotSizeWithMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t CArtifactsOfHeroBackpack::calcRows(size_t slots)
|
||||||
|
{
|
||||||
|
size_t rows = 0;
|
||||||
|
if(slotsColumnsMax != 0)
|
||||||
|
{
|
||||||
|
rows = slots / slotsColumnsMax;
|
||||||
|
if(slots % slotsColumnsMax != 0)
|
||||||
|
rows += 1;
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
CArtifactsOfHeroQuickBackpack::CArtifactsOfHeroQuickBackpack(const ArtifactPosition filterBySlot)
|
||||||
|
: CArtifactsOfHeroBackpack(0, 0)
|
||||||
|
{
|
||||||
|
assert(filterBySlot != ArtifactPosition::FIRST_AVAILABLE);
|
||||||
|
|
||||||
|
if(!ArtifactUtils::isSlotEquipment(filterBySlot))
|
||||||
|
return;
|
||||||
|
|
||||||
|
this->filterBySlot = filterBySlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactsOfHeroQuickBackpack::setHero(const CGHeroInstance * hero)
|
||||||
|
{
|
||||||
|
if(curHero == hero)
|
||||||
|
return;
|
||||||
|
|
||||||
|
curHero = hero;
|
||||||
|
if(curHero)
|
||||||
|
{
|
||||||
|
ArtifactID artInSlotId = ArtifactID::NONE;
|
||||||
|
SpellID scrollInSlotSpellId = SpellID::NONE;
|
||||||
|
if(auto artInSlot = curHero->getArt(filterBySlot))
|
||||||
|
{
|
||||||
|
artInSlotId = artInSlot->getTypeId();
|
||||||
|
scrollInSlotSpellId = artInSlot->getScrollSpellID();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<const ArtifactID, const CArtifactInstance*> filteredArts;
|
||||||
|
for(auto & slotInfo : curHero->artifactsInBackpack)
|
||||||
|
if(slotInfo.artifact->getTypeId() != artInSlotId && !slotInfo.artifact->isScroll() &&
|
||||||
|
slotInfo.artifact->artType->canBePutAt(curHero, filterBySlot, true))
|
||||||
|
{
|
||||||
|
filteredArts.insert(std::pair(slotInfo.artifact->getTypeId(), slotInfo.artifact));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<const SpellID, const CArtifactInstance*> filteredScrolls;
|
||||||
|
if(filterBySlot == ArtifactPosition::MISC1 || filterBySlot == ArtifactPosition::MISC2 || filterBySlot == ArtifactPosition::MISC3 ||
|
||||||
|
filterBySlot == ArtifactPosition::MISC4 || filterBySlot == ArtifactPosition::MISC5)
|
||||||
|
{
|
||||||
|
for(auto & slotInfo : curHero->artifactsInBackpack)
|
||||||
|
{
|
||||||
|
if(slotInfo.artifact->isScroll() && slotInfo.artifact->getScrollSpellID() != scrollInSlotSpellId)
|
||||||
|
filteredScrolls.insert(std::pair(slotInfo.artifact->getScrollSpellID(), slotInfo.artifact));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
backpack.clear();
|
||||||
|
auto requiredSlots = filteredArts.size() + filteredScrolls.size();
|
||||||
|
slotsColumnsMax = ceilf(sqrtf(requiredSlots));
|
||||||
|
slotsRowsMax = calcRows(requiredSlots);
|
||||||
|
initAOHbackpack(requiredSlots, false);
|
||||||
|
auto artPlace = backpack.begin();
|
||||||
|
for(auto & art : filteredArts)
|
||||||
|
setSlotData(*artPlace++, curHero->getSlotByInstance(art.second), *curHero);
|
||||||
|
for(auto & art : filteredScrolls)
|
||||||
|
setSlotData(*artPlace++, curHero->getSlotByInstance(art.second), *curHero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ArtifactPosition CArtifactsOfHeroQuickBackpack::getFilterSlot()
|
||||||
|
{
|
||||||
|
return filterBySlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactsOfHeroQuickBackpack::selectSlotAt(const Point & position)
|
||||||
|
{
|
||||||
|
for(auto & artPlace : backpack)
|
||||||
|
artPlace->selectSlot(artPlace->pos.isInside(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactsOfHeroQuickBackpack::swapSelected()
|
||||||
|
{
|
||||||
|
ArtifactLocation backpackLoc(curHero->id, ArtifactPosition::PRE_FIRST);
|
||||||
|
for(auto & artPlace : backpack)
|
||||||
|
if(artPlace->isSelected())
|
||||||
|
{
|
||||||
|
backpackLoc.slot = artPlace->slot;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(backpackLoc.slot != ArtifactPosition::PRE_FIRST && filterBySlot != ArtifactPosition::PRE_FIRST && curHero)
|
||||||
|
swapArtifacts(backpackLoc, ArtifactLocation(curHero->id, filterBySlot));
|
||||||
|
}
|
@@ -22,18 +22,36 @@ class CListBoxWithCallback;
|
|||||||
class CArtifactsOfHeroBackpack : public CArtifactsOfHeroBase
|
class CArtifactsOfHeroBackpack : public CArtifactsOfHeroBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CArtifactsOfHeroBackpack(const Point & position);
|
CArtifactsOfHeroBackpack(size_t slotsColumnsMax, size_t slotsRowsMax);
|
||||||
|
CArtifactsOfHeroBackpack();
|
||||||
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
||||||
void pickUpArtifact(CHeroArtPlace & artPlace);
|
void pickUpArtifact(CArtPlace & artPlace);
|
||||||
void scrollBackpack(int offset) override;
|
void scrollBackpack(int offset) override;
|
||||||
void updateBackpackSlots() override;
|
void updateBackpackSlots() override;
|
||||||
size_t getActiveSlotRowsNum();
|
size_t getActiveSlotRowsNum();
|
||||||
|
size_t getSlotsNum();
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
std::shared_ptr<CListBoxWithCallback> backpackListBox;
|
std::shared_ptr<CListBoxWithCallback> backpackListBox;
|
||||||
std::vector<std::shared_ptr<CPicture>> backpackSlotsBackgrounds;
|
std::vector<std::shared_ptr<CPicture>> backpackSlotsBackgrounds;
|
||||||
const size_t HERO_BACKPACK_WINDOW_SLOT_COLUMNS = 8;
|
size_t slotsColumnsMax;
|
||||||
const size_t HERO_BACKPACK_WINDOW_SLOT_ROWS = 8;
|
size_t slotsRowsMax;
|
||||||
const int slotSizeWithMargin = 46;
|
const int slotSizeWithMargin = 46;
|
||||||
const int sliderPosOffsetX = 10;
|
const int sliderPosOffsetX = 5;
|
||||||
|
|
||||||
|
void initAOHbackpack(size_t slots, bool slider);
|
||||||
|
size_t calcRows(size_t slots);
|
||||||
|
};
|
||||||
|
|
||||||
|
class CArtifactsOfHeroQuickBackpack : public CArtifactsOfHeroBackpack
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CArtifactsOfHeroQuickBackpack(const ArtifactPosition filterBySlot);
|
||||||
|
void setHero(const CGHeroInstance * hero);
|
||||||
|
ArtifactPosition getFilterSlot();
|
||||||
|
void selectSlotAt(const Point & position);
|
||||||
|
void swapSelected();
|
||||||
|
|
||||||
|
private:
|
||||||
|
ArtifactPosition filterBySlot;
|
||||||
};
|
};
|
||||||
|
@@ -56,8 +56,8 @@ void CArtifactsOfHeroBase::setPutBackPickedArtifactCallback(PutBackPickedArtCall
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroBase::init(
|
void CArtifactsOfHeroBase::init(
|
||||||
CHeroArtPlace::ClickFunctor lClickCallback,
|
CArtPlace::ClickFunctor lClickCallback,
|
||||||
CHeroArtPlace::ClickFunctor showPopupCallback,
|
CArtPlace::ClickFunctor showPopupCallback,
|
||||||
const Point & position,
|
const Point & position,
|
||||||
BpackScrollFunctor scrollCallback)
|
BpackScrollFunctor scrollCallback)
|
||||||
{
|
{
|
||||||
@@ -78,14 +78,14 @@ void CArtifactsOfHeroBase::init(
|
|||||||
{
|
{
|
||||||
artPlace.second->slot = artPlace.first;
|
artPlace.second->slot = artPlace.first;
|
||||||
artPlace.second->setArtifact(nullptr);
|
artPlace.second->setArtifact(nullptr);
|
||||||
artPlace.second->leftClickCallback = lClickCallback;
|
artPlace.second->setClickPressedCallback(lClickCallback);
|
||||||
artPlace.second->showPopupCallback = showPopupCallback;
|
artPlace.second->setShowPopupCallback(showPopupCallback);
|
||||||
}
|
}
|
||||||
for(auto artPlace : backpack)
|
for(auto artPlace : backpack)
|
||||||
{
|
{
|
||||||
artPlace->setArtifact(nullptr);
|
artPlace->setArtifact(nullptr);
|
||||||
artPlace->leftClickCallback = lClickCallback;
|
artPlace->setClickPressedCallback(lClickCallback);
|
||||||
artPlace->showPopupCallback = showPopupCallback;
|
artPlace->setShowPopupCallback(showPopupCallback);
|
||||||
}
|
}
|
||||||
leftBackpackRoll = std::make_shared<CButton>(Point(379, 364), AnimationPath::builtin("hsbtns3.def"), CButton::tooltip(), [scrollCallback]() {scrollCallback(-1);}, EShortcut::MOVE_LEFT);
|
leftBackpackRoll = std::make_shared<CButton>(Point(379, 364), AnimationPath::builtin("hsbtns3.def"), CButton::tooltip(), [scrollCallback]() {scrollCallback(-1);}, EShortcut::MOVE_LEFT);
|
||||||
rightBackpackRoll = std::make_shared<CButton>(Point(632, 364), AnimationPath::builtin("hsbtns5.def"), CButton::tooltip(), [scrollCallback]() {scrollCallback(+1);}, EShortcut::MOVE_RIGHT);
|
rightBackpackRoll = std::make_shared<CButton>(Point(632, 364), AnimationPath::builtin("hsbtns5.def"), CButton::tooltip(), [scrollCallback]() {scrollCallback(+1);}, EShortcut::MOVE_RIGHT);
|
||||||
@@ -95,16 +95,22 @@ void CArtifactsOfHeroBase::init(
|
|||||||
setRedrawParent(true);
|
setRedrawParent(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroBase::leftClickArtPlace(CHeroArtPlace & artPlace)
|
void CArtifactsOfHeroBase::clickPrassedArtPlace(CArtPlace & artPlace, const Point & cursorPosition)
|
||||||
{
|
{
|
||||||
if(leftClickCallback)
|
if(clickPressedCallback)
|
||||||
leftClickCallback(*this, artPlace);
|
clickPressedCallback(*this, artPlace, cursorPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroBase::rightClickArtPlace(CHeroArtPlace & artPlace)
|
void CArtifactsOfHeroBase::showPopupArtPlace(CArtPlace & artPlace, const Point & cursorPosition)
|
||||||
{
|
{
|
||||||
if(showPopupCallback)
|
if(showPopupCallback)
|
||||||
showPopupCallback(*this, artPlace);
|
showPopupCallback(*this, artPlace, cursorPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactsOfHeroBase::gestureArtPlace(CArtPlace & artPlace, const Point & cursorPosition)
|
||||||
|
{
|
||||||
|
if(gestureCallback)
|
||||||
|
gestureCallback(*this, artPlace, cursorPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroBase::setHero(const CGHeroInstance * hero)
|
void CArtifactsOfHeroBase::setHero(const CGHeroInstance * hero)
|
||||||
@@ -241,6 +247,15 @@ const CArtifactInstance * CArtifactsOfHeroBase::getPickedArtifact()
|
|||||||
return curHero->getArt(ArtifactPosition::TRANSITION_POS);
|
return curHero->getArt(ArtifactPosition::TRANSITION_POS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CArtifactsOfHeroBase::addGestureCallback(CArtPlace::ClickFunctor callback)
|
||||||
|
{
|
||||||
|
for(auto & artPlace : artWorn)
|
||||||
|
{
|
||||||
|
artPlace.second->setGestureCallback(callback);
|
||||||
|
artPlace.second->addUsedEvents(GESTURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroBase::setSlotData(ArtPlacePtr artPlace, const ArtifactPosition & slot, const CArtifactSet & artSet)
|
void CArtifactsOfHeroBase::setSlotData(ArtPlacePtr artPlace, const ArtifactPosition & slot, const CArtifactSet & artSet)
|
||||||
{
|
{
|
||||||
// Spurious call from artifactMoved in attempt to update hidden backpack slot
|
// Spurious call from artifactMoved in attempt to update hidden backpack slot
|
||||||
|
@@ -21,17 +21,19 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
using ArtPlaceMap = std::map<ArtifactPosition, ArtPlacePtr>;
|
using ArtPlaceMap = std::map<ArtifactPosition, ArtPlacePtr>;
|
||||||
using ClickFunctor = std::function<void(CArtifactsOfHeroBase&, CHeroArtPlace&)>;
|
using ClickFunctor = std::function<void(CArtifactsOfHeroBase&, CArtPlace&, const Point&)>;
|
||||||
using PutBackPickedArtCallback = std::function<void()>;
|
using PutBackPickedArtCallback = std::function<void()>;
|
||||||
|
|
||||||
ClickFunctor leftClickCallback;
|
ClickFunctor clickPressedCallback;
|
||||||
ClickFunctor showPopupCallback;
|
ClickFunctor showPopupCallback;
|
||||||
|
ClickFunctor gestureCallback;
|
||||||
|
|
||||||
CArtifactsOfHeroBase();
|
CArtifactsOfHeroBase();
|
||||||
virtual void putBackPickedArtifact();
|
virtual void putBackPickedArtifact();
|
||||||
virtual void setPutBackPickedArtifactCallback(PutBackPickedArtCallback callback);
|
virtual void setPutBackPickedArtifactCallback(PutBackPickedArtCallback callback);
|
||||||
virtual void leftClickArtPlace(CHeroArtPlace & artPlace);
|
virtual void clickPrassedArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
|
||||||
virtual void rightClickArtPlace(CHeroArtPlace & artPlace);
|
virtual void showPopupArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
|
||||||
|
virtual void gestureArtPlace(CArtPlace & artPlace, const Point & cursorPosition);
|
||||||
virtual void setHero(const CGHeroInstance * hero);
|
virtual void setHero(const CGHeroInstance * hero);
|
||||||
virtual const CGHeroInstance * getHero() const;
|
virtual const CGHeroInstance * getHero() const;
|
||||||
virtual void scrollBackpack(int offset);
|
virtual void scrollBackpack(int offset);
|
||||||
@@ -42,6 +44,7 @@ public:
|
|||||||
virtual void updateBackpackSlots();
|
virtual void updateBackpackSlots();
|
||||||
virtual void updateSlot(const ArtifactPosition & slot);
|
virtual void updateSlot(const ArtifactPosition & slot);
|
||||||
virtual const CArtifactInstance * getPickedArtifact();
|
virtual const CArtifactInstance * getPickedArtifact();
|
||||||
|
void addGestureCallback(CArtPlace::ClickFunctor callback);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const CGHeroInstance * curHero;
|
const CGHeroInstance * curHero;
|
||||||
|
@@ -30,14 +30,15 @@ CArtifactsOfHeroKingdom::CArtifactsOfHeroKingdom(ArtPlaceMap ArtWorn, std::vecto
|
|||||||
{
|
{
|
||||||
artPlace.second->slot = artPlace.first;
|
artPlace.second->slot = artPlace.first;
|
||||||
artPlace.second->setArtifact(nullptr);
|
artPlace.second->setArtifact(nullptr);
|
||||||
artPlace.second->leftClickCallback = std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1);
|
artPlace.second->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||||
artPlace.second->showPopupCallback = std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1);
|
artPlace.second->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||||
}
|
}
|
||||||
|
addGestureCallback(std::bind(&CArtifactsOfHeroBase::gestureArtPlace, this, _1, _2));
|
||||||
for(auto artPlace : backpack)
|
for(auto artPlace : backpack)
|
||||||
{
|
{
|
||||||
artPlace->setArtifact(nullptr);
|
artPlace->setArtifact(nullptr);
|
||||||
artPlace->leftClickCallback = std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1);
|
artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||||
artPlace->showPopupCallback = std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1);
|
artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||||
}
|
}
|
||||||
leftBackpackRoll->addCallback(std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, -1));
|
leftBackpackRoll->addCallback(std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, -1));
|
||||||
rightBackpackRoll->addCallback(std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, +1));
|
rightBackpackRoll->addCallback(std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, +1));
|
||||||
@@ -55,7 +56,7 @@ void CArtifactsOfHeroKingdom::swapArtifacts(const ArtifactLocation & srcLoc, con
|
|||||||
LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
|
LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroKingdom::pickUpArtifact(CHeroArtPlace & artPlace)
|
void CArtifactsOfHeroKingdom::pickUpArtifact(CArtPlace & artPlace)
|
||||||
{
|
{
|
||||||
LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, artPlace.slot),
|
LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, artPlace.slot),
|
||||||
ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS));
|
ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS));
|
||||||
|
@@ -24,5 +24,5 @@ public:
|
|||||||
std::shared_ptr<CButton> leftScroll, std::shared_ptr<CButton> rightScroll);
|
std::shared_ptr<CButton> leftScroll, std::shared_ptr<CButton> rightScroll);
|
||||||
~CArtifactsOfHeroKingdom();
|
~CArtifactsOfHeroKingdom();
|
||||||
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
||||||
void pickUpArtifact(CHeroArtPlace & artPlace);
|
void pickUpArtifact(CArtPlace & artPlace);
|
||||||
};
|
};
|
@@ -19,10 +19,11 @@
|
|||||||
CArtifactsOfHeroMain::CArtifactsOfHeroMain(const Point & position)
|
CArtifactsOfHeroMain::CArtifactsOfHeroMain(const Point & position)
|
||||||
{
|
{
|
||||||
init(
|
init(
|
||||||
std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1),
|
std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2),
|
||||||
std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1),
|
std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2),
|
||||||
position,
|
position,
|
||||||
std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, _1));
|
std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, _1));
|
||||||
|
addGestureCallback(std::bind(&CArtifactsOfHeroBase::gestureArtPlace, this, _1, _2));
|
||||||
}
|
}
|
||||||
|
|
||||||
CArtifactsOfHeroMain::~CArtifactsOfHeroMain()
|
CArtifactsOfHeroMain::~CArtifactsOfHeroMain()
|
||||||
@@ -35,7 +36,7 @@ void CArtifactsOfHeroMain::swapArtifacts(const ArtifactLocation & srcLoc, const
|
|||||||
LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
|
LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactsOfHeroMain::pickUpArtifact(CHeroArtPlace & artPlace)
|
void CArtifactsOfHeroMain::pickUpArtifact(CArtPlace & artPlace)
|
||||||
{
|
{
|
||||||
LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, artPlace.slot),
|
LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, artPlace.slot),
|
||||||
ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS));
|
ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS));
|
||||||
|
@@ -23,5 +23,5 @@ public:
|
|||||||
CArtifactsOfHeroMain(const Point & position);
|
CArtifactsOfHeroMain(const Point & position);
|
||||||
~CArtifactsOfHeroMain();
|
~CArtifactsOfHeroMain();
|
||||||
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
|
||||||
void pickUpArtifact(CHeroArtPlace & artPlace);
|
void pickUpArtifact(CArtPlace & artPlace);
|
||||||
};
|
};
|
||||||
|
@@ -15,8 +15,8 @@
|
|||||||
CArtifactsOfHeroMarket::CArtifactsOfHeroMarket(const Point & position)
|
CArtifactsOfHeroMarket::CArtifactsOfHeroMarket(const Point & position)
|
||||||
{
|
{
|
||||||
init(
|
init(
|
||||||
std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1),
|
std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2),
|
||||||
std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1),
|
std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2),
|
||||||
position,
|
position,
|
||||||
std::bind(&CArtifactsOfHeroMarket::scrollBackpack, this, _1));
|
std::bind(&CArtifactsOfHeroMarket::scrollBackpack, this, _1));
|
||||||
};
|
};
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
class CArtifactsOfHeroMarket : public CArtifactsOfHeroBase
|
class CArtifactsOfHeroMarket : public CArtifactsOfHeroBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
std::function<void(CHeroArtPlace*)> selectArtCallback;
|
std::function<void(CArtPlace*)> selectArtCallback;
|
||||||
|
|
||||||
CArtifactsOfHeroMarket(const Point & position);
|
CArtifactsOfHeroMarket(const Point & position);
|
||||||
void scrollBackpack(int offset) override;
|
void scrollBackpack(int offset) override;
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include "../windows/CHeroWindow.h"
|
#include "../windows/CHeroWindow.h"
|
||||||
#include "../windows/CSpellWindow.h"
|
#include "../windows/CSpellWindow.h"
|
||||||
#include "../windows/GUIClasses.h"
|
#include "../windows/GUIClasses.h"
|
||||||
|
#include "../windows/CHeroBackpackWindow.h"
|
||||||
#include "../CPlayerInterface.h"
|
#include "../CPlayerInterface.h"
|
||||||
#include "../CGameInfo.h"
|
#include "../CGameInfo.h"
|
||||||
|
|
||||||
@@ -39,18 +40,19 @@ void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet)
|
|||||||
|
|
||||||
void CWindowWithArtifacts::addSetAndCallbacks(CArtifactsOfHeroPtr artSet)
|
void CWindowWithArtifacts::addSetAndCallbacks(CArtifactsOfHeroPtr artSet)
|
||||||
{
|
{
|
||||||
CArtifactsOfHeroBase::PutBackPickedArtCallback artPutBackHandler = []() -> void
|
CArtifactsOfHeroBase::PutBackPickedArtCallback artPutBackFunctor = []() -> void
|
||||||
{
|
{
|
||||||
CCS->curh->dragAndDropCursor(nullptr);
|
CCS->curh->dragAndDropCursor(nullptr);
|
||||||
};
|
};
|
||||||
|
|
||||||
addSet(artSet);
|
addSet(artSet);
|
||||||
std::visit([this, artPutBackHandler](auto artSetWeak)
|
std::visit([this, artPutBackFunctor](auto artSetWeak)
|
||||||
{
|
{
|
||||||
auto artSet = artSetWeak.lock();
|
auto artSet = artSetWeak.lock();
|
||||||
artSet->leftClickCallback = std::bind(&CWindowWithArtifacts::leftClickArtPlaceHero, this, _1, _2);
|
artSet->clickPressedCallback = std::bind(&CWindowWithArtifacts::clickPressedArtPlaceHero, this, _1, _2, _3);
|
||||||
artSet->showPopupCallback = std::bind(&CWindowWithArtifacts::rightClickArtPlaceHero, this, _1, _2);
|
artSet->showPopupCallback = std::bind(&CWindowWithArtifacts::showPopupArtPlaceHero, this, _1, _2, _3);
|
||||||
artSet->setPutBackPickedArtifactCallback(artPutBackHandler);
|
artSet->gestureCallback = std::bind(&CWindowWithArtifacts::gestureArtPlaceHero, this, _1, _2, _3);
|
||||||
|
artSet->setPutBackPickedArtifactCallback(artPutBackFunctor);
|
||||||
}, artSet);
|
}, artSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +79,7 @@ const CArtifactInstance * CWindowWithArtifacts::getPickedArtifact()
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWindowWithArtifacts::leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace)
|
void CWindowWithArtifacts::clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition)
|
||||||
{
|
{
|
||||||
const auto artSetWeak = findAOHbyRef(artsInst);
|
const auto artSetWeak = findAOHbyRef(artsInst);
|
||||||
assert(artSetWeak.has_value());
|
assert(artSetWeak.has_value());
|
||||||
@@ -85,7 +87,7 @@ void CWindowWithArtifacts::leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst
|
|||||||
if(artPlace.isLocked())
|
if(artPlace.isLocked())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const auto checkSpecialArts = [](const CGHeroInstance * hero, CHeroArtPlace & artPlace) -> bool
|
const auto checkSpecialArts = [](const CGHeroInstance * hero, CArtPlace & artPlace) -> bool
|
||||||
{
|
{
|
||||||
if(artPlace.getArt()->getTypeId() == ArtifactID::SPELLBOOK)
|
if(artPlace.getArt()->getTypeId() == ArtifactID::SPELLBOOK)
|
||||||
{
|
{
|
||||||
@@ -206,10 +208,18 @@ void CWindowWithArtifacts::leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if constexpr(std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroQuickBackpack>>)
|
||||||
|
{
|
||||||
|
const auto hero = artSetPtr->getHero();
|
||||||
|
artSetPtr->swapArtifacts(ArtifactLocation(hero->id, artPlace.slot),
|
||||||
|
ArtifactLocation(hero->id, artSetPtr->getFilterSlot()));
|
||||||
|
if(closeCallback)
|
||||||
|
closeCallback();
|
||||||
|
}
|
||||||
}, artSetWeak.value());
|
}, artSetWeak.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWindowWithArtifacts::rightClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace)
|
void CWindowWithArtifacts::showPopupArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition)
|
||||||
{
|
{
|
||||||
const auto artSetWeak = findAOHbyRef(artsInst);
|
const auto artSetWeak = findAOHbyRef(artsInst);
|
||||||
assert(artSetWeak.has_value());
|
assert(artSetWeak.has_value());
|
||||||
@@ -218,7 +228,7 @@ void CWindowWithArtifacts::rightClickArtPlaceHero(CArtifactsOfHeroBase & artsIns
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
std::visit(
|
std::visit(
|
||||||
[&artPlace](auto artSetWeak) -> void
|
[&artPlace, &cursorPosition](auto artSetWeak) -> void
|
||||||
{
|
{
|
||||||
const auto artSetPtr = artSetWeak.lock();
|
const auto artSetPtr = artSetWeak.lock();
|
||||||
|
|
||||||
@@ -239,16 +249,40 @@ void CWindowWithArtifacts::rightClickArtPlaceHero(CArtifactsOfHeroBase & artsIns
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(artPlace.text.size())
|
if(artPlace.text.size())
|
||||||
artPlace.LRClickableAreaWTextComp::showPopupWindow(GH.getCursorPosition());
|
artPlace.LRClickableAreaWTextComp::showPopupWindow(cursorPosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Altar window, Market window right click handler
|
// Altar window, Market window right click handler
|
||||||
else if constexpr(
|
else if constexpr(
|
||||||
std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroAltar>> ||
|
std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroAltar>> ||
|
||||||
std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroMarket>>)
|
std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroMarket>> ||
|
||||||
|
std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroQuickBackpack>>)
|
||||||
{
|
{
|
||||||
if(artPlace.getArt() && artPlace.text.size())
|
if(artPlace.getArt() && artPlace.text.size())
|
||||||
artPlace.LRClickableAreaWTextComp::showPopupWindow(GH.getCursorPosition());
|
artPlace.LRClickableAreaWTextComp::showPopupWindow(cursorPosition);
|
||||||
|
}
|
||||||
|
}, artSetWeak.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWindowWithArtifacts::gestureArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition)
|
||||||
|
{
|
||||||
|
const auto artSetWeak = findAOHbyRef(artsInst);
|
||||||
|
assert(artSetWeak.has_value());
|
||||||
|
if(artPlace.isLocked())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::visit(
|
||||||
|
[&artPlace, cursorPosition](auto artSetWeak) -> void
|
||||||
|
{
|
||||||
|
const auto artSetPtr = artSetWeak.lock();
|
||||||
|
if constexpr(
|
||||||
|
std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroMain>> ||
|
||||||
|
std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroKingdom>>)
|
||||||
|
{
|
||||||
|
GH.windows().createAndPushWindow<CHeroQuickBackpackWindow>(artSetPtr->getHero(), artPlace.slot);
|
||||||
|
auto backpackWindow = GH.windows().topWindow<CHeroQuickBackpackWindow>();
|
||||||
|
backpackWindow->moveTo(cursorPosition - Point(1, 1));
|
||||||
|
backpackWindow->fitToScreen(15);
|
||||||
}
|
}
|
||||||
}, artSetWeak.value());
|
}, artSetWeak.value());
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,8 @@ public:
|
|||||||
std::weak_ptr<CArtifactsOfHeroAltar>,
|
std::weak_ptr<CArtifactsOfHeroAltar>,
|
||||||
std::weak_ptr<CArtifactsOfHeroKingdom>,
|
std::weak_ptr<CArtifactsOfHeroKingdom>,
|
||||||
std::weak_ptr<CArtifactsOfHeroMain>,
|
std::weak_ptr<CArtifactsOfHeroMain>,
|
||||||
std::weak_ptr<CArtifactsOfHeroBackpack>>;
|
std::weak_ptr<CArtifactsOfHeroBackpack>,
|
||||||
|
std::weak_ptr<CArtifactsOfHeroQuickBackpack>>;
|
||||||
using CloseCallback = std::function<void()>;
|
using CloseCallback = std::function<void()>;
|
||||||
|
|
||||||
void addSet(CArtifactsOfHeroPtr artSet);
|
void addSet(CArtifactsOfHeroPtr artSet);
|
||||||
@@ -32,8 +33,9 @@ public:
|
|||||||
void addCloseCallback(CloseCallback callback);
|
void addCloseCallback(CloseCallback callback);
|
||||||
const CGHeroInstance * getHeroPickedArtifact();
|
const CGHeroInstance * getHeroPickedArtifact();
|
||||||
const CArtifactInstance * getPickedArtifact();
|
const CArtifactInstance * getPickedArtifact();
|
||||||
void leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace);
|
void clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
|
||||||
void rightClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace);
|
void showPopupArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
|
||||||
|
void gestureArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
|
||||||
|
|
||||||
void artifactRemoved(const ArtifactLocation & artLoc) override;
|
void artifactRemoved(const ArtifactLocation & artLoc) override;
|
||||||
void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override;
|
void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override;
|
||||||
|
@@ -22,25 +22,19 @@
|
|||||||
CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero)
|
CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero)
|
||||||
: CWindowObject((EOptions)0)
|
: CWindowObject((EOptions)0)
|
||||||
{
|
{
|
||||||
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
|
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
|
||||||
|
|
||||||
stretchedBackground = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), Rect(0, 0, 410, 425));
|
stretchedBackground = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), Rect(0, 0, 0, 0));
|
||||||
|
arts = std::make_shared<CArtifactsOfHeroBackpack>();
|
||||||
arts = std::make_shared<CArtifactsOfHeroBackpack>(Point(windowMargin, windowMargin));
|
arts->moveBy(Point(windowMargin, windowMargin));
|
||||||
arts->setHero(hero);
|
|
||||||
addSetAndCallbacks(arts);
|
addSetAndCallbacks(arts);
|
||||||
|
arts->setHero(hero);
|
||||||
addCloseCallback(std::bind(&CHeroBackpackWindow::close, this));
|
addCloseCallback(std::bind(&CHeroBackpackWindow::close, this));
|
||||||
|
|
||||||
quitButton = std::make_shared<CButton>(Point(), AnimationPath::builtin("IOKAY32.def"), CButton::tooltip(""), [this]() { close(); }, EShortcut::GLOBAL_RETURN);
|
quitButton = std::make_shared<CButton>(Point(), AnimationPath::builtin("IOKAY32.def"), CButton::tooltip(""), [this]() { close(); }, EShortcut::GLOBAL_RETURN);
|
||||||
|
pos.w = stretchedBackground->pos.w = arts->pos.w + 2 * windowMargin;
|
||||||
stretchedBackground->pos.w = arts->pos.w + 2 * windowMargin;
|
pos.h = stretchedBackground->pos.h = arts->pos.h + quitButton->pos.h + 3 * windowMargin;
|
||||||
stretchedBackground->pos.h = arts->pos.h + quitButton->pos.h + 3 * windowMargin;
|
quitButton->moveTo(Point(pos.x + pos.w / 2 - quitButton->pos.w / 2, pos.y + arts->pos.h + 2 * windowMargin));
|
||||||
pos.w = stretchedBackground->pos.w;
|
|
||||||
pos.h = stretchedBackground->pos.h;
|
|
||||||
center();
|
center();
|
||||||
|
|
||||||
quitButton->moveBy(Point(GH.screenDimensions().x / 2 - quitButton->pos.w / 2 - quitButton->pos.x, arts->pos.h + 2 * windowMargin));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHeroBackpackWindow::showAll(Canvas & to)
|
void CHeroBackpackWindow::showAll(Canvas & to)
|
||||||
@@ -48,3 +42,46 @@ void CHeroBackpackWindow::showAll(Canvas & to)
|
|||||||
CIntObject::showAll(to);
|
CIntObject::showAll(to);
|
||||||
CMessage::drawBorder(PlayerColor(LOCPLINT->playerID), to.getInternalSurface(), pos.w+28, pos.h+29, pos.x-14, pos.y-15);
|
CMessage::drawBorder(PlayerColor(LOCPLINT->playerID), to.getInternalSurface(), pos.w+28, pos.h+29, pos.x-14, pos.y-15);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CHeroQuickBackpackWindow::CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot)
|
||||||
|
: CWindowObject((EOptions)0)
|
||||||
|
{
|
||||||
|
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
|
||||||
|
|
||||||
|
stretchedBackground = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), Rect(0, 0, 0, 0));
|
||||||
|
arts = std::make_shared<CArtifactsOfHeroQuickBackpack>(targetSlot);
|
||||||
|
arts->moveBy(Point(windowMargin, windowMargin));
|
||||||
|
addSetAndCallbacks(static_cast<std::weak_ptr<CArtifactsOfHeroQuickBackpack>>(arts));
|
||||||
|
arts->setHero(hero);
|
||||||
|
addCloseCallback(std::bind(&CHeroQuickBackpackWindow::close, this));
|
||||||
|
addUsedEvents(GESTURE);
|
||||||
|
pos.w = stretchedBackground->pos.w = arts->pos.w + 2 * windowMargin;
|
||||||
|
pos.h = stretchedBackground->pos.h = arts->pos.h + windowMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHeroQuickBackpackWindow::gesture(bool on, const Point & initialPosition, const Point & finalPosition)
|
||||||
|
{
|
||||||
|
if(on)
|
||||||
|
return;
|
||||||
|
|
||||||
|
arts->swapSelected();
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHeroQuickBackpackWindow::gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance)
|
||||||
|
{
|
||||||
|
arts->selectSlotAt(currentPosition);
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHeroQuickBackpackWindow::showAll(Canvas & to)
|
||||||
|
{
|
||||||
|
if(arts->getSlotsNum() == 0)
|
||||||
|
{
|
||||||
|
// Dirty solution for closing that window
|
||||||
|
close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CMessage::drawBorder(PlayerColor(LOCPLINT->playerID), to.getInternalSurface(), pos.w + 28, pos.h + 29, pos.x - 14, pos.y - 15);
|
||||||
|
CIntObject::showAll(to);
|
||||||
|
}
|
||||||
|
@@ -19,11 +19,26 @@ class CHeroBackpackWindow : public CWindowObject, public CWindowWithArtifacts
|
|||||||
public:
|
public:
|
||||||
CHeroBackpackWindow(const CGHeroInstance * hero);
|
CHeroBackpackWindow(const CGHeroInstance * hero);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
std::shared_ptr<CArtifactsOfHeroBackpack> arts;
|
std::shared_ptr<CArtifactsOfHeroBackpack> arts;
|
||||||
std::shared_ptr<CButton> quitButton;
|
std::shared_ptr<CButton> quitButton;
|
||||||
std::shared_ptr<CFilledTexture> stretchedBackground;
|
std::shared_ptr<CFilledTexture> stretchedBackground;
|
||||||
const int windowMargin = 10;
|
const int windowMargin = 5;
|
||||||
|
|
||||||
|
void showAll(Canvas & to) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CHeroQuickBackpackWindow : public CWindowObject, public CWindowWithArtifacts
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot);
|
||||||
|
void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override;
|
||||||
|
void gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<CArtifactsOfHeroQuickBackpack> arts;
|
||||||
|
std::shared_ptr<CFilledTexture> stretchedBackground;
|
||||||
|
const int windowMargin = 5;
|
||||||
|
|
||||||
void showAll(Canvas & to) override;
|
void showAll(Canvas & to) override;
|
||||||
};
|
};
|
||||||
|
@@ -111,6 +111,5 @@ public:
|
|||||||
void createBackpackWindow();
|
void createBackpackWindow();
|
||||||
|
|
||||||
//friends
|
//friends
|
||||||
friend void CHeroArtPlace::clickPressed(const Point & cursorPosition);
|
|
||||||
friend class CPlayerInterface;
|
friend class CPlayerInterface;
|
||||||
};
|
};
|
||||||
|
@@ -331,7 +331,7 @@ void CTradeWindow::setMode(EMarketMode Mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTradeWindow::artifactSelected(CHeroArtPlace *slot)
|
void CTradeWindow::artifactSelected(CArtPlace * slot)
|
||||||
{
|
{
|
||||||
assert(mode == EMarketMode::ARTIFACT_RESOURCE);
|
assert(mode == EMarketMode::ARTIFACT_RESOURCE);
|
||||||
items[1][0]->setArtInstance(slot->getArt());
|
items[1][0]->setArtInstance(slot->getArt());
|
||||||
|
@@ -40,7 +40,7 @@ public:
|
|||||||
void getPositionsFor(std::vector<Rect> &poss, bool Left, EType type) const;
|
void getPositionsFor(std::vector<Rect> &poss, bool Left, EType type) const;
|
||||||
void setMode(EMarketMode Mode); //mode setter
|
void setMode(EMarketMode Mode); //mode setter
|
||||||
|
|
||||||
void artifactSelected(CHeroArtPlace *slot); //used when selling artifacts -> called when user clicked on artifact slot
|
void artifactSelected(CArtPlace * slot); //used when selling artifacts -> called when user clicked on artifact slot
|
||||||
virtual void selectionChanged(bool side) = 0; //true == left
|
virtual void selectionChanged(bool side) = 0; //true == left
|
||||||
virtual Point selectionOffset(bool Left) const = 0;
|
virtual Point selectionOffset(bool Left) const = 0;
|
||||||
virtual std::string updateSlotSubtitle(bool Left) const = 0;
|
virtual std::string updateSlotSubtitle(bool Left) const = 0;
|
||||||
|
@@ -64,10 +64,7 @@ SpellID CScrollArtifactInstance::getScrollSpellID() const
|
|||||||
auto artInst = static_cast<const CArtifactInstance*>(this);
|
auto artInst = static_cast<const CArtifactInstance*>(this);
|
||||||
const auto bonus = artInst->getBonusLocalFirst(Selector::type()(BonusType::SPELL));
|
const auto bonus = artInst->getBonusLocalFirst(Selector::type()(BonusType::SPELL));
|
||||||
if(!bonus)
|
if(!bonus)
|
||||||
{
|
|
||||||
logMod->warn("Warning: %s doesn't bear any spell!", artInst->nodeName());
|
|
||||||
return SpellID::NONE;
|
return SpellID::NONE;
|
||||||
}
|
|
||||||
return bonus->subtype.as<SpellID>();
|
return bonus->subtype.as<SpellID>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,6 +162,11 @@ bool CArtifactInstance::isCombined() const
|
|||||||
return artType->isCombined();
|
return artType->isCombined();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CArtifactInstance::isScroll() const
|
||||||
|
{
|
||||||
|
return artType->isScroll();
|
||||||
|
}
|
||||||
|
|
||||||
void CArtifactInstance::putAt(CArtifactSet & set, const ArtifactPosition slot)
|
void CArtifactInstance::putAt(CArtifactSet & set, const ArtifactPosition slot)
|
||||||
{
|
{
|
||||||
auto placementMap = set.putArtifact(slot, this);
|
auto placementMap = set.putArtifact(slot, this);
|
||||||
|
@@ -87,6 +87,7 @@ public:
|
|||||||
bool canBePutAt(const CArtifactSet * artSet, ArtifactPosition slot = ArtifactPosition::FIRST_AVAILABLE,
|
bool canBePutAt(const CArtifactSet * artSet, ArtifactPosition slot = ArtifactPosition::FIRST_AVAILABLE,
|
||||||
bool assumeDestRemoved = false) const;
|
bool assumeDestRemoved = false) const;
|
||||||
bool isCombined() const;
|
bool isCombined() const;
|
||||||
|
bool isScroll() const;
|
||||||
void putAt(CArtifactSet & set, const ArtifactPosition slot);
|
void putAt(CArtifactSet & set, const ArtifactPosition slot);
|
||||||
void removeFrom(CArtifactSet & set, const ArtifactPosition slot);
|
void removeFrom(CArtifactSet & set, const ArtifactPosition slot);
|
||||||
void move(CArtifactSet & srcSet, const ArtifactPosition srcSlot, CArtifactSet & dstSet, const ArtifactPosition dstSlot);
|
void move(CArtifactSet & srcSet, const ArtifactPosition srcSlot, CArtifactSet & dstSet, const ArtifactPosition dstSlot);
|
||||||
|
Reference in New Issue
Block a user