Skip to content

Commit 36eb59a

Browse files
committed
changes and improvements
Use SearchEntry for text search and SpinButton for ID search and subsequent logic changes Cleaned up logic when no results found Re-organized the UI, cleaner implementation
1 parent c6c4d8f commit 36eb59a

File tree

2 files changed

+88
-76
lines changed

2 files changed

+88
-76
lines changed

src/Gom/main.blp

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,54 @@ Adw.ToastOverlay overlay {
1616
"linked"
1717
]
1818

19-
Entry filter_entry {
20-
placeholder-text: "Enter Text";
21-
width-request: 250;
19+
Entry text_entry {
20+
placeholder-text: _("Enter Text");
21+
width-request: 300;
2222
}
2323

24-
Button filter_button {
25-
label: _("Filter");
24+
Button insert_button {
25+
label: _("Insert");
2626
}
2727
}
2828

2929
Box {
30-
styles [
31-
"linked"
32-
]
30+
orientation: horizontal;
31+
spacing: 18;
3332

34-
Entry url_entry {
35-
placeholder-text: "Enter URL";
36-
width-request: 250;
37-
}
33+
Box {
34+
orientation: vertical;
35+
spacing: 12;
3836

39-
Button insert_button {
40-
label: _("Insert");
37+
Label {
38+
label: _("Search by Text");
39+
}
40+
41+
SearchEntry search_entry {
42+
search-delay: 100;
43+
placeholder-text: _("Enter Text");
44+
width-request: 250;
45+
}
4146
}
42-
}
4347

44-
Box {
45-
styles [
46-
"linked"
47-
]
48+
Box {
49+
spacing: 12;
50+
orientation: vertical;
4851

49-
Entry id_entry {
50-
placeholder-text: "Enter ID";
51-
width-request: 250;
52-
}
52+
Label {
53+
label: _("Search by ID");
54+
}
5355

54-
Button find_button {
55-
label: _("Search");
56+
SpinButton id_entry {
57+
halign: center;
58+
orientation: horizontal;
59+
wrap: false;
60+
climb-rate: 1;
61+
62+
adjustment: Adjustment {
63+
step-increment: 1;
64+
value: 0;
65+
};
66+
}
5667
}
5768
}
5869

@@ -61,7 +72,7 @@ Adw.ToastOverlay overlay {
6172
show-column-separators: true;
6273

6374
ColumnViewColumn col1 {
64-
title: _("URL");
75+
title: _("Text");
6576
expand: true;
6677

6778
factory: SignalListItemFactory {};
@@ -77,7 +88,6 @@ Adw.ToastOverlay overlay {
7788
}
7889

7990
Label result_label {
80-
label: _("Results will appear here");
8191
wrap: true;
8292
width-request: 250;
8393
}

src/Gom/main.js

Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,43 @@ import Adw from "gi://Adw";
55
import GLib from "gi://GLib";
66
import Gio from "gi://Gio";
77

8-
const INT32_MAX = 2147483647;
9-
10-
const ItemClass = GObject.registerClass({
11-
GTypeName: 'Item',
12-
Properties: {
13-
'id': GObject.ParamSpec.int(
14-
'id', 'ID', 'An ID',
15-
GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT,
16-
0, INT32_MAX, 0
17-
),
18-
'url': GObject.ParamSpec.string(
19-
'url', 'URL', 'A URL',
20-
GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT,
21-
''
22-
),
8+
const ItemClass = GObject.registerClass(
9+
{
10+
GTypeName: "Item",
11+
Properties: {
12+
id: GObject.ParamSpec.int(
13+
"id",
14+
"ID",
15+
"An ID",
16+
GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT,
17+
0,
18+
GLib.MAXINT32,
19+
0,
20+
),
21+
url: GObject.ParamSpec.string(
22+
"url",
23+
"URL",
24+
"A URL",
25+
GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT,
26+
"",
27+
),
28+
},
2329
},
24-
}, class ItemClass extends Gom.Resource { });
30+
class ItemClass extends Gom.Resource { },
31+
);
2532

2633
let adapter, repository;
2734

2835
function initDatabase() {
2936
adapter = new Gom.Adapter();
30-
adapter.open_sync(':memory:',);
37+
adapter.open_sync(":memory:",);
3138
repository = new Gom.Repository({ adapter: adapter });
3239

33-
ItemClass.set_table('items');
34-
ItemClass.set_primary_key('id');
40+
// Set up table and primary key
41+
ItemClass.set_table("items");
42+
ItemClass.set_primary_key("id");
3543

44+
// Perform automatic migration
3645
repository.automatic_migrate_sync(1, [ItemClass]);
3746
}
3847

@@ -52,34 +61,33 @@ function showToast(overlay, message) {
5261

5362
initDatabase();
5463

55-
const url_entry = workbench.builder.get_object("url_entry");
64+
const text_entry = workbench.builder.get_object("text_entry");
5665
const id_entry = workbench.builder.get_object("id_entry");
5766
const insert_button = workbench.builder.get_object("insert_button");
58-
const find_button = workbench.builder.get_object("find_button");
59-
const filter_entry = workbench.builder.get_object("filter_entry");
60-
const filter_button = workbench.builder.get_object("filter_button");
67+
const search_entry = workbench.builder.get_object("search_entry");
6168
const result_label = workbench.builder.get_object("result_label");
6269
const overlay = workbench.builder.get_object("overlay");
63-
6470
const data_model = new Gio.ListStore({ item_type: ItemClass });
6571
const column_view = workbench.builder.get_object("column_view");
6672
const col1 = workbench.builder.get_object("col1");
6773
const col2 = workbench.builder.get_object("col2");
74+
var count = 0;
6875

6976
insert_button.connect("clicked", () => {
70-
const url = url_entry.text;
77+
const url = text_entry.text;
7178
const item = new ItemClass({ repository: repository, url: url });
7279
const success = item.save_sync();
80+
7381
if (success) {
7482
showToast(overlay, "Item inserted successfully");
7583
data_model.append(item);
84+
id_entry.set_range(1, ++count);
7685
} else {
77-
result_label.label = "Failed to insert item";
7886
showToast(overlay, "Failed to insert item");
7987
}
8088
});
8189

82-
find_button.connect("clicked", () => {
90+
id_entry.connect("value-changed", () => {
8391
data_model.remove_all();
8492
const id = parseInt(id_entry.text);
8593
const filter = Gom.Filter.new_eq(ItemClass, "id", id);
@@ -89,49 +97,42 @@ find_button.connect("clicked", () => {
8997
} else {
9098
result_label.label = "Item not found";
9199
}
92-
93100
});
94101

95-
filter_button.connect("clicked", () => {
102+
search_entry.connect("search-changed", () => {
96103
data_model.remove_all();
97-
const filter_text = filter_entry.text.trim();
104+
const filter_text = search_entry.text.trim();
98105
if (filter_text === "") {
99-
result_label.label = "Enter a value";
106+
result_label.label = "";
100107
return;
101108
}
102-
103-
const filter = Gom.Filter.new_glob(ItemClass, 'url', `*${filter_text}*`);
109+
// Create a filter for Text matching
110+
const filter = Gom.Filter.new_glob(ItemClass, "url", `*${filter_text}*`);
104111
const filtered_items = repository.find_sync(ItemClass, filter);
105112

106-
if (filtered_items) {
107-
const count = filtered_items.get_count();
108-
if (count > 0) {
109-
filtered_items.fetch_async(0, count, () => {
110-
for (let i = 0; i < count; i++) {
111-
const item = filtered_items.get_index(i);
112-
if (item) {
113-
data_model.append(item);
114-
}
115-
}
116-
result_label.label = "Loaded successfully";
117-
});
118-
} else {
119-
result_label.label = "No matching items found";
120-
}
113+
if (filtered_items && filtered_items.get_count() > 0) {
114+
filtered_items.fetch_async(0, filtered_items.get_count(), () => {
115+
for (let i = 0; i < filtered_items.get_count(); i++) {
116+
const item = filtered_items.get_index(i);
117+
if (item) data_model.append(item);
118+
}
119+
result_label.label = "Loaded successfully";
120+
});
121121
} else {
122122
result_label.label = "No matching items found";
123123
}
124124
});
125125

126-
127126
const factory_col1 = col1.factory;
127+
128128
factory_col1.connect("setup", (_self, list_item) => {
129129
const label = new Gtk.Label({
130130
margin_start: 12,
131131
margin_end: 12,
132132
});
133133
list_item.set_child(label);
134134
});
135+
135136
factory_col1.connect("bind", (_self, list_item) => {
136137
const label_widget = list_item.get_child();
137138
const model_item = list_item.get_item();
@@ -146,6 +147,7 @@ factory_col2.connect("setup", (_self, list_item) => {
146147
});
147148
list_item.set_child(label);
148149
});
150+
149151
factory_col2.connect("bind", (_self, list_item) => {
150152
const label_widget = list_item.get_child();
151153
const model_item = list_item.get_item();

0 commit comments

Comments
 (0)