A patch for wxListCtrlAutoWidthMixin from anthony@computronix.com
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17256 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -132,137 +132,102 @@ class wxColumnSorterMixin:
|
|||||||
|
|
||||||
class wxListCtrlAutoWidthMixin:
|
class wxListCtrlAutoWidthMixin:
|
||||||
""" A mix-in class that automatically resizes the last column to take up
|
""" A mix-in class that automatically resizes the last column to take up
|
||||||
the remaining width of the wxListCtrl.
|
the remaining width of the wxListCtrl.
|
||||||
|
|
||||||
This causes the wxListCtrl to automatically take up the full width of
|
This causes the wxListCtrl to automatically take up the full width of
|
||||||
the list, without either a horizontal scroll bar (unless absolutely
|
the list, without either a horizontal scroll bar (unless absolutely
|
||||||
necessary) or empty space to the right of the last column.
|
necessary) or empty space to the right of the last column.
|
||||||
|
|
||||||
NOTE: This only works for report-style lists.
|
NOTE: This only works for report-style lists.
|
||||||
|
|
||||||
WARNING: If you override the EVT_SIZE event in your wxListCtrl, make
|
WARNING: If you override the EVT_SIZE event in your wxListCtrl, make
|
||||||
sure you call event.Skip() to ensure that the mixin's
|
sure you call event.Skip() to ensure that the mixin's
|
||||||
_OnResize method is called.
|
_OnResize method is called.
|
||||||
|
|
||||||
This mix-in class was written by Erik Westra <ewestra@wave.co.nz>
|
This mix-in class was written by Erik Westra <ewestra@wave.co.nz>
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
""" Standard initialiser.
|
""" Standard initialiser.
|
||||||
"""
|
"""
|
||||||
self._needResize = false
|
self._lastColMinWidth = None
|
||||||
self._lastColMinWidth = None
|
|
||||||
|
|
||||||
EVT_SIZE(self, self._onResize)
|
EVT_SIZE(self, self._onResize)
|
||||||
EVT_LIST_COL_END_DRAG(self, self.GetId(), self._onEndColDrag)
|
EVT_LIST_COL_END_DRAG(self, self.GetId(), self._onResize)
|
||||||
EVT_IDLE(self, self._onIdle)
|
|
||||||
|
|
||||||
|
|
||||||
def resizeLastColumn(self, minWidth):
|
def resizeLastColumn(self, minWidth):
|
||||||
""" Resize the last column appropriately.
|
""" Resize the last column appropriately.
|
||||||
|
|
||||||
If the list's columns are too wide to fit within the window, we use
|
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
|
a horizontal scrollbar. Otherwise, we expand the right-most column
|
||||||
to take up the remaining free space in the list.
|
to take up the remaining free space in the list.
|
||||||
|
|
||||||
This method is called automatically when the wxListCtrl is resized;
|
This method is called automatically when the wxListCtrl is resized;
|
||||||
you can also call it yourself whenever you want the last column to
|
you can also call it yourself whenever you want the last column to
|
||||||
be resized appropriately (eg, when adding, removing or resizing
|
be resized appropriately (eg, when adding, removing or resizing
|
||||||
columns).
|
columns).
|
||||||
|
|
||||||
'minWidth' is the preferred minimum width for the last column.
|
'minWidth' is the preferred minimum width for the last column.
|
||||||
"""
|
"""
|
||||||
self._lastColMinWidth = minWidth
|
self._lastColMinWidth = minWidth
|
||||||
self._doResize()
|
self._doResize()
|
||||||
|
|
||||||
# =====================
|
# =====================
|
||||||
# == Private Methods ==
|
# == Private Methods ==
|
||||||
# =====================
|
# =====================
|
||||||
|
|
||||||
def _onResize(self, event):
|
def _onResize(self, event):
|
||||||
""" Respond to the wxListCtrl being resized.
|
""" Respond to the wxListCtrl being resized.
|
||||||
|
|
||||||
We automatically resize the last column in the list.
|
We automatically resize the last column in the list.
|
||||||
"""
|
"""
|
||||||
self._doResize()
|
wxCallAfter(self._doResize)
|
||||||
event.Skip()
|
|
||||||
|
|
||||||
def _onEndColDrag(self, event):
|
|
||||||
""" Respond to the user resizing one of our columns.
|
|
||||||
|
|
||||||
We resize the last column in the list to match. Note that, because
|
|
||||||
of a quirk in the way columns are resized under MS Windows, we
|
|
||||||
actually have to do the column resize in idle time.
|
|
||||||
"""
|
|
||||||
self._needResize = true
|
|
||||||
event.Skip()
|
|
||||||
|
|
||||||
|
|
||||||
def _onIdle(self, event):
|
|
||||||
""" Respond to an idle event.
|
|
||||||
|
|
||||||
We resize the last column, if we've been asked to do so.
|
|
||||||
"""
|
|
||||||
if self._needResize:
|
|
||||||
self._doResize()
|
|
||||||
self.Refresh() # Fixes redraw problem under MS Windows.
|
|
||||||
self._needResize = false
|
|
||||||
event.Skip()
|
event.Skip()
|
||||||
|
|
||||||
|
|
||||||
def _doResize(self):
|
def _doResize(self):
|
||||||
""" Resize the last column as appropriate.
|
""" Resize the last column as appropriate.
|
||||||
|
|
||||||
If the list's columns are too wide to fit within the window, we use
|
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
|
a horizontal scrollbar. Otherwise, we expand the right-most column
|
||||||
to take up the remaining free space in the list.
|
to take up the remaining free space in the list.
|
||||||
|
|
||||||
We remember the current size of the last column, before resizing,
|
We remember the current size of the last column, before resizing,
|
||||||
as the preferred minimum width if we haven't previously been given
|
as the preferred minimum width if we haven't previously been given
|
||||||
or calculated a minimum width. This ensure that repeated calls to
|
or calculated a minimum width. This ensure that repeated calls to
|
||||||
_doResize() don't cause the last column to size itself too large.
|
_doResize() don't cause the last column to size itself too large.
|
||||||
"""
|
"""
|
||||||
numCols = self.GetColumnCount()
|
numCols = self.GetColumnCount()
|
||||||
if numCols == 0: return # Nothing to resize.
|
if numCols == 0: return # Nothing to resize.
|
||||||
|
|
||||||
if self._lastColMinWidth == None:
|
if self._lastColMinWidth == None:
|
||||||
self._lastColMinWidth = self.GetColumnWidth(numCols - 1)
|
self._lastColMinWidth = self.GetColumnWidth(numCols - 1)
|
||||||
|
|
||||||
listWidth = self.GetSize().width
|
# We're showing the vertical scrollbar -> allow for scrollbar width
|
||||||
if self.GetItemCount() > self.GetCountPerPage():
|
# NOTE: on GTK, the scrollbar is included in the client size, but on
|
||||||
# We're showing the vertical scrollbar -> allow for scrollbar width
|
# Windows it is not included
|
||||||
scrollWidth = wxSystemSettings_GetSystemMetric(wxSYS_VSCROLL_X)
|
listWidth = self.GetClientSize().width
|
||||||
listWidth = listWidth - scrollWidth
|
if wxPlatform != '__WXMSW__':
|
||||||
|
if self.GetItemCount() > self.GetCountPerPage():
|
||||||
|
scrollWidth = wxSystemSettings_GetSystemMetric(wxSYS_VSCROLL_X)
|
||||||
|
listWidth = listWidth - scrollWidth
|
||||||
|
|
||||||
totColWidth = 0 # Width of all columns except last one.
|
totColWidth = 0 # Width of all columns except last one.
|
||||||
for col in range(numCols-1):
|
for col in range(numCols-1):
|
||||||
totColWidth = totColWidth + self.GetColumnWidth(col)
|
totColWidth = totColWidth + self.GetColumnWidth(col)
|
||||||
|
|
||||||
lastColWidth = self.GetColumnWidth(numCols - 1)
|
lastColWidth = self.GetColumnWidth(numCols - 1)
|
||||||
|
|
||||||
# NOTE: This is the extra number of pixels required to make the
|
if totColWidth + self._lastColMinWidth > listWidth:
|
||||||
# wxListCtrl size correctly, at least under Windows 2000.
|
# We haven't got the width to show the last column at its minimum
|
||||||
# Unfortunately, different OSs and even different versions of the
|
# width -> set it to its minimum width and allow the horizontal
|
||||||
# same OS may implement the wxListCtrl differently, so different
|
# scrollbar to show.
|
||||||
# margins may be needed to get the columns resized correctly. No
|
self.SetColumnWidth(numCols-1, self._lastColMinWidth)
|
||||||
# doubt the margin could be calculated in a more intelligent
|
return
|
||||||
# manner...
|
|
||||||
if wxPlatform == '__WXMSW__':
|
|
||||||
margin = 6
|
|
||||||
elif wxPlatform == '__WXGTK__':
|
|
||||||
margin = 8
|
|
||||||
else:
|
|
||||||
margin = 0
|
|
||||||
|
|
||||||
if totColWidth + self._lastColMinWidth > listWidth - margin:
|
# Resize the last column to take up the remaining available space.
|
||||||
# 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)
|
||||||
|
|
||||||
self.SetColumnWidth(numCols-1, listWidth - totColWidth - margin)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user