wxFloatingPane::wxFloatingPane(wxWindow* parent,
wxFrameManager* owner_mgr,
const wxPaneInfo& pane,
- wxWindowID id /*= wxID_ANY*/)
+ wxWindowID id /*= wxID_ANY*/,
+ long style /*=wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION |
+ wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT |
+ wxCLIP_CHILDREN
+ */)
: wxFloatingPaneBaseClass(parent, id, wxEmptyString,
pane.floating_pos, pane.floating_size,
- wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION |
+ style |
(pane.HasCloseButton()?wxCLOSE_BOX:0) |
- wxFRAME_NO_TASKBAR |
- wxFRAME_FLOAT_ON_PARENT | wxCLIP_CHILDREN |
(pane.IsFixed()?0:wxRESIZE_BORDER)
)
{
m_owner_mgr = owner_mgr;
m_moving = false;
- m_last_rect = wxRect();
m_mgr.SetManagedWindow(this);
SetExtraStyle(wxWS_EX_PROCESS_IDLE);
}
void wxFloatingPane::OnMoveEvent(wxMoveEvent& event)
{
-#ifdef __WXGTK__
- // On wxGTK 2.6 and 2.7 for some unknown reason, wxSizeEvents are not
- // emitted for wxFloatingPanes when they are manually resized.
- // See Bug #1528554.
- // However, it does (fortunately) wrongly emit wxMoveEvent in this scenario.
- // So we having on that to update the floating pane size - let's hope noone
- // fixes this useful bug, without fixing the above.
- m_owner_mgr->OnFloatingPaneResized(m_pane_window, GetSize());
-#endif
-
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 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)