Refactor Binary and Image form widget
Move shared code from both in a Mixin class review21351002
This commit is contained in:
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()
|
||||
Reference in new issue
Block a user