Skip to content

Commit 018b0f4

Browse files
committed
First examples
0 parents  commit 018b0f4

11 files changed

+384
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
__pycache__
2+
.venv
3+
*.sw[op]

README.md

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# GTK4 ListView examples
2+
3+
[`Gtk.ListView`](https://docs.gtk.org/gtk4/section-list-widget.html) is the new list and tree widget for GTK4.
4+
5+
I started with a simple list model ([simple_list.py](gtk4_list_view/simple_list.py)).
6+
The next step is to add some hierarchy, make it a tree ([simple_tree.py](gtk4_list_view/simple_tree.py)).
7+
8+
Note that, in the _.ui_ files, `type="__main__+Demo"`. This is because the Demo class is defined in the module
9+
we start (`__main__`).
10+
11+
12+
#Set up
13+
14+
```
15+
poetry install
16+
```
17+
18+
To enable the Python virtual environment:
19+
20+
```
21+
poetry shell
22+
```
23+
24+
To run an example:
25+
26+
```
27+
python -m gtk4_list_view.simple_list
28+
```

gtk4_list_view/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
__version__ = '0.1.0'
2+
3+
import gi
4+
5+
gi.require_version("Gtk", "4.0")

gtk4_list_view/simple_list.py

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import importlib.resources
2+
3+
from gi.repository import Gio, GLib, GObject, Gtk
4+
5+
6+
def new_list_item_ui():
7+
with importlib.resources.path("gtk4_list_view", "simple_list.ui") as ui_path:
8+
return GLib.Bytes.new(ui_path.read_bytes())
9+
10+
11+
class Demo(GObject.GObject):
12+
def __init__(self, name):
13+
super().__init__()
14+
self._name = name
15+
16+
@GObject.Property(type=str)
17+
def name(self):
18+
return self._name
19+
20+
21+
if __name__ == "__main__":
22+
23+
model = Gio.ListStore.new(Demo)
24+
model.append(Demo("one"))
25+
model.append(Demo("two"))
26+
model.append(Demo("three"))
27+
28+
app = Gtk.Application.new("gtk4.listview.SimpleList", 0)
29+
30+
def activate(app):
31+
w = Gtk.Window()
32+
w.set_title("Listview test")
33+
w.set_default_size(400, 400)
34+
app.add_window(w)
35+
36+
# wrap in gtk_tree_list_model_new
37+
selection = Gtk.SingleSelection.new(model)
38+
factory = Gtk.BuilderListItemFactory.new_from_bytes(None, new_list_item_ui())
39+
40+
lv = Gtk.ListView.new(selection, factory)
41+
w.set_child(lv)
42+
w.show()
43+
44+
app.connect("activate", activate)
45+
app.run()

gtk4_list_view/simple_list.ui

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<interface>
3+
<template class="GtkListItem">
4+
<property name="child">
5+
<object class="GtkLabel">
6+
<property name="xalign">0</property>
7+
<binding name="label">
8+
<lookup name="name" type="__main__+Demo">
9+
<lookup name="item">GtkListItem</lookup>
10+
</lookup>
11+
</binding>
12+
</object>
13+
</property>
14+
</template>
15+
</interface>

gtk4_list_view/simple_tree.py

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import importlib.resources
2+
3+
from gi.repository import Gio, GLib, GObject, Gtk
4+
5+
6+
def new_list_item_ui():
7+
with importlib.resources.path("gtk4_list_view", "simple_tree.ui") as ui_path:
8+
return GLib.Bytes.new(ui_path.read_bytes())
9+
10+
11+
class Demo(GObject.GObject):
12+
def __init__(self, name):
13+
super().__init__()
14+
self._name = name
15+
16+
@GObject.Property(type=str)
17+
def name(self):
18+
return self._name
19+
20+
21+
if __name__ == "__main__":
22+
23+
model = Gio.ListStore.new(Demo)
24+
model.append(Demo("one"))
25+
model.append(Demo("two"))
26+
model.append(Demo("three"))
27+
28+
app = Gtk.Application.new("gtk4.listview.SimpleTree", 0)
29+
30+
def activate(app):
31+
w = Gtk.Window()
32+
w.set_title("Simple tree")
33+
w.set_default_size(400, 400)
34+
app.add_window(w)
35+
36+
def child_model(item, user_data):
37+
return model
38+
39+
# Our data objects are wrapped by a Gtk.TreeListRow
40+
tree = Gtk.TreeListModel.new(
41+
model,
42+
passthrough=False,
43+
autoexpand=False,
44+
create_func=child_model,
45+
user_data=None,
46+
)
47+
48+
selection = Gtk.SingleSelection.new(tree)
49+
factory = Gtk.BuilderListItemFactory.new_from_bytes(None, new_list_item_ui())
50+
51+
lv = Gtk.ListView.new(selection, factory)
52+
w.set_child(lv)
53+
w.show()
54+
55+
app.connect("activate", activate)
56+
app.run()

gtk4_list_view/simple_tree.ui

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<interface>
3+
<template class="GtkListItem">
4+
<property name="child">
5+
<object class="GtkTreeExpander" id="expander">
6+
<property name="indent-for-icon">yes</property>
7+
<binding name="list-row">
8+
<lookup name="item">GtkListItem</lookup>
9+
</binding>
10+
<property name="child">
11+
<object class="GtkLabel">
12+
<property name="xalign">0</property>
13+
<binding name="label">
14+
<lookup name="name" type="__main__+Demo">
15+
<lookup name="item">expander</lookup>
16+
</lookup>
17+
</binding>
18+
</object>
19+
</property>
20+
</object>
21+
</property>
22+
</template>
23+
</interface>

poetry.lock

+188
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[tool.poetry]
2+
name = "gtk4-list-view"
3+
version = "0.1.0"
4+
description = ""
5+
authors = ["Arjan Molenaar <gaphor@gmail.com>"]
6+
7+
[tool.poetry.dependencies]
8+
python = "^3.10"
9+
PyGObject = "^3.42.1"
10+
11+
[tool.poetry.dev-dependencies]
12+
pytest = "^5.2"
13+
14+
[build-system]
15+
requires = ["poetry-core>=1.0.0"]
16+
build-backend = "poetry.core.masonry.api"

tests/__init__.py

Whitespace-only changes.

tests/test_python_gtk4_list_view.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from python_gtk4_list_view import __version__
2+
3+
4+
def test_version():
5+
assert __version__ == '0.1.0'

0 commit comments

Comments
 (0)