Unconnect signals when removing dict entries

Closes #11872
This commit is contained in:
Nicolas Évrard
2022-12-26 01:27:36 +01:00
parent 19f8faa28b
commit 4326581801
@@ -5,6 +5,7 @@ import decimal
import gettext
import locale
import operator
from collections import defaultdict
from decimal import Decimal
from gi.repository import GLib, GObject, Gtk
@@ -36,6 +37,7 @@ class DictEntry(object):
self.name = name
self.definition = parent_widget.field.keys[name]
self.parent_widget = parent_widget
self._signal_handlers = defaultdict(list)
self.widget = self.create_widget()
if self.definition.get('help'):
parent_widget.tooltips.set_tip(
@@ -43,11 +45,16 @@ class DictEntry(object):
def create_widget(self):
widget = Gtk.Entry()
widget.connect('key-press-event', self.parent_widget.send_modified)
widget.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out())
self._signal_handlers[widget].append(
widget.connect('key-press-event',
self.parent_widget.send_modified))
self._signal_handlers[widget].append(
widget.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out()))
widget.props.activates_default = True
widget.connect('activate', self.parent_widget.sig_activate)
self._signal_handlers[widget].append(
widget.connect('activate',
self.parent_widget.sig_activate))
return widget
def modified(self, value):
@@ -63,6 +70,11 @@ class DictEntry(object):
def set_readonly(self, readonly):
self.widget.set_editable(not readonly)
def disconnect_signals(self):
for widget, signal_ids in self._signal_handlers.items():
for handler_id in signal_ids:
widget.disconnect(handler_id)
class DictCharEntry(DictEntry):
@@ -74,9 +86,11 @@ class DictBooleanEntry(DictEntry):
def create_widget(self):
widget = Gtk.CheckButton()
widget.connect('toggled', self.parent_widget.sig_activate)
widget.connect('focus-out-event', lambda w, e:
self.parent_widget._focus_out())
self._signal_handlers[widget].append(
widget.connect('toggled', self.parent_widget.sig_activate))
self._signal_handlers[widget].append(
widget.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out()))
return widget
def get_value(self):
@@ -104,11 +118,14 @@ class DictSelectionEntry(DictEntry):
# customizing entry
child = widget.get_child()
child.props.activates_default = True
child.connect('changed', self._changed)
child.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out())
child.connect('activate',
lambda w: self.parent_widget._focus_out())
self._signal_handlers[child].append(
child.connect('changed', self._changed))
self._signal_handlers[child].append(
child.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out()))
self._signal_handlers[child].append(
child.connect('activate',
lambda w: self.parent_widget._focus_out()))
widget.connect(
'scroll-event',
lambda c, e: c.stop_emission_by_name('scroll-event'))
@@ -189,12 +206,14 @@ class DictMultiSelectionEntry(DictEntry):
self.tree = Gtk.TreeView()
self.tree.set_model(model)
self.tree.set_search_column(1)
self.tree.connect(
'focus-out-event', lambda w, e: self.parent_widget._focus_out())
self._signal_handlers[self.tree].append(
self.tree.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out()))
self.tree.set_headers_visible(False)
selection = self.tree.get_selection()
selection.set_mode(Gtk.SelectionMode.MULTIPLE)
selection.connect('changed', self._changed)
self._signal_handlers[selection].append(
selection.connect('changed', self._changed))
widget.add(self.tree)
self.selection = self.definition['selection']
@@ -242,11 +261,15 @@ class DictIntegerEntry(DictEntry):
def create_widget(self):
widget = NumberEntry()
widget.connect('key-press-event', self.parent_widget.send_modified)
widget.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out())
self._signal_handlers[widget].append(
widget.connect('key-press-event',
self.parent_widget.send_modified))
self._signal_handlers[widget].append(
widget.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out()))
widget.props.activates_default = True
widget.connect('activate', self.parent_widget.sig_activate)
self._signal_handlers[widget].append(
widget.connect('activate', self.parent_widget.sig_activate))
return widget
def get_value(self):
@@ -326,9 +349,12 @@ class DictDateTimeEntry(DictEntry):
time_format = field.time_format(record)
widget.props.date_format = date_format
widget.props.time_format = time_format
widget.connect('key_press_event', self.parent_widget.send_modified)
widget.connect('focus-out-event', lambda w, e:
self.parent_widget._focus_out())
self._signal_handlers[widget].append(
widget.connect('key_press_event',
self.parent_widget.send_modified))
self._signal_handlers[widget].append(
widget.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out()))
return widget
def get_value(self):
@@ -358,9 +384,12 @@ class DictDateEntry(DictEntry):
if record and field:
format_ = field.date_format(record)
widget.props.format = format_
widget.connect('key_press_event', self.parent_widget.send_modified)
widget.connect('focus-out-event', lambda w, e:
self.parent_widget._focus_out())
self._signal_handlers[widget].append(
widget.connect('key_press_event',
self.parent_widget.send_modified))
self._signal_handlers[widget].append(
widget.connect('focus-out-event',
lambda w, e: self.parent_widget._focus_out()))
return widget
def get_value(self):
@@ -486,6 +515,7 @@ class DictWidget(Widget):
focus = True
def _sig_remove(self, button, key, modified=True):
self.fields[key].disconnect_signals()
del self.fields[key]
del self.buttons[key]
for widget in self.rows[key]: