diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-02-21 16:03:27 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-02-25 18:28:11 +0100 |
commit | cca8b9c59a83d865ed1c64cef4f5c098f0c78bf9 (patch) | |
tree | 2e64a266dba73f41d1f75a6b04093bbe2fa49aec /src | |
parent | 46e5338fc2f341bca9e3be1994ebf3067b0c7cb9 (diff) | |
download | mana-cca8b9c59a83d865ed1c64cef4f5c098f0c78bf9.tar.gz mana-cca8b9c59a83d865ed1c64cef4f5c098f0c78bf9.tar.bz2 mana-cca8b9c59a83d865ed1c64cef4f5c098f0c78bf9.tar.xz mana-cca8b9c59a83d865ed1c64cef4f5c098f0c78bf9.zip |
Some code cleanups related to status icons
Fixed leaking of Sprite instances.
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/ministatuswindow.cpp | 29 | ||||
-rw-r--r-- | src/gui/ministatuswindow.h | 4 | ||||
-rw-r--r-- | src/gui/viewport.cpp | 2 | ||||
-rw-r--r-- | src/sprite.cpp | 2 | ||||
-rw-r--r-- | src/statuseffect.cpp | 14 | ||||
-rw-r--r-- | src/statuseffect.h | 5 |
6 files changed, 23 insertions, 33 deletions
diff --git a/src/gui/ministatuswindow.cpp b/src/gui/ministatuswindow.cpp index 534a5c42..08656f78 100644 --- a/src/gui/ministatuswindow.cpp +++ b/src/gui/ministatuswindow.cpp @@ -95,13 +95,14 @@ MiniStatusWindow::MiniStatusWindow(): addMouseListener(this); } +MiniStatusWindow::~MiniStatusWindow() = default; + void MiniStatusWindow::setIcon(int index, Sprite *sprite) { if (index >= (int) mIcons.size()) mIcons.resize(index + 1); - delete mIcons[index]; - mIcons[index] = sprite; + mIcons[index].reset(sprite); } void MiniStatusWindow::eraseIcon(int index) @@ -115,16 +116,12 @@ void MiniStatusWindow::drawIcons(Graphics *graphics) int icon_x = mXpBar->getX() + mXpBar->getWidth() + 14; for (auto &icon : mIcons) { - if (icon) - { - icon->draw(graphics, icon_x, 3); - icon_x += 2 + icon->getWidth(); - } + icon->draw(graphics, icon_x, 3); + icon_x += 2 + icon->getWidth(); } } -void MiniStatusWindow::event(Event::Channel channel, - const Event &event) +void MiniStatusWindow::event(Event::Channel channel, const Event &event) { if (channel == Event::AttributesChannel) { @@ -160,10 +157,7 @@ void MiniStatusWindow::event(Event::Channel channel, int index = event.getInt("index"); bool newStatus = event.getBool("newStatus"); - StatusEffect *effect = StatusEffect::getStatusEffect(index, - newStatus); - - if (effect) + if (auto effect = StatusEffect::getStatusEffect(index, newStatus)) { effect->deliverMessage(); effect->playSFX(); @@ -178,7 +172,7 @@ void MiniStatusWindow::event(Event::Channel channel, { mStatusEffectIcons.erase(mStatusEffectIcons.begin() + i); - miniStatusWindow->eraseIcon(i); + eraseIcon(i); } else i++; @@ -192,7 +186,7 @@ void MiniStatusWindow::event(Event::Channel channel, i++) if (mStatusEffectIcons[i] == index) { - miniStatusWindow->setIcon(i, sprite); + setIcon(i, sprite); found = true; break; } @@ -200,7 +194,7 @@ void MiniStatusWindow::event(Event::Channel channel, if (!found) { // add new int offset = mStatusEffectIcons.size(); - miniStatusWindow->setIcon(offset, sprite); + setIcon(offset, sprite); mStatusEffectIcons.push_back(index); } } @@ -227,8 +221,7 @@ void MiniStatusWindow::logic() */ for (auto &icon : mIcons) - if (icon) - icon->update(Time::deltaTimeMs()); + icon->update(Time::deltaTimeMs()); } void MiniStatusWindow::mouseMoved(gcn::MouseEvent &event) diff --git a/src/gui/ministatuswindow.h b/src/gui/ministatuswindow.h index b496fb00..a92ab63a 100644 --- a/src/gui/ministatuswindow.h +++ b/src/gui/ministatuswindow.h @@ -25,6 +25,7 @@ #include "gui/widgets/popup.h" +#include <memory> #include <vector> class Sprite; @@ -41,6 +42,7 @@ class MiniStatusWindow : public Popup, public EventListener { public: MiniStatusWindow(); + ~MiniStatusWindow() override; void drawIcons(Graphics *graphics); @@ -73,7 +75,7 @@ class MiniStatusWindow : public Popup, public EventListener TextPopup *mTextPopup; std::vector<int> mStatusEffectIcons; - std::vector<Sprite *> mIcons; + std::vector<std::unique_ptr<Sprite>> mIcons; }; extern MiniStatusWindow *miniStatusWindow; diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 558ce0e6..fba08a9a 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -237,6 +237,8 @@ void Viewport::draw(gcn::Graphics *gcnGraphics) } } + // The icons for the MiniStatusWindow are drawn here, otherwise they would + // be clipped by the window. if (miniStatusWindow) miniStatusWindow->drawIcons(graphics); diff --git a/src/sprite.cpp b/src/sprite.cpp index 1e8f9923..3d9608f3 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -138,7 +138,7 @@ bool Sprite::draw(Graphics *graphics, int posX, int posY) const return false; if (!mFrame->image) - return false; + return false; if (mFrame->image->getAlpha() != mAlpha) mFrame->image->setAlpha(mAlpha); diff --git a/src/statuseffect.cpp b/src/statuseffect.cpp index a493b24f..9c13d037 100644 --- a/src/statuseffect.cpp +++ b/src/statuseffect.cpp @@ -47,26 +47,18 @@ void StatusEffect::deliverMessage() serverNotice(mMessage); } -Particle *StatusEffect::getParticle() +Particle *StatusEffect::getParticle() const { if (mParticleEffect.empty()) return nullptr; return particleEngine->addEffect(mParticleEffect, 0, 0); } -Sprite *StatusEffect::getIcon() +Sprite *StatusEffect::getIcon() const { if (mIcon.empty()) return nullptr; - - Sprite *sprite = Sprite::load( - paths.getStringValue("sprites") + mIcon); - if (false && sprite) - { - sprite->play(SpriteAction::DEFAULT); - sprite->reset(); - } - return sprite; + return Sprite::load(paths.getStringValue("sprites") + mIcon); } std::string StatusEffect::getAction() const diff --git a/src/statuseffect.h b/src/statuseffect.h index d07609cc..62961db9 100644 --- a/src/statuseffect.h +++ b/src/statuseffect.h @@ -47,12 +47,12 @@ public: * Creates the particle effect associated with this status effect, if * possible. */ - Particle *getParticle(); + Particle *getParticle() const; /** * Retrieves the status icon for this effect, if applicable */ - Sprite *getIcon(); + Sprite *getIcon() const; /** * Retrieves an action to perform, or SpriteAction::INVALID @@ -100,6 +100,7 @@ public: static void checkStatus(); static void unload(); + private: static bool mLoaded; |