pidgin/pidginaccountchooser.c

changeset 40248
0d975f80d020
parent 39793
2a29bc06910b
child 40249
a133a6fcc822
--- a/pidgin/pidginaccountchooser.c	Fri Dec 20 02:44:13 2019 +0000
+++ b/pidgin/pidginaccountchooser.c	Sun Dec 22 18:42:12 2019 -0500
@@ -36,6 +36,14 @@
 	AOP_COLUMN_COUNT
 };
 
+enum
+{
+	PROP_0,
+	PROP_ACCOUNT,
+	PROP_SHOW_ALL,
+	PROP_LAST
+};
+
 /******************************************************************************
  * Structs
  *****************************************************************************/
@@ -52,6 +60,8 @@
 /******************************************************************************
  * Code
  *****************************************************************************/
+static GParamSpec *properties[PROP_LAST] = {NULL};
+
 G_DEFINE_TYPE(PidginAccountChooser, pidgin_account_chooser, GTK_TYPE_COMBO_BOX)
 
 static gpointer
@@ -192,14 +202,78 @@
 	return FALSE;
 }
 
+static void
+pidgin_account_chooser_changed_cb(GtkComboBox *widget, gpointer user_data)
+{
+	g_object_notify_by_pspec(G_OBJECT(widget), properties[PROP_ACCOUNT]);
+}
+
 /******************************************************************************
  * GObject implementation
  *****************************************************************************/
 static void
+pidgin_account_chooser_get_property(GObject *object, guint prop_id,
+                                    GValue *value, GParamSpec *pspec)
+{
+	PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(object);
+
+	switch (prop_id) {
+		case PROP_ACCOUNT:
+			g_value_set_object(value, account_chooser_get_selected(chooser));
+			break;
+		case PROP_SHOW_ALL:
+			g_value_set_boolean(value, chooser->show_all);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+			break;
+	}
+}
+
+static void
+pidgin_account_chooser_set_property(GObject *object, guint prop_id,
+                                    const GValue *value, GParamSpec *pspec)
+{
+	PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(object);
+
+	switch (prop_id) {
+		case PROP_ACCOUNT:
+			account_chooser_select_by_data(GTK_WIDGET(chooser),
+			                               g_value_get_object(value));
+			break;
+		case PROP_SHOW_ALL:
+			chooser->show_all = g_value_get_boolean(value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+			break;
+	}
+}
+
+static void
 pidgin_account_chooser_class_init(PidginAccountChooserClass *klass)
 {
+	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
 	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
 
+	/* Properties */
+	obj_class->get_property = pidgin_account_chooser_get_property;
+	obj_class->set_property = pidgin_account_chooser_set_property;
+
+	properties[PROP_ACCOUNT] = g_param_spec_object(
+	        "account", "Account", "The account that is currently selected.",
+	        PURPLE_TYPE_ACCOUNT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	properties[PROP_SHOW_ALL] = g_param_spec_boolean(
+	        "show-all", "Show all",
+	        "Whether to show all accounts, or just online ones.", FALSE,
+	        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                G_PARAM_STATIC_STRINGS);
+
+	g_object_class_install_properties(obj_class, PROP_LAST, properties);
+
+	/* Widget template */
+
 	gtk_widget_class_set_template_from_resource(
 	        widget_class, "/im/pidgin/Pidgin/Accounts/chooser.ui");
 
@@ -215,6 +289,9 @@
 {
 	gtk_widget_init_template(GTK_WIDGET(chooser));
 
+	g_signal_connect(chooser, "changed", pidgin_account_chooser_changed_cb,
+	                 NULL);
+
 	/* Register the purple sign on/off event callbacks. */
 	purple_signal_connect(
 	        purple_connections_get_handle(), "signed-on", chooser,
@@ -238,8 +315,8 @@
 {
 	PidginAccountChooser *chooser = NULL;
 
-	chooser = g_object_new(PIDGIN_TYPE_ACCOUNT_CHOOSER, NULL);
-	chooser->show_all = show_all;
+	chooser = g_object_new(PIDGIN_TYPE_ACCOUNT_CHOOSER, "account",
+	                       default_account, "show-all", show_all, NULL);
 	set_account_menu(PIDGIN_ACCOUNT_CHOOSER(chooser), default_account);
 
 	return GTK_WIDGET(chooser);
@@ -270,4 +347,14 @@
 	g_return_if_fail(PIDGIN_IS_ACCOUNT_CHOOSER(chooser));
 
 	account_chooser_select_by_data(chooser, account);
+
+	/* NOTE: Property notification occurs in 'changed' signal callback. */
 }
+
+gboolean
+pidgin_account_chooser_get_show_all(GtkWidget *chooser)
+{
+	g_return_val_if_fail(PIDGIN_IS_ACCOUNT_CHOOSER(chooser), FALSE);
+
+	return PIDGIN_ACCOUNT_CHOOSER(chooser)->show_all;
+}

mercurial