libgimpwidgets: GimpCellRendererToggle now final.

This commit is contained in:
Jehan 2024-10-16 20:45:41 +02:00
parent 3728e37553
commit 03b88d8ac0
2 changed files with 62 additions and 88 deletions

View File

@ -59,14 +59,16 @@ enum
};
typedef struct _GimpCellRendererTogglePrivate
struct _GimpCellRendererToggle
{
gchar *icon_name;
gint icon_size;
gboolean override_background;
GtkCellRendererToggle parent_instance;
GdkPixbuf *pixbuf;
} GimpCellRendererTogglePrivate;
gchar *icon_name;
gint icon_size;
gboolean override_background;
GdkPixbuf *pixbuf;
};
static void gimp_cell_renderer_toggle_finalize (GObject *object);
@ -102,8 +104,7 @@ static void gimp_cell_renderer_toggle_create_pixbuf (GimpCellRendererToggle *tog
GtkWidget *widget);
G_DEFINE_TYPE_WITH_PRIVATE (GimpCellRendererToggle, gimp_cell_renderer_toggle,
GTK_TYPE_CELL_RENDERER_TOGGLE)
G_DEFINE_TYPE (GimpCellRendererToggle, gimp_cell_renderer_toggle, GTK_TYPE_CELL_RENDERER_TOGGLE)
#define parent_class gimp_cell_renderer_toggle_parent_class
@ -120,7 +121,7 @@ gimp_cell_renderer_toggle_class_init (GimpCellRendererToggleClass *klass)
g_signal_new ("clicked",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GimpCellRendererToggleClass, clicked),
0,
NULL, NULL,
_gimp_widgets_marshal_VOID__STRING_FLAGS,
G_TYPE_NONE, 2,
@ -169,11 +170,10 @@ gimp_cell_renderer_toggle_init (GimpCellRendererToggle *toggle)
static void
gimp_cell_renderer_toggle_finalize (GObject *object)
{
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
GimpCellRendererTogglePrivate *priv = gimp_cell_renderer_toggle_get_instance_private (toggle);
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
g_clear_pointer (&priv->icon_name, g_free);
g_clear_object (&priv->pixbuf);
g_clear_pointer (&toggle->icon_name, g_free);
g_clear_object (&toggle->pixbuf);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -184,21 +184,20 @@ gimp_cell_renderer_toggle_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
GimpCellRendererTogglePrivate *priv = gimp_cell_renderer_toggle_get_instance_private (toggle);
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
switch (param_id)
{
case PROP_ICON_NAME:
g_value_set_string (value, priv->icon_name);
g_value_set_string (value, toggle->icon_name);
break;
case PROP_ICON_SIZE:
g_value_set_int (value, priv->icon_size);
g_value_set_int (value, toggle->icon_size);
break;
case PROP_OVERRIDE_BACKGROUND:
g_value_set_boolean (value, priv->override_background);
g_value_set_boolean (value, toggle->override_background);
break;
default:
@ -213,23 +212,22 @@ gimp_cell_renderer_toggle_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
GimpCellRendererTogglePrivate *priv = gimp_cell_renderer_toggle_get_instance_private (toggle);
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
switch (param_id)
{
case PROP_ICON_NAME:
if (priv->icon_name)
g_free (priv->icon_name);
priv->icon_name = g_value_dup_string (value);
if (toggle->icon_name)
g_free (toggle->icon_name);
toggle->icon_name = g_value_dup_string (value);
break;
case PROP_ICON_SIZE:
priv->icon_size = g_value_get_int (value);
toggle->icon_size = g_value_get_int (value);
break;
case PROP_OVERRIDE_BACKGROUND:
priv->override_background = g_value_get_boolean (value);
toggle->override_background = g_value_get_boolean (value);
break;
default:
@ -237,7 +235,7 @@ gimp_cell_renderer_toggle_set_property (GObject *object,
break;
}
g_clear_object (&priv->pixbuf);
g_clear_object (&toggle->pixbuf);
}
static void
@ -249,23 +247,22 @@ gimp_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
gint *width,
gint *height)
{
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
GimpCellRendererTogglePrivate *priv = gimp_cell_renderer_toggle_get_instance_private (toggle);
GtkStyleContext *context = gtk_widget_get_style_context (widget);
GtkBorder border;
gint scale_factor;
gint calc_width;
gint calc_height;
gint pixbuf_width;
gint pixbuf_height;
gfloat xalign;
gfloat yalign;
gint xpad;
gint ypad;
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
GtkStyleContext *context = gtk_widget_get_style_context (widget);
GtkBorder border;
gint scale_factor;
gint calc_width;
gint calc_height;
gint pixbuf_width;
gint pixbuf_height;
gfloat xalign;
gfloat yalign;
gint xpad;
gint ypad;
scale_factor = gtk_widget_get_scale_factor (widget);
if (! priv->icon_name)
if (! toggle->icon_name)
{
GTK_CELL_RENDERER_CLASS (parent_class)->get_size (cell,
widget,
@ -280,11 +277,11 @@ gimp_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
gtk_cell_renderer_get_alignment (cell, &xalign, &yalign);
gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
if (! priv->pixbuf)
if (! toggle->pixbuf)
gimp_cell_renderer_toggle_create_pixbuf (toggle, widget);
pixbuf_width = gdk_pixbuf_get_width (priv->pixbuf);
pixbuf_height = gdk_pixbuf_get_height (priv->pixbuf);
pixbuf_width = gdk_pixbuf_get_width (toggle->pixbuf);
pixbuf_height = gdk_pixbuf_get_height (toggle->pixbuf);
/* The pixbuf size may be bigger than the logical size. */
calc_width = pixbuf_width / scale_factor + (gint) xpad * 2;
@ -330,19 +327,18 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer *cell,
const GdkRectangle *cell_area,
GtkCellRendererState flags)
{
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
GimpCellRendererTogglePrivate *priv = gimp_cell_renderer_toggle_get_instance_private (toggle);
GtkStyleContext *context = gtk_widget_get_style_context (widget);
GdkRectangle toggle_rect;
GtkStateFlags state;
gboolean active;
gint scale_factor;
gint xpad;
gint ypad;
GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
GtkStyleContext *context = gtk_widget_get_style_context (widget);
GdkRectangle toggle_rect;
GtkStateFlags state;
gboolean active;
gint scale_factor;
gint xpad;
gint ypad;
scale_factor = gtk_widget_get_scale_factor (widget);
if (! priv->icon_name)
if (! toggle->icon_name)
{
GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, cr, widget,
background_area,
@ -351,8 +347,7 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer *cell,
return;
}
if ((flags & GTK_CELL_RENDERER_SELECTED) &&
priv->override_background)
if ((flags & GTK_CELL_RENDERER_SELECTED) && toggle->override_background)
{
gboolean background_set;
@ -432,7 +427,7 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer *cell,
/* For high DPI displays, pixbuf size is bigger than logical size. */
cairo_scale (cr, (gdouble) 1.0 / scale_factor, (gdouble) 1.0 / scale_factor);
gdk_cairo_set_source_pixbuf (cr, priv->pixbuf,
gdk_cairo_set_source_pixbuf (cr, toggle->pixbuf,
toggle_rect.x, toggle_rect.y);
cairo_paint (cr);
@ -491,11 +486,9 @@ static void
gimp_cell_renderer_toggle_create_pixbuf (GimpCellRendererToggle *toggle,
GtkWidget *widget)
{
GimpCellRendererTogglePrivate *priv = gimp_cell_renderer_toggle_get_instance_private (toggle);
g_clear_object (&toggle->pixbuf);
g_clear_object (&priv->pixbuf);
if (priv->icon_name)
if (toggle->icon_name)
{
GdkPixbuf *pixbuf;
GdkScreen *screen;
@ -509,16 +502,16 @@ gimp_cell_renderer_toggle_create_pixbuf (GimpCellRendererToggle *toggle,
icon_theme = gtk_icon_theme_get_for_screen (screen);
/* Look for symbolic and fallback to color icon. */
icon_name = g_strdup_printf ("%s-symbolic", priv->icon_name);
icon_name = g_strdup_printf ("%s-symbolic", toggle->icon_name);
icon_info = gtk_icon_theme_lookup_icon_for_scale (icon_theme, icon_name,
priv->icon_size, scale_factor,
toggle->icon_size, scale_factor,
GTK_ICON_LOOKUP_GENERIC_FALLBACK);
g_free (icon_name);
if (! icon_info)
{
icon_info = gtk_icon_theme_lookup_icon_for_scale (icon_theme, "image-missing",
priv->icon_size, scale_factor,
toggle->icon_size, scale_factor,
GTK_ICON_LOOKUP_GENERIC_FALLBACK |
GTK_ICON_LOOKUP_USE_BUILTIN);
}
@ -528,7 +521,7 @@ gimp_cell_renderer_toggle_create_pixbuf (GimpCellRendererToggle *toggle,
pixbuf = gtk_icon_info_load_symbolic_for_context (icon_info,
gtk_widget_get_style_context (widget),
NULL, NULL);
priv->pixbuf = pixbuf;
toggle->pixbuf = pixbuf;
g_object_unref (icon_info);
}
}

View File

@ -30,33 +30,14 @@ G_BEGIN_DECLS
#define GIMP_TYPE_CELL_RENDERER_TOGGLE (gimp_cell_renderer_toggle_get_type ())
G_DECLARE_DERIVABLE_TYPE (GimpCellRendererToggle, gimp_cell_renderer_toggle, GIMP, CELL_RENDERER_TOGGLE, GtkCellRendererToggle)
struct _GimpCellRendererToggleClass
{
GtkCellRendererToggleClass parent_class;
void (* clicked) (GimpCellRendererToggle *cell,
const gchar *path,
GdkModifierType state);
/* Padding for future expansion */
void (* _gimp_reserved1) (void);
void (* _gimp_reserved2) (void);
void (* _gimp_reserved3) (void);
void (* _gimp_reserved4) (void);
void (* _gimp_reserved5) (void);
void (* _gimp_reserved6) (void);
void (* _gimp_reserved7) (void);
void (* _gimp_reserved8) (void);
};
G_DECLARE_FINAL_TYPE (GimpCellRendererToggle, gimp_cell_renderer_toggle, GIMP, CELL_RENDERER_TOGGLE, GtkCellRendererToggle)
GtkCellRenderer * gimp_cell_renderer_toggle_new (const gchar *icon_name);
GtkCellRenderer * gimp_cell_renderer_toggle_new (const gchar *icon_name);
void gimp_cell_renderer_toggle_clicked (GimpCellRendererToggle *cell,
const gchar *path,
GdkModifierType state);
void gimp_cell_renderer_toggle_clicked (GimpCellRendererToggle *cell,
const gchar *path,
GdkModifierType state);
G_END_DECLS