/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2013 Red Hat, Inc. */ /** * SECTION:nmt-newt-toggle-button * @short_description: Toggle buttons * * #NmtNewtToggleButton implements a two-state toggle button. */ #include "nm-default.h" #include "nmt-newt-toggle-button.h" G_DEFINE_TYPE(NmtNewtToggleButton, nmt_newt_toggle_button, NMT_TYPE_NEWT_BUTTON) #define NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_NEWT_TOGGLE_BUTTON, NmtNewtToggleButtonPrivate)) typedef struct { char * on_label, *off_label; gboolean active; } NmtNewtToggleButtonPrivate; enum { PROP_0, PROP_ON_LABEL, PROP_OFF_LABEL, PROP_ACTIVE, LAST_PROP }; /** * nmt_newt_toggle_button_new: * @on_label: the button's label when it is in the "on" state * @off_label: the button's label when it is in the "off" state * * Creates a new #NmtNewtToggleButton * * Returns: a new #NmtNewtToggleButton */ NmtNewtWidget * nmt_newt_toggle_button_new(const char *on_label, const char *off_label) { return g_object_new(NMT_TYPE_NEWT_TOGGLE_BUTTON, "on-label", on_label, "off-label", off_label, NULL); } /** * nmt_newt_toggle_button_get_active: * @button: an #NmtNewtToggleButton * * Gets whether @button is currently "on" or "off" * * Returns: whether @button is currently "on" (%TRUE) or "off" (%FALSE) */ gboolean nmt_newt_toggle_button_get_active(NmtNewtToggleButton *button) { NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(button); return priv->active; } /** * nmt_newt_toggle_button_set_active: * @button: an #NmtNewtToggleButton * @active: whether @button should be "on" or "off" * * Sets whether @button is currently "on" or "off" */ void nmt_newt_toggle_button_set_active(NmtNewtToggleButton *button, gboolean active) { NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(button); if (priv->active == active) return; priv->active = active; g_object_set(G_OBJECT(button), "label", active ? priv->on_label : priv->off_label, NULL); g_object_notify(G_OBJECT(button), "active"); } static void nmt_newt_toggle_button_init(NmtNewtToggleButton *button) {} static void nmt_newt_toggle_button_finalize(GObject *object) { NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(object); g_free(priv->on_label); g_free(priv->off_label); G_OBJECT_CLASS(nmt_newt_toggle_button_parent_class)->finalize(object); } static void nmt_newt_toggle_button_activated(NmtNewtWidget *widget) { NmtNewtToggleButton *button = NMT_NEWT_TOGGLE_BUTTON(widget); nmt_newt_toggle_button_set_active(button, !nmt_newt_toggle_button_get_active(button)); NMT_NEWT_WIDGET_CLASS(nmt_newt_toggle_button_parent_class)->activated(widget); } static void nmt_newt_toggle_button_set_property(GObject * object, guint prop_id, const GValue *value, GParamSpec * pspec) { NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(object); switch (prop_id) { case PROP_ON_LABEL: g_free(priv->on_label); priv->on_label = g_value_dup_string(value); if (priv->active) g_object_set(object, "label", priv->on_label, NULL); break; case PROP_OFF_LABEL: g_free(priv->off_label); priv->off_label = g_value_dup_string(value); if (!priv->active) g_object_set(object, "label", priv->off_label, NULL); break; case PROP_ACTIVE: priv->active = g_value_get_boolean(value); g_object_set(object, "label", priv->active ? priv->on_label : priv->off_label, NULL); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void nmt_newt_toggle_button_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec *pspec) { NmtNewtToggleButtonPrivate *priv = NMT_NEWT_TOGGLE_BUTTON_GET_PRIVATE(object); switch (prop_id) { case PROP_ON_LABEL: g_value_set_string(value, priv->on_label); break; case PROP_OFF_LABEL: g_value_set_string(value, priv->off_label); break; case PROP_ACTIVE: g_value_set_boolean(value, priv->active); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void nmt_newt_toggle_button_class_init(NmtNewtToggleButtonClass *button_class) { GObjectClass * object_class = G_OBJECT_CLASS(button_class); NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS(button_class); g_type_class_add_private(button_class, sizeof(NmtNewtToggleButtonPrivate)); /* virtual methods */ object_class->set_property = nmt_newt_toggle_button_set_property; object_class->get_property = nmt_newt_toggle_button_get_property; object_class->finalize = nmt_newt_toggle_button_finalize; widget_class->activated = nmt_newt_toggle_button_activated; /** * NmtNewtToggleButton:on-label: * * The label the button displays when it is "on". */ g_object_class_install_property( object_class, PROP_ON_LABEL, g_param_spec_string("on-label", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * NmtNewtToggleButton:off-label: * * The label the button displays when it is "off". */ g_object_class_install_property( object_class, PROP_OFF_LABEL, g_param_spec_string("off-label", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * NmtNewtToggleButton:active: * * Whether the button is currently "on" (%TRUE) or "off" (%FALSE) */ g_object_class_install_property( object_class, PROP_ACTIVE, g_param_spec_boolean("active", "", "", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); }