commit-gnue
[Top][All Lists]
Advanced

[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
 
 
 # =============================================================================





reply via email to

[Prev in Thread] Current Thread [Next in Thread]