Don't scroll too far if the child getting the focus is large.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27476 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2004-05-28 04:22:16 +00:00
parent a1d66aef6f
commit 68c0610dae
2 changed files with 56 additions and 37 deletions

View File

@@ -28,24 +28,27 @@ class TestPanel(scrolled.ScrolledPanel):
words = text.split() words = text.split()
panel1 = scrolled.ScrolledPanel(self, -1, size=(120,300), panel1 = scrolled.ScrolledPanel(self, -1, size=(140, 300),
style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER ) style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1" )
fgs1 = wx.FlexGridSizer(cols=2, vgap=4, hgap=4) fgs1 = wx.FlexGridSizer(cols=2, vgap=4, hgap=4)
for word in words: for word in words:
label = wx.StaticText(panel1, -1, word+":") label = wx.StaticText(panel1, -1, word+":")
tc = wx.TextCtrl(panel1, -1, word, size=(50,-1)) if word == "three":
fgs1.Add(label, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) tc = wx.TextCtrl(panel1, -1, word, size=(150,-1))
fgs1.Add(tc, flag=wx.EXPAND|wx.RIGHT, border=25) else:
tc = wx.TextCtrl(panel1, -1, word, size=(50,-1))
fgs1.Add(label, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
fgs1.Add(tc, flag=wx.RIGHT, border=10)
panel1.SetSizer( fgs1 ) panel1.SetSizer( fgs1 )
panel1.SetAutoLayout(1) panel1.SetAutoLayout(1)
panel1.SetupScrolling( scroll_x=False ) panel1.SetupScrolling()
panel2 = scrolled.ScrolledPanel(self, -1, size=(350, 40), panel2 = scrolled.ScrolledPanel(self, -1, size=(350, 50),
style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER) style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel2")
panel3 = scrolled.ScrolledPanel(self, -1, size=(200,100), panel3 = scrolled.ScrolledPanel(self, -1, size=(200,100),
style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER) style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel3")
fgs2 = wx.FlexGridSizer(cols=25, vgap=4, hgap=4) fgs2 = wx.FlexGridSizer(cols=25, vgap=4, hgap=4)
fgs3 = wx.FlexGridSizer(cols=5, vgap=4, hgap=4) fgs3 = wx.FlexGridSizer(cols=5, vgap=4, hgap=4)

View File

@@ -18,22 +18,27 @@
import wx import wx
class ScrolledPanel( wx.ScrolledWindow ): class ScrolledPanel( wx.PyScrolledWindow ):
"""\
ScrolledPanel fills a "hole" in the implementation of wx.ScrolledWindow,
providing automatic scrollbar and scrolling behavior and the tab traversal
management that wxScrolledWindow lacks. This code was based on the original
demo code showing how to do this, but is now available for general use
as a proper class (and the demo is now converted to just use it.)
"""
def __init__(self, parent, id=-1,
pos = wx.DefaultPosition, size = wx.DefaultSize,
style = wx.TAB_TRAVERSAL, name = "scrolledpanel"):
wx.ScrolledWindow.__init__(self, parent, -1, """ ScrolledPanel fills a "hole" in the implementation of
pos=pos, size=size, wx.ScrolledWindow, providing automatic scrollbar and scrolling
style=style, name=name) behavior and the tab traversal management that wxScrolledWindow
lacks. This code was based on the original demo code showing how
to do this, but is now available for general use as a proper class
(and the demo is now converted to just use it.)
It is assumed that the ScrolledPanel will have a sizer, as it is
used to calculate the minimal virtual size of the panel and etc.
"""
def __init__(self, parent, id=-1, pos = wx.DefaultPosition,
size = wx.DefaultSize, style = wx.TAB_TRAVERSAL,
name = "scrolledpanel"):
wx.PyScrolledWindow.__init__(self, parent, -1,
pos=pos, size=size,
style=style, name=name)
self.SetBestSize(size)
self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocus) self.Bind(wx.EVT_CHILD_FOCUS, self.OnChildFocus)
@@ -74,30 +79,41 @@ as a proper class (and the demo is now converted to just use it.)
sppu_x, sppu_y = self.GetScrollPixelsPerUnit() sppu_x, sppu_y = self.GetScrollPixelsPerUnit()
vs_x, vs_y = self.GetViewStart() vs_x, vs_y = self.GetViewStart()
cpos = child.GetPosition() cr = child.GetRect()
csz = child.GetSize() clntsz = self.GetClientSize()
new_vs_x, new_vs_y = -1, -1 new_vs_x, new_vs_y = -1, -1
# is it before the left edge? # is it before the left edge?
if cpos.x < 0 and sppu_x > 0: if cr.x < 0 and sppu_x > 0:
new_vs_x = vs_x + (cpos.x / sppu_x) new_vs_x = vs_x + (cr.x / sppu_x)
# is it above the top? # is it above the top?
if cpos.y < 0 and sppu_y > 0: if cr.y < 0 and sppu_y > 0:
new_vs_y = vs_y + (cpos.y / sppu_y) new_vs_y = vs_y + (cr.y / sppu_y)
clntsz = self.GetClientSize()
# For the right and bottom edges, scroll enough to show the
# whole control if possible, but if not just scroll such that
# the top/left edges are still visible
# is it past the right edge ? # is it past the right edge ?
if cpos.x + csz.width > clntsz.width and sppu_x > 0: if cr.right > clntsz.width and sppu_x > 0:
diff = (cpos.x + csz.width - clntsz.width) / sppu_x diff = (cr.right - clntsz.width) / sppu_x
new_vs_x = vs_x + diff + 1 if cr.x - diff * sppu_x > 0:
new_vs_x = vs_x + diff + 1
else:
new_vs_x = vs_x + (cr.x / sppu_x)
# is it below the bottom ? # is it below the bottom ?
if cpos.y + csz.height > clntsz.height and sppu_y > 0: if cr.bottom > clntsz.height and sppu_y > 0:
diff = (cpos.y + csz.height - clntsz.height) / sppu_y diff = (cr.bottom - clntsz.height) / sppu_y
new_vs_y = vs_y + diff + 1 if cr.y - diff * sppu_y > 0:
new_vs_y = vs_y + diff + 1
else:
new_vs_y = vs_y + (cr.y / sppu_y)
# if we need to adjust # if we need to adjust
if new_vs_x != -1 or new_vs_y != -1: if new_vs_x != -1 or new_vs_y != -1:
#print "%s: (%s, %s)" % (self.GetName(), new_vs_x, new_vs_y)
self.Scroll(new_vs_x, new_vs_y) self.Scroll(new_vs_x, new_vs_y)