Refactor Binary and Image form widget

Move shared code from both in a Mixin class

review21351002
This commit is contained in:
Cédric Krier committed 2015-08-21 15:36:11 +02:00
1 parent 7ec8672961
commit ddda520ebd
2 files changed
+148 -227

No files matched your search

@@ -11,16 +11,131 @@ from .widget import Widget
_ = gettext.gettext
class Binary(Widget):
class BinaryMixin(Widget):
def __init__(self, view, attrs):
super(BinaryMixin, self).__init__(view, attrs)
self.filename = attrs.get('filename')
def toolbar(self):
'Return HBox with the toolbar'
hbox = gtk.HBox(spacing=0)
tooltips = Tooltips()
self.but_select = gtk.Button()
img_select = gtk.Image()
img_select.set_from_stock('tryton-find', gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_select.set_image(img_select)
self.but_select.set_relief(gtk.RELIEF_NONE)
self.but_select.connect('clicked', self.select)
tooltips.set_tip(self.but_select, _('Select...'))
hbox.pack_start(self.but_select, expand=False, fill=False)
if self.filename:
self.but_open = gtk.Button()
img_open = gtk.Image()
img_open.set_from_stock('tryton-open', gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_open.set_image(img_open)
self.but_open.set_relief(gtk.RELIEF_NONE)
self.but_open.connect('clicked', self.open_)
tooltips.set_tip(self.but_open, _('Open...'))
hbox.pack_start(self.but_open, expand=False, fill=False)
else:
self.but_open = None
self.but_save_as = gtk.Button()
img_save_as = gtk.Image()
img_save_as.set_from_stock('tryton-save-as',
gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_save_as.set_image(img_save_as)
self.but_save_as.set_relief(gtk.RELIEF_NONE)
self.but_save_as.connect('clicked', self.save_as)
tooltips.set_tip(self.but_save_as, _('Save As...'))
hbox.pack_start(self.but_save_as, expand=False, fill=False)
self.but_clear = gtk.Button()
img_clear = gtk.Image()
img_clear.set_from_stock('tryton-clear', gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_clear.set_image(img_clear)
self.but_clear.set_relief(gtk.RELIEF_NONE)
self.but_clear.connect('clicked', self.clear)
tooltips.set_tip(self.but_clear, _('Clear'))
hbox.pack_start(self.but_clear, expand=False, fill=False)
tooltips.enable()
return hbox
@property
def filename_field(self):
return self.record.group.fields.get(self.filename)
@property
def filters(self):
filter_all = gtk.FileFilter()
filter_all.set_name(_('All files'))
filter_all.add_pattern("*")
return [filter_all]
@property
def preview(self):
return False
def select(self, widget=None):
if not self.field:
return
filters = self.filters
filename = file_selection(_('Select'), preview=self.preview,
filters=filters)
if filename:
self.field.set_client(self.record, open(filename, 'rb').read())
if self.filename_field:
self.filename_field.set_client(self.record,
os.path.basename(filename))
def open_(self, widget=None):
if not self.filename_field:
return
filename = self.filename_field.get(self.record)
if not filename:
return
dtemp = tempfile.mkdtemp(prefix='tryton_')
root, ext = os.path.splitext(filename)
filename = ''.join([slugify(root), os.extsep, slugify(ext)])
file_path = os.path.join(dtemp, filename)
with open(file_path, 'wb') as fp:
if hasattr(self.field, 'get_data'):
fp.write(self.field.get_data(self.record))
else:
fp.write(self.field.get(self.record))
root, type_ = os.path.splitext(filename)
if type_:
type_ = type_[1:]
file_open(file_path, type_)
def save_as(self, widget=None):
filename = ''
if self.filename_field:
filename = self.filename_field.get(self.record)
filename = file_selection(_('Save As...'), filename=filename,
action=gtk.FILE_CHOOSER_ACTION_SAVE)
if filename:
with open(filename, 'wb') as fp:
if hasattr(self.field, 'get_data'):
fp.write(self.field.get_data(self.record))
else:
fp.write(self.field.get(self.record))
def clear(self, widget=None):
self.field.set_client(self.record, None)
class Binary(BinaryMixin, Widget):
"Binary"
def __init__(self, view, attrs):
super(Binary, self).__init__(view, attrs)
self.filename = attrs.get('filename')
self.tooltips = Tooltips()
self.widget = gtk.HBox(spacing=0)
self.wid_size = gtk.Entry()
self.wid_size.set_width_chars(10)
@@ -39,121 +154,26 @@ class Binary(Widget):
self.widget.pack_start(self.wid_size, expand=not self.filename,
fill=True)
self.but_new = gtk.Button()
img_new = gtk.Image()
img_new.set_from_stock('tryton-find', gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_new.set_image(img_new)
self.but_new.set_relief(gtk.RELIEF_NONE)
self.but_new.connect('clicked', self.sig_new)
self.tooltips.set_tip(self.but_new, _('Select a File...'))
self.widget.pack_start(self.but_new, expand=False, fill=False)
if self.filename:
self.but_open = gtk.Button()
img_open = gtk.Image()
img_open.set_from_stock('tryton-open', gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_open.set_image(img_open)
self.but_open.set_relief(gtk.RELIEF_NONE)
self.but_open.connect('clicked', self.sig_open)
self.tooltips.set_tip(self.but_open, _('Open...'))
self.widget.pack_start(self.but_open, expand=False, fill=False)
else:
self.but_open = None
self.but_save_as = gtk.Button()
img_save_as = gtk.Image()
img_save_as.set_from_stock('tryton-save-as',
gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_save_as.set_image(img_save_as)
self.but_save_as.set_relief(gtk.RELIEF_NONE)
self.but_save_as.connect('clicked', self.sig_save_as)
self.tooltips.set_tip(self.but_save_as, _('Save As...'))
self.widget.pack_start(self.but_save_as, expand=False, fill=False)
self.but_remove = gtk.Button()
img_remove = gtk.Image()
img_remove.set_from_stock('tryton-clear', gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_remove.set_image(img_remove)
self.but_remove.set_relief(gtk.RELIEF_NONE)
self.but_remove.connect('clicked', self.sig_remove)
self.tooltips.set_tip(self.but_remove, _('Clear'))
self.widget.pack_start(self.but_remove, expand=False, fill=False)
self.last_open_file = None
self.tooltips.enable()
@property
def filename_field(self):
return self.record.group.fields.get(self.filename)
self.widget.pack_start(self.toolbar(), expand=False, fill=False)
def _readonly_set(self, value):
if value:
self.but_new.hide()
self.but_remove.hide()
self.but_select.hide()
self.but_clear.hide()
self.widget.set_focus_chain([])
else:
self.but_new.show()
self.but_remove.show()
self.but_select.show()
self.but_clear.show()
if self.wid_text:
focus_chain = [self.wid_text]
elif self.filename:
focus_chain = [self.but_new, self.but_open, self.but_save_as,
self.but_remove]
focus_chain = [self.but_select, self.but_open,
self.but_save_as, self.but_clear]
else:
focus_chain = [self.but_new, self.but_save_as, self.but_remove]
focus_chain = [self.but_select, self.but_save_as,
self.but_clear]
self.widget.set_focus_chain(focus_chain)
def sig_new(self, widget=None):
filename = ''
if self.last_open_file:
last_id, last_filename = self.last_open_file
if last_id == self.record.id:
filename = last_filename
filename = file_selection(_('Open...'), filename=filename)
if filename and self.field:
self.field.set_client(self.record, open(filename, 'rb').read())
if self.filename_field:
self.filename_field.set_client(self.record,
os.path.basename(filename))
def sig_open(self, widget=None):
if not self.filename_field:
return
dtemp = tempfile.mkdtemp(prefix='tryton_')
filename = self.filename_field.get(self.record)
if not filename:
return
root, ext = os.path.splitext(filename)
filename = ''.join([slugify(root), os.extsep, slugify(ext)])
file_path = os.path.join(dtemp, filename)
with open(file_path, 'wb') as fp:
if hasattr(self.field, 'get_data'):
fp.write(self.field.get_data(self.record))
else:
fp.write(self.field.get(self.record))
root, type_ = os.path.splitext(filename)
if type_:
type_ = type_[1:]
file_open(file_path, type_)
self.last_open_file = (self.record.id, file_path)
def sig_save_as(self, widget=None):
filename = ''
if self.filename_field:
filename = self.filename_field.get(self.record)
filename = file_selection(_('Save As...'), filename=filename,
action=gtk.FILE_CHOOSER_ACTION_SAVE)
if filename:
with open(filename, 'wb') as fp:
if hasattr(self.field, 'get_data'):
fp.write(self.field.get_data(self.record))
else:
fp.write(self.field.get(self.record))
def sig_remove(self, widget=None):
self.field.set_client(self.record, False)
def sig_key_press(self, widget, event, *args):
editable = self.wid_text and self.wid_text.get_editable()
if event.keyval == gtk.keysyms.F3 and editable:
@@ -2,22 +2,20 @@
# this repository contains the full copyright notices and license terms.
import gtk
import gettext
import os
import tempfile
from tryton.common import (file_selection, Tooltips, file_open, slugify,
resize_pixbuf, data2pixbuf, BIG_IMAGE_SIZE)
from .widget import Widget
import urllib
from tryton.common import resize_pixbuf, data2pixbuf, BIG_IMAGE_SIZE
from .widget import Widget
from .binary import BinaryMixin
_ = gettext.gettext
class Image(Widget):
class Image(BinaryMixin, Widget):
def __init__(self, view, attrs):
super(Image, self).__init__(view, attrs)
self.filename = attrs.get('filename')
self.height = int(attrs.get('height', 100))
self.width = int(attrs.get('width', 300))
@@ -30,136 +28,41 @@ class Image(Widget):
self.event.connect('drag_motion', self.drag_motion)
self.event.connect('drag_data_received', self.drag_data_received)
self.tooltips = Tooltips()
self.image = gtk.Image()
self.event.add(self.image)
self.widget.pack_start(self.event, expand=True, fill=True)
toolbar = self.toolbar() # Set button attributes even if not display
if not attrs.get('readonly'):
alignment = gtk.Alignment(xalign=0.5, yalign=0.5)
hbox = gtk.HBox(spacing=0)
self.but_add = gtk.Button()
img_add = gtk.Image()
img_add.set_from_stock('tryton-find', gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_add.set_image(img_add)
self.but_add.set_relief(gtk.RELIEF_NONE)
self.but_add.connect('clicked', self.sig_add)
self.tooltips.set_tip(self.but_add, _('Select an Image...'))
hbox.pack_start(self.but_add, expand=False, fill=False)
if self.filename:
self.but_open = gtk.Button()
img_open = gtk.Image()
img_open.set_from_stock('tryton-open',
gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_open.set_image(img_open)
self.but_open.set_relief(gtk.RELIEF_NONE)
self.but_open.connect('clicked', self.sig_open)
self.tooltips.set_tip(self.but_open, _('Open...'))
hbox.pack_start(self.but_open, expand=False, fill=False)
else:
self.but_open = None
self.but_save_as = gtk.Button()
img_save_as = gtk.Image()
img_save_as.set_from_stock('tryton-save',
gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_save_as.set_image(img_save_as)
self.but_save_as.set_relief(gtk.RELIEF_NONE)
self.but_save_as.connect('clicked', self.sig_save_as)
self.tooltips.set_tip(self.but_save_as, _('Save As...'))
hbox.pack_start(self.but_save_as, expand=False, fill=False)
self.but_remove = gtk.Button()
img_remove = gtk.Image()
img_remove.set_from_stock('tryton-clear',
gtk.ICON_SIZE_SMALL_TOOLBAR)
self.but_remove.set_image(img_remove)
self.but_remove.set_relief(gtk.RELIEF_NONE)
self.but_remove.connect('clicked', self.sig_remove)
self.tooltips.set_tip(self.but_remove, _('Clear'))
hbox.pack_start(self.but_remove, expand=False, fill=False)
alignment.add(hbox)
alignment.add(toolbar)
self.widget.pack_start(alignment, expand=False, fill=False)
else:
self.but_add = None
self.but_open = None
self.but_save_as = None
self.but_remove = None
self.tooltips.enable()
self._readonly = False
self.update_img()
@property
def filename_field(self):
return self.record.group.fields.get(self.filename)
def _readonly_set(self, value):
self._readonly = value
if self.but_add:
self.but_add.set_sensitive(not value)
if self.but_open:
self.but_open.set_sensitive(not value)
if self.but_save_as:
self.but_save_as.set_sensitive(not value)
if self.but_remove:
self.but_remove.set_sensitive(not value)
def sig_add(self, widget):
filter_all = gtk.FileFilter()
filter_all.set_name(_('All files'))
filter_all.add_pattern("*")
def filters(self):
filters = super(Image, self).filters
filter_image = gtk.FileFilter()
filter_image.set_name(_('Images'))
for mime in ("image/png", "image/jpeg", "image/gif"):
filter_image.add_mime_type(mime)
for pat in ("*.png", "*.jpg", "*.gif", "*.tif", "*.xpm"):
filter_image.add_pattern(pat)
filters.insert(0, filter_image)
return filters
filename = file_selection(_('Open...'), preview=True,
filters=[filter_image, filter_all])
if filename:
self.field.set_client(self.record, open(filename, 'rb').read())
if self.filename_field:
self.filename_field.set_client(self.record,
os.path.basename(filename))
self.update_img()
def _readonly_set(self, value):
self._readonly = value
for button in [self.but_select, self.but_open, self.but_save_as,
self.but_clear]:
if button:
button.set_sensitive(not value)
def sig_open(self, widget=None):
if not self.filename_field:
return
dtemp = tempfile.mkdtemp(prefix='tryton_')
filename = self.filename_field.get(self.record)
if not filename:
return
root, ext = os.path.splitext(filename)
filename = ''.join([slugify(root), os.extsep, slugify(ext)])
file_path = os.path.join(dtemp, filename)
with open(file_path, 'wb') as fp:
fp.write(self.field.get_data(self.record))
root, type_ = os.path.splitext(filename)
if type_:
type_ = type_[1:]
file_open(file_path, type_)
def sig_save_as(self, widget):
filename = ''
if self.filename_field:
filename = self.filename_field.get(self.record)
filename = file_selection(_('Save As...'), filename=filename,
action=gtk.FILE_CHOOSER_ACTION_SAVE)
if filename:
with open(filename, 'wb') as fp:
fp.write(self.field.get_data(self.record))
def sig_remove(self, widget):
self.field.set_client(self.record, False)
def clear(self, widget=None):
super(Image, self).clear(widget=widget)
self.update_img()
def drag_motion(self, widget, context, x, y, timestamp):
@@ -201,7 +104,5 @@ class Image(Widget):
self.image.set_from_pixbuf(pixbuf)
def display(self, record, field):
if not field:
return False
super(Image, self).display(record, field)
self.update_img()