Rely on editing property of renderer to set value

In Python3, the 'remove-widget' is not trigger when the selected row is
changed. This makes the attribute editabletree_entry not reliable. Instead we
should use the editing property of the renderer and manage the editable
reference on the widget (which is a cleaner separation concept). This allows
also to remove duplicate code in set_value by calling on_editing_done.

issue7936
review46711002
This commit is contained in:
Cédric Krier committed 2019-01-30 10:10:00 +01:00
1 parent 257978a01f
commit c7dfe09cb8
2 files changed
+9 -21

No files matched your search

@@ -115,21 +115,12 @@ class EditableTreeView(TreeView):
def set_value(self):
path, column = self.get_cursor()
model = self.get_model()
if not path or not column or not column.name:
return True
record = model.get_value(model.get_iter(path), 0)
field = record[column.name]
if hasattr(field, 'editabletree_entry'):
entry = field.editabletree_entry
if isinstance(entry, (Date, Time)):
entry.activate()
txt = entry.props.value
elif isinstance(entry, gtk.Entry):
txt = entry.get_text()
else:
txt = entry.get_active_text()
self.on_quit_cell(record, column, txt)
for renderer in column.get_cell_renderers():
if renderer.props.editing:
widget = self.view.get_column_widget(column)
self.on_editing_done(widget.editable)
return True
def on_keypressed(self, entry, event):
@@ -235,14 +226,6 @@ class EditableTreeView(TreeView):
field = record[column.name]
if isinstance(entry, gtk.Entry):
entry.set_max_length(int(field.attrs.get('size', 0)))
# store in the record the entry widget to get the value in
# set_value
field.editabletree_entry = entry
def remove_widget(widget):
if hasattr(field, 'editabletree_entry'):
del field.editabletree_entry
entry.connect('remove-widget', remove_widget)
record.modified_fields.setdefault(column.name)
return False
@@ -170,6 +170,7 @@ class Affix(Cell):
class GenericText(Cell):
align = 0
editable = None
def __init__(self, view, attrs, renderer=None):
super(GenericText, self).__init__()
@@ -259,6 +260,10 @@ class GenericText(Cell):
callback()
def editing_started(self, cell, editable, path):
def remove(editable):
self.editable = None
self.editable = editable
editable.connect('remove-widget', remove)
return False
def _get_record_field(self, path):