diff --git a/include/wx/aui/framemanager.h b/include/wx/aui/framemanager.h index 65a3dc7d7e..b19cd3e26c 100644 --- a/include/wx/aui/framemanager.h +++ b/include/wx/aui/framemanager.h @@ -555,6 +555,8 @@ protected: wxDockUIPart* m_action_part; // ptr to the part the action happened to wxWindow* m_action_window; // action frame or window (NULL if none) wxRect m_action_hintrect; // hint rectangle for the action + bool m_skipping; + wxRect m_last_rect; wxDockUIPart* m_hover_button;// button uipart being hovered over wxRect m_last_hint; // last hint rectangle wxPoint m_last_mouse_move; // last mouse move position (see OnMotion) diff --git a/src/aui/framemanager.cpp b/src/aui/framemanager.cpp index 8fad2a47cb..d5d6751675 100644 --- a/src/aui/framemanager.cpp +++ b/src/aui/framemanager.cpp @@ -480,6 +480,7 @@ wxFrameManager::wxFrameManager(wxWindow* managed_wnd, unsigned int flags) m_art = new wxDefaultDockArt; m_hint_wnd = NULL; m_flags = flags; + m_skipping = false; if (managed_wnd) { @@ -2349,8 +2350,7 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, { if (!part || !part->dock) return false; - - + // calculate the offset from where the dock begins // to the point where the user dropped the pane int dock_drop_offset = 0; @@ -2365,16 +2365,40 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, // should float if being dragged over center pane windows if (!part->dock->fixed || part->dock->dock_direction == wxAUI_DOCK_CENTER) { - if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) && + if (m_last_rect.IsEmpty() || m_last_rect.Inside(pt.x, pt.y )) + { + m_skipping = true; + } + else + { + if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) && (drop.IsFloatable() || (part->dock->dock_direction != wxAUI_DOCK_CENTER && part->dock->dock_direction != wxAUI_DOCK_NONE))) - { - drop.Float(); + { + drop.Float(); + } + + m_skipping = false; + + return ProcessDockResult(target, drop); } + + drop.Position(pt.x - GetDockPixelOffset(drop) - offset.x); return ProcessDockResult(target, drop); } + else + { + m_skipping = false; + } + + if (!m_skipping) + { + m_last_rect = part->dock->rect; + m_last_rect.Offset( -10, -10 ); + m_last_rect.Inflate( 20, 20 ); + } drop.Dock(). Direction(part->dock->dock_direction).