[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnue] r8541 - trunk/gnue-forms/src/uidrivers/wx26/widgets
From: |
johannes |
Subject: |
[gnue] r8541 - trunk/gnue-forms/src/uidrivers/wx26/widgets |
Date: |
Tue, 25 Jul 2006 08:24:08 -0500 (CDT) |
Author: johannes
Date: 2006-07-25 08:24:07 -0500 (Tue, 25 Jul 2006)
New Revision: 8541
Modified:
trunk/gnue-forms/src/uidrivers/wx26/widgets/_base.py
trunk/gnue-forms/src/uidrivers/wx26/widgets/box.py
trunk/gnue-forms/src/uidrivers/wx26/widgets/form.py
trunk/gnue-forms/src/uidrivers/wx26/widgets/hbox.py
trunk/gnue-forms/src/uidrivers/wx26/widgets/page.py
trunk/gnue-forms/src/uidrivers/wx26/widgets/vbox.py
Log:
Improved stacking of sizeres and panels
Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/_base.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/_base.py 2006-07-25
12:50:28 UTC (rev 8540)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/_base.py 2006-07-25
13:24:07 UTC (rev 8541)
@@ -32,7 +32,8 @@
from gnue.forms.GFObjects import GFTabStop, GFBox, GFScrollBar, GFLabel
from gnue.forms.uidrivers._base.widgets._base import UIWidget
-__all__ = ['InvalidBoundingBoxError', 'UIHelper']
+__all__ = ['InvalidBoundingBoxError', 'UIHelper', 'ManagedBox',
+ 'create_gridbag']
# =============================================================================
# Exceptions
@@ -492,7 +493,7 @@
else:
# We're using the size of an empty GridCell instead of the average
# character width. It returns better looking forms.
- return (5 * self.chr_w, -1)
+ return (self._uiDriver.cellWidth * self.chr_w, -1)
# -------------------------------------------------------------------------
@@ -514,3 +515,118 @@
raise NotImplementedError("No implementation for %s (%s/%s)" \
% (self.__class__, event.container, spacer))
+
+# =============================================================================
+# Create a new GridBagSizer
+# =============================================================================
+
+def create_gridbag(ecs=(5, 10)):
+ """
+ Create a new GridBagSizer with a given size for empty cells. Horizontal
+ and vertical gap is set depending on the OS.
+
+ @param ecs: tuple with the EmptyCellSize
+ @returns: wx.GridBagSizer instance
+ """
+
+ if 'wxMac' in wx.PlatformInfo:
+ hgap, vgap = 4, 4
+ else:
+ hgap, vgap = 2, 2
+
+ result = wx.GridBagSizer(hgap, vgap)
+ result.SetEmptyCellSize(ecs)
+
+ return result
+
+# =============================================================================
+# Base class for managed boxes (vbox/hbox)
+# =============================================================================
+
+class ManagedBox(UIHelper):
+ """
+ A ManagedBox is the base class for all kinds of managed box containers
+ (vbox/hbox). Such a box contains a GridBagSizer with two columns (vbox) or
+ two rows (hbox). The first row/column always contains the labels and the
+ second one the entries. The first row/column will be left away if a box
+ has no child using it.
+
+ @cvar _vertical_: orientation of the managed box is vertical (True) or
+ horizontal (False).
+ @ivar last_item: the row- or column-number within the GridBagSizer of the
+ last item added.
+ @ivar _entry_pos: the row- or column-number which holds the entries or
+ non-label-style child-widgets in general.
+ """
+
+ _vertical_ = True
+ last_item = 0
+ _entry_pos = 0
+
+ # -------------------------------------------------------------------------
+ # Create the box widget
+ # -------------------------------------------------------------------------
+
+ def _create_widget_(self, event, spacer):
+ """
+ @param event: the creation-event instance carrying information like
+ container (parent-widget)
+ @param spacer: not used for managed boxes
+
+ @returns: the container panel
+ """
+
+ self.last_item = 0
+
+ parent = event.container
+
+ # Build the base panel for the managed box. This panel will be the
+ # parent for container-panel of the box (as well as the StaticBoxSizer
+ # if a box-label is requested).
+ panel = wx.Panel(parent, -1)
+ panel.SetSizer(wx.BoxSizer(wx.VERTICAL))
+
+ self._container = wx.Panel(panel, -1)
+ self._entry_pos = self.__use_second_one() and 2 or 1
+
+ gbs = create_gridbag()
+ if self._vertical_:
+ gbs.AddGrowableCol(self._entry_pos - 1)
+ else:
+ gbs.AddGrowableRow(self._entry_pos - 1)
+
+ self._container.SetSizer(gbs)
+
+ # If a label is requested for the box, we have to wrap the container
+ # with a StaticBoxSizer.
+ if self._gfObject.label is not None:
+ box = wx.StaticBox(panel, -1, self._gfObject.label)
+ stb = wx.StaticBoxSizer(box, wx.VERTICAL)
+ stb.Add(self._container, 1, wx.EXPAND)
+ add = stb
+ else:
+ add = self._container
+
+ panel.GetSizer().Add(add, 1, wx.EXPAND)
+
+ self.widget = panel
+ self.getParent().add_widgets(self, spacer)
+
+ return self._container
+
+
+ # -------------------------------------------------------------------------
+ # Do we need both rows/columns
+ # -------------------------------------------------------------------------
+
+ def __use_second_one(self):
+
+ result = False
+
+ for item in self._children:
+ if (item._gfObject._type in ['GFEntry', 'GFImage']) and \
+ item._gfObject.label:
+ result = True
+ break
+
+ return result
Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/box.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/box.py 2006-07-25 12:50:28 UTC
(rev 8540)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/box.py 2006-07-25 13:24:07 UTC
(rev 8541)
@@ -59,8 +59,6 @@
Interface implementation for the <box> tag
"""
- container_sizer = None
-
# -------------------------------------------------------------------------
# Create a wx box widget
# -------------------------------------------------------------------------
@@ -88,27 +86,20 @@
owner.chr_y + owner.chr_h <= top + height:
raise InvalidBoundingBoxError(self, owner)
- self.widget = wx.BoxSizer(wx.VERTICAL)
parent = event.container
-
- stb = wx.StaticBox (parent, -1, self._gfObject.label)
- stb_sizer = wx.StaticBoxSizer(stb, wx.VERTICAL)
- if 'wxMac' in wx.PlatformInfo:
- hgap, vgap = 4, 4
- else:
- hgap, vgap = 2, 2
+ # Box-Panel
+ self._container = wx.Panel(parent, -1)
+ self._container.SetSizer(_base.create_gridbag())
- self.container_sizer = wx.GridBagSizer(hgap, vgap)
- self.container_sizer.SetEmptyCellSize((5, 10))
+ box = wx.StaticBox(parent, -1, self._gfObject.label)
+ stb = wx.StaticBoxSizer(box, wx.VERTICAL)
+ stb.Add(self._container, 1, wx.EXPAND)
- stb_sizer.Add(self.container_sizer, 1, wx.EXPAND | wx.ALL, 3)
- self.widget.Add(stb_sizer, 1, wx.EXPAND | wx.ALL, 3)
-
+ self.widget = stb
owner.add_widgets(self, 0)
- self._container = parent
- return self.container_sizer
+ return self._container
# -------------------------------------------------------------------------
@@ -131,7 +122,7 @@
box.Add(item, 1, wx.ALIGN_CENTER_VERTICAL)
item = box
- self.container_sizer.Add(item, ui_widget.chr_pos,
+ self._container.GetSizer().Add(item, ui_widget.chr_pos,
ui_widget.chr_span, flags)
Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/form.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/form.py 2006-07-25 12:50:28 UTC
(rev 8540)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/form.py 2006-07-25 13:24:07 UTC
(rev 8541)
@@ -131,19 +131,15 @@
tlb = ToolBar(self._uiDriver, base_panel, self._form)
base_sizer.Add(tlb.toolbar, 0, wx.EXPAND)
- # Now create the page container depending on the tabbed attribute
+ # If the form is using tabs, we need to create a Notebook control as
+ # page container, otherwise we can just use the base panel
if self._form._layout.tabbed != 'none':
style = self._TAB_STYLE[self._form._layout.tabbed]
- container = wx.Notebook(base_panel, -1, style = style)
+ self._container = wx.Notebook(base_panel, -1, style = style)
+ base_sizer.Add(self._container, 1, wx.EXPAND | wx.ALL, 6)
else:
- container = wx.Panel(base_panel, -1)
- cont_sizer = wx.BoxSizer(wx.VERTICAL)
- container.SetSizer(cont_sizer)
+ self._container = base_panel
- # and add it to the base sizer
- base_sizer.Add(container, 1, wx.EXPAND | wx.ALL, 6)
- self._container = container
-
return self.main_window
@@ -238,17 +234,17 @@
@param page_index: the zero-based index of the page to show
"""
- container = self._container
- if isinstance (container, wx.Notebook):
- container.SetSelection(page_index)
+ if isinstance (self._container, wx.Notebook):
+ self._container.SetSelection(page_index)
else:
+ # TODO: on wx.MSW the screen does not refresh automatically
self.main_window.Freeze()
try:
for (index, widget) in enumerate(self.pages):
- if index != page_index:
- widget.Hide()
- else:
+ if index == page_index:
widget.Show()
+ else:
+ widget.Hide()
if not initial:
self.main_window.Layout()
@@ -256,6 +252,7 @@
finally:
self.main_window.Thaw()
+ self.main_window.Refresh()
# -------------------------------------------------------------------------
Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/hbox.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/hbox.py 2006-07-25 12:50:28 UTC
(rev 8540)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/hbox.py 2006-07-25 13:24:07 UTC
(rev 8541)
@@ -36,68 +36,14 @@
# Interface implementation for a box widget
# =============================================================================
-class UIHBox (_base.UIHelper):
+class UIHBox (_base.ManagedBox):
"""
Implementation of the hbox tag.
"""
- container_sizer = None
- __current_col = 0
+ _vertical_ = False
-
# -------------------------------------------------------------------------
- # Create a wx box widget
- # -------------------------------------------------------------------------
-
- def _create_widget_ (self, event, spacer):
- """
- Create the BoxSizer for the hbox and add it to the owner. The spacer
- is ignored for hbox tags.
-
- @param event: the creation-event instance carrying information like
- container (parent-widget)
- @param spacer: not used for hboxes
-
- @returns: the GridBagSizer used for all the child widgets.
- """
-
- parent = event.container
- owner = self.getParent()
-
- outer = wx.BoxSizer(wx.VERTICAL)
-
- if self._gfObject.label:
- stb = wx.StaticBox(parent, -1, self._gfObject.label)
- stb_sizer = wx.StaticBoxSizer(stb, wx.VERTICAL)
-
- outer.Add(stb_sizer, 1, wx.EXPAND | wx.ALL, 4)
- next = stb_sizer
- border = 2
- else:
- next = outer
- border = 0
-
- if 'wxMac' in wx.PlatformInfo:
- hgap, vgap = 4, 4
- else:
- hgap, vgap = 2, 2
-
- self.container_sizer = wx.GridBagSizer(hgap, vgap)
- self.container_sizer.SetEmptyCellSize((5, 10))
- self.container_sizer.AddGrowableRow(1)
-
- next.Add(self.container_sizer, 1, wx.EXPAND | wx.ALL, border)
-
- self._container = event.container
- self.__current_col = 0
-
- self.widget = outer
- owner.add_widgets(self, spacer)
-
- return self.container_sizer
-
-
- # -------------------------------------------------------------------------
# Add new widgets for a givin UI* instance to the HBox container
# -------------------------------------------------------------------------
@@ -109,40 +55,35 @@
@param spacer: not used for boxes
"""
- pos = (0, self.__current_col)
+ sizer = self._container.GetSizer()
+ pos = (0, self.last_item)
span = (1, 1)
- add = 0
- span_control = False
+ add = False
if ui_widget.label:
- add = 1
- self.container_sizer.Add(ui_widget.label, pos, span,
- wx.ALIGN_BOTTOM)
+ add = True
+ sizer.Add(ui_widget.label, pos, span, wx.ALIGN_BOTTOM)
if ui_widget.widget:
- add = 1
- if span_control and not ui_widget.label:
- pos = (0, self.__current_col)
- span = (2, 1)
- else:
- pos = (1, self.__current_col)
- span = (1, 1)
+ add = True
+ pos = (self._entry_pos - 1, self.last_item)
+ span = (1, 1)
item = ui_widget.widget
flags = wx.ALIGN_TOP | wx.EXPAND
+
if isinstance(ui_widget, button.UIButton):
item = self.add_to_hbox(item)
elif not ui_widget.growable:
item = self.add_to_vbox(item)
- self.container_sizer.Add(item, pos, span, flags)
+ sizer.Add(item, pos, span, flags)
if add:
- self.container_sizer.AddGrowableCol(self.__current_col,
- ui_widget.stretch)
+ sizer.AddGrowableCol(self.last_item, ui_widget.stretch)
- self.__current_col += add
+ self.last_item += add
# =============================================================================
Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/page.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/page.py 2006-07-25 12:50:28 UTC
(rev 8540)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/page.py 2006-07-25 13:24:07 UTC
(rev 8541)
@@ -40,16 +40,9 @@
@ivar page_index: zero-based index of the page within the form's
page-container (which is either a notebook or a panel).
- @ivar container_sizer: all child widgets of the page will be added to this
- wx.Sizer. For a positioned layout this is a wx.GridBagSizer and for
- managed layouts it is a vertical wx.BoxSizer. This sizer is embedded
- within the page panel using a border of 4 pixels.
- @ivar _container: the page panel which gets the parent window
- for all child widgets
"""
page_index = 0
- container_sizer = None
# -------------------------------------------------------------------------
# Create a new page widget
@@ -72,36 +65,27 @@
self.page_index = len(self._uiForm.pages)
parent = event.container
- page_panel = wx.Panel(parent, -1)
- page_sizer = wx.BoxSizer(wx.VERTICAL)
- page_panel.SetSizer(page_sizer)
- if isinstance(parent, wx.Notebook):
- title = "%s" % (self._gfObject.caption or self._gfObject.name)
- parent.AddPage(page_panel, title, False)
- else:
- parent.GetSizer().Add(page_panel, 1, wx.EXPAND)
+ self._container = wx.Panel(parent, -1)
- self._uiForm.pages.append(page_panel)
-
- # Add the container-sizer depending on the page-management
if self.managed:
- self.container_sizer = wx.BoxSizer(wx.VERTICAL)
+ page_sizer = wx.BoxSizer(wx.VERTICAL)
else:
- if 'wxMac' in wx.PlatformInfo:
- hgap, vgap = 4, 4
- else:
- hgap, vgap = 2, 2
+ page_sizer = _base.create_gridbag()
- self.container_sizer = wx.GridBagSizer(hgap, vgap)
- self.container_sizer.SetEmptyCellSize((5, 10))
+ self._container.SetSizer(page_sizer)
- page_sizer.Add(self.container_sizer, 1, wx.EXPAND | wx.ALL, 4)
+ if isinstance(parent, wx.Notebook):
+ title = "%s" % (self._gfObject.caption or self._gfObject.name)
+ parent.AddPage(self._container, title, False)
+ else:
+ parent.GetSizer().Add(self._container, 1, wx.EXPAND)
- self._container = page_panel
- return page_panel
+ self._uiForm.pages.append(self._container)
+ return self._container
+
# -------------------------------------------------------------------------
# Add widgets to the page
# -------------------------------------------------------------------------
@@ -115,20 +99,28 @@
"""
item = ui_widget.widget
+ sizer = self._container.GetSizer()
if self.managed:
- self.container_sizer.Add(item, 1, wx.EXPAND)
+ sizer.Add(item, 1, wx.EXPAND | wx.ALL, 4)
else:
flags = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND
+ border = 0
if not ui_widget.growable:
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(item, 1, wx.ALIGN_CENTER_VERTICAL)
item = box
- self.container_sizer.Add(item, ui_widget.chr_pos,
- ui_widget.chr_span, flags)
+ if ui_widget._gfObject._type == 'GFBox' and \
+ 'wxMSW' in wx.PlatformInfo:
+ border = 6
+ flags |= wx.RIGHT
+ sizer.Add(item, ui_widget.chr_pos, ui_widget.chr_span, flags,
+ border)
+
+
# =============================================================================
# Configuration data
# =============================================================================
Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/vbox.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/vbox.py 2006-07-25 12:50:28 UTC
(rev 8540)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/vbox.py 2006-07-25 13:24:07 UTC
(rev 8541)
@@ -28,7 +28,7 @@
import wx
-from gnue.forms.uidrivers.wx26.widgets import _base, hbox, entry, button, grid
+from gnue.forms.uidrivers.wx26.widgets import _base, hbox, button, grid
__all__ = ['UIVBox']
@@ -36,67 +36,12 @@
# Interface implementation for a box widget
# =============================================================================
-class UIVBox (_base.UIHelper):
+class UIVBox (_base.ManagedBox):
"""
Implementation of the vbox tag
"""
- __current_row = 0
- container_sizer = None
-
# -------------------------------------------------------------------------
- # Create a wx box widget
- # -------------------------------------------------------------------------
-
- def _create_widget_ (self, event, spacer):
- """
- Create the BoxSizer for the vbox and add it to the owner. The spacer
- is ignored for vbox tags.
-
- @param event: the creation-event instance carrying information like
- container (parent-widget)
- @param spacer: not used for vboxes
-
- @returns: the GridBagSizer used for all the child widgets.
- """
-
- parent = event.container
- owner = self.getParent()
-
- outer = wx.BoxSizer(wx.VERTICAL)
-
- if self._gfObject.label:
- stb = wx.StaticBox(parent, -1, self._gfObject.label)
- stb_sizer = wx.StaticBoxSizer(stb, wx.VERTICAL)
-
- outer.Add(stb_sizer, 1, wx.EXPAND | wx.ALL, 4)
- next = stb_sizer
- border = 2
- else:
- next = outer
- border = 0
-
- if 'wxMac' in wx.PlatformInfo:
- hgap, vgap = 4, 4
- else:
- hgap, vgap = 2, 2
-
- self.container_sizer = wx.GridBagSizer(hgap, vgap)
- self.container_sizer.SetEmptyCellSize((5, 10))
- self.container_sizer.AddGrowableCol(1)
-
- next.Add(self.container_sizer, 1, wx.EXPAND | wx.ALL, border)
-
- self._container = event.container
- self.__current_row = 0
-
- self.widget = outer
- owner.add_widgets(self, spacer)
-
- return self.container_sizer
-
-
- # -------------------------------------------------------------------------
# Add an UI widget to the VBox container
# -------------------------------------------------------------------------
@@ -109,22 +54,23 @@
@param spacer: not used for boxes
"""
- pos = (self.__current_row, 0)
+ sizer = self._container.GetSizer()
+ pos = (self.last_item, 0)
span = (1, 1)
- add = 0
+ add = False
both = isinstance(ui_widget, (UIVBox, hbox.UIHBox, grid.UIGrid)) or \
isinstance (ui_widget.widget, wx.CheckBox)
if ui_widget.label:
- add = 1
+ add = True
flags = wx.ALIGN_CENTER_VERTICAL
if ui_widget.growable:
flags |= wx.EXPAND
- self.container_sizer.Add(ui_widget.label, pos, span, flags)
+ sizer.Add(ui_widget.label, pos, span, flags)
if ui_widget.widget:
- add = 1
+ add = True
if isinstance(ui_widget, button.UIButton):
item = self.add_to_hbox(ui_widget.widget)
item = ui_widget.widget
@@ -132,20 +78,18 @@
item = ui_widget.widget
if both and not ui_widget.label:
- pos = (self.__current_row, 0)
+ pos = (self.last_item, 0)
span = (1, 2)
else:
- pos = (self.__current_row, 1)
+ pos = (self.last_item, self._entry_pos - 1)
span = (1, 1)
- self.container_sizer.Add(item, pos, span, wx.EXPAND)
+ sizer.Add(item, pos, span, wx.EXPAND)
- if add:
- if ui_widget.growable:
- self.container_sizer.AddGrowableRow(self.__current_row,
- ui_widget.stretch)
+ if add and ui_widget.growable:
+ sizer.AddGrowableRow(self.last_item, ui_widget.stretch)
- self.__current_row += add
+ self.last_item += add
# =============================================================================
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r8541 - trunk/gnue-forms/src/uidrivers/wx26/widgets,
johannes <=