Skip to content

Commit d89e7e6

Browse files
committed
Add sidebar editing mode with card toggles and tag reordering
- Allow toggling visibility of Insights and Places cards in sidebar - Enable drag-and-drop reordering of user-created tags - Add sidebar edit mode with controls for card visibility and tag order - Update SettingsManager to persist sidebar card and tag order settings - Improve tag row UI for editing and drag handle display - Fix bug with All Entries row selection logic
1 parent 76e68f6 commit d89e7e6

5 files changed

Lines changed: 420 additions & 92 deletions

File tree

data/style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ window {
7070
color: var(--text-primary);
7171
}
7272

73+
.selection-mode * {
74+
border-radius: 999px;
75+
}
76+
7377
/* --- Sidebar --- */
7478
.sidebar {
7579
background: var(--sidebar-bg);

src/settings/SettingsManager.vala

Lines changed: 106 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
* "streak": {
2020
* "enabled": true,
2121
* "time": "20:00"
22+
* },
23+
* "sidebar": {
24+
* "insights_card_enabled": true,
25+
* "places_card_enabled": true,
26+
* "tag_order": []
2227
* }
2328
* }
2429
*/
@@ -42,6 +47,10 @@ namespace Notejot {
4247
private bool streak_enabled = false;
4348
private string streak_time = "20:00"; // 24h HH:MM
4449

50+
private bool insights_card_enabled = true;
51+
private bool places_card_enabled = true;
52+
private string[] tag_order = {};
53+
4554
// Singleton
4655
private static SettingsManager? instance = null;
4756

@@ -91,6 +100,18 @@ namespace Notejot {
91100
return this.streak_time;
92101
}
93102

103+
public bool get_insights_card_enabled () {
104+
return this.insights_card_enabled;
105+
}
106+
107+
public bool get_places_card_enabled () {
108+
return this.places_card_enabled;
109+
}
110+
111+
public string[] get_tag_order () {
112+
return this.tag_order;
113+
}
114+
94115
// ---- Public setters (auto-save) ------------------------------------
95116

96117
public void set_scheduling_enabled (bool enabled) {
@@ -128,6 +149,23 @@ namespace Notejot {
128149
save ();
129150
}
130151

152+
public void set_insights_card_enabled (bool enabled) {
153+
if (this.insights_card_enabled == enabled)return;
154+
this.insights_card_enabled = enabled;
155+
save ();
156+
}
157+
158+
public void set_places_card_enabled (bool enabled) {
159+
if (this.places_card_enabled == enabled)return;
160+
this.places_card_enabled = enabled;
161+
save ();
162+
}
163+
164+
public void set_tag_order (string[] order) {
165+
this.tag_order = order;
166+
save ();
167+
}
168+
131169
// Convenience batch updates (auto-save)
132170
public void update_scheduling (bool enabled, string time_hhmm, int[] days_of_week) {
133171
this.scheduling_enabled = enabled;
@@ -145,58 +183,73 @@ namespace Notejot {
145183
// ---- Persistence ----------------------------------------------------
146184

147185
private void load () {
148-
try {
149-
if (!GLib.FileUtils.test (this.settings_path, GLib.FileTest.EXISTS)) {
150-
return; // keep defaults
151-
}
186+
if (!GLib.FileUtils.test (this.settings_path, GLib.FileTest.EXISTS)) {
187+
return; // keep defaults
188+
}
152189

153-
string contents;
154-
GLib.FileUtils.get_contents (this.settings_path, out contents);
190+
string contents;
191+
GLib.FileUtils.get_contents (this.settings_path, out contents);
155192

156-
var parser = new Json.Parser ();
157-
parser.load_from_data (contents);
158-
var root_node = parser.get_root ();
159-
if (root_node.get_node_type () != Json.NodeType.OBJECT)return;
193+
var parser = new Json.Parser ();
194+
parser.load_from_data (contents);
195+
var root_node = parser.get_root ();
196+
if (root_node.get_node_type () != Json.NodeType.OBJECT)return;
160197

161-
var root = root_node.get_object ();
198+
var root = root_node.get_object ();
162199

163-
// Scheduling
164-
if (root.has_member ("scheduling")) {
165-
var sched = root.get_object_member ("scheduling");
200+
// Scheduling
201+
if (root.has_member ("scheduling")) {
202+
var sched = root.get_object_member ("scheduling");
166203

167-
if (sched.has_member ("enabled")) {
168-
this.scheduling_enabled = sched.get_boolean_member ("enabled");
169-
}
170-
if (sched.has_member ("time")) {
171-
var t = sched.get_string_member ("time");
172-
this.scheduling_time = normalize_time_or_fallback (t, this.scheduling_time);
173-
}
174-
if (sched.has_member ("days_of_week")) {
175-
var arr = sched.get_array_member ("days_of_week");
176-
int[] tmp = {};
177-
foreach (var el in arr.get_elements ()) {
178-
int v = (int) el.get_int ();
179-
tmp += v;
180-
}
181-
this.scheduling_days = sanitize_days (tmp);
204+
if (sched.has_member ("enabled")) {
205+
this.scheduling_enabled = sched.get_boolean_member ("enabled");
206+
}
207+
if (sched.has_member ("time")) {
208+
var t = sched.get_string_member ("time");
209+
this.scheduling_time = normalize_time_or_fallback (t, this.scheduling_time);
210+
}
211+
if (sched.has_member ("days_of_week")) {
212+
var arr = sched.get_array_member ("days_of_week");
213+
int[] tmp = {};
214+
foreach (var el in arr.get_elements ()) {
215+
int v = (int) el.get_int ();
216+
tmp += v;
182217
}
218+
this.scheduling_days = sanitize_days (tmp);
183219
}
220+
}
184221

185-
// Streak
186-
if (root.has_member ("streak")) {
187-
var st = root.get_object_member ("streak");
222+
// Streak
223+
if (root.has_member ("streak")) {
224+
var st = root.get_object_member ("streak");
188225

189-
if (st.has_member ("enabled")) {
190-
this.streak_enabled = st.get_boolean_member ("enabled");
191-
}
192-
if (st.has_member ("time")) {
193-
var t = st.get_string_member ("time");
194-
this.streak_time = normalize_time_or_fallback (t, this.streak_time);
226+
if (st.has_member ("enabled")) {
227+
this.streak_enabled = st.get_boolean_member ("enabled");
228+
}
229+
if (st.has_member ("time")) {
230+
var t = st.get_string_member ("time");
231+
this.streak_time = normalize_time_or_fallback (t, this.streak_time);
232+
}
233+
}
234+
235+
// Sidebar
236+
if (root.has_member ("sidebar")) {
237+
var sidebar = root.get_object_member ("sidebar");
238+
239+
if (sidebar.has_member ("insights_card_enabled")) {
240+
this.insights_card_enabled = sidebar.get_boolean_member ("insights_card_enabled");
241+
}
242+
if (sidebar.has_member ("places_card_enabled")) {
243+
this.places_card_enabled = sidebar.get_boolean_member ("places_card_enabled");
244+
}
245+
if (sidebar.has_member ("tag_order")) {
246+
var arr = sidebar.get_array_member ("tag_order");
247+
string[] tmp = {};
248+
foreach (var el in arr.get_elements ()) {
249+
tmp += el.get_string ();
195250
}
251+
this.tag_order = tmp;
196252
}
197-
} catch (Error e) {
198-
warning ("Failed to load settings: %s", e.message);
199-
// Keep defaults on failure
200253
}
201254
}
202255

@@ -223,6 +276,18 @@ namespace Notejot {
223276
streak_obj.set_string_member ("time", this.streak_time);
224277
root_obj.set_object_member ("streak", streak_obj);
225278

279+
// Sidebar object
280+
var sidebar_obj = new Json.Object ();
281+
sidebar_obj.set_boolean_member ("insights_card_enabled", this.insights_card_enabled);
282+
sidebar_obj.set_boolean_member ("places_card_enabled", this.places_card_enabled);
283+
284+
var tag_order_array = new Json.Array ();
285+
foreach (var uuid in this.tag_order) {
286+
tag_order_array.add_string_element (uuid);
287+
}
288+
sidebar_obj.set_array_member ("tag_order", tag_order_array);
289+
root_obj.set_object_member ("sidebar", sidebar_obj);
290+
226291
// Write pretty JSON
227292
var generator = new Json.Generator ();
228293
generator.set_pretty (true);

src/views/EntriesView.vala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,17 @@ namespace Notejot {
7676
entries_to_show = this.data_manager.get_entries (true);
7777
} else if (this.current_tag_uuid == "pinned") {
7878
entries_to_show = this.data_manager.get_pinned_entries ();
79-
} else if (this.current_tag_uuid == null) {
79+
} else if (this.current_tag_uuid == "") {
8080
entries_to_show = this.data_manager.get_entries (false);
8181
} else {
8282
entries_to_show = this.data_manager.get_entries_for_tag (this.current_tag_uuid);
8383
}
8484

85-
var q = "";
85+
string? q = null;
8686
if (this.search_entry != null) {
8787
q = this.search_entry.get_text ().strip ();
8888
}
89-
if (q != "") {
89+
if (q != null) {
9090
try {
9191
var pattern = GLib.Regex.escape_string (q, -1);
9292
var regex = new GLib.Regex (pattern, GLib.RegexCompileFlags.CASELESS | GLib.RegexCompileFlags.OPTIMIZE, 0);

0 commit comments

Comments
 (0)