Skip to content

Commit ea858af

Browse files
committed
[WIP] wxOverlay experiment
1 parent 7b0362b commit ea858af

File tree

7 files changed

+1517
-1075
lines changed

7 files changed

+1517
-1075
lines changed

src/ProxyDropTarget.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,32 @@ void REHex::DropEvent::RejectData()
117117
assert(GetEventType() == DROP_DROP);
118118
m_accept = false;
119119
}
120+
121+
REHex::ScopedProxyDropTarget::ScopedProxyDropTarget(wxWindow *window, wxEvtHandler *handler, wxDataObject *data)
122+
{
123+
Add(window, handler, data);
124+
}
125+
126+
REHex::ScopedProxyDropTarget::~ScopedProxyDropTarget()
127+
{
128+
for(auto it = m_windows.begin(); it != m_windows.end(); ++it)
129+
{
130+
if(*it)
131+
{
132+
(*it)->SetDropTarget(NULL);
133+
}
134+
}
135+
}
136+
137+
REHex::ProxyDropTarget *REHex::ScopedProxyDropTarget::Add(wxWindow *window, wxEvtHandler *handler, wxDataObject *data)
138+
{
139+
/* wxWidgets will destroy any existing drop target, so we can't restore it afterwards. */
140+
assert(window->GetDropTarget() == NULL);
141+
142+
ProxyDropTarget *target = new ProxyDropTarget(handler, data);
143+
144+
window->SetDropTarget(target);
145+
m_windows.emplace_back(window);
146+
147+
return target;
148+
}

src/ProxyDropTarget.hpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@
1818
#ifndef REHEX_PROXYDROPTARGET_HPP
1919
#define REHEX_PROXYDROPTARGET_HPP
2020

21+
#include <vector>
2122
#include <wx/dnd.h>
2223
#include <wx/event.h>
24+
#include <wx/window.h>
25+
26+
#include "SafeWindowPointer.hpp"
2327

2428
namespace REHex
2529
{
@@ -127,6 +131,57 @@ namespace REHex
127131

128132
friend ProxyDropTarget;
129133
};
134+
135+
/**
136+
* @brief Temporary construction/assignment of ProxyDropTarget to window(s).
137+
*
138+
* This class creates ProxyDropTarget objects and temporarily assigns them to windows, removing
139+
* them when the ScopedProxyDropTarget is destroyed.
140+
*/
141+
class ScopedProxyDropTarget
142+
{
143+
public:
144+
/**
145+
* @brief Create a ScopedProxyDropTarget with no initial windows.
146+
*/
147+
ScopedProxyDropTarget() = default;
148+
149+
/**
150+
* @brief Create a ScopedProxyDropTarget and set up a ProxyDropTarget.
151+
*
152+
* @param window Window to attach ProxyDropTarget to.
153+
* @param handler wxEvtHandler to receive events.
154+
* @param data wxDataObject to receive data.
155+
*
156+
* The window MUST NOT have an existing wxDropTarget assigned.
157+
*/
158+
ScopedProxyDropTarget(wxWindow *window, wxEvtHandler *handler, wxDataObject *data = NULL);
159+
160+
ScopedProxyDropTarget(const ScopedProxyDropTarget&) = delete;
161+
ScopedProxyDropTarget &operator=(const ScopedProxyDropTarget&) = delete;
162+
163+
ScopedProxyDropTarget(ScopedProxyDropTarget&&) = delete;
164+
ScopedProxyDropTarget &operator=(ScopedProxyDropTarget&&) = delete;
165+
166+
/**
167+
* @brief Unregister any created drop targets.
168+
*/
169+
~ScopedProxyDropTarget();
170+
171+
/**
172+
* @brief Set up a ProxyDropTarget on a window (can be called multiple times).
173+
*
174+
* @param window Window to attach ProxyDropTarget to.
175+
* @param handler wxEvtHandler to receive events.
176+
* @param data wxDataObject to receive data.
177+
*
178+
* The window MUST NOT have an existing wxDropTarget assigned.
179+
*/
180+
ProxyDropTarget *Add(wxWindow *window, wxEvtHandler *handler, wxDataObject *data = NULL);
181+
182+
private:
183+
std::vector< SafeWindowPointer<wxWindow> > m_windows;
184+
};
130185
}
131186

132187
#endif /* !REHEX_PROXYDROPTARGET_HPP */

0 commit comments

Comments
 (0)