Added wxListCtrlAutoWidthMixin from Erik Westra.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14888 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
15030c51b8
commit
726fc00ab9
@ -68,6 +68,7 @@ UNICODE!
|
||||
codecs first and then pass the unicode string to the wxPython
|
||||
method.
|
||||
|
||||
Added wxListCtrlAutoWidthMixin from Erik Westra.
|
||||
|
||||
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
from wxPython.wx import *
|
||||
from wxPython.lib.mixins.listctrl import wxColumnSorterMixin
|
||||
from wxPython.lib.mixins.listctrl import wxColumnSorterMixin, wxListCtrlAutoWidthMixin
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
@ -74,6 +74,15 @@ musicdata = {
|
||||
|
||||
import images
|
||||
|
||||
|
||||
class TestListCtrl(wxListCtrl, wxListCtrlAutoWidthMixin):
|
||||
def __init__(self, parent, ID, pos=wxDefaultPosition,
|
||||
size=wxDefaultSize, style=0):
|
||||
wxListCtrl.__init__(self, parent, ID, pos, size, style)
|
||||
wxListCtrlAutoWidthMixin.__init__(self)
|
||||
|
||||
|
||||
|
||||
class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
|
||||
def __init__(self, parent, log):
|
||||
wxPanel.__init__(self, parent, -1, style=wxWANTS_CHARS)
|
||||
@ -91,7 +100,7 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
|
||||
#self.sm_up = self.il.AddIcon(wxIconFromXPMData(images.getSmallUpArrowData()))
|
||||
#self.sm_dn = self.il.AddIcon(wxIconFromXPMData(images.getSmallDnArrowData()))
|
||||
|
||||
self.list = wxListCtrl(self, tID,
|
||||
self.list = TestListCtrl(self, tID,
|
||||
style=wxLC_REPORT|wxSUNKEN_BORDER)#|wxLC_VRULES|wxLC_HRULES)
|
||||
self.list.SetImageList(self.il, wxIMAGE_LIST_SMALL)
|
||||
|
||||
@ -99,7 +108,7 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
|
||||
self.list.SetToolTip(wxToolTip("This is a ToolTip!"))
|
||||
|
||||
if 0:
|
||||
# for normal simple columns, you can add them like this:
|
||||
# for normal, simple columns, you can add them like this:
|
||||
self.list.InsertColumn(0, "Artist")
|
||||
self.list.InsertColumn(1, "Title", wxLIST_FORMAT_RIGHT)
|
||||
self.list.InsertColumn(2, "Genre")
|
||||
|
@ -128,9 +128,110 @@ class wxColumnSorterMixin:
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
class wxListCtrlAutoWidthMixin:
|
||||
""" A mix-in class that automatically resizes the last column to take up
|
||||
the remaining width of the wxListCtrl.
|
||||
|
||||
This causes the wxListCtrl to automatically take up the full width of
|
||||
the list, without either a horizontal scroll bar (unless absolutely
|
||||
necessary) or empty space to the right of the last column.
|
||||
|
||||
NOTE: This only works for report-style lists.
|
||||
|
||||
WARNING: If you override the EVT_SIZE event in your wxListCtrl, make
|
||||
sure you call event.Skip() to ensure that the mixin's
|
||||
_OnResize method is called.
|
||||
|
||||
This mix-in class was written by Erik Westra <ewestra@wave.co.nz>
|
||||
"""
|
||||
def __init__(self):
|
||||
""" Standard initialiser.
|
||||
"""
|
||||
EVT_SIZE(self, self._onResize)
|
||||
self._lastColMinWidth = None
|
||||
|
||||
|
||||
def resizeLastColumn(self, minWidth):
|
||||
""" Resize the last column appropriately.
|
||||
|
||||
If the list's columns are too wide to fit within the window, we use
|
||||
a horizontal scrollbar. Otherwise, we expand the right-most column
|
||||
to take up the remaining free space in the list.
|
||||
|
||||
This method is called automatically when the wxListCtrl is resized;
|
||||
you can also call it yourself whenever you want the last column to
|
||||
be resized appropriately (eg, when adding, removing or resizing
|
||||
columns).
|
||||
|
||||
'minWidth' is the preferred minimum width for the last column.
|
||||
"""
|
||||
self.lastColMinWidth = minWidth
|
||||
self._doResize()
|
||||
|
||||
# =====================
|
||||
# == Private Methods ==
|
||||
# =====================
|
||||
|
||||
def _onResize(self, event):
|
||||
""" Respond to the wxListCtrl being resized.
|
||||
|
||||
We automatically resize the last column in the list.
|
||||
"""
|
||||
self._doResize()
|
||||
|
||||
|
||||
def _doResize(self):
|
||||
""" Resize the last column as appropriate.
|
||||
|
||||
If the list's columns are too wide to fit within the window, we use
|
||||
a horizontal scrollbar. Otherwise, we expand the right-most column
|
||||
to take up the remaining free space in the list.
|
||||
|
||||
We remember the current size of the last column, before resizing,
|
||||
as the preferred minimum width if we haven't previously been given
|
||||
or calculated a minimum width. This ensure that repeated calls to
|
||||
_doResize() don't cause the last column to size itself too large.
|
||||
"""
|
||||
numCols = self.GetColumnCount()
|
||||
if numCols == 0: return # Nothing to resize.
|
||||
|
||||
if self._lastColMinWidth == None:
|
||||
self._lastColMinWidth = self.GetColumnWidth(numCols - 1)
|
||||
|
||||
listWidth = self.GetSize().width
|
||||
if self.GetItemCount() > self.GetCountPerPage():
|
||||
# We're showing the vertical scrollbar -> allow for scrollbar width
|
||||
scrollWidth = wxSystemSettings_GetSystemMetric(wxSYS_VSCROLL_X)
|
||||
listWidth = listWidth - scrollWidth
|
||||
|
||||
totColWidth = 0 # Width of all columns except last one.
|
||||
for col in range(numCols-1):
|
||||
totColWidth = totColWidth + self.GetColumnWidth(col)
|
||||
|
||||
lastColWidth = self.GetColumnWidth(numCols - 1)
|
||||
|
||||
margin = 6 # NOTE: This is the extra number of pixels required to make
|
||||
# the wxListCtrl size correctly, at least under
|
||||
# Windows 2000. Unfortunately, different OSs and
|
||||
# even different versions of the same OS may implement
|
||||
# the wxListCtrl differently, so different margins may
|
||||
# be needed to get the columns resized correctly. No
|
||||
# doubt the margin could be calculated in a more
|
||||
# intelligent manner...
|
||||
|
||||
if totColWidth + self._lastColMinWidth > listWidth - margin:
|
||||
# We haven't got the width to show the last column at its minimum
|
||||
# width -> set it to its minimum width and allow the horizontal
|
||||
# scrollbar to show.
|
||||
self.SetColumnWidth(numCols-1, self._lastColMinWidth)
|
||||
return
|
||||
|
||||
# Resize the last column to take up the remaining available space.
|
||||
|
||||
self.SetColumnWidth(numCols-1, listWidth - totColWidth - margin)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user