X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4395fb21f651f8a08905c34507692ca7f902dfe5..065ab451bf9bcf7986049ff82b8b456ecc559aa4:/src/generic/splitter.cpp?ds=sidebyside diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 4269063c1d..22c09bc9ff 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -50,12 +50,12 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_UNSPLIT) IMPLEMENT_DYNAMIC_CLASS(wxSplitterWindow, wxWindow) /* - TODO PROPERTIES - style wxSP_3D - sashpos (long , 0 ) - minsize (long -1 ) - object, object_ref - orientation + TODO PROPERTIES + style wxSP_3D + sashpos (long , 0 ) + minsize (long -1 ) + object, object_ref + orientation */ IMPLEMENT_DYNAMIC_CLASS(wxSplitterEvent, wxNotifyEvent) @@ -183,7 +183,7 @@ void wxSplitterWindow::OnInternalIdle() SizeWindows(); return; // it won't needUpdating in this case } - + if (m_needUpdating) SizeWindows(); } @@ -208,7 +208,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { // Start the drag now m_dragMode = wxSPLIT_DRAG_DRAGGING; - + // Capture mouse and set the cursor CaptureMouse(); SetResizeCursor(); @@ -233,7 +233,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { // We can stop dragging now and see what we've got. m_dragMode = wxSPLIT_DRAG_NONE; - + // Release mouse and unset the cursor ReleaseMouse(); SetCursor(* wxSTANDARD_CURSOR); @@ -423,7 +423,7 @@ bool wxSplitterWindow::SashHitTest(int x, int y, int tolerance) int z = m_splitMode == wxSPLIT_VERTICAL ? x : y; int hitMin = m_sashPosition - tolerance; int hitMax = m_sashPosition + GetSashSize() + tolerance; - + return z >= hitMin && z <= hitMax; } @@ -582,6 +582,12 @@ bool wxSplitterWindow::DoSetSashPosition(int sashPos) void wxSplitterWindow::SetSashPositionAndNotify(int sashPos) { + // we must reset the request here, otherwise the sash would be stuck at + // old position if the user attempted to move the sash after invalid + // (e.g. smaller than minsize) sash position was requested using + // SetSashPosition(): + m_requestedSashPosition = INT_MAX; + if ( DoSetSashPosition(sashPos) ) { wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, this); @@ -662,7 +668,7 @@ void wxSplitterWindow::SizeWindows() // Set pane for unsplit window void wxSplitterWindow::Initialize(wxWindow *window) { - wxASSERT_MSG( window && window->GetParent() == this, + wxASSERT_MSG( (!window || (window && window->GetParent() == this)), _T("windows in the splitter should have it as parent!") ); m_windowOne = window; @@ -694,7 +700,7 @@ bool wxSplitterWindow::DoSplit(wxSplitMode mode, // right now (e.g. because the window is too small) m_requestedSashPosition = sashPosition; m_checkRequestedSashPosition = false; - + DoSetSashPosition(ConvertSashPosition(sashPosition)); SizeWindows(); @@ -792,7 +798,7 @@ void wxSplitterWindow::SetSashPosition(int position, bool redraw) // right now (e.g. because the window is too small) m_requestedSashPosition = position; m_checkRequestedSashPosition = false; - + DoSetSashPosition(ConvertSashPosition(position)); if ( redraw ) @@ -801,6 +807,16 @@ void wxSplitterWindow::SetSashPosition(int position, bool redraw) } } +// Make sure the child window sizes are updated. This is useful +// for reducing flicker by updating the sizes before a +// window is shown, if you know the overall size is correct. +void wxSplitterWindow::UpdateSize() +{ + m_checkRequestedSashPosition = true; + SizeWindows(); + m_checkRequestedSashPosition = false; +} + bool wxSplitterWindow::DoSendEvent(wxSplitterEvent& event) { return !GetEventHandler()->ProcessEvent(event) || event.IsAllowed();