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-contact-row"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <adwaita.h>
9 : : #include <glib/gi18n.h>
10 : : #include <gtk/gtk.h>
11 : : #include <libebook-contacts/libebook-contacts.h>
12 : : #include <valent.h>
13 : :
14 : : #include "valent-contact-row.h"
15 : : #include "valent-ui-utils-private.h"
16 : :
17 : :
18 : : struct _ValentContactRow
19 : : {
20 : : GtkListBoxRow parent_instance;
21 : :
22 : : EContact *contact;
23 : :
24 : : GtkWidget *grid;
25 : : GtkWidget *avatar;
26 : : GtkWidget *title_label;
27 : : GtkWidget *subtitle_label;
28 : : GtkWidget *type_label;
29 : : };
30 : :
31 [ + + + - ]: 4 : G_DEFINE_FINAL_TYPE (ValentContactRow, valent_contact_row, GTK_TYPE_LIST_BOX_ROW)
32 : :
33 : : typedef enum {
34 : : PROP_CONTACT = 1,
35 : : PROP_CONTACT_MEDIUM,
36 : : PROP_CONTACT_TYPE,
37 : : } ValentContactRowProperty;
38 : :
39 : : static GParamSpec *properties[PROP_CONTACT_TYPE + 1] = { NULL, };
40 : :
41 : : /*
42 : : * GObject
43 : : */
44 : : static void
45 : 1 : valent_contact_row_finalize (GObject *object)
46 : : {
47 : 1 : ValentContactRow *self = VALENT_CONTACT_ROW (object);
48 : :
49 [ + - ]: 1 : g_clear_object (&self->contact);
50 : :
51 : 1 : G_OBJECT_CLASS (valent_contact_row_parent_class)->finalize (object);
52 : 1 : }
53 : :
54 : : static void
55 : 12 : valent_contact_row_get_property (GObject *object,
56 : : guint prop_id,
57 : : GValue *value,
58 : : GParamSpec *pspec)
59 : : {
60 : 12 : ValentContactRow *self = VALENT_CONTACT_ROW (object);
61 : :
62 [ + + - - ]: 12 : switch ((ValentContactRowProperty)prop_id)
63 : : {
64 : 11 : case PROP_CONTACT:
65 : 11 : g_value_set_object (value, self->contact);
66 : 11 : break;
67 : :
68 : 1 : case PROP_CONTACT_MEDIUM:
69 : 1 : g_value_set_string (value, gtk_label_get_text (GTK_LABEL (self->subtitle_label)));
70 : 1 : break;
71 : :
72 : 0 : case PROP_CONTACT_TYPE:
73 : 0 : g_value_set_string (value, gtk_label_get_text (GTK_LABEL (self->type_label)));
74 : 0 : break;
75 : :
76 : 0 : default:
77 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
78 : : }
79 : 12 : }
80 : :
81 : : static void
82 : 2 : valent_contact_row_set_property (GObject *object,
83 : : guint prop_id,
84 : : const GValue *value,
85 : : GParamSpec *pspec)
86 : : {
87 : 2 : ValentContactRow *self = VALENT_CONTACT_ROW (object);
88 : :
89 [ + + - - ]: 2 : switch ((ValentContactRowProperty)prop_id)
90 : : {
91 : 1 : case PROP_CONTACT:
92 : 1 : valent_contact_row_set_contact (self, g_value_get_object (value));
93 : 1 : break;
94 : :
95 : 1 : case PROP_CONTACT_MEDIUM:
96 : 1 : gtk_label_set_text (GTK_LABEL (self->subtitle_label), g_value_get_string (value));
97 : 1 : break;
98 : :
99 : 0 : case PROP_CONTACT_TYPE:
100 : 0 : gtk_label_set_text (GTK_LABEL (self->type_label), g_value_get_string (value));
101 : 0 : break;
102 : :
103 : 0 : default:
104 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
105 : : }
106 : 2 : }
107 : :
108 : : static void
109 : 1 : valent_contact_row_class_init (ValentContactRowClass *klass)
110 : : {
111 : 1 : GObjectClass *object_class = G_OBJECT_CLASS (klass);
112 : 1 : GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
113 : :
114 : 1 : object_class->finalize = valent_contact_row_finalize;
115 : 1 : object_class->get_property = valent_contact_row_get_property;
116 : 1 : object_class->set_property = valent_contact_row_set_property;
117 : :
118 : 1 : gtk_widget_class_set_template_from_resource (widget_class, "/plugins/gnome/valent-contact-row.ui");
119 : 1 : gtk_widget_class_bind_template_child (widget_class, ValentContactRow, avatar);
120 : 1 : gtk_widget_class_bind_template_child (widget_class, ValentContactRow, title_label);
121 : 1 : gtk_widget_class_bind_template_child (widget_class, ValentContactRow, subtitle_label);
122 : 1 : gtk_widget_class_bind_template_child (widget_class, ValentContactRow, type_label);
123 : 1 : gtk_widget_class_bind_template_callback (widget_class, valent_contact_to_paintable);
124 : :
125 : 2 : properties [PROP_CONTACT] =
126 : 1 : g_param_spec_object ("contact", NULL, NULL,
127 : : E_TYPE_CONTACT,
128 : : (G_PARAM_READWRITE |
129 : : G_PARAM_EXPLICIT_NOTIFY |
130 : : G_PARAM_STATIC_STRINGS));
131 : :
132 : 2 : properties [PROP_CONTACT_MEDIUM] =
133 : 1 : g_param_spec_string ("contact-medium", NULL, NULL,
134 : : NULL,
135 : : (G_PARAM_READWRITE |
136 : : G_PARAM_STATIC_STRINGS));
137 : :
138 : 2 : properties [PROP_CONTACT_TYPE] =
139 : 1 : g_param_spec_string ("contact-type", NULL, NULL,
140 : : NULL,
141 : : (G_PARAM_READWRITE |
142 : : G_PARAM_STATIC_STRINGS));
143 : :
144 : 1 : g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties);
145 : 1 : }
146 : :
147 : : static void
148 : 1 : valent_contact_row_init (ValentContactRow *self)
149 : : {
150 : 1 : gtk_widget_init_template (GTK_WIDGET (self));
151 : 1 : }
152 : :
153 : : /**
154 : : * valent_contact_row_get_contact:
155 : : * @row: a `ValentContactRow`
156 : : *
157 : : * Get the `EContact` for @row.
158 : : *
159 : : * Returns: (transfer none): a `EContact`
160 : : */
161 : : EContact *
162 : 0 : valent_contact_row_get_contact (ValentContactRow *row)
163 : : {
164 [ # # ]: 0 : g_return_val_if_fail (VALENT_IS_CONTACT_ROW (row), NULL);
165 : :
166 : 0 : return row->contact;
167 : : }
168 : :
169 : : /**
170 : : * valent_contact_row_set_contact:
171 : : * @row: a `ValentContactRow`
172 : : * @contact: a `ValentContact`
173 : : *
174 : : * Set the `ValentContact` for @row.
175 : : */
176 : : void
177 : 1 : valent_contact_row_set_contact (ValentContactRow *row,
178 : : EContact *contact)
179 : : {
180 [ + - ]: 1 : g_return_if_fail (VALENT_IS_CONTACT_ROW (row));
181 [ + - + - : 1 : g_return_if_fail (contact == NULL || E_IS_CONTACT (contact));
- + - - ]
182 : :
183 [ + - ]: 1 : if (g_set_object (&row->contact, contact))
184 : 1 : g_object_notify_by_pspec (G_OBJECT (row), properties [PROP_CONTACT]);
185 : : }
186 : :
|