background: add remove button overlay to recent section

This commit is contained in:
Julian Sparber 2020-02-14 15:53:08 +01:00
parent 33c23eaef6
commit 2e1dc3da00
2 changed files with 51 additions and 17 deletions

View file

@ -68,8 +68,21 @@ emit_background_chosen (CcBackgroundChooser *self)
item = g_object_get_data (list->data, "item");
g_signal_emit (self, signals[BACKGROUND_CHOSEN], 0, item);
}
gtk_flow_box_unselect_all (flowbox);
static void
on_delete_background_clicked_cb (GtkButton *button,
BgRecentSource *source)
{
GtkWidget *parent;
CcBackgroundItem *item;
parent = gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (button)));
g_assert (GTK_IS_FLOW_BOX_CHILD (parent));
item = g_object_get_data (G_OBJECT (parent), "item");
bg_recent_source_remove_item (source, item);
}
static GtkWidget*
@ -82,6 +95,8 @@ create_widget_func (gpointer model_item,
GtkWidget *child;
GtkWidget *image;
GtkWidget *icon;
GtkWidget *button_image;
GtkWidget *button = NULL;
BgSource *source;
source = BG_SOURCE (user_data);
@ -104,9 +119,32 @@ create_widget_func (gpointer model_item,
NULL);
gtk_style_context_add_class (gtk_widget_get_style_context (icon), "slideshow-emblem");
if (BG_IS_RECENT_SOURCE (source))
{
button_image = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_BUTTON);
button = g_object_new (GTK_TYPE_BUTTON,
"image", button_image,
"halign", GTK_ALIGN_END,
"valign", GTK_ALIGN_START,
"margin", 6,
"visible", TRUE,
NULL);
gtk_style_context_add_class (gtk_widget_get_style_context (button), "osd");
gtk_style_context_add_class (gtk_widget_get_style_context (button), "remove-button");
g_signal_connect (button,
"clicked",
G_CALLBACK (on_delete_background_clicked_cb),
source);
}
overlay = gtk_overlay_new ();
gtk_container_add (GTK_CONTAINER (overlay), image);
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), icon);
if (button)
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), button);
gtk_widget_show (overlay);
child = g_object_new (GTK_TYPE_FLOW_BOX_CHILD,
@ -162,27 +200,16 @@ setup_flowbox (CcBackgroundChooser *self)
G_CONNECT_SWAPPED);
}
static void
on_delete_background_clicked_cb (GtkButton *button,
CcBackgroundChooser *self)
{
g_autoptr(GList) list = NULL;
CcBackgroundItem *item;
list = gtk_flow_box_get_selected_children (self->recent_flowbox);
g_assert (g_list_length (list) == 1);
item = g_object_get_data (list->data, "item");
bg_recent_source_remove_item (self->recent_source, item);
}
static void
on_item_activated_cb (GtkFlowBox *flowbox,
GtkFlowBoxChild *child,
CcBackgroundChooser *self)
{
self->recent_selected = flowbox == self->recent_flowbox;
if (self->recent_selected)
gtk_flow_box_unselect_all (self->flowbox);
else
gtk_flow_box_unselect_all (self->recent_flowbox);
emit_background_chosen (self);
}
@ -285,7 +312,6 @@ cc_background_chooser_class_init (CcBackgroundChooserClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcBackgroundChooser, recent_box);
gtk_widget_class_bind_template_child (widget_class, CcBackgroundChooser, recent_flowbox);
gtk_widget_class_bind_template_callback (widget_class, on_delete_background_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, on_item_activated_cb);
}

View file

@ -30,3 +30,11 @@ image.slideshow-icon {
color: white;
-gtk-icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.33);
}
button.remove-button {
border-radius: 9999px;
-gtk-outline-radius: 9999px;
padding: 1px 0px; /* circles instead of ellipses */
background-origin: padding-box, border-box;
background-clip: padding-box, border-box;
}