project: Adjust color rendering to use GdkPaintable

This commit is contained in:
Georges Basile Stavracas Neto
2022-02-11 09:18:38 -03:00
parent 760d74686d
commit 2139f40e67
8 changed files with 84 additions and 59 deletions
+3 -5
View File
@@ -220,9 +220,9 @@ get_result_metas_cb (GcalShellSearchProvider *self,
g_variant_builder_init (&abuilder, G_VARIANT_TYPE ("aa{sv}"));
for (i = 0; i < g_strv_length (results); i++)
{
g_autoptr (GdkPaintable) paintable = NULL;
g_autoptr (GVariant) icon_variant = NULL;
g_autoptr (GdkPixbuf) gicon = NULL;
cairo_surface_t *surface;
uuid = results[i];
event = g_hash_table_lookup (self->events, uuid);
@@ -231,8 +231,8 @@ get_result_metas_cb (GcalShellSearchProvider *self,
g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (uuid));
g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (gcal_event_get_summary (event)));
surface = get_circle_surface_from_color (gcal_event_get_color (event), 96);
gicon = gdk_pixbuf_get_from_surface (surface, 0, 0, 96, 96);
paintable = get_circle_paintable_from_color (gcal_event_get_color (event), 96);
gicon = paintable_to_pixbuf (paintable);
icon_variant = g_icon_serialize (G_ICON (gicon));
g_variant_builder_add (&builder, "{sv}", "icon", icon_variant);
@@ -246,8 +246,6 @@ get_result_metas_cb (GcalShellSearchProvider *self,
g_variant_builder_add (&builder, "{sv}", "description", g_variant_new_string (desc));
g_variant_builder_add_value (&abuilder, g_variant_builder_end (&builder));
g_clear_pointer (&surface, cairo_surface_destroy);
}
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &abuilder));
@@ -151,18 +151,18 @@ fill_sources_menu (GcalEventEditorDialog *self)
for (aux = list; aux != NULL; aux = aux->next)
{
g_autoptr (GdkPaintable) paintable = NULL;
g_autoptr (GMenuItem) item = NULL;
g_autoptr (GdkPixbuf) pix = NULL;
GcalCalendar *calendar;
const GdkRGBA *color;
cairo_surface_t *surface;
calendar = GCAL_CALENDAR (aux->data);
/* retrieve color */
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
pix = gdk_pixbuf_get_from_surface (surface, 0, 0, 16, 16);
paintable = get_circle_paintable_from_color (color, 16);
pix = paintable_to_pixbuf (paintable);
/* menu item */
item = g_menu_item_new (gcal_calendar_get_name (calendar), "select-calendar");
@@ -180,8 +180,6 @@ fill_sources_menu (GcalEventEditorDialog *self)
}
g_menu_append_item (self->sources_menu, item);
g_clear_pointer (&surface, cairo_surface_destroy);
}
gtk_popover_bind_model (GTK_POPOVER (self->sources_popover), G_MENU_MODEL (self->sources_menu), "edit");
@@ -243,19 +241,17 @@ on_calendar_selected_action_cb (GSimpleAction *action,
if (g_strcmp0 (gcal_calendar_get_id (calendar), uid) == 0)
{
cairo_surface_t *surface;
g_autoptr (GdkPaintable) paintable = NULL;
const GdkRGBA *color;
/* retrieve color */
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
gtk_image_set_from_surface (GTK_IMAGE (self->source_image), surface);
paintable = get_circle_paintable_from_color (color, 16);
gtk_image_set_from_paintable (GTK_IMAGE (self->source_image), paintable);
self->selected_calendar = calendar;
gtk_label_set_label (GTK_LABEL (self->subtitle_label), gcal_calendar_get_name (calendar));
g_clear_pointer (&surface, cairo_surface_destroy);
break;
}
}
@@ -597,10 +593,10 @@ gcal_event_editor_dialog_set_event (GcalEventEditorDialog *self,
GcalEvent *event,
gboolean new_event)
{
g_autoptr (GdkPaintable) paintable = NULL;
g_autoptr (GcalEvent) cloned_event = NULL;
GcalEventEditorFlags flags;
GcalCalendar *calendar;
cairo_surface_t *surface;
gint i;
GCAL_ENTRY;
@@ -625,9 +621,8 @@ gcal_event_editor_dialog_set_event (GcalEventEditorDialog *self,
fill_sources_menu (self);
/* dialog titlebar's title & subtitle */
surface = get_circle_surface_from_color (gcal_event_get_color (cloned_event), 10);
gtk_image_set_from_surface (GTK_IMAGE (self->source_image), surface);
g_clear_pointer (&surface, cairo_surface_destroy);
paintable = get_circle_paintable_from_color (gcal_event_get_color (cloned_event), 10);
gtk_image_set_from_paintable (GTK_IMAGE (self->source_image), paintable);
g_clear_pointer (&self->event_title_binding, g_binding_unbind);
self->event_title_binding = g_object_bind_property (cloned_event,
+3 -5
View File
@@ -59,9 +59,9 @@ static GParamSpec *properties [N_PROPS];
static GtkWidget*
make_calendar_row (GcalCalendar *calendar)
{
g_autoptr (GdkPaintable) paintable = NULL;
GtkWidget *label, *icon, *checkbox, *box, *row;
GtkStyleContext *context;
cairo_surface_t *surface;
const GdkRGBA *color;
row = gtk_list_box_row_new ();
@@ -78,8 +78,8 @@ make_calendar_row (GcalCalendar *calendar)
/* source color icon */
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
icon = gtk_image_new_from_surface (surface);
paintable = get_circle_paintable_from_color (color, 16);
icon = gtk_image_new_from_paintable (paintable);
gtk_style_context_add_class (gtk_widget_get_style_context (icon), "calendar-color-image");
@@ -106,8 +106,6 @@ make_calendar_row (GcalCalendar *calendar)
gtk_widget_show_all (row);
g_clear_pointer (&surface, cairo_surface_destroy);
return row;
}
+9 -14
View File
@@ -70,7 +70,7 @@ static GtkWidget*
create_calendar_row (GcalManager *manager,
GcalCalendar *calendar)
{
cairo_surface_t *surface;
g_autoptr (GdkPaintable) paintable = NULL;
const GdkRGBA *color;
GtkWidget *row, *box, *icon, *label, *selected_icon;
gboolean read_only;
@@ -85,8 +85,8 @@ create_calendar_row (GcalManager *manager,
/* The icon with the source color */
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
icon = gtk_image_new_from_surface (surface);
paintable = get_circle_paintable_from_color (color, 16);
icon = gtk_image_new_from_paintable (paintable);
gtk_container_add (GTK_CONTAINER (box), icon);
@@ -135,7 +135,6 @@ create_calendar_row (GcalManager *manager,
gtk_widget_show (box);
gtk_widget_show (row);
g_clear_pointer (&surface, cairo_surface_destroy);
g_free (parent_name);
g_free (tooltip);
@@ -176,7 +175,7 @@ static void
select_row (GcalQuickAddPopover *self,
GtkListBoxRow *row)
{
cairo_surface_t *surface;
g_autoptr (GdkPaintable) paintable = NULL;
const GdkRGBA *color;
GcalCalendar *calendar;
GtkWidget *icon;
@@ -200,8 +199,8 @@ select_row (GcalQuickAddPopover *self,
gtk_label_set_label (GTK_LABEL (self->calendar_name_label), gcal_calendar_get_name (calendar));
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
gtk_image_set_from_surface (GTK_IMAGE (self->color_image), surface);
paintable = get_circle_paintable_from_color (color, 16);
gtk_image_set_from_paintable (GTK_IMAGE (self->color_image), paintable);
/* Return to the events page */
gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "events");
@@ -209,8 +208,6 @@ select_row (GcalQuickAddPopover *self,
/* Focus back the event Entry */
if (gtk_widget_get_visible (GTK_WIDGET (self)))
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (self->summary_entry));
g_clear_pointer (&surface, cairo_surface_destroy);
}
static gint
@@ -536,7 +533,7 @@ on_calendar_changed (GcalManager *manager,
GcalCalendar *calendar,
GcalQuickAddPopover *self)
{
cairo_surface_t *surface;
g_autoptr (GdkPaintable) paintable = NULL;
const GdkRGBA *color;
GtkWidget *row, *color_icon, *name_label;
gboolean read_only;
@@ -567,10 +564,8 @@ on_calendar_changed (GcalManager *manager,
/* Setup the source color, in case it changed */
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
gtk_image_set_from_surface (GTK_IMAGE (color_icon), surface);
g_clear_pointer (&surface, cairo_surface_destroy);
paintable = get_circle_paintable_from_color (color, 16);
gtk_image_set_from_paintable (GTK_IMAGE (color_icon), paintable);
/* Also setup the row name, in case we just changed the source name */
gtk_label_set_text (GTK_LABEL (name_label), gcal_calendar_get_name (calendar));
+9 -15
View File
@@ -109,21 +109,21 @@ static GtkWidget*
create_calendar_row (GcalManager *manager,
GcalCalendar *calendar)
{
g_autoptr (GdkPaintable) paintable = NULL;
g_autofree gchar *parent_name = NULL;
cairo_surface_t *surface;
const GdkRGBA *color;
GtkWidget *icon;
GtkWidget *row;
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
paintable = get_circle_paintable_from_color (color, 16);
get_source_parent_name_color (manager,
gcal_calendar_get_source (calendar),
&parent_name,
NULL);
/* The icon with the source color */
icon = gtk_image_new_from_surface (surface);
icon = gtk_image_new_from_paintable (paintable);
gtk_style_context_add_class (gtk_widget_get_style_context (icon), "calendar-color-image");
gtk_widget_show (icon);
@@ -141,8 +141,6 @@ create_calendar_row (GcalManager *manager,
g_object_set_data_full (G_OBJECT (row), "calendar", g_object_ref (calendar), g_object_unref);
g_object_set_data (G_OBJECT (row), "color-icon", icon);
g_clear_pointer (&surface, cairo_surface_destroy);
return row;
}
@@ -175,7 +173,7 @@ static void
select_row (GcalImportDialog *self,
GtkListBoxRow *row)
{
cairo_surface_t *surface;
g_autoptr (GdkPaintable) paintable = NULL;
const GdkRGBA *color;
GcalCalendar *calendar;
@@ -187,10 +185,8 @@ select_row (GcalImportDialog *self,
gtk_label_set_label (self->calendar_name_label, gcal_calendar_get_name (calendar));
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
gtk_image_set_from_surface (self->calendar_color_image, surface);
g_clear_pointer (&surface, cairo_surface_destroy);
paintable = get_circle_paintable_from_color (color, 16);
gtk_image_set_from_paintable (self->calendar_color_image, paintable);
}
static void
@@ -449,7 +445,7 @@ on_manager_calendar_changed_cb (GcalManager *manager,
GcalCalendar *calendar,
GcalImportDialog *self)
{
cairo_surface_t *surface;
g_autoptr (GdkPaintable) paintable = NULL;
const GdkRGBA *color;
GtkWidget *row, *color_icon;
gboolean read_only;
@@ -475,13 +471,11 @@ on_manager_calendar_changed_cb (GcalManager *manager,
/* Setup the source color, in case it changed */
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
paintable = get_circle_paintable_from_color (color, 16);
color_icon = g_object_get_data (G_OBJECT (row), "color-icon");
gtk_image_set_from_surface (GTK_IMAGE (color_icon), surface);
gtk_image_set_from_paintable (GTK_IMAGE (color_icon), paintable);
gtk_list_box_invalidate_sort (GTK_LIST_BOX (self->calendars_listbox));
g_clear_pointer (&surface, cairo_surface_destroy);
}
static void
+6 -6
View File
@@ -71,12 +71,12 @@ set_event (GcalSearchHitEvent *self,
* DzlSuggestion overrides
*/
static cairo_surface_t*
gcal_search_hit_event_get_icon_surface (DzlSuggestion *suggestion,
GtkWidget *widget)
static GdkPaintable*
gcal_search_hit_event_get_paintable (DzlSuggestion *suggestion,
GtkWidget *widget)
{
g_autoptr (GdkPaintable) paintable = NULL;
GcalSearchHitEvent *self;
cairo_surface_t *surface;
const GdkRGBA *color;
GcalCalendar *calendar;
@@ -84,12 +84,12 @@ gcal_search_hit_event_get_icon_surface (DzlSuggestion *suggestion,
calendar = gcal_event_get_calendar (self->event);
color = gcal_calendar_get_color (calendar);
surface = get_circle_surface_from_color (color, 16);
paintable = get_circle_paintable_from_color (color, 16);
/* Inject our custom style class into the given widget */
gtk_style_context_add_class (gtk_widget_get_style_context (widget), "calendar-color-image");
return surface;
return g_steal_pointer (&paintable);
}
+43
View File
@@ -182,6 +182,49 @@ get_circle_paintable_from_color (const GdkRGBA *color,
return gtk_snapshot_to_paintable (snapshot, &GRAPHENE_SIZE_INIT (size, size));
}
/**
* paintable_to_pixbuf:
* @color: a #GdkRGBA
* @size: the size of the surface
*
* Creates a circular surface filled with @color. The
* surface is always @size x @size.
*
* Returns: (transfer full): a #cairo_surface_t
*/
GdkPixbuf*
paintable_to_pixbuf (GdkPaintable *paintable)
{
g_autoptr (GtkSnapshot) snapshot = NULL;
g_autoptr (GskRenderNode) node = NULL;
g_autoptr (GskRenderer) renderer = NULL;
g_autoptr (GdkTexture) texture = NULL;
g_autoptr (GError) error = NULL;
graphene_rect_t viewport;
snapshot = gtk_snapshot_new ();
gdk_paintable_snapshot (paintable, snapshot,
gdk_paintable_get_intrinsic_width (paintable),
gdk_paintable_get_intrinsic_height (paintable));
node = gtk_snapshot_free_to_node (g_steal_pointer (&snapshot));
renderer = gsk_cairo_renderer_new ();
gsk_renderer_realize (renderer, NULL, &error);
if (error)
{
g_warning ("Couldn't realize Cairo renderer: %s", error->message);
return NULL;
}
viewport = GRAPHENE_RECT_INIT (0, 0,
gdk_paintable_get_intrinsic_width (paintable),
gdk_paintable_get_intrinsic_height (paintable));
texture = gsk_renderer_render_texture (renderer, node, &viewport);
gsk_renderer_unrealize (renderer);
return gdk_pixbuf_get_from_texture (texture);
}
/**
* get_color_name_from_source:
* @source: an #ESource
+2
View File
@@ -55,6 +55,8 @@ GdkPaintable* gcal_get_paintable_from_color (const GdkRGBA
GdkPaintable* get_circle_paintable_from_color (const GdkRGBA *color,
gint size);
GdkPixbuf* paintable_to_pixbuf (GdkPaintable *paintable);
void get_color_name_from_source (ESource *source,
GdkRGBA *out_color);