https://github.com/libsdl-org/Maelstrom/commit/b9b578ee3e34022cf18af1615e50d9dc6e3bdd6f
From b9b578ee3e34022cf18af1615e50d9dc6e3bdd6f Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 25 Oct 2011 00:57:39 -0400
Subject: [PATCH] Generalized the concept of click callback to a button
delegate in case we add other functionality.
---
main.cpp | 22 +++++++++++-----------
screenlib/UIElementButton.cpp | 26 +++++++++++++-------------
screenlib/UIElementButton.h | 11 ++++++-----
3 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/main.cpp b/main.cpp
index 6a9a4ed7..3a0254b7 100644
--- a/main.cpp
+++ b/main.cpp
@@ -120,10 +120,10 @@ static void RunScreenshot(void)
screen->ScreenDump("ScoreDump", 64, 48, 298, 384);
}
-class SetVolumeCallback : public UIButtonCallback
+class SetVolumeDelegate : public UIButtonDelegate
{
public:
- SetVolumeCallback(int volume) : m_volume(volume) { }
+ SetVolumeDelegate(int volume) : m_volume(volume) { }
virtual void OnClick() {
SetSoundLevel(m_volume);
@@ -436,39 +436,39 @@ void SetupMainScreen()
button = panel->GetElement<UIElementButton>("SetVolume0");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(0));
+ button->SetButtonDelegate(new SetVolumeDelegate(0));
}
button = panel->GetElement<UIElementButton>("SetVolume1");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(1));
+ button->SetButtonDelegate(new SetVolumeDelegate(1));
}
button = panel->GetElement<UIElementButton>("SetVolume2");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(2));
+ button->SetButtonDelegate(new SetVolumeDelegate(2));
}
button = panel->GetElement<UIElementButton>("SetVolume3");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(3));
+ button->SetButtonDelegate(new SetVolumeDelegate(3));
}
button = panel->GetElement<UIElementButton>("SetVolume4");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(4));
+ button->SetButtonDelegate(new SetVolumeDelegate(4));
}
button = panel->GetElement<UIElementButton>("SetVolume5");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(5));
+ button->SetButtonDelegate(new SetVolumeDelegate(5));
}
button = panel->GetElement<UIElementButton>("SetVolume6");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(6));
+ button->SetButtonDelegate(new SetVolumeDelegate(6));
}
button = panel->GetElement<UIElementButton>("SetVolume7");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(7));
+ button->SetButtonDelegate(new SetVolumeDelegate(7));
}
button = panel->GetElement<UIElementButton>("SetVolume8");
if (button) {
- button->SetClickCallback(new SetVolumeCallback(8));
+ button->SetButtonDelegate(new SetVolumeDelegate(8));
}
DrawMainScreen();
diff --git a/screenlib/UIElementButton.cpp b/screenlib/UIElementButton.cpp
index 0bbe3ed4..fd313818 100644
--- a/screenlib/UIElementButton.cpp
+++ b/screenlib/UIElementButton.cpp
@@ -25,10 +25,10 @@
#include "UIElementButton.h"
-class SimpleButtonCallback : public UIButtonCallback
+class SimpleButtonDelegate : public UIButtonDelegate
{
public:
- SimpleButtonCallback(void (*callback)(void)) {
+ SimpleButtonDelegate(void (*callback)(void)) {
m_callback = callback;
}
@@ -52,7 +52,8 @@ UIElementButton::UIElementButton(UIPanel *panel, const char *name) :
m_mousePressed = false;
m_clickSound = 0;
m_clickPanel = NULL;
- m_callback = NULL;
+ m_delegate = NULL;
+ m_deleteDelegate = false;
}
UIElementButton::~UIElementButton()
@@ -60,9 +61,7 @@ UIElementButton::~UIElementButton()
if (m_clickPanel) {
delete[] m_clickPanel;
}
- if (m_callback) {
- delete m_callback;
- }
+ SetButtonDelegate(NULL);
}
bool
@@ -212,22 +211,23 @@ UIElementButton::OnClick()
if (m_clickPanel) {
m_panel->GetUI()->ShowPanel(m_clickPanel);
}
- if (m_callback) {
- m_callback->OnClick();
+ if (m_delegate) {
+ m_delegate->OnClick();
}
}
void
UIElementButton::SetClickCallback(void (*callback)(void))
{
- SetClickCallback(new SimpleButtonCallback(callback));
+ SetButtonDelegate(new SimpleButtonDelegate(callback));
}
void
-UIElementButton::SetClickCallback(UIButtonCallback *callback)
+UIElementButton::SetButtonDelegate(UIButtonDelegate *delegate, bool autodelete)
{
- if (m_callback) {
- delete m_callback;
+ if (m_delegate && m_deleteDelegate) {
+ delete m_delegate;
}
- m_callback = callback;
+ m_delegate = delegate;
+ m_deleteDelegate = autodelete;
}
diff --git a/screenlib/UIElementButton.h b/screenlib/UIElementButton.h
index eeb63b81..a299857c 100644
--- a/screenlib/UIElementButton.h
+++ b/screenlib/UIElementButton.h
@@ -25,10 +25,10 @@
#include "UIElement.h"
-class UIButtonCallback
+class UIButtonDelegate
{
public:
- virtual void OnClick() = 0;
+ virtual void OnClick() { }
};
class UIElementButton : public UIElement
@@ -52,9 +52,9 @@ class UIElementButton : public UIElement
virtual void OnMouseUp() { }
virtual void OnClick();
- /* This class owns this callback object and will delete it */
+ /* Setting a click callback sets a simplified delegate */
void SetClickCallback(void (*callback)(void));
- void SetClickCallback(UIButtonCallback *callback);
+ void SetButtonDelegate(UIButtonDelegate *delegate, bool autodelete = true);
protected:
SDL_Keycode m_hotkey;
@@ -63,7 +63,8 @@ class UIElementButton : public UIElement
bool m_mousePressed;
int m_clickSound;
char *m_clickPanel;
- UIButtonCallback *m_callback;
+ UIButtonDelegate *m_delegate;
+ bool m_deleteDelegate;
protected:
bool ShouldHandleKey(SDL_Keycode key);