提交 fa00c6fa 编写于 作者: J jp9000

add a RAII wx connect wrapper

上级 40f922ca
......@@ -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,
......
......@@ -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;
}
};
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册