Handle disappearing focus on widget

review892002
This commit is contained in:
Nicolas Évrard committed 2013-09-13 11:39:08 +02:00
1 parent b056eaee4a
commit 14d66815b7
2 files changed
+71

No files matched your search

+62
View File
@@ -0,0 +1,62 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
def get_invisible_ancestor(widget):
if not widget.get_visible():
return widget
if not widget.parent:
return None
return get_invisible_ancestor(widget.parent)
def find_focused_child(widget):
if widget.has_focus():
return widget
if not hasattr(widget, 'get_children'):
return None
for child in widget.get_children():
focused_widget = find_focused_child(child)
if focused_widget:
return focused_widget
def find_focusable_child(widget):
if not widget.get_visible():
return None
if widget.get_can_focus():
return widget
if not hasattr(widget, 'get_children'):
return None
focus_chain = widget.get_focus_chain()
# If the focus_chain is not defined on the widget then we will simply
# search into all its children widgets
widgets = (focus_chain
if focus_chain is not None
else widget.get_children())
for child in widgets:
focusable = find_focusable_child(child)
if focusable:
return focusable
def next_focus_widget(widget):
if not widget.parent:
return None
focus_chain = widget.parent.get_focus_chain()
if focus_chain is not None:
idx = focus_chain.index(widget)
focus_widget = None
for widget in focus_chain[idx:] + focus_chain[:idx]:
focus_widget = find_focusable_child(widget)
if focus_widget:
return focus_widget
if not focus_widget:
return next_focus_widget(widget.parent)
else:
focus_widget = find_focusable_child(widget.parent)
if focus_widget:
return focus_widget
else:
return next_focus_widget(widget.parent)
+9
View File
@@ -5,6 +5,8 @@ from functools import reduce
import gtk
import gettext
from interface import ParserView
from tryton.common.focus import (get_invisible_ancestor, find_focused_child,
next_focus_widget)
_ = gettext.gettext
@@ -119,6 +121,7 @@ class ViewForm(ParserView):
fields.sort(key=operator.itemgetter(1), reverse=True)
for field, _ in fields:
record[field].get(record)
focused_widget = find_focused_child(self.widget)
for name, widgets in self.widgets.iteritems():
field = None
if record:
@@ -129,6 +132,12 @@ class ViewForm(ParserView):
widget.display(record, field)
for widget in self.state_widgets:
widget.state_set(record)
if focused_widget:
invisible_ancestor = get_invisible_ancestor(focused_widget)
if invisible_ancestor:
new_focused_widget = next_focus_widget(invisible_ancestor)
if new_focused_widget:
new_focused_widget.grab_focus()
return True
def set_cursor(self, new=False, reset_view=True):