ensure that scroll position is always in scrolling range, otherwise we could have a window without scrollbars at all but with non zero scroll offset which was really strange
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43795 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -35,9 +35,30 @@ protected:
|
|||||||
int pixelsPerLine,
|
int pixelsPerLine,
|
||||||
int winSize,
|
int winSize,
|
||||||
int virtSize,
|
int virtSize,
|
||||||
|
int *pos,
|
||||||
int *lines,
|
int *lines,
|
||||||
int *linesPerPage);
|
int *linesPerPage);
|
||||||
|
|
||||||
|
void DoAdjustHScrollbar(int winSize, int virtSize)
|
||||||
|
{
|
||||||
|
DoAdjustScrollbar
|
||||||
|
(
|
||||||
|
m_win->m_scrollBar[wxWindow::ScrollDir_Horz],
|
||||||
|
m_xScrollPixelsPerLine, winSize, virtSize,
|
||||||
|
&m_xScrollPosition, &m_xScrollLines, &m_xScrollLinesPerPage
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoAdjustVScrollbar(int winSize, int virtSize)
|
||||||
|
{
|
||||||
|
DoAdjustScrollbar
|
||||||
|
(
|
||||||
|
m_win->m_scrollBar[wxWindow::ScrollDir_Vert],
|
||||||
|
m_yScrollPixelsPerLine, winSize, virtSize,
|
||||||
|
&m_yScrollPosition, &m_yScrollLines, &m_yScrollLinesPerPage
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// and this does the same for Scroll()
|
// and this does the same for Scroll()
|
||||||
void DoScroll(int orient,
|
void DoScroll(int orient,
|
||||||
int pos,
|
int pos,
|
||||||
|
@@ -85,6 +85,7 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range,
|
|||||||
int pixelsPerLine,
|
int pixelsPerLine,
|
||||||
int winSize,
|
int winSize,
|
||||||
int virtSize,
|
int virtSize,
|
||||||
|
int *pos,
|
||||||
int *lines,
|
int *lines,
|
||||||
int *linesPerPage)
|
int *linesPerPage)
|
||||||
{
|
{
|
||||||
@@ -106,6 +107,11 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range,
|
|||||||
*lines = 0;
|
*lines = 0;
|
||||||
*linesPerPage = 0;
|
*linesPerPage = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ensure that the scroll position is always in valid range
|
||||||
|
if ( *pos > *lines )
|
||||||
|
*pos = *lines;
|
||||||
|
|
||||||
GtkAdjustment* adj = range->adjustment;
|
GtkAdjustment* adj = range->adjustment;
|
||||||
adj->step_increment = 1;
|
adj->step_increment = 1;
|
||||||
adj->page_increment =
|
adj->page_increment =
|
||||||
@@ -115,22 +121,20 @@ void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range,
|
|||||||
|
|
||||||
void wxScrollHelperNative::AdjustScrollbars()
|
void wxScrollHelperNative::AdjustScrollbars()
|
||||||
{
|
{
|
||||||
int w, h;
|
|
||||||
int vw, vh;
|
|
||||||
|
|
||||||
// this flag indicates which window has the scrollbars
|
// this flag indicates which window has the scrollbars
|
||||||
m_win->m_hasScrolling = m_xScrollPixelsPerLine != 0 || m_yScrollPixelsPerLine != 0;
|
m_win->m_hasScrolling = m_xScrollPixelsPerLine != 0 ||
|
||||||
|
m_yScrollPixelsPerLine != 0;
|
||||||
|
|
||||||
|
int vw, vh;
|
||||||
m_targetWindow->GetVirtualSize( &vw, &vh );
|
m_targetWindow->GetVirtualSize( &vw, &vh );
|
||||||
|
|
||||||
|
int w;
|
||||||
m_targetWindow->GetClientSize(&w, NULL);
|
m_targetWindow->GetClientSize(&w, NULL);
|
||||||
DoAdjustScrollbar(
|
DoAdjustHScrollbar(w, vw);
|
||||||
m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine,
|
|
||||||
w, vw, &m_xScrollLines, &m_xScrollLinesPerPage);
|
int h;
|
||||||
m_targetWindow->GetClientSize(NULL, &h);
|
m_targetWindow->GetClientSize(NULL, &h);
|
||||||
DoAdjustScrollbar(
|
DoAdjustVScrollbar(h, vh);
|
||||||
m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine,
|
|
||||||
h, vh, &m_yScrollLines, &m_yScrollLinesPerPage);
|
|
||||||
|
|
||||||
const int w_old = w;
|
const int w_old = w;
|
||||||
m_targetWindow->GetClientSize(&w, NULL);
|
m_targetWindow->GetClientSize(&w, NULL);
|
||||||
@@ -143,13 +147,10 @@ void wxScrollHelperNative::AdjustScrollbars()
|
|||||||
// AdjustScrollbars() to be called again. If the scrollbar visibility
|
// AdjustScrollbars() to be called again. If the scrollbar visibility
|
||||||
// is not correct before then, yet another resize will occur, possibly
|
// is not correct before then, yet another resize will occur, possibly
|
||||||
// leading to an unending series if the sizes are just right.
|
// leading to an unending series if the sizes are just right.
|
||||||
DoAdjustScrollbar(
|
DoAdjustHScrollbar(w, vw);
|
||||||
m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine,
|
|
||||||
w, vw, &m_xScrollLines, &m_xScrollLinesPerPage);
|
|
||||||
m_targetWindow->GetClientSize(NULL, &h);
|
m_targetWindow->GetClientSize(NULL, &h);
|
||||||
DoAdjustScrollbar(
|
DoAdjustVScrollbar(h, vh);
|
||||||
m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine,
|
|
||||||
h, vh, &m_yScrollLines, &m_yScrollLinesPerPage);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user