Handle disappearing focus on widget
review892002
This commit is contained in:
1 parent
b056eaee4a
commit
14d66815b7
2 files changed
+71
No files matched your search
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user