Skip to content

Instantly share code, notes, and snippets.

@estebanlm
Created April 18, 2025 15:18
Show Gist options
  • Save estebanlm/c77585b3534ec14d2cab627915e7a0be to your computer and use it in GitHub Desktop.
Save estebanlm/c77585b3534ec14d2cab627915e7a0be to your computer and use it in GitHub Desktop.
A gtkcolumnview example in python
import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk, Gio, GObject
class Person(GObject.GObject):
name = GObject.Property(type=str)
age = GObject.Property(type=int)
def __init__(self, name, age):
super().__init__()
self.name = name
self.age = age
class ColumnViewWindow(Gtk.ApplicationWindow):
def __init__(self, app):
super().__init__(application=app)
self.set_title("ColumnView with Custom Sorter")
self.set_default_size(400, 300)
# Raw data
self.people = Gio.ListStore.new(Person)
self.people.append(Person("Charlie", 35))
self.people.append(Person("Alice", 30))
self.people.append(Person("Dana", 22))
self.people.append(Person("Bob", 25))
# Define custom sorters
self.name_sorter = Gtk.CustomSorter.new(self.sort_by_name)
self.age_sorter = Gtk.CustomSorter.new(self.sort_by_age)
# Sort model
self.sort_model = Gtk.SortListModel.new(self.people, self.name_sorter)
selection = Gtk.SingleSelection(model=self.sort_model)
column_view = Gtk.ColumnView(model=selection)
# Name Column
name_factory = Gtk.SignalListItemFactory()
name_factory.connect("setup", self.setup_label)
name_factory.connect("bind", self.bind_label, "name")
name_column = Gtk.ColumnViewColumn(title="Name", factory=name_factory)
name_column.set_sorter(self.name_sorter)
name_column.connect("notify::sorter", self.on_sorter_changed)
column_view.append_column(name_column)
# Age Column
age_factory = Gtk.SignalListItemFactory()
age_factory.connect("setup", self.setup_label)
age_factory.connect("bind", self.bind_label, "age")
age_column = Gtk.ColumnViewColumn(title="Age", factory=age_factory)
age_column.set_sorter(self.age_sorter)
age_column.connect("notify::sorter", self.on_sorter_changed)
column_view.append_column(age_column)
# column_view.sort_by_column(name_column, Gtk.SortType.ASCENDING)
self.set_child(column_view)
def on_sorter_changed(self, column, _):
"""Update model sorter when column sort changes."""
sorter = column.get_sorter()
if sorter:
self.sort_model.set_sorter(sorter)
def sort_by_name(self, item1, item2):
name1 = item1.get_name().lower()
name2 = item2.get_name().lower()
print(name1, name2)
if name1 < name2:
return Gtk.Ordering.LESS_THAN
elif name1 > name2:
return Gtk.Ordering.GREATER_THAN
else:
return Gtk.Ordering.EQUAL
def sort_by_age(self, item1, item2):
if item1.age < item2.age:
return Gtk.Ordering.LESS_THAN
elif item1.age > item2.age:
return Gtk.Ordering.GREATER_THAN
else:
return Gtk.Ordering.EQUAL
def setup_label(self, factory, list_item):
label = Gtk.Label(xalign=0)
list_item.set_child(label)
def bind_label(self, factory, list_item, prop):
item = list_item.get_item()
label = list_item.get_child()
label.set_text(str(getattr(item, prop)))
class ColumnViewExample(Gtk.Application):
def __init__(self):
super().__init__(application_id="org.example.columnview")
def do_activate(self):
win = ColumnViewWindow(self)
win.present()
app = ColumnViewExample()
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment