[gnue] r9504 - in trunk/gnue-forms/src: GFObjects input/displayHandlers uidrivers/wx26 uidrivers/wx26/widgets

[email protected]
Newsgroups gmane.comp.cms.gnue.cvs
Message-ID <[email protected]>
Author: johannes
Date: 2007-04-23 09:05:48 -0500 (Mon, 23 Apr 2007)
New Revision: 9504

Modified:
   trunk/gnue-forms/src/GFObjects/GFField.py
   trunk/gnue-forms/src/input/displayHandlers/Image.py
   trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py
   trunk/gnue-forms/src/uidrivers/wx26/widgets/entry.py
   trunk/gnue-forms/src/uidrivers/wx26/widgets/image.py
Log:
Images are working on wxMSW and OSX again (although not scrollable).
ListBoxes without values does not crash on wxMSW

issue163: testing 


Modified: trunk/gnue-forms/src/GFObjects/GFField.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFField.py	2007-04-19 10:31:40 UTC (rev 9503)
+++ trunk/gnue-forms/src/GFObjects/GFField.py	2007-04-23 14:05:48 UTC (rev 9504)
@@ -550,11 +550,15 @@
         if dpSep.startswith('"') and dpSep.endswith('"') and len(dpSep) > 2:
             dpSep = dpSep[1:-1]
 
-        array = resultSet.getArray ([self.fk_key] + self._fk_descr)
+        array = resultSet.getArray([self.fk_key] + self._fk_descr)
+        if not array and self.required:
+            gDebug(1, "WARNING: empty item added the choices of a required " \
+                      "field")
+            self.__lookup_list = [u""]
 
         for line in array:
             key = line[0]
-            descr = dpSep.join (["%s" % i for i in line[1:]])
+            descr = dpSep.join(["%s" % i for i in line[1:]])
 
             self.__lookup_list.append(descr)
             self.__lookup_dict[key] = descr

Modified: trunk/gnue-forms/src/input/displayHandlers/Image.py
===================================================================
--- trunk/gnue-forms/src/input/displayHandlers/Image.py	2007-04-19 10:31:40 UTC (rev 9503)
+++ trunk/gnue-forms/src/input/displayHandlers/Image.py	2007-04-23 14:05:48 UTC (rev 9504)
@@ -66,7 +66,7 @@
             # upon urlopen which doesn't provide seek.  We'll use the
             # StringIO function to get around that so that urls can
             # still be used 
-            urlFile = openResource(value)        
+            urlFile = openResource(value, 'rb')
             fileObject = cStringIO.StringIO(urlFile.read())
             image = PILImage.open(fileObject)
         
@@ -74,4 +74,5 @@
             image = PILImage.new("RGB", (1, 1, ))
     else:
         image = PILImage.new("RGB", (1, 1, ))
+
     return image

Modified: trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py	2007-04-19 10:31:40 UTC (rev 9503)
+++ trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py	2007-04-23 14:05:48 UTC (rev 9504)
@@ -71,6 +71,7 @@
 
       self.name = "wx 2.6"
       self.app  = wx.GetApp () or wx.App ()
+      wx.InitAllImageHandlers()
       wx.lib.colourdb.updateColourDB()
 
       (self.best_sizes, self.cellWidth, self.cellHeight) = self.__getSizes ()

Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/entry.py	2007-04-19 10:31:40 UTC (rev 9503)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/entry.py	2007-04-23 14:05:48 UTC (rev 9504)
@@ -437,8 +437,14 @@
                 # TODO: We must allow setting the value to None, too, to be
                 # able to move the cursor to the empty position at the start.
                 # Must be tested under windows and Mac OS X.
-                if not widget.SetStringSelection(value, True):
+                #
+                # On wxMSW SetStringSelection() does not work properly with
+                # empty values.
+                index = widget.FindString(value)
+                if index == -1:
                     widget.SetSelection(wx.NOT_FOUND)
+                else:
+                    widget.SetSelection(index)
 
             elif isinstance(widget, wx.CheckBox):
                 if value is None:

Modified: trunk/gnue-forms/src/uidrivers/wx26/widgets/image.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/widgets/image.py	2007-04-19 10:31:40 UTC (rev 9503)
+++ trunk/gnue-forms/src/uidrivers/wx26/widgets/image.py	2007-04-23 14:05:48 UTC (rev 9504)
@@ -24,10 +24,10 @@
 import wx
 
 try:
-  from PIL import Image as PILImage
+    from PIL import Image as PILImage
 
 except:
-  PILImage = None
+    PILImage = None
 
 from gnue.common.definitions import GParser
 from gnue.forms.uidrivers.wx26.widgets import _base
@@ -45,9 +45,139 @@
 
 
 # =============================================================================
-# Wrap an UI layer around a wx image
+# ImageViewer
 # =============================================================================
 
+class ImageViewer(wx.Window):
+    """
+    An implementation of a wx widget used for displaying images
+    """
+
+    # -------------------------------------------------------------------------
+    # Constructor
+    # -------------------------------------------------------------------------
+
+    def __init__(self, parent, size=wx.DefaultSize, fit='auto'):
+
+        wx.Window.__init__(self, parent, -1, wx.DefaultPosition, size)
+        self.win = parent
+        self.image = None
+        self.back_color = 'WHITE'
+        self.border_color = 'BLACK'
+        self.fit = fit
+
+        self.image_sizex = size[0]
+        self.image_sizey = size[1]
+
+        self.Bind(wx.EVT_PAINT, self.OnPaint)
+
+
+    # -------------------------------------------------------------------------
+    # Draw the current image
+    # -------------------------------------------------------------------------
+
+    def OnPaint(self, event):
+        dc = wx.PaintDC(self)
+        self.DrawImage(dc)
+
+
+    # -------------------------------------------------------------------------
+    # Change the current image
+    # -------------------------------------------------------------------------
+
+    def SetValue(self, value):
+
+        image = wx.EmptyImage(value.size[0], value.size[1])
+        image.SetData(value.convert("RGB").tostring())
+        self.image = image
+        self.Refresh()
+
+
+    # -------------------------------------------------------------------------
+    # Draw a border around the widget
+    # -------------------------------------------------------------------------
+
+    def DrawBorder(self, dc):
+
+        brush = wx.Brush(wx.NamedColour(self.back_color), wx.SOLID)
+        dc.SetBrush(brush)
+        dc.SetPen(wx.Pen(wx.NamedColour(self.border_color), 1))
+        dc.DrawRectangle(0, 0, self.image_sizex, self.image_sizey)
+
+
+    # -------------------------------------------------------------------------
+    # Draw the image to the device context
+    # -------------------------------------------------------------------------
+
+    def DrawImage(self, dc):
+        try:
+            image = self.image
+        except:
+            return
+
+        self.DrawBorder(dc)
+
+        if image is None:
+            return
+
+        bmp = image.ConvertToBitmap()
+
+        # Dimensions of the image file
+        iwidth = bmp.GetWidth()
+        iheight = bmp.GetHeight()
+        scrx = self.image_sizex
+        scry = self.image_sizey
+
+        fit = self.fit
+        if fit == "auto":
+            if float(scrx) / iwidth < float(scry) / iwidth:
+                fit = "width"
+            else:
+                fit = "height"
+
+        if fit == 'width':
+            prop = float(self.image_sizex-10) / iwidth
+            iwidth = self.image_sizex - 10
+            diffx = 5
+            iheight = abs(int(iheight * prop))
+            diffy = (self.image_sizey - iheight)/2
+
+            if iheight >= self.image_sizey - 10:
+                diffy = 5
+                iheight = self.image_sizey - 10
+
+        elif fit == 'height':
+            prop = float(self.image_sizey-10) / iheight
+            iheight = self.image_sizey - 10
+            diffy = 5
+
+            iwidth = abs(int(iwidth * prop))
+            diffx = (self.image_sizex - iwidth) / 2
+            if iwidth > self.image_sizex - 10:
+                diffx = 5
+                iwidth = self.image_sizex - 10
+
+        elif fit == 'both':
+            diffx = (self.image_sizex - iwidth)/2   # center calc
+            if iwidth >= self.image_sizex -10:      # if image width fits in
+                                                    # window adjust
+                diffx = 5
+                iwidth = self.image_sizex - 10
+
+            diffy = (self.image_sizey - iheight)/2  # center calc
+            if iheight >= self.image_sizey - 10:    # if image height fits in 
+                                                    # window adjust
+                diffy = 5
+                iheight = self.image_sizey - 10
+
+        image.Rescale(iwidth, iheight)      # rescale to fit the window
+        bmp = image.ConvertToBitmap()
+        dc.DrawBitmap(bmp, diffx, diffy)        # draw the image to window
+
+
+# ============================================================================= # Wrap an UI layer around a wx image
+# =============================================================================
+
 class UIImage (_base.UIHelper):
     """
     Creates a single instance of an image.
@@ -65,22 +195,12 @@
         parent = event.container
 
         self.image_size = self.get_default_size()
-        self.widget = wx.ScrolledWindow(parent, -1, size=self.image_size)
 
-        sw_sizer = wx.BoxSizer(wx.VERTICAL)
-        self.widget.SetSizer(sw_sizer)
+        self.widget = ImageViewer(parent, self.image_size, self._gfObject.fit)
 
-        if self.managed:
-            bmp = wx.StaticBitmap(self.widget, -1, wx.NullBitmap,
-                    size=self.image_size)
-        else:
-            bmp = wx.StaticBitmap(self.widget, -1, wx.NullBitmap)
-
-        sw_sizer.Add(bmp, 1, wx.EXPAND)
-
         self.getParent().add_widgets(self, spacer)
 
-        return bmp
+        return self.widget
 
 
     # -------------------------------------------------------------------------
@@ -120,47 +240,12 @@
         """
 
         if PILImage is None:
-          return
+            return
 
-        widget = self.widgets [index]
-        scrx, scry = self.image_size
-        imgx, imgy = value.size
+        widget = self.widgets[index]
+        widget.SetValue(value)
 
-        scalex = scaley = 1
 
-        fit = self._gfObject.fit
-
-        if fit == "auto":
-          if float (scrx) / imgx < float (scry) / imgy:
-            fit = "width"
-          else:
-            fit = "height"
-
-        if fit == "width":
-          scalex = scaley = float (scrx) / imgx
-
-        elif fit == "height":
-          scalex = scaley = float (scry) / imgy
-
-        elif fit == "both":
-          scalex = float (scrx) / imgx
-          scaley = float (scry) / imgy
-        else:
-          self.widget.SetScrollRate (10, 10)
-
-        if scalex != 1 or scaley != 1:
-          value = value.resize ((abs (int (imgx * scalex)),
-            abs (int (imgy * scaley))), PILImage.BICUBIC)
-
-        # Convert the PIL Image to a wxBitmap
-        wxImg = wx.EmptyImage(value.size[0], value.size[1])
-        wxImg.SetData(value.convert("RGB").tostring())
-        image = wxImg.ConvertToBitmap()
-
-        widget.SetBitmap(image)
-        widget.Refresh()
-
-
 # =============================================================================
 # Configuration data
 # =============================================================================
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.