diff --git a/tryton/gui/window/view_form/view/form_gtk/binary.py b/tryton/gui/window/view_form/view/form_gtk/binary.py index 35befa77fb..47ca7f7acb 100644 --- a/tryton/gui/window/view_form/view/form_gtk/binary.py +++ b/tryton/gui/window/view_form/view/form_gtk/binary.py @@ -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: diff --git a/tryton/gui/window/view_form/view/form_gtk/image.py b/tryton/gui/window/view_form/view/form_gtk/image.py index 0d6eb52ff5..3a0fa9233d 100644 --- a/tryton/gui/window/view_form/view/form_gtk/image.py +++ b/tryton/gui/window/view_form/view/form_gtk/image.py @@ -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()