From: Robin Dunn Date: Mon, 1 Apr 2002 20:31:23 +0000 (+0000) Subject: Added wxListCtrlAutoWidthMixin from Erik Westra. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/726fc00ab9a45ac4acbd7622e4dcb877b96fe8cb?ds=inline Added wxListCtrlAutoWidthMixin from Erik Westra. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14888 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt index 8246e66d34..c740a60ee4 100644 --- a/wxPython/CHANGES.txt +++ b/wxPython/CHANGES.txt @@ -68,6 +68,7 @@ UNICODE! codecs first and then pass the unicode string to the wxPython method. +Added wxListCtrlAutoWidthMixin from Erik Westra. diff --git a/wxPython/demo/wxListCtrl.py b/wxPython/demo/wxListCtrl.py index b861392e54..7e510dc04f 100644 --- a/wxPython/demo/wxListCtrl.py +++ b/wxPython/demo/wxListCtrl.py @@ -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") diff --git a/wxPython/wxPython/lib/mixins/listctrl.py b/wxPython/wxPython/lib/mixins/listctrl.py index f215ee220f..dd57fc851e 100644 --- a/wxPython/wxPython/lib/mixins/listctrl.py +++ b/wxPython/wxPython/lib/mixins/listctrl.py @@ -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 +""" + 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) + + + +#----------------------------------------------------------------------------