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 );
0 commit comments