Added direction sensitive docking.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40769 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2006-08-23 11:17:13 +00:00
parent dbfa7f339c
commit 322c5ec4c0
4 changed files with 120 additions and 14 deletions

View File

@@ -45,7 +45,7 @@ private:
void OnMoveEvent(wxMoveEvent& event); void OnMoveEvent(wxMoveEvent& event);
void OnIdle(wxIdleEvent& event); void OnIdle(wxIdleEvent& event);
void OnMoveStart(); void OnMoveStart();
void OnMoving(const wxRect& window_rect); void OnMoving(const wxRect& window_rect, wxDirection dir);
void OnMoveFinished(); void OnMoveFinished();
void OnActivate(wxActivateEvent& event); void OnActivate(wxActivateEvent& event);
static bool isMouseDown(); static bool isMouseDown();
@@ -53,7 +53,10 @@ private:
wxWindow* m_pane_window; // pane window being managed wxWindow* m_pane_window; // pane window being managed
bool m_moving; bool m_moving;
wxRect m_last_rect; wxRect m_last_rect;
wxRect m_last2_rect;
wxRect m_last3_rect;
wxSize m_last_size; wxSize m_last_size;
wxDirection m_lastDirection;
wxFrameManager* m_owner_mgr; wxFrameManager* m_owner_mgr;
wxFrameManager m_mgr; wxFrameManager m_mgr;

View File

@@ -492,8 +492,8 @@ protected:
wxDockUIPart* GetPanePart(wxWindow* pane); wxDockUIPart* GetPanePart(wxWindow* pane);
int GetDockPixelOffset(wxPaneInfo& test); int GetDockPixelOffset(wxPaneInfo& test);
void OnFloatingPaneMoveStart(wxWindow* window); void OnFloatingPaneMoveStart(wxWindow* window);
void OnFloatingPaneMoving(wxWindow* window); void OnFloatingPaneMoving(wxWindow* window, wxDirection dir );
void OnFloatingPaneMoved(wxWindow* window); void OnFloatingPaneMoved(wxWindow* window, wxDirection dir);
void OnFloatingPaneActivated(wxWindow* window); void OnFloatingPaneActivated(wxWindow* window);
void OnFloatingPaneClosed(wxWindow* window, wxCloseEvent& evt); void OnFloatingPaneClosed(wxWindow* window, wxCloseEvent& evt);
void OnFloatingPaneResized(wxWindow* window, const wxSize& size); void OnFloatingPaneResized(wxWindow* window, const wxSize& size);

View File

@@ -49,9 +49,8 @@ wxFloatingPane::wxFloatingPane(wxWindow* parent,
{ {
m_owner_mgr = owner_mgr; m_owner_mgr = owner_mgr;
m_moving = false; m_moving = false;
m_last_rect = wxRect();
m_mgr.SetManagedWindow(this); m_mgr.SetManagedWindow(this);
// SetExtraStyle(wxWS_EX_PROCESS_IDLE); SetExtraStyle(wxWS_EX_PROCESS_IDLE);
} }
wxFloatingPane::~wxFloatingPane() wxFloatingPane::~wxFloatingPane()
@@ -127,6 +126,9 @@ void wxFloatingPane::OnMoveEvent(wxMoveEvent& event)
{ {
wxRect win_rect = GetRect(); wxRect win_rect = GetRect();
if (win_rect == m_last_rect)
return;
// skip the first move event // skip the first move event
if (m_last_rect.IsEmpty()) if (m_last_rect.IsEmpty())
{ {
@@ -134,10 +136,13 @@ void wxFloatingPane::OnMoveEvent(wxMoveEvent& event)
return; return;
} }
// skip if moving fast // skip if moving too fast to avoid massive redraws and
if ((abs(win_rect.x - m_last_rect.x) > 1) || // jumping hint windows
(abs(win_rect.y - m_last_rect.y) > 1)) 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; m_last_rect = win_rect;
return; return;
} }
@@ -145,10 +150,34 @@ void wxFloatingPane::OnMoveEvent(wxMoveEvent& event)
// prevent frame redocking during resize // prevent frame redocking during resize
if (m_last_rect.GetSize() != win_rect.GetSize()) 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; m_last_rect = win_rect;
return; 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; m_last_rect = win_rect;
if (!isMouseDown()) if (!isMouseDown())
@@ -160,7 +189,10 @@ void wxFloatingPane::OnMoveEvent(wxMoveEvent& event)
m_moving = true; m_moving = true;
} }
OnMoving(event.GetRect()); if (m_last3_rect.IsEmpty())
return;
OnMoving(event.GetRect(), dir );
} }
void wxFloatingPane::OnIdle(wxIdleEvent& event) void wxFloatingPane::OnIdle(wxIdleEvent& event)
@@ -185,16 +217,17 @@ void wxFloatingPane::OnMoveStart()
m_owner_mgr->OnFloatingPaneMoveStart(m_pane_window); 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 // 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() void wxFloatingPane::OnMoveFinished()
{ {
// notify the owner manager that the pane has finished moving // 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) void wxFloatingPane::OnActivate(wxActivateEvent& event)

View File

@@ -2874,13 +2874,48 @@ void wxFrameManager::OnFloatingPaneMoveStart(wxWindow* wnd)
#endif #endif
} }
void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd) void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd, wxDirection dir)
{ {
// try to find the pane // try to find the pane
wxPaneInfo& pane = GetPane(wnd); wxPaneInfo& pane = GetPane(wnd);
wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found")); wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
wxPoint pt = ::wxGetMousePosition(); 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); wxPoint client_pt = m_frame->ScreenToClient(pt);
// calculate the offset from the upper left-hand corner // calculate the offset from the upper left-hand corner
@@ -2940,13 +2975,48 @@ void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd)
m_frame->Update(); m_frame->Update();
} }
void wxFrameManager::OnFloatingPaneMoved(wxWindow* wnd) void wxFrameManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir)
{ {
// try to find the pane // try to find the pane
wxPaneInfo& pane = GetPane(wnd); wxPaneInfo& pane = GetPane(wnd);
wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found")); wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
wxPoint pt = ::wxGetMousePosition(); 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); wxPoint client_pt = m_frame->ScreenToClient(pt);
// calculate the offset from the upper left-hand corner // calculate the offset from the upper left-hand corner