summaryrefslogtreecommitdiffstats
path: root/subprojects/libhandy/src/hdy-preferences-page.c
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/libhandy/src/hdy-preferences-page.c')
-rw-r--r--subprojects/libhandy/src/hdy-preferences-page.c365
1 files changed, 365 insertions, 0 deletions
diff --git a/subprojects/libhandy/src/hdy-preferences-page.c b/subprojects/libhandy/src/hdy-preferences-page.c
new file mode 100644
index 0000000..51fdc0d
--- /dev/null
+++ b/subprojects/libhandy/src/hdy-preferences-page.c
@@ -0,0 +1,365 @@
+/*
+ * Copyright (C) 2019 Purism SPC
+ *
+ * SPDX-License-Identifier: LGPL-2.1+
+ */
+
+#include "config.h"
+#include <glib/gi18n-lib.h>
+
+#include "hdy-preferences-page-private.h"
+
+#include "hdy-preferences-group-private.h"
+
+/**
+ * SECTION:hdy-preferences-page
+ * @short_description: A page from the preferences window.
+ * @Title: HdyPreferencesPage
+ *
+ * The #HdyPreferencesPage widget gathers preferences groups into a single page
+ * of a preferences window.
+ *
+ * # CSS nodes
+ *
+ * #HdyPreferencesPage has a single CSS node with name preferencespage.
+ *
+ * Since: 0.0.10
+ */
+
+typedef struct
+{
+ GtkBox *box;
+ GtkScrolledWindow *scrolled_window;
+
+ gchar *icon_name;
+ gchar *title;
+} HdyPreferencesPagePrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (HdyPreferencesPage, hdy_preferences_page, GTK_TYPE_BIN)
+
+enum {
+ PROP_0,
+ PROP_ICON_NAME,
+ PROP_TITLE,
+ LAST_PROP,
+};
+
+static GParamSpec *props[LAST_PROP];
+
+typedef struct {
+ HdyPreferencesPage *preferences_page;
+ GtkCallback callback;
+ gpointer data;
+} CallbackData;
+
+static void
+hdy_preferences_page_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ HdyPreferencesPage *self = HDY_PREFERENCES_PAGE (object);
+
+ switch (prop_id) {
+ case PROP_ICON_NAME:
+ g_value_set_string (value, hdy_preferences_page_get_icon_name (self));
+ break;
+ case PROP_TITLE:
+ g_value_set_string (value, hdy_preferences_page_get_title (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+hdy_preferences_page_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ HdyPreferencesPage *self = HDY_PREFERENCES_PAGE (object);
+
+ switch (prop_id) {
+ case PROP_ICON_NAME:
+ hdy_preferences_page_set_icon_name (self, g_value_get_string (value));
+ break;
+ case PROP_TITLE:
+ hdy_preferences_page_set_title (self, g_value_get_string (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+hdy_preferences_page_finalize (GObject *object)
+{
+ HdyPreferencesPage *self = HDY_PREFERENCES_PAGE (object);
+ HdyPreferencesPagePrivate *priv = hdy_preferences_page_get_instance_private (self);
+
+ g_clear_pointer (&priv->icon_name, g_free);
+ g_clear_pointer (&priv->title, g_free);
+
+ G_OBJECT_CLASS (hdy_preferences_page_parent_class)->finalize (object);
+}
+
+static void
+hdy_preferences_page_add (GtkContainer *container,
+ GtkWidget *child)
+{
+ HdyPreferencesPage *self = HDY_PREFERENCES_PAGE (container);
+ HdyPreferencesPagePrivate *priv = hdy_preferences_page_get_instance_private (self);
+
+ if (priv->scrolled_window == NULL)
+ GTK_CONTAINER_CLASS (hdy_preferences_page_parent_class)->add (container, child);
+ else if (HDY_IS_PREFERENCES_GROUP (child))
+ gtk_container_add (GTK_CONTAINER (priv->box), child);
+ else
+ g_warning ("Can't add children of type %s to %s",
+ G_OBJECT_TYPE_NAME (child),
+ G_OBJECT_TYPE_NAME (container));
+}
+
+static void
+hdy_preferences_page_remove (GtkContainer *container,
+ GtkWidget *child)
+{
+ HdyPreferencesPage *self = HDY_PREFERENCES_PAGE (container);
+ HdyPreferencesPagePrivate *priv = hdy_preferences_page_get_instance_private (self);
+
+ if (child == GTK_WIDGET (priv->scrolled_window))
+ GTK_CONTAINER_CLASS (hdy_preferences_page_parent_class)->remove (container, child);
+ else
+ gtk_container_remove (GTK_CONTAINER (priv->box), child);
+}
+
+static void
+hdy_preferences_page_forall (GtkContainer *container,
+ gboolean include_internals,
+ GtkCallback callback,
+ gpointer callback_data)
+{
+ HdyPreferencesPage *self = HDY_PREFERENCES_PAGE (container);
+ HdyPreferencesPagePrivate *priv = hdy_preferences_page_get_instance_private (self);
+
+ if (include_internals)
+ GTK_CONTAINER_CLASS (hdy_preferences_page_parent_class)->forall (container,
+ include_internals,
+ callback,
+ callback_data);
+ else if (priv->box)
+ gtk_container_foreach (GTK_CONTAINER (priv->box), callback, callback_data);
+}
+
+static void
+hdy_preferences_page_class_init (HdyPreferencesPageClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
+
+ object_class->get_property = hdy_preferences_page_get_property;
+ object_class->set_property = hdy_preferences_page_set_property;
+ object_class->finalize = hdy_preferences_page_finalize;
+
+ container_class->add = hdy_preferences_page_add;
+ container_class->remove = hdy_preferences_page_remove;
+ container_class->forall = hdy_preferences_page_forall;
+
+ /**
+ * HdyPreferencesPage:icon-name:
+ *
+ * The icon name for this page of preferences.
+ *
+ * Since: 0.0.10
+ */
+ props[PROP_ICON_NAME] =
+ g_param_spec_string ("icon-name",
+ _("Icon name"),
+ _("Icon name"),
+ "",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
+
+ /**
+ * HdyPreferencesPage:title:
+ *
+ * The title for this page of preferences.
+ *
+ * Since: 0.0.10
+ */
+ props[PROP_TITLE] =
+ g_param_spec_string ("title",
+ _("Title"),
+ _("Title"),
+ "",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
+
+ g_object_class_install_properties (object_class, LAST_PROP, props);
+
+ gtk_widget_class_set_template_from_resource (widget_class,
+ "/sm/puri/handy/ui/hdy-preferences-page.ui");
+ gtk_widget_class_bind_template_child_private (widget_class, HdyPreferencesPage, box);
+ gtk_widget_class_bind_template_child_private (widget_class, HdyPreferencesPage, scrolled_window);
+
+ gtk_widget_class_set_css_name (widget_class, "preferencespage");
+}
+
+static void
+hdy_preferences_page_init (HdyPreferencesPage *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+/**
+ * hdy_preferences_page_new:
+ *
+ * Creates a new #HdyPreferencesPage.
+ *
+ * Returns: a new #HdyPreferencesPage
+ *
+ * Since: 0.0.10
+ */
+GtkWidget *
+hdy_preferences_page_new (void)
+{
+ return g_object_new (HDY_TYPE_PREFERENCES_PAGE, NULL);
+}
+
+/**
+ * hdy_preferences_page_get_icon_name:
+ * @self: a #HdyPreferencesPage
+ *
+ * Gets the icon name for @self, or %NULL.
+ *
+ * Returns: (transfer none) (nullable): the icon name for @self, or %NULL.
+ *
+ * Since: 0.0.10
+ */
+const gchar *
+hdy_preferences_page_get_icon_name (HdyPreferencesPage *self)
+{
+ HdyPreferencesPagePrivate *priv;
+
+ g_return_val_if_fail (HDY_IS_PREFERENCES_PAGE (self), NULL);
+
+ priv = hdy_preferences_page_get_instance_private (self);
+
+ return priv->icon_name;
+}
+
+/**
+ * hdy_preferences_page_set_icon_name:
+ * @self: a #HdyPreferencesPage
+ * @icon_name: (nullable): the icon name, or %NULL
+ *
+ * Sets the icon name for @self.
+ *
+ * Since: 0.0.10
+ */
+void
+hdy_preferences_page_set_icon_name (HdyPreferencesPage *self,
+ const gchar *icon_name)
+{
+ HdyPreferencesPagePrivate *priv;
+
+ g_return_if_fail (HDY_IS_PREFERENCES_PAGE (self));
+
+ priv = hdy_preferences_page_get_instance_private (self);
+
+ if (g_strcmp0 (priv->icon_name, icon_name) == 0)
+ return;
+
+ g_clear_pointer (&priv->icon_name, g_free);
+ priv->icon_name = g_strdup (icon_name);
+
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_ICON_NAME]);
+}
+
+/**
+ * hdy_preferences_page_get_title:
+ * @self: a #HdyPreferencesPage
+ *
+ * Gets the title of @self, or %NULL.
+ *
+ * Returns: (transfer none) (nullable): the title of the @self, or %NULL.
+ *
+ * Since: 0.0.10
+ */
+const gchar *
+hdy_preferences_page_get_title (HdyPreferencesPage *self)
+{
+ HdyPreferencesPagePrivate *priv;
+
+ g_return_val_if_fail (HDY_IS_PREFERENCES_PAGE (self), NULL);
+
+ priv = hdy_preferences_page_get_instance_private (self);
+
+ return priv->title;
+}
+
+/**
+ * hdy_preferences_page_set_title:
+ * @self: a #HdyPreferencesPage
+ * @title: (nullable): the title of the page, or %NULL
+ *
+ * Sets the title of @self.
+ *
+ * Since: 0.0.10
+ */
+void
+hdy_preferences_page_set_title (HdyPreferencesPage *self,
+ const gchar *title)
+{
+ HdyPreferencesPagePrivate *priv;
+
+ g_return_if_fail (HDY_IS_PREFERENCES_PAGE (self));
+
+ priv = hdy_preferences_page_get_instance_private (self);
+
+ if (g_strcmp0 (priv->title, title) == 0)
+ return;
+
+ g_clear_pointer (&priv->title, g_free);
+ priv->title = g_strdup (title);
+
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_TITLE]);
+}
+
+GtkAdjustment *
+hdy_preferences_page_get_vadjustment (HdyPreferencesPage *self)
+{
+ HdyPreferencesPagePrivate *priv;
+
+ g_return_val_if_fail (HDY_IS_PREFERENCES_PAGE (self), NULL);
+
+ priv = hdy_preferences_page_get_instance_private (self);
+
+ return gtk_scrolled_window_get_vadjustment (priv->scrolled_window);
+}
+
+/**
+ * hdy_preferences_page_add_preferences_to_model: (skip)
+ * @self: a #HdyPreferencesPage
+ * @model: the model
+ *
+ * Add preferences from @self to the model.
+ *
+ * Since: 0.0.10
+ */
+void
+hdy_preferences_page_add_preferences_to_model (HdyPreferencesPage *self,
+ GListStore *model)
+{
+ HdyPreferencesPagePrivate *priv;
+
+ g_return_if_fail (HDY_IS_PREFERENCES_PAGE (self));
+ g_return_if_fail (G_IS_LIST_STORE (model));
+
+ if (!gtk_widget_get_visible (GTK_WIDGET (self)))
+ return;
+
+ priv = hdy_preferences_page_get_instance_private (self);
+
+ gtk_container_foreach (GTK_CONTAINER (priv->box), (GtkCallback) hdy_preferences_group_add_preferences_to_model, model);
+}