129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
from gi.repository import Gtk
|
|
|
|
def load_from_dict(combobox, dictionary, selected=None, sort=False):
|
|
"""
|
|
Populates a simple combo box based on a given dictionary
|
|
Optionally, the list can be sorted in ascending order by value
|
|
The key fields must be of a uniform type
|
|
"""
|
|
if len(dictionary) > 0:
|
|
if type(next(iter(dictionary))) == int:
|
|
lst = Gtk.ListStore(int, str)
|
|
else:
|
|
lst = Gtk.ListStore(str, str)
|
|
else:
|
|
lst = Gtk.ListStore(str, str)
|
|
if sort:
|
|
for key in sorted(dictionary, key=dictionary.get):
|
|
lst.append((key, dictionary[key]))
|
|
else:
|
|
for item in dictionary.items():
|
|
lst.append(item)
|
|
combobox.set_model(lst)
|
|
cell = Gtk.CellRendererText()
|
|
combobox.pack_start(cell, True)
|
|
combobox.add_attribute(cell, 'text', 1)
|
|
if selected is not None:
|
|
activate_row(combobox, selected)
|
|
|
|
def refresh_dict(combobox, dictionary, keep_selection=True):
|
|
"""
|
|
Populates the data model of a combo box with new values
|
|
"""
|
|
model = combobox.get_model()
|
|
selected = get_value(combobox)
|
|
model.clear()
|
|
for item in dictionary.iteritems():
|
|
model.append(item)
|
|
if keep_selection:
|
|
activate_row(combobox, selected)
|
|
|
|
def get_list_value(combobox, decode=False):
|
|
model = combobox.get_model()
|
|
active = combobox.get_active()
|
|
if active < 0:
|
|
return None
|
|
if decode:
|
|
return model[active][0].decode('utf-8')
|
|
else:
|
|
return model[active][0]
|
|
|
|
def get_tree_value(combobox, decode=False):
|
|
model = combobox.get_model()
|
|
it = combobox.get_active_iter()
|
|
if it is None:
|
|
return None
|
|
val = model.get_value(it, 0)
|
|
if decode:
|
|
return val.decode('utf-8')
|
|
else:
|
|
return val
|
|
|
|
def get_value(combobox, decode=False):
|
|
"""
|
|
Liefert den Wert der ersten Spalte des verknüpften Modells
|
|
TODO Unterscheidung ListStore und TreeStore notwending?
|
|
Ggf. alles über den Iter?
|
|
"""
|
|
model = combobox.get_model()
|
|
active = combobox.get_active()
|
|
if active < 0:
|
|
return None
|
|
else:
|
|
if type(model) == gtk.TreeStore:
|
|
it = combobox.get_active_iter()
|
|
val = model.get_value(it, 0)
|
|
if decode:
|
|
return val.decode('utf-8')
|
|
else:
|
|
return val
|
|
else:
|
|
if decode:
|
|
return model[active][0].decode('utf-8')
|
|
else:
|
|
return model[active][0]
|
|
|
|
def search(model, treeiter, value, column):
|
|
"""
|
|
Suche einen TreeIter zu einem gegebenen Spaltenwert
|
|
"""
|
|
while treeiter:
|
|
compare_val = model.get_value(treeiter, column)
|
|
if value == compare_val:
|
|
return treeiter
|
|
result = search(model, model.iter_children(treeiter), value, column)
|
|
if result:
|
|
return result
|
|
treeiter = model.iter_next(treeiter)
|
|
return None
|
|
|
|
def activate_tree_row(combobox, value, column=0):
|
|
model = combobox.get_model()
|
|
it = search(model, model.iter_children(None), value, column)
|
|
combobox.set_active_iter(it)
|
|
|
|
def activate_row(combobox, value, column=0):
|
|
"""Zeigt einen bestimmten Listeneintrag an"""
|
|
model = combobox.get_model()
|
|
for row in model:
|
|
if row[column] == value:
|
|
combobox.set_active_iter(row.iter)
|
|
return
|
|
combobox.set_active(-1)
|
|
|
|
def has_list_value(combobox, value):
|
|
""" Prüft, ob in der zugrundeliegenden Liste ein Element vorhanden ist"""
|
|
model = combobox.get_model()
|
|
for row in model:
|
|
if row[0] == value:
|
|
return True
|
|
return False
|
|
|
|
def get_first_iter(combobox, columnindex, value):
|
|
"""Liefert einen Iter in die Liste, wo der Spalteninhalt mit einem vorgegebenen Wert beginnt"""
|
|
model = combobox.get_model()
|
|
for row in model:
|
|
if row[columnindex].startswith(value):
|
|
return row.iter
|
|
return None
|