carousel: Make MctCarouselItem subclass GtkButton

And add a setter to its internal child.
This commit is contained in:
Georges Basile Stavracas Neto 2022-07-08 16:25:21 -03:00
parent e088443645
commit 0fca70768a
4 changed files with 20 additions and 12 deletions

View File

@ -30,12 +30,12 @@
#define ARROW_SIZE 20 #define ARROW_SIZE 20
struct _MctCarouselItem { struct _MctCarouselItem {
GtkRadioButton parent; GtkButton parent;
gint page; gint page;
}; };
G_DEFINE_TYPE (MctCarouselItem, mct_carousel_item, GTK_TYPE_RADIO_BUTTON) G_DEFINE_TYPE (MctCarouselItem, mct_carousel_item, GTK_TYPE_BUTTON)
GtkWidget * GtkWidget *
mct_carousel_item_new (void) mct_carousel_item_new (void)
@ -43,17 +43,24 @@ mct_carousel_item_new (void)
return g_object_new (MCT_TYPE_CAROUSEL_ITEM, NULL); return g_object_new (MCT_TYPE_CAROUSEL_ITEM, NULL);
} }
void
mct_carousel_item_set_child (MctCarouselItem *self,
GtkWidget *child)
{
g_return_if_fail (MCT_IS_CAROUSEL_ITEM (self));
gtk_button_set_child (GTK_BUTTON (self), child);
}
static void static void
mct_carousel_item_class_init (MctCarouselItemClass *klass) mct_carousel_item_class_init (MctCarouselItemClass *klass)
{ {
gtk_widget_class_set_css_name (GTK_WIDGET_CLASS (klass), "carousel-item");
} }
static void static void
mct_carousel_item_init (MctCarouselItem *self) mct_carousel_item_init (MctCarouselItem *self)
{ {
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (self), FALSE);
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self)),
"carousel-item");
} }
struct _MctCarousel { struct _MctCarousel {
@ -318,9 +325,7 @@ mct_carousel_add (GtkContainer *container,
self->children = g_list_append (self->children, widget); self->children = g_list_append (self->children, widget);
MCT_CAROUSEL_ITEM (widget)->page = get_last_page_number (self); MCT_CAROUSEL_ITEM (widget)->page = get_last_page_number (self);
if (self->selected_item != NULL) g_signal_connect (item, "clicked", G_CALLBACK (on_item_toggled), self);
gtk_radio_button_join_group (GTK_RADIO_BUTTON (widget), GTK_RADIO_BUTTON (self->selected_item));
g_signal_connect (widget, "button-press-event", G_CALLBACK (on_item_toggled), self);
last_box_is_full = ((g_list_length (self->children) - 1) % ITEMS_PER_PAGE == 0); last_box_is_full = ((g_list_length (self->children) - 1) % ITEMS_PER_PAGE == 0);
if (last_box_is_full) if (last_box_is_full)

View File

@ -22,7 +22,7 @@
margin-bottom: -2px; margin-bottom: -2px;
} }
.carousel-item { carousel-item {
background: transparent; background: transparent;
box-shadow: none; box-shadow: none;
border: none; border: none;

View File

@ -23,19 +23,22 @@
#pragma once #pragma once
#include <gtk/gtk.h> #include <adwaita.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define MCT_TYPE_CAROUSEL_ITEM (mct_carousel_item_get_type ()) #define MCT_TYPE_CAROUSEL_ITEM (mct_carousel_item_get_type ())
G_DECLARE_FINAL_TYPE (MctCarouselItem, mct_carousel_item, MCT, CAROUSEL_ITEM, GtkRadioButton) G_DECLARE_FINAL_TYPE (MctCarouselItem, mct_carousel_item, MCT, CAROUSEL_ITEM, GtkButton)
#define MCT_TYPE_CAROUSEL (mct_carousel_get_type ()) #define MCT_TYPE_CAROUSEL (mct_carousel_get_type ())
G_DECLARE_FINAL_TYPE (MctCarousel, mct_carousel, MCT, CAROUSEL, GtkRevealer) G_DECLARE_FINAL_TYPE (MctCarousel, mct_carousel, MCT, CAROUSEL, GtkRevealer)
GtkWidget *mct_carousel_item_new (void); GtkWidget *mct_carousel_item_new (void);
void mct_carousel_item_set_child (MctCarouselItem *self,
GtkWidget *child);
MctCarousel *mct_carousel_new (void); MctCarousel *mct_carousel_new (void);
void mct_carousel_purge_items (MctCarousel *self); void mct_carousel_purge_items (MctCarousel *self);

View File

@ -455,7 +455,7 @@ user_added_cb (ActUserManager *user_manager,
widget = create_carousel_entry (self, user); widget = create_carousel_entry (self, user);
item = mct_carousel_item_new (); item = mct_carousel_item_new ();
gtk_container_add (GTK_CONTAINER (item), widget); mct_carousel_item_set_child (MCT_CAROUSEL_ITEM (item), widget);
g_object_set_data (G_OBJECT (item), "uid", GINT_TO_POINTER (act_user_get_uid (user))); g_object_set_data (G_OBJECT (item), "uid", GINT_TO_POINTER (act_user_get_uid (user)));
gtk_container_add (GTK_CONTAINER (self->carousel), item); gtk_container_add (GTK_CONTAINER (self->carousel), item);