Maelstrom: Generalized the concept of click callback to a button delegate in case we add other functionality.

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);