Skip to content

Commit b0faf68

Browse files
authored
Add "List View with a Tree" demo (#207)
1 parent 62f9ece commit b0faf68

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

src/List View with a Tree/main.blp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Gtk 4.0;
2+
using Adw 1;
3+
4+
Adw.StatusPage {
5+
title: _("List View with a Tree");
6+
description: _("Arrange items in a tree like structure");
7+
valign: start;
8+
9+
Adw.Clamp {
10+
maximum-size: 360;
11+
12+
Box {
13+
orientation: vertical;
14+
spacing: 18;
15+
16+
ScrolledWindow {
17+
has-frame: true;
18+
height-request: 320;
19+
20+
child: ListView list_view {
21+
factory: SignalListItemFactory factory {};
22+
};
23+
}
24+
25+
Box {
26+
halign: center;
27+
28+
LinkButton {
29+
label: _("API Reference");
30+
uri: "https://docs.gtk.org/gtk4/class.TreeListModel.html";
31+
}
32+
33+
LinkButton {
34+
label: _("Documentation");
35+
uri: "https://docs.gtk.org/gtk4/section-list-widget.html#displaying-trees";
36+
}
37+
}
38+
}
39+
}
40+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "layout",
3+
"description": "Arrange items in a tree like structure",
4+
"panels": ["code", "ui", "preview"],
5+
"autorun": true
6+
}

src/List View with a Tree/main.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import gi
2+
3+
gi.require_version("Gtk", "4.0")
4+
gi.require_version("Adw", "1")
5+
from gi.repository import Gtk, GObject, Gio
6+
import workbench
7+
8+
list_view = workbench.builder.get_object("list_view")
9+
factory = workbench.builder.get_object("factory")
10+
11+
12+
class TreeNode(GObject.Object):
13+
def __init__(self, _title, _children=None):
14+
super().__init__()
15+
self.children = _children or []
16+
self.title = _title
17+
18+
19+
class TreeWidget(Gtk.Box):
20+
def __init__(self):
21+
super().__init__(
22+
spacing=6, margin_start=6, margin_end=12, margin_top=6, margin_bottom=6
23+
)
24+
25+
self.expander = Gtk.TreeExpander.new()
26+
27+
self.label = Gtk.Label(xalign=0, ellipsize=3)
28+
29+
self.append(self.expander)
30+
self.append(self.label)
31+
32+
33+
def create_model_func(item):
34+
if item.children == []:
35+
return None
36+
child_model = Gio.ListStore.new(TreeNode)
37+
for child in item.children:
38+
child_model.append(child)
39+
return child_model
40+
41+
42+
def on_setup(_, list_item):
43+
list_item.set_child(TreeWidget())
44+
45+
46+
def on_bind(_, list_item):
47+
list_row = list_item.get_item()
48+
widget = list_item.get_child()
49+
item = list_row.get_item()
50+
51+
widget.expander.set_list_row(list_row)
52+
widget.label.set_label(item.title)
53+
54+
55+
factory.connect("setup", on_setup)
56+
factory.connect("bind", on_bind)
57+
58+
root_model = TreeNode(
59+
"Root",
60+
[
61+
TreeNode("Child 1", [TreeNode("Child 1.1", []), TreeNode("Child 1.2", [])]),
62+
TreeNode(
63+
"Child 2",
64+
[
65+
TreeNode("Child 2.1", []),
66+
TreeNode("Child 2.2", []),
67+
TreeNode("Child 2.3", [TreeNode("Child 3.1", [])]),
68+
],
69+
),
70+
],
71+
)
72+
73+
tree_model = Gio.ListStore.new(TreeNode)
74+
tree_model.append(root_model)
75+
76+
tree_list_model = Gtk.TreeListModel.new(tree_model, False, True, create_model_func)
77+
tree_list_model.set_autoexpand(False)
78+
79+
selection_model = Gtk.NoSelection(model=tree_list_model)
80+
81+
list_view.set_model(selection_model)

0 commit comments

Comments
 (0)