Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #define G_LOG_DOMAIN "valent-contacts-preferences"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <glib/gi18n.h>
9 : : #include <adwaita.h>
10 : : #include <gtk/gtk.h>
11 : : #include <valent.h>
12 : :
13 : : #include "valent-device-preferences-contacts.h"
14 : :
15 : :
16 : : struct _ValentContactsPreferences
17 : : {
18 : : ValentDevicePreferencesGroup parent_instance;
19 : :
20 : : GHashTable *local_stores;
21 : :
22 : : /* template */
23 : : AdwExpanderRow *local_sync;
24 : : GtkListBox *local_list;
25 : : GtkSwitch *remote_sync;
26 : : };
27 : :
28 [ + + + - ]: 45 : G_DEFINE_FINAL_TYPE (ValentContactsPreferences, valent_contacts_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
29 : :
30 : :
31 : : static void
32 : 0 : on_local_sync (GtkListBox *box,
33 : : GtkListBoxRow *row,
34 : : ValentDevicePreferencesGroup *group)
35 : : {
36 : 0 : GSettings *settings;
37 : 0 : g_autofree char *local_uid = NULL;
38 : 0 : const char *uid;
39 : :
40 [ # # # # : 0 : g_assert (GTK_IS_LIST_BOX (box));
# # # # ]
41 [ # # # # : 0 : g_assert (GTK_IS_LIST_BOX_ROW (row));
# # # # ]
42 [ # # ]: 0 : g_assert (VALENT_IS_DEVICE_PREFERENCES_GROUP (group));
43 : :
44 : 0 : settings = valent_device_preferences_group_get_settings (group);
45 : 0 : local_uid = g_settings_get_string (settings, "local-uid");
46 : 0 : uid = gtk_widget_get_name (GTK_WIDGET (row));
47 : :
48 [ # # ]: 0 : if (g_strcmp0 (local_uid, uid) == 0)
49 : 0 : g_settings_reset (settings, "local-uid");
50 : : else
51 : 0 : g_settings_set_string (settings, "local-uid", uid);
52 : :
53 : 0 : gtk_list_box_invalidate_filter (box);
54 : 0 : }
55 : :
56 : : static void
57 : 0 : on_adapter_selected (AdwActionRow *row,
58 : : ValentContactsPreferences *self)
59 : : {
60 : 0 : ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
61 : 0 : GSettings *settings;
62 : 0 : GHashTableIter iter;
63 : 0 : ValentContactsAdapter *adapter;
64 : 0 : gpointer store_row;
65 : :
66 [ # # ]: 0 : g_assert (ADW_IS_ACTION_ROW (row));
67 [ # # ]: 0 : g_assert (VALENT_IS_CONTACTS_PREFERENCES (self));
68 : :
69 : 0 : settings = valent_device_preferences_group_get_settings (group);
70 : :
71 : 0 : g_hash_table_iter_init (&iter, self->local_stores);
72 [ # # ]: 0 : while (g_hash_table_iter_next (&iter, (void **)&adapter, &store_row))
73 : : {
74 : 0 : GtkWidget *check = g_object_get_data (G_OBJECT (store_row), "select");
75 : :
76 [ # # ]: 0 : if (row == store_row)
77 : : {
78 : 0 : const char *iri = valent_resource_get_iri (VALENT_RESOURCE (self));
79 [ # # ]: 0 : g_settings_set_string (settings, "local-uid", iri != NULL ? iri : "");
80 : : }
81 : :
82 : 0 : gtk_widget_set_visible (check, (row == store_row));
83 : : }
84 : 0 : }
85 : :
86 : : static GtkWidget *
87 : 2 : valent_contacts_preferences_create_row_func (gpointer item,
88 : : gpointer user_data)
89 : : {
90 : 2 : ValentContactsPreferences *self = VALENT_CONTACTS_PREFERENCES (user_data);
91 : 2 : ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
92 : 2 : ValentContactsAdapter *adapter = VALENT_CONTACTS_ADAPTER (item);
93 : 2 : ValentContext *context = NULL;
94 : 2 : const char *device_id = NULL;
95 : 2 : GSettings *settings;
96 : 2 : GtkWidget *row;
97 : 2 : GtkWidget *image;
98 : 2 : const char *icon_name;
99 : 2 : const char *iri = NULL;
100 : 4 : g_autofree char *local_iri = NULL;
101 : :
102 [ + - ]: 2 : g_assert (VALENT_IS_CONTACTS_ADAPTER (adapter));
103 [ - + ]: 2 : g_assert (VALENT_IS_CONTACTS_PREFERENCES (self));
104 : :
105 : : /* FIXME: select an icon name for the addressbook type */
106 : 2 : context = valent_device_preferences_group_get_context (group);
107 : 2 : device_id = valent_context_get_id (context);
108 : 2 : iri = valent_resource_get_iri (VALENT_RESOURCE (adapter));
109 : :
110 [ + - - + ]: 2 : if (iri != NULL && g_strrstr (iri, device_id) != NULL)
111 : : icon_name = APPLICATION_ID"-symbolic";
112 : : else
113 : : icon_name = "x-office-address-book";
114 : :
115 : : /* Row */
116 : 2 : row = g_object_new (ADW_TYPE_ACTION_ROW,
117 : : "activatable", TRUE,
118 : : "title", iri,
119 : : NULL);
120 : 2 : image = g_object_new (GTK_TYPE_IMAGE,
121 : : "icon-name", icon_name,
122 : : "icon-size", GTK_ICON_SIZE_NORMAL,
123 : : NULL);
124 : 2 : adw_action_row_add_prefix (ADW_ACTION_ROW (row), image);
125 : :
126 : 2 : g_signal_connect_object (G_OBJECT (row),
127 : : "activated",
128 : : G_CALLBACK (on_adapter_selected),
129 : : self, 0);
130 : :
131 : : /* Check */
132 : 2 : settings = valent_device_preferences_group_get_settings (group);
133 : 2 : local_iri = g_settings_get_string (settings, "local-uid");
134 : 2 : image = g_object_new (GTK_TYPE_IMAGE,
135 : : "icon-name", "object-select-symbolic",
136 : : "icon-size", GTK_ICON_SIZE_NORMAL,
137 : 2 : "visible", (g_strcmp0 (local_iri, iri) == 0),
138 : : NULL);
139 : 2 : adw_action_row_add_suffix (ADW_ACTION_ROW (row), image);
140 : 2 : g_object_set_data (G_OBJECT (row), "select", image);
141 : :
142 : 2 : g_object_bind_property (adapter, "iri",
143 : : row, "title",
144 : : G_BINDING_SYNC_CREATE);
145 : :
146 : 2 : return row;
147 : : }
148 : :
149 : : static GtkListBox *
150 : 1 : _adw_expander_row_get_list (AdwExpanderRow *row)
151 : : {
152 : 1 : GtkWidget *box;
153 : 1 : GtkWidget *child;
154 : :
155 : : /* First child is a GtkBox */
156 : 1 : box = gtk_widget_get_first_child (GTK_WIDGET (row));
157 : :
158 : : /* The GtkBox contains the primary AdwActionRow and a GtkRevealer */
159 : 1 : for (child = gtk_widget_get_first_child (box);
160 [ + - ]: 2 : child != NULL;
161 : 1 : child = gtk_widget_get_next_sibling (child))
162 : : {
163 [ + - + + : 2 : if (GTK_IS_REVEALER (child))
+ - ]
164 : : break;
165 : : }
166 : :
167 : : /* The GtkRevealer's child is the GtkListBox */
168 [ + - + - : 1 : if (GTK_IS_REVEALER (child))
- + - - ]
169 : 1 : return GTK_LIST_BOX (gtk_revealer_get_child (GTK_REVEALER (child)));
170 : :
171 : : return NULL;
172 : : }
173 : :
174 : :
175 : : /*
176 : : * GObject
177 : : */
178 : : static void
179 : 1 : valent_contacts_preferences_constructed (GObject *object)
180 : : {
181 : 1 : ValentContactsPreferences *self = VALENT_CONTACTS_PREFERENCES (object);
182 : 1 : ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
183 : 1 : GSettings *settings;
184 : 1 : ValentContacts *contacts;
185 : :
186 : 1 : G_OBJECT_CLASS (valent_contacts_preferences_parent_class)->constructed (object);
187 : :
188 : 1 : settings = valent_device_preferences_group_get_settings (group);
189 : 1 : g_settings_bind (settings, "remote-sync",
190 : 1 : self->remote_sync, "active",
191 : : G_SETTINGS_BIND_DEFAULT);
192 : 1 : g_settings_bind (settings, "local-sync",
193 : 1 : self->local_sync, "enable-expansion",
194 : : G_SETTINGS_BIND_DEFAULT);
195 : :
196 : 1 : contacts = valent_contacts_get_default ();
197 : 1 : gtk_list_box_bind_model (self->local_list,
198 : : G_LIST_MODEL (contacts),
199 : : valent_contacts_preferences_create_row_func,
200 : : self, NULL);
201 : 1 : }
202 : :
203 : : static void
204 : 1 : valent_contacts_preferences_dispose (GObject *object)
205 : : {
206 : 1 : GtkWidget *widget = GTK_WIDGET (object);
207 : :
208 : 1 : gtk_widget_dispose_template (widget, VALENT_TYPE_CONTACTS_PREFERENCES);
209 : :
210 : 1 : G_OBJECT_CLASS (valent_contacts_preferences_parent_class)->dispose (object);
211 : 1 : }
212 : :
213 : : static void
214 : 1 : valent_contacts_preferences_finalize (GObject *object)
215 : : {
216 : 1 : ValentContactsPreferences *self = VALENT_CONTACTS_PREFERENCES (object);
217 : :
218 [ + - ]: 1 : g_clear_pointer (&self->local_stores, g_hash_table_unref);
219 : :
220 : 1 : G_OBJECT_CLASS (valent_contacts_preferences_parent_class)->finalize (object);
221 : 1 : }
222 : :
223 : : static void
224 : 1 : valent_contacts_preferences_class_init (ValentContactsPreferencesClass *klass)
225 : : {
226 : 1 : GObjectClass *object_class = G_OBJECT_CLASS (klass);
227 : 1 : GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
228 : :
229 : 1 : object_class->constructed = valent_contacts_preferences_constructed;
230 : 1 : object_class->dispose = valent_contacts_preferences_dispose;
231 : 1 : object_class->finalize = valent_contacts_preferences_finalize;
232 : :
233 : 1 : gtk_widget_class_set_template_from_resource (widget_class, "/plugins/gnome/valent-device-preferences-contacts.ui");
234 : 1 : gtk_widget_class_bind_template_child (widget_class, ValentContactsPreferences, local_sync);
235 : 1 : gtk_widget_class_bind_template_child (widget_class, ValentContactsPreferences, remote_sync);
236 : :
237 : 1 : gtk_widget_class_bind_template_callback (widget_class, on_local_sync);
238 : 1 : }
239 : :
240 : : static void
241 : 1 : valent_contacts_preferences_init (ValentContactsPreferences *self)
242 : : {
243 : 1 : gtk_widget_init_template (GTK_WIDGET (self));
244 : :
245 : 1 : self->local_list = _adw_expander_row_get_list (self->local_sync);
246 : 1 : self->local_stores = g_hash_table_new (NULL, NULL);
247 : 1 : }
248 : :
|