import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class GtkSelectionList(Gtk.ListBox): def __init__(self, *args, **kwds): super().__init__(*args, **kwds) self.connect("row-selected", self.on_selection) self.selections={} self._on_selected=None self.current_selection_name="" def init(self): ch=self.get_children() for c in ch: super().remove(c) self.current_selection_name="" def set_on_selected(self, a): self._on_selected=a def rename(self, old, new): self.selections[new]=self.selections[old] del self.selections[old] self.selections[new][0].set_text(new) def append(self, name, sel): label = Gtk.Label.new(name) label.set_alignment(0,0) self.add(label) label.show_all() self.selections[name]=(label, sel) def remove(self, name): if name in self.selections: lbl = self.selections[name][0] for i in range(len(self.selections)): row = self.get_row_at_index(i) label = row.get_child() if label==lbl: super().remove(row) del self.selections[name] def on_selection(self, obj, c): for k in self.selections: if c.get_child()==self.selections[k][0]: self.current_selection_name=k self._on_selected(k, self.selections[k][1])