Fix gtk.Button state corruption

By default gtk.Button grab the focus on button-press, this can potentially
trigger a RPC request from by example a Many2One filled with search text. If
the request takes too much time, RPCProgress starts to process events and this
put the button in a corrupted state (it is displayed as pressed when mouse if
over).
To avoid, we set the value of the view when mouse move over a button or outside
the form.

review447001
This commit is contained in:
Cédric Krier committed 2012-08-11 12:17:18 +02:00
1 parent c19e798e54
commit 5f3fd4d64f
11 files changed
+42 -1

No files matched your search

+5
View File
@@ -23,6 +23,7 @@ class ViewForm(ParserView):
for button in self.buttons:
if isinstance(button, gtk.Button):
button.connect('clicked', self.button_clicked)
button.set_focus_on_click(False)
# Force to display the first time it switches on a page
# This avoids glitch in position of widgets
@@ -43,6 +44,7 @@ class ViewForm(ParserView):
vbox = gtk.VBox()
vp = gtk.Viewport()
vp.set_shadow_type(gtk.SHADOW_NONE)
vp.connect('leave-notify-event', self.leave)
vp.add(self.widget)
scroll = gtk.ScrolledWindow()
scroll.add(vp)
@@ -165,6 +167,9 @@ class ViewForm(ParserView):
notebook.set_current_page(i)
focus_widget.grab_focus()
def leave(self, widget, event):
self.set_value()
def button_clicked(self, widget):
record_id = self.screen.save_current()
record = self.screen.current_record
@@ -46,6 +46,7 @@ class Binary(WidgetInterface):
self.but_new.set_image(img_new)
self.but_new.set_relief(gtk.RELIEF_NONE)
self.but_new.connect('clicked', self.sig_new)
self.but_new.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_new, _('Select a File...'))
self.widget.pack_start(self.but_new, expand=False, fill=False)
@@ -56,6 +57,7 @@ class Binary(WidgetInterface):
self.but_open.set_image(img_open)
self.but_open.set_relief(gtk.RELIEF_NONE)
self.but_open.connect('clicked', self.sig_open)
self.but_open.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_open, _('Open...'))
self.widget.pack_start(self.but_open, expand=False, fill=False)
else:
@@ -68,6 +70,7 @@ class Binary(WidgetInterface):
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.but_save_as.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_save_as, _('Save As...'))
self.widget.pack_start(self.but_save_as, expand=False, fill=False)
@@ -77,6 +80,7 @@ class Binary(WidgetInterface):
self.but_remove.set_image(img_remove)
self.but_remove.set_relief(gtk.RELIEF_NONE)
self.but_remove.connect('clicked', self.sig_remove)
self.but_remove.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_remove, _('Clear'))
self.widget.pack_start(self.but_remove, expand=False, fill=False)
@@ -48,6 +48,7 @@ class Image(WidgetInterface):
self.but_add.set_image(img_add)
self.but_add.set_relief(gtk.RELIEF_NONE)
self.but_add.connect('clicked', self.sig_add)
self.but_add.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_add, _('Select an Image...'))
hbox.pack_start(self.but_add, expand=False, fill=False)
@@ -59,6 +60,7 @@ class Image(WidgetInterface):
self.but_open.set_image(img_open)
self.but_open.set_relief(gtk.RELIEF_NONE)
self.but_open.connect('clicked', self.sig_open)
self.but_open.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_open, _('Open...'))
hbox.pack_start(self.but_open, expand=False, fill=False)
else:
@@ -71,6 +73,7 @@ class Image(WidgetInterface):
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.but_save_as.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_save_as, _('Save As...'))
hbox.pack_start(self.but_save_as, expand=False, fill=False)
@@ -81,6 +84,7 @@ class Image(WidgetInterface):
self.but_remove.set_image(img_remove)
self.but_remove.set_relief(gtk.RELIEF_NONE)
self.but_remove.connect('clicked', self.sig_remove)
self.but_remove.connect('enter-notify-event', self.enter)
self.tooltips.set_tip(self.but_remove, _('Clear'))
hbox.pack_start(self.but_remove, expand=False, fill=False)
@@ -164,6 +164,10 @@ class WidgetInterface(object):
def cancel(self):
pass
def enter(self, widget, event):
if self.view:
self.view.set_value()
class TranslateDialog(NoModal):
@@ -295,6 +299,7 @@ class TranslateMixin:
button.set_image(img)
button.set_relief(gtk.RELIEF_NONE)
button.connect('clicked', self.translate)
button.connect('enter-notify-event', self.enter)
return button
def translate(self, widget):
@@ -43,6 +43,7 @@ class Many2Many(WidgetInterface):
self.but_add = gtk.Button()
tooltips.set_tip(self.but_add, _('Add'))
self.but_add.connect('clicked', self._sig_add)
self.but_add.connect('enter-notify-event', self.enter)
img_add = gtk.Image()
img_add.set_from_stock('tryton-list-add',
gtk.ICON_SIZE_SMALL_TOOLBAR)
@@ -54,6 +55,7 @@ class Many2Many(WidgetInterface):
self.but_remove = gtk.Button()
tooltips.set_tip(self.but_remove, _('Remove <Del>'))
self.but_remove.connect('clicked', self._sig_remove)
self.but_remove.connect('enter-notify-event', self.enter)
img_remove = gtk.Image()
img_remove.set_from_stock('tryton-list-remove',
gtk.ICON_SIZE_SMALL_TOOLBAR)
@@ -44,6 +44,7 @@ class Many2One(WidgetInterface):
self.but_open.set_image(img_find)
self.but_open.set_relief(gtk.RELIEF_NONE)
self.but_open.connect('clicked', self.sig_edit)
self.but_open.connect('enter-notify-event', self.enter)
self.but_open.set_alignment(0.5, 0.5)
self.but_new = gtk.Button()
@@ -52,6 +53,7 @@ class Many2One(WidgetInterface):
self.but_new.set_image(img_new)
self.but_new.set_relief(gtk.RELIEF_NONE)
self.but_new.connect('clicked', self.sig_new)
self.but_new.connect('enter-notify-event', self.enter)
self.but_new.set_alignment(0.5, 0.5)
self.widget.pack_end(self.but_new, expand=False, fill=False)
@@ -46,6 +46,7 @@ class One2Many(WidgetInterface):
self.but_add = gtk.Button()
tooltips.set_tip(self.but_add, _('Add'))
self.but_add.connect('clicked', self._sig_add)
self.but_add.connect('enter-notify-event', self.enter)
img_add = gtk.Image()
img_add.set_from_stock('tryton-list-add',
gtk.ICON_SIZE_SMALL_TOOLBAR)
@@ -57,6 +58,7 @@ class One2Many(WidgetInterface):
self.but_remove = gtk.Button()
tooltips.set_tip(self.but_remove, _('Remove <Del>'))
self.but_remove.connect('clicked', self._sig_remove, True)
self.but_remove.connect('enter-notify-event', self.enter)
img_remove = gtk.Image()
img_remove.set_from_stock('tryton-list-remove',
gtk.ICON_SIZE_SMALL_TOOLBAR)
@@ -70,6 +72,7 @@ class One2Many(WidgetInterface):
self.but_new = gtk.Button()
tooltips.set_tip(self.but_new, _('Create a new record <F3>'))
self.but_new.connect('clicked', self._sig_new)
self.but_new.connect('enter-notify-event', self.enter)
img_new = gtk.Image()
img_new.set_from_stock('tryton-new', gtk.ICON_SIZE_SMALL_TOOLBAR)
img_new.set_alignment(0.5, 0.5)
@@ -80,6 +83,7 @@ class One2Many(WidgetInterface):
self.but_open = gtk.Button()
tooltips.set_tip(self.but_open, _('Edit selected record <F2>'))
self.but_open.connect('clicked', self._sig_edit)
self.but_open.connect('enter-notify-event', self.enter)
img_open = gtk.Image()
img_open.set_from_stock('tryton-open', gtk.ICON_SIZE_SMALL_TOOLBAR)
img_open.set_alignment(0.5, 0.5)
@@ -90,6 +94,7 @@ class One2Many(WidgetInterface):
self.but_del = gtk.Button()
tooltips.set_tip(self.but_del, _('Delete selected record <Del>'))
self.but_del.connect('clicked', self._sig_remove, False)
self.but_del.connect('enter-notify-event', self.enter)
img_del = gtk.Image()
img_del.set_from_stock('tryton-delete', gtk.ICON_SIZE_SMALL_TOOLBAR)
img_del.set_alignment(0.5, 0.5)
@@ -100,6 +105,7 @@ class One2Many(WidgetInterface):
self.but_undel = gtk.Button()
tooltips.set_tip(self.but_undel, _('Undelete selected record <Ins>'))
self.but_undel.connect('clicked', self._sig_undelete)
self.but_undel.connect('enter-notify-event', self.enter)
img_undel = gtk.Image()
img_undel.set_from_stock('tryton-undo', gtk.ICON_SIZE_SMALL_TOOLBAR)
img_undel.set_alignment(0.5, 0.5)
@@ -112,6 +118,7 @@ class One2Many(WidgetInterface):
self.but_pre = gtk.Button()
tooltips.set_tip(self.but_pre, _('Previous'))
self.but_pre.connect('clicked', self._sig_previous)
self.but_pre.connect('enter-notify-event', self.enter)
img_pre = gtk.Image()
img_pre.set_from_stock('tryton-go-previous',
gtk.ICON_SIZE_SMALL_TOOLBAR)
@@ -126,6 +133,7 @@ class One2Many(WidgetInterface):
self.but_next = gtk.Button()
tooltips.set_tip(self.but_next, _('Next'))
self.but_next.connect('clicked', self._sig_next)
self.but_next.connect('enter-notify-event', self.enter)
img_next = gtk.Image()
img_next.set_from_stock('tryton-go-next', gtk.ICON_SIZE_SMALL_TOOLBAR)
img_next.set_alignment(0.5, 0.5)
@@ -138,6 +146,7 @@ class One2Many(WidgetInterface):
but_switch = gtk.Button()
tooltips.set_tip(but_switch, _('Switch'))
but_switch.connect('clicked', self.switch_view)
but_switch.connect('enter-notify-event', self.enter)
img_switch = gtk.Image()
img_switch.set_from_stock('tryton-fullscreen',
gtk.ICON_SIZE_SMALL_TOOLBAR)
@@ -187,6 +187,7 @@ class RichTextBox(TextBox):
self.tools['markup'].set_tooltip_text(_('Change the markup text view'))
# Packing widgets
tool_bar = gtk.Toolbar()
tool_bar.connect('enter-notify-event', self.enter)
tool_bar.set_style(gtk.TOOLBAR_ICONS)
for tag in tags:
@@ -14,6 +14,8 @@ class Selection(WidgetInterface):
super(Selection, self).__init__(field_name, model_name, attrs=attrs)
self.widget = gtk.HBox(spacing=3)
ev_box = gtk.EventBox()
ev_box.connect('enter-notify-event', self.enter)
self.entry = gtk.ComboBoxEntry()
child = self.entry.child
child.set_property('activates_default', True)
@@ -25,7 +27,8 @@ class Selection(WidgetInterface):
child.connect_after('focus-out-event', self.sig_activate)
child.connect('changed', self.send_modified)
self.entry.connect('notify::active', lambda *a: self._focus_out())
self.widget.pack_start(self.entry)
ev_box.add(self.entry)
self.widget.pack_start(ev_box)
self.widget.set_focus_chain([child])
self._selection = {}
@@ -19,6 +19,7 @@ class URL(Char):
self.button.set_image(img)
self.button.set_relief(gtk.RELIEF_NONE)
self.button.connect('clicked', self.button_clicked)
self.button.connect('enter-notify-event', self.enter)
self.button.set_alignment(0.5, 0.5)
self.widget.pack_start(self.button, expand=False, fill=False)
self.widget.set_focus_chain([self.entry])
+5
View File
@@ -54,9 +54,11 @@ class WinForm(NoModal):
icon_cancel = gtk.STOCK_CANCEL
self.but_cancel = self.win.add_button(icon_cancel,
gtk.RESPONSE_CANCEL)
self.but_cancel.set_focus_on_click(False)
self.but_ok = self.win.add_button(gtk.STOCK_OK,
gtk.RESPONSE_OK)
self.but_ok.set_focus_on_click(False)
if new and self.many:
self.but_ok.add_accelerator('clicked',
self.accel_group, gtk.keysyms.Return,
@@ -65,6 +67,7 @@ class WinForm(NoModal):
self.but_new = self.win.add_button(gtk.STOCK_NEW,
gtk.RESPONSE_ACCEPT)
self.but_new.set_focus_on_click(False)
self.but_new.add_accelerator('clicked', self.accel_group,
gtk.keysyms.Return, gtk.gdk.CONTROL_MASK,
gtk.ACCEL_VISIBLE)
@@ -376,6 +379,8 @@ class WinForm(NoModal):
validate = False
cancel_responses = (gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT)
self.screen.current_view.set_value()
if not self.win.get_focus():
return
if (response_id not in cancel_responses
and self.screen.current_record is not None):
validate = self.screen.current_record.validate(