Learning_GTK4_tree/gtk/print/gtkpagethumbnail.c

159 lines
4.0 KiB
C

#include "config.h"
#include "gtkpagethumbnailprivate.h"
enum
{
PROP_PAGE_NUM = 1,
NUM_PROPERTIES,
};
static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
struct _GtkPageThumbnail
{
GtkWidget parent_instance;
GtkWidget *label;
int page_num;
};
struct _GtkPageThumbnailClass
{
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (GtkPageThumbnail, gtk_page_thumbnail, GTK_TYPE_WIDGET)
static void
gtk_page_thumbnail_init (GtkPageThumbnail *self)
{
self->label = gtk_inscription_new ("0");
gtk_widget_set_parent (self->label, GTK_WIDGET (self));
gtk_inscription_set_min_chars (GTK_INSCRIPTION (self->label), 1);
gtk_inscription_set_nat_chars (GTK_INSCRIPTION (self->label), 1);
}
static void
gtk_page_thumbnail_dispose (GObject *object)
{
GtkPageThumbnail *self = GTK_PAGE_THUMBNAIL (object);
g_clear_pointer (&self->label, gtk_widget_unparent);
G_OBJECT_CLASS (gtk_page_thumbnail_parent_class)->dispose (object);
}
static void
gtk_page_thumbnail_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkPageThumbnail *self = GTK_PAGE_THUMBNAIL (object);
switch (prop_id)
{
case PROP_PAGE_NUM:
gtk_page_thumbnail_set_page_num (self, g_value_get_int (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_page_thumbnail_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkPageThumbnail *self = GTK_PAGE_THUMBNAIL (object);
switch (prop_id)
{
case PROP_PAGE_NUM:
g_value_set_int (value, self->page_num);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_page_thumbnail_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline)
{
GtkPageThumbnail *self = GTK_PAGE_THUMBNAIL (widget);
GtkRequisition nat;
GtkAllocation alloc;
gtk_widget_get_preferred_size (self->label, NULL, &nat);
alloc.x = width - nat.width;
alloc.y = height - nat.height;
alloc.width = nat.width;
alloc.height = nat.height;
gtk_widget_size_allocate (self->label, &alloc, -1);
}
static void
gtk_page_thumbnail_class_init (GtkPageThumbnailClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = gtk_page_thumbnail_dispose;
object_class->set_property = gtk_page_thumbnail_set_property;
object_class->get_property = gtk_page_thumbnail_get_property;
widget_class->size_allocate = gtk_page_thumbnail_size_allocate;
properties[PROP_PAGE_NUM] =
g_param_spec_int ("page-num", NULL, NULL,
0, G_MAXINT, 0, G_PARAM_READWRITE);
g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
gtk_widget_class_set_css_name (widget_class, "page-thumbnail");
}
GtkPageThumbnail *
gtk_page_thumbnail_new (void)
{
return g_object_new (GTK_TYPE_PAGE_THUMBNAIL, NULL);
}
void
gtk_page_thumbnail_set_page_num (GtkPageThumbnail *self,
int page_num)
{
g_return_if_fail (GTK_IS_PAGE_THUMBNAIL (self));
g_return_if_fail (page_num >= 0);
char text[64];
if (self->page_num == page_num)
return;
self->page_num = page_num;
g_snprintf (text, sizeof (text), "%d", self->page_num);
gtk_inscription_set_text (GTK_INSCRIPTION (self->label), text);
gtk_widget_queue_draw (GTK_WIDGET (self));
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PAGE_NUM]);
}
int
gtk_page_thumbnail_get_page_num (GtkPageThumbnail *self)
{
g_return_val_if_fail (GTK_IS_PAGE_THUMBNAIL (self), 0);
return self->page_num;
}