Skip to content

Commit a63852e

Browse files
authored
Port 'Database' demo to Python (#218)
1 parent f53216e commit a63852e

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

src/Database/main.py

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import gi
2+
3+
gi.require_version("Gtk", "4.0")
4+
gi.require_version("Gom", "1.0")
5+
from gi.repository import GObject, Gom, Gtk, GLib, Gio
6+
7+
import workbench
8+
9+
text_entry = workbench.builder.get_object("text_entry")
10+
insert_button = workbench.builder.get_object("insert_button")
11+
search_entry = workbench.builder.get_object("search_entry")
12+
column_view = workbench.builder.get_object("column_view")
13+
column_text = workbench.builder.get_object("column_text")
14+
column_id = workbench.builder.get_object("column_id")
15+
16+
17+
class ItemClass(Gom.Resource):
18+
id = GObject.Property(
19+
type=int,
20+
nick="ID",
21+
blurb="An ID",
22+
flags=GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT,
23+
minimum=0,
24+
maximum=GLib.MAXINT32,
25+
default=0,
26+
)
27+
text = GObject.Property(
28+
type=str,
29+
nick="Text",
30+
blurb="Some Text",
31+
flags=GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT,
32+
default="",
33+
)
34+
35+
36+
data_model = Gio.ListStore(item_type=ItemClass)
37+
adapter = None
38+
repository = None
39+
40+
41+
def migrate_cb(repository, result):
42+
_res = repository.automatic_migrate_finish(result)
43+
44+
45+
def open_cb(adapter, result):
46+
global repository
47+
_res = adapter.open_finish(result)
48+
repository = Gom.Repository(adapter=adapter)
49+
50+
# Set up table and primary key
51+
ItemClass.set_table("items")
52+
ItemClass.set_primary_key("id")
53+
54+
# Perform automatic migration
55+
repository.automatic_migrate_async(1, [ItemClass], migrate_cb)
56+
57+
58+
def init_database():
59+
global adapter
60+
adapter = Gom.Adapter()
61+
adapter.open_async(workbench.resolve("db.sqlite"), open_cb)
62+
63+
64+
def save_cb(item, result):
65+
success = item.save_finish(result)
66+
if not success:
67+
print("Failed to insert")
68+
return
69+
70+
load()
71+
72+
73+
def on_insert():
74+
text = text_entry.get_text()
75+
item = ItemClass(repository=repository, text=text)
76+
item.save_async(save_cb)
77+
78+
79+
def fetch_cb(resource_group, result):
80+
_res = resource_group.fetch_finish(result)
81+
for i in range(resource_group.get_count()):
82+
item = resource_group.get_index(i)
83+
if item:
84+
data_model.append(item)
85+
86+
87+
def find_cb(repository, result):
88+
resource_group = repository.find_finish(result)
89+
resource_group.fetch_async(0, resource_group.get_count(), fetch_cb)
90+
91+
92+
def load():
93+
text = search_entry.get_text() or ""
94+
95+
data_model.remove_all()
96+
# Create a filter for Text matching
97+
filter = Gom.Filter.new_glob(ItemClass, "text", f"*{text}*")
98+
repository.find_async(ItemClass, filter, find_cb)
99+
100+
101+
column_text.get_factory().connect(
102+
"setup",
103+
lambda _self, list_item: list_item.set_child(
104+
Gtk.Label(margin_start=12, margin_end=12)
105+
),
106+
)
107+
108+
109+
def column_text_bind_cb(_self, list_item):
110+
label_widget = list_item.get_child()
111+
model_item = list_item.get_item()
112+
label_widget.set_label(model_item.text)
113+
114+
115+
column_text.get_factory().connect("bind", column_text_bind_cb)
116+
117+
column_id.get_factory().connect(
118+
"setup",
119+
lambda _self, list_item: list_item.set_child(
120+
Gtk.Label(margin_start=12, margin_end=12)
121+
),
122+
)
123+
124+
125+
def column_id_bind_cb(_self, list_item):
126+
label_widget = list_item.get_child()
127+
model_item = list_item.get_item()
128+
label_widget.set_label(str(model_item.id))
129+
130+
131+
column_id.get_factory().connect("bind", column_id_bind_cb)
132+
133+
134+
column_view.set_model(Gtk.SingleSelection(model=data_model))
135+
136+
try:
137+
init_database()
138+
search_entry.connect("search-changed", lambda *_: load())
139+
140+
insert_button.connect("clicked", lambda *_: on_insert())
141+
# load()
142+
except Exception as err:
143+
print(err)

0 commit comments

Comments
 (0)