trytond-patches/issue4011003_200001.diff

190 lines
6.2 KiB
Diff

Index: tryton/tryton/common/cellrendererimage.py
===================================================================
new file mode 100644
--- /dev/null
+++ b/tryton/tryton/common/cellrendererimage.py
@@ -0,0 +1,25 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+import gtk
+import gobject
+
+
+class CellRendererImage(gtk.GenericCellRenderer):
+
+ def __init__(self):
+ self.__gobject_init__()
+ self._renderer = gtk.CellRendererPixbuf()
+ self.pixbuf = None
+
+ def on_get_size(self, widget, cell_area):
+ return self._renderer.get_size(widget, cell_area)
+
+ def on_render(self, window, widget, background_area, cell_area,
+ expose_area, flags):
+ self._renderer.set_property('pixbuf', self.pixbuf)
+
+ return self._renderer.render(window, widget, background_area,
+ cell_area, expose_area, flags)
+
+
+gobject.type_register(CellRendererImage)
Index: tryton/tryton/common/common.py
===================================================================
--- a/tryton/tryton/common/common.py
+++ b/tryton/tryton/common/common.py
@@ -1534,3 +1534,26 @@
if size < 1000:
return '%3.1f%s' % (size, x)
size /= 1000.0
+
+
+def raw_data2pixbuf(data):
+ pixbuf = None
+ if data:
+ for ftype in ('jpeg', 'gif', 'png', 'bmp', 'svg'):
+ try:
+ loader = gtk.gdk.PixbufLoader(ftype)
+ loader.write(data, len(data))
+ loader.close()
+ pixbuf = loader.get_pixbuf()
+ except glib.GError:
+ continue
+ if pixbuf:
+ break
+ if not pixbuf:
+ no_image = open(os.path.join(PIXMAPS_DIR, 'tryton-noimage.png'),
+ 'rb').read()
+ loader = gtk.gdk.PixbufLoader('png')
+ loader.write(no_image, len(no_image))
+ loader.close()
+ pixbuf = loader.get_pixbuf()
+ return pixbuf
Index: tryton/tryton/gui/window/view_form/view/form_gtk/image.py
===================================================================
--- a/tryton/tryton/gui/window/view_form/view/form_gtk/image.py
+++ b/tryton/tryton/gui/window/view_form/view/form_gtk/image.py
@@ -1,19 +1,16 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-import glib
import gettext
import os
import tempfile
-from tryton.common import file_selection, Tooltips, file_open, slugify
-from tryton.config import PIXMAPS_DIR
+from tryton.common import (file_selection, Tooltips, file_open, slugify,
+ raw_data2pixbuf)
from interface import WidgetInterface
import urllib
_ = gettext.gettext
-NOIMAGE = open(os.path.join(PIXMAPS_DIR, 'tryton-noimage.png'), 'rb').read()
-
class Image(WidgetInterface):
@@ -203,28 +200,8 @@
value = False
else:
value = self.field.get_data(self.record)
- if not value:
- data = NOIMAGE
- else:
- data = value
- pixbuf = None
- for ftype in ('jpeg', 'gif', 'png', 'bmp', 'svg'):
- try:
- loader = gtk.gdk.PixbufLoader(ftype)
- loader.write(data, len(data))
- loader.close()
- pixbuf = loader.get_pixbuf()
- except glib.GError:
- continue
- if pixbuf:
- break
- if not pixbuf:
- loader = gtk.gdk.PixbufLoader('png')
- loader.write(NOIMAGE, len(NOIMAGE))
- loader.close()
- pixbuf = loader.get_pixbuf()
-
+ pixbuf = raw_data2pixbuf(value)
img_height = pixbuf.get_height()
if img_height > self.height:
height = self.height
Index: tryton/tryton/gui/window/view_form/view/list_gtk/parser.py
===================================================================
--- a/tryton/tryton/gui/window/view_form/view/list_gtk/parser.py
+++ b/tryton/tryton/gui/window/view_form/view/list_gtk/parser.py
@@ -30,8 +30,9 @@
from tryton.common.cellrendererbinary import CellRendererBinary
from tryton.common.cellrendererclickablepixbuf import \
CellRendererClickablePixbuf
+from tryton.common.cellrendererimage import CellRendererImage
from tryton.translate import date_format
-from tryton.common import RPCExecute, RPCException
+from tryton.common import RPCExecute, RPCException, raw_data2pixbuf
from tryton.common.completion import get_completion, update_completion
from tryton.common.selection import SelectionMixin, PopdownMixin
@@ -142,8 +143,8 @@
fields[fname].attrs.get('readonly', False)))
if isinstance(renderer, CellRendererToggle):
renderer.set_property('activatable', not readonly)
- elif isinstance(renderer,
- (gtk.CellRendererProgress, CellRendererButton)):
+ elif isinstance(renderer, (gtk.CellRendererProgress,
+ CellRendererButton, CellRendererImage)):
pass
else:
renderer.set_property('editable', not readonly)
@@ -1042,6 +1043,30 @@
callback()
+class Image(Char):
+
+ def __init__(self, field_name, model_name, treeview, attrs=None,
+ renderer=None):
+ if renderer is None:
+ renderer = CellRendererImage
+ super(Image, self).__init__(field_name, model_name, treeview, attrs,
+ renderer)
+ self.renderer.set_fixed_size(*[int(attrs.get(a, -1))
+ for a in ('width', 'height')])
+
+ @realized
+ def setter(self, column, cell, store, iter_):
+ record = store.get_value(iter_, 0)
+ field = record[self.field_name]
+ value = field.get_client(record)
+ if isinstance(value, (int, long)):
+ if value > 10 ** 6:
+ value = None
+ else:
+ value = field.get_data(record)
+ cell.pixbuf = raw_data2pixbuf(value)
+
+
class Button(object):
def __init__(self, treeview, screen, attrs=None):
@@ -1106,4 +1131,5 @@
'reference': Reference,
'one2one': O2O,
'binary': Binary,
+ 'image': Image,
}