瀏覽代碼

add a RAII wx connect wrapper

jp9000 12 年之前
父節點
當前提交
fa00c6fa47
共有 2 個文件被更改,包括 71 次插入12 次删除
  1. 4 11
      obs/settings-basic-general.cpp
  2. 67 1
      obs/wx-wrappers.hpp

+ 4 - 11
obs/settings-basic-general.cpp

@@ -20,10 +20,12 @@
 #include "obs-app.hpp"
 #include "settings-basic.hpp"
 #include "window-settings-basic.hpp"
+#include "wx-wrappers.hpp"
 #include "platform.hpp"
 
 class GeneralSettings : public BasicSettingsData {
 	ConfigFile localeIni;
+	WXConnector languageBoxConnector;
 
 	void LanguageChanged(wxCommandEvent &event);
 
@@ -32,7 +34,6 @@ class GeneralSettings : public BasicSettingsData {
 
 public:
 	GeneralSettings(OBSBasicSettings *window);
-	virtual ~GeneralSettings();
 
 	virtual void Apply();
 };
@@ -86,16 +87,8 @@ GeneralSettings::GeneralSettings(OBSBasicSettings *window)
 			"General", "Language");
 	FillLanguageList(currentLang);
 
-	window->languageList->Connect(
-			wxEVT_COMBOBOX,
-			wxCommandEventHandler(GeneralSettings::LanguageChanged),
-			NULL,
-			this);
-}
-
-GeneralSettings::~GeneralSettings()
-{
-	window->languageList->Disconnect(
+	languageBoxConnector.Connect(
+			window->languageList,
 			wxEVT_COMBOBOX,
 			wxCommandEventHandler(GeneralSettings::LanguageChanged),
 			NULL,

+ 67 - 1
obs/wx-wrappers.hpp

@@ -17,8 +17,74 @@
 
 #pragma once
 
+#include <wx/window.h>
+#include <wx/event.h>
+
 struct gs_window;
-class wxWindow;
 
 gs_window WxToGSWindow(const wxWindow *window);
 void OBSErrorBox(wxWindow *parent, const char *message, ...);
+
+/*
+ * RAII wx connection wrapper
+ *
+ *   Automatically disconnects events on destruction rather than having to
+ * manually call Disconnect for every Connect.
+ */
+
+class WXConnector {
+	wxEvtHandler          *obj;
+	wxEventType           eventType;
+	wxObjectEventFunction func;
+	wxObject              *userData;
+	wxEvtHandler          *eventSink;
+
+public:
+	inline WXConnector()
+		: obj       (NULL),
+		  eventType (0),
+		  func      (NULL),
+		  userData  (NULL),
+		  eventSink (NULL)
+	{
+	}
+
+	inline WXConnector(wxEvtHandler *obj, wxEventType eventType,
+			wxObjectEventFunction func, wxObject *userData,
+			wxEvtHandler *eventSink)
+		: obj       (obj),
+		  eventType (eventType),
+		  func      (func),
+		  userData  (userData),
+		  eventSink (eventSink)
+	{
+		obj->Connect(eventType, func, userData, eventSink);
+	}
+
+	inline ~WXConnector()
+	{
+		Disconnect();
+	}
+
+	inline void Connect(wxEvtHandler *obj, wxEventType eventType,
+			wxObjectEventFunction func, wxObject *userData,
+			wxEvtHandler *eventSink)
+	{
+		Disconnect();
+
+		this->obj       = obj;
+		this->eventType = eventType;
+		this->func      = func;
+		this->userData  = userData;
+		this->eventSink = eventSink;
+
+		obj->Connect(eventType, func, userData, eventSink);
+	}
+
+	inline void Disconnect()
+	{
+		if (obj)
+			obj->Disconnect(eventType, func, userData, eventSink);
+		obj = NULL;
+	}
+};