// 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));
}