void OnMoveEvent(wxMoveEvent& event);
void OnIdle(wxIdleEvent& event);
void OnMoveStart();
- void OnMoving(const wxRect& window_rect);
+ void OnMoving(const wxRect& window_rect, wxDirection dir);
void OnMoveFinished();
void OnActivate(wxActivateEvent& event);
static bool isMouseDown();
wxWindow* m_pane_window; // pane window being managed
bool m_moving;
wxRect m_last_rect;
+ wxRect m_last2_rect;
+ wxRect m_last3_rect;
wxSize m_last_size;
+ wxDirection m_lastDirection;
wxFrameManager* m_owner_mgr;
wxFrameManager m_mgr;
wxDockUIPart* GetPanePart(wxWindow* pane);
int GetDockPixelOffset(wxPaneInfo& test);
void OnFloatingPaneMoveStart(wxWindow* window);
- void OnFloatingPaneMoving(wxWindow* window);
- void OnFloatingPaneMoved(wxWindow* window);
+ void OnFloatingPaneMoving(wxWindow* window, wxDirection dir );
+ void OnFloatingPaneMoved(wxWindow* window, wxDirection dir);
void OnFloatingPaneActivated(wxWindow* window);
void OnFloatingPaneClosed(wxWindow* window, wxCloseEvent& evt);
void OnFloatingPaneResized(wxWindow* window, const wxSize& size);
{
m_owner_mgr = owner_mgr;
m_moving = false;
- m_last_rect = wxRect();
m_mgr.SetManagedWindow(this);
- // SetExtraStyle(wxWS_EX_PROCESS_IDLE);
+ SetExtraStyle(wxWS_EX_PROCESS_IDLE);
}
wxFloatingPane::~wxFloatingPane()
{
wxRect win_rect = GetRect();
+ if (win_rect == m_last_rect)
+ return;
+
// skip the first move event
if (m_last_rect.IsEmpty())
{
return;
}
- // skip if moving fast
- if ((abs(win_rect.x - m_last_rect.x) > 1) ||
- (abs(win_rect.y - m_last_rect.y) > 1))
+ // skip if moving too fast to avoid massive redraws and
+ // jumping hint windows
+ if ((abs(win_rect.x - m_last_rect.x) > 3) ||
+ (abs(win_rect.y - m_last_rect.y) > 3))
{
+ m_last3_rect = m_last2_rect;
+ m_last2_rect = m_last_rect;
m_last_rect = win_rect;
return;
}
// prevent frame redocking during resize
if (m_last_rect.GetSize() != win_rect.GetSize())
{
+ m_last3_rect = m_last2_rect;
+ m_last2_rect = m_last_rect;
m_last_rect = win_rect;
return;
}
+ wxDirection dir = wxALL;
+
+ int horiz_dist = abs(win_rect.x - m_last3_rect.x);
+ int vert_dist = abs(win_rect.y - m_last3_rect.y);
+
+ if (vert_dist >= horiz_dist)
+ {
+ if (win_rect.y < m_last3_rect.y)
+ dir = wxNORTH;
+ else
+ dir = wxSOUTH;
+ }
+ else
+ {
+ if (win_rect.x < m_last3_rect.x)
+ dir = wxWEST;
+ else
+ dir = wxEAST;
+ }
+
+ m_last3_rect = m_last2_rect;
+ m_last2_rect = m_last_rect;
m_last_rect = win_rect;
if (!isMouseDown())
m_moving = true;
}
- OnMoving(event.GetRect());
+ if (m_last3_rect.IsEmpty())
+ return;
+
+ OnMoving(event.GetRect(), dir );
}
void wxFloatingPane::OnIdle(wxIdleEvent& event)
m_owner_mgr->OnFloatingPaneMoveStart(m_pane_window);
}
-void wxFloatingPane::OnMoving(const wxRect& WXUNUSED(window_rect))
+void wxFloatingPane::OnMoving(const wxRect& WXUNUSED(window_rect), wxDirection dir)
{
// notify the owner manager that the pane is moving
- m_owner_mgr->OnFloatingPaneMoving(m_pane_window);
+ m_owner_mgr->OnFloatingPaneMoving(m_pane_window, dir);
+ m_lastDirection = dir;
}
void wxFloatingPane::OnMoveFinished()
{
// notify the owner manager that the pane has finished moving
- m_owner_mgr->OnFloatingPaneMoved(m_pane_window);
+ m_owner_mgr->OnFloatingPaneMoved(m_pane_window, m_lastDirection);
}
void wxFloatingPane::OnActivate(wxActivateEvent& event)
#endif
}
-void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd)
+void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd, wxDirection dir)
{
// try to find the pane
wxPaneInfo& pane = GetPane(wnd);
wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
wxPoint pt = ::wxGetMousePosition();
+
+#if 1
+ // Adapt pt to direction
+ if (dir == wxNORTH)
+ {
+ // move to pane's upper border
+ wxPoint pos( 0,0 );
+ pos = wnd->ClientToScreen( pos );
+ pt.y = pos.y;
+ // and some more pixels for the title bar
+ pt.y -= 5;
+ } else
+ if (dir == wxWEST)
+ {
+ // move to pane's left border
+ wxPoint pos( 0,0 );
+ pos = wnd->ClientToScreen( pos );
+ pt.x = pos.x;
+ } else
+ if (dir == wxEAST)
+ {
+ // move to pane's right border
+ wxPoint pos( wnd->GetSize().x, 0 );
+ pos = wnd->ClientToScreen( pos );
+ pt.x = pos.x;
+ } else
+ if (dir == wxSOUTH)
+ {
+ // move to pane's bottom border
+ wxPoint pos( 0, wnd->GetSize().y );
+ pos = wnd->ClientToScreen( pos );
+ pt.y = pos.y;
+ }
+#endif
+
wxPoint client_pt = m_frame->ScreenToClient(pt);
// calculate the offset from the upper left-hand corner
m_frame->Update();
}
-void wxFrameManager::OnFloatingPaneMoved(wxWindow* wnd)
+void wxFrameManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir)
{
// try to find the pane
wxPaneInfo& pane = GetPane(wnd);
wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
wxPoint pt = ::wxGetMousePosition();
+
+#if 1
+ // Adapt pt to direction
+ if (dir == wxNORTH)
+ {
+ // move to pane's upper border
+ wxPoint pos( 0,0 );
+ pos = wnd->ClientToScreen( pos );
+ pt.y = pos.y;
+ // and some more pixels for the title bar
+ pt.y -= 10;
+ } else
+ if (dir == wxWEST)
+ {
+ // move to pane's left border
+ wxPoint pos( 0,0 );
+ pos = wnd->ClientToScreen( pos );
+ pt.x = pos.x;
+ } else
+ if (dir == wxEAST)
+ {
+ // move to pane's right border
+ wxPoint pos( wnd->GetSize().x, 0 );
+ pos = wnd->ClientToScreen( pos );
+ pt.x = pos.x;
+ } else
+ if (dir == wxSOUTH)
+ {
+ // move to pane's bottom border
+ wxPoint pos( 0, wnd->GetSize().y );
+ pos = wnd->ClientToScreen( pos );
+ pt.y = pos.y;
+ }
+#endif
+
wxPoint client_pt = m_frame->ScreenToClient(pt);
// calculate the offset from the upper left-hand corner