summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-02-21 16:03:27 +0100
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-02-25 18:28:11 +0100
commitcca8b9c59a83d865ed1c64cef4f5c098f0c78bf9 (patch)
tree2e64a266dba73f41d1f75a6b04093bbe2fa49aec /src
parent46e5338fc2f341bca9e3be1994ebf3067b0c7cb9 (diff)
downloadmana-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.cpp29
-rw-r--r--src/gui/ministatuswindow.h4
-rw-r--r--src/gui/viewport.cpp2
-rw-r--r--src/sprite.cpp2
-rw-r--r--src/statuseffect.cpp14
-rw-r--r--src/statuseffect.h5
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;