FIX: transfer input events to children of PopupWindow

Change-Id: I2ff9ba91a548402d77308aa88de34976a146a571
Jira: STUDIO-8942
(cherry picked from commit 23e30c7227474adf4efe5ee93f985e1140da9b6f)
This commit is contained in:
chunmao.guo
2024-11-27 14:54:55 +08:00
committed by Noisyfox
parent b871e9318f
commit c806aa05b7
3 changed files with 66 additions and 12 deletions

View File

@@ -17,6 +17,11 @@ bool PopupWindow::Create(wxWindow *parent, int style)
return false;
#ifdef __WXGTK__
GetTopParent(parent)->Bind(wxEVT_ACTIVATE, &PopupWindow::topWindowActiavate, this);
#endif
#ifdef __WXOSX__
if (style & wxPU_CONTAINS_CONTROLS)
for (auto evt : {wxEVT_LEFT_DOWN, wxEVT_LEFT_UP, wxEVT_LEFT_DCLICK, wxEVT_MOTION, wxEVT_MOUSEWHEEL})
Bind(evt, &PopupWindow::OnMouseEvent2, this);
#endif
return true;
}
@@ -28,6 +33,50 @@ PopupWindow::~PopupWindow()
#endif
}
#ifdef __WXOSX__
static wxEvtHandler * HitTest(wxWindow * parent, wxMouseEvent &evt)
{
auto pt = evt.GetPosition();
const wxWindowList &children = parent->GetChildren();
for (auto w : children) {
wxRect rc { w->GetPosition(), w->GetSize() };
if (rc.Contains(pt)) {
evt.SetPosition(pt - rc.GetTopLeft());
if (auto child = HitTest(w, evt))
return child;
return w;
}
}
return nullptr;
}
void PopupWindow::OnMouseEvent2(wxMouseEvent &evt)
{
auto child = ::HitTest(this, evt);
if (evt.GetEventType() == wxEVT_MOTION) {
auto h = child ? child : this;
if (hovered != h) {
wxMouseEvent leave(wxEVT_LEAVE_WINDOW);
leave.SetEventObject(hovered);
leave.SetId(static_cast<wxWindow*>(hovered)->GetId());
hovered->ProcessEventLocally(leave);
hovered = h;
wxMouseEvent enter(wxEVT_ENTER_WINDOW);
enter.SetEventObject(hovered);
enter.SetId(static_cast<wxWindow*>(hovered)->GetId());
hovered->ProcessEventLocally(enter);
}
}
if (child) {
child->ProcessEventLocally(evt);
} else {
evt.Skip();
}
}
#endif
#ifdef __WXGTK__
void PopupWindow::topWindowActiavate(wxActivateEvent &event)
{

View File

@@ -12,10 +12,15 @@ public:
PopupWindow(wxWindow *parent, int style = wxBORDER_NONE)
{ Create(parent, style); }
bool Create(wxWindow *parent, int flags = wxBORDER_NONE);
private:
#ifdef __WXOSX__
void OnMouseEvent2(wxMouseEvent &evt);
wxEvtHandler * hovered { this };
#endif
#ifdef __WXGTK__
void topWindowActiavate(wxActivateEvent &event);
#endif