Fix LdCategorySymbolView size negotiation

In GTK+ 3 I don't need the negotiation hack anymore.
This commit is contained in:
Přemysl Eric Janouch 2015-01-19 04:00:33 +01:00
parent 5c17944454
commit 616650c558
1 changed files with 71 additions and 49 deletions

View File

@ -47,7 +47,6 @@ SymbolData;
* @path: path to the category within the library. * @path: path to the category within the library.
* @layout: (element-type SymbolData *): current layout of symbols. * @layout: (element-type SymbolData *): current layout of symbols.
* @preselected: currently preselected symbol. * @preselected: currently preselected symbol.
* @height_negotiation: whether we are negotiating height right now.
*/ */
struct _LdCategorySymbolViewPrivate struct _LdCategorySymbolViewPrivate
{ {
@ -55,7 +54,6 @@ struct _LdCategorySymbolViewPrivate
gchar *path; gchar *path;
GSList *layout; GSList *layout;
SymbolData *preselected; SymbolData *preselected;
guint height_negotiation : 1;
}; };
enum enum
@ -70,6 +68,19 @@ static void ld_category_symbol_view_set_property (GObject *object,
guint property_id, const GValue *value, GParamSpec *pspec); guint property_id, const GValue *value, GParamSpec *pspec);
static void ld_category_symbol_view_finalize (GObject *gobject); static void ld_category_symbol_view_finalize (GObject *gobject);
static void on_size_allocate (GtkWidget *widget, GdkRectangle *allocation);
static gboolean on_draw (GtkWidget *widget, cairo_t *cr);
static GtkSizeRequestMode on_get_request_mode (GtkWidget *widget);
static void on_get_preferred_height (GtkWidget *widget,
gint *minimum_height, gint *natural_height);
static void on_get_preferred_width_for_height (GtkWidget *widget,
gint height, gint *minimum_width, gint *natural_width);
static void on_get_preferred_width (GtkWidget *widget,
gint *minimum_width, gint *natural_width);
static void on_get_preferred_height_for_width (GtkWidget *widget,
gint width, gint *minimum_height, gint *natural_height);
static void ld_category_symbol_view_set_category static void ld_category_symbol_view_set_category
(LdCategoryView *iface, LdCategory *category); (LdCategoryView *iface, LdCategory *category);
static LdCategory *ld_category_symbol_view_get_category static LdCategory *ld_category_symbol_view_get_category
@ -85,18 +96,29 @@ ld_category_view_init (LdCategoryViewInterface *iface)
G_DEFINE_TYPE_WITH_CODE (LdCategorySymbolView, G_DEFINE_TYPE_WITH_CODE (LdCategorySymbolView,
ld_category_symbol_view, GTK_TYPE_DRAWING_AREA, ld_category_symbol_view, GTK_TYPE_DRAWING_AREA,
G_IMPLEMENT_INTERFACE (LD_TYPE_CATEGORY_VIEW, ld_category_view_init)); G_IMPLEMENT_INTERFACE (LD_TYPE_CATEGORY_VIEW, ld_category_view_init))
static void static void
ld_category_symbol_view_class_init (LdCategorySymbolViewClass *klass) ld_category_symbol_view_class_init (LdCategorySymbolViewClass *klass)
{ {
GObjectClass *object_class; GObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = G_OBJECT_CLASS (klass); object_class = G_OBJECT_CLASS (klass);
object_class->get_property = ld_category_symbol_view_get_property; object_class->get_property = ld_category_symbol_view_get_property;
object_class->set_property = ld_category_symbol_view_set_property; object_class->set_property = ld_category_symbol_view_set_property;
object_class->finalize = ld_category_symbol_view_finalize; object_class->finalize = ld_category_symbol_view_finalize;
widget_class = GTK_WIDGET_CLASS (klass);
widget_class->draw = on_draw;
widget_class->get_request_mode = on_get_request_mode;
widget_class->get_preferred_width = on_get_preferred_width;
widget_class->get_preferred_width_for_height
= on_get_preferred_width_for_height;
widget_class->get_preferred_height = on_get_preferred_height;
widget_class->get_preferred_height_for_width
= on_get_preferred_height_for_width;
g_object_class_override_property (object_class, PROP_CATEGORY, "category"); g_object_class_override_property (object_class, PROP_CATEGORY, "category");
g_type_class_add_private (klass, sizeof (LdCategorySymbolViewPrivate)); g_type_class_add_private (klass, sizeof (LdCategorySymbolViewPrivate));
@ -260,57 +282,61 @@ layout_for_width (LdCategorySymbolView *self, gint width)
return ctx.total_height; return ctx.total_height;
} }
static void static GtkSizeRequestMode
on_size_request (GtkWidget *widget, GtkRequisition *requisition, on_get_request_mode (GtkWidget *widget)
gpointer user_data)
{ {
LdCategorySymbolView *self; return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
}
self = LD_CATEGORY_SYMBOL_VIEW (widget);
static void
on_get_preferred_height (GtkWidget *widget,
gint *minimum_height, gint *natural_height)
{
LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
if (!self->priv->category if (!self->priv->category
|| !ld_category_get_symbols (self->priv->category)) || !ld_category_get_symbols (self->priv->category))
{ *minimum_height = *natural_height = 0;
requisition->width = 0;
requisition->height = 0;
return;
}
requisition->width = SYMBOL_WIDTH + 2 * SYMBOL_SPACING;
if (self->priv->height_negotiation)
{
GtkAllocation alloc;
gtk_widget_get_allocation (widget, &alloc);
requisition->height = layout_for_width (self, alloc.width);
}
else else
requisition->height = SYMBOL_HEIGHT + 2 * SYMBOL_SPACING; *minimum_height = *natural_height = SYMBOL_HEIGHT + 2 * SYMBOL_SPACING;
} }
static void static void
on_size_allocate (GtkWidget *widget, GdkRectangle *allocation, on_get_preferred_width_for_height (GtkWidget *widget,
gpointer user_data) gint height, gint *minimum_width, gint *natural_width)
{ {
LdCategorySymbolView *self; // TODO: compute it the other way around
on_get_preferred_width (widget, minimum_width, natural_width);
self = LD_CATEGORY_SYMBOL_VIEW (widget);
if (self->priv->height_negotiation)
{
gtk_widget_queue_draw (widget);
self->priv->height_negotiation = FALSE;
} }
static void
on_get_preferred_width (GtkWidget *widget,
gint *minimum_width, gint *natural_width)
{
LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
if (!self->priv->category
|| !ld_category_get_symbols (self->priv->category))
*minimum_width = *natural_width = 0;
else else
{ *minimum_width = *natural_width = SYMBOL_WIDTH + 2 * SYMBOL_SPACING;
self->priv->height_negotiation = TRUE;
gtk_widget_queue_resize (widget);
} }
static void
on_get_preferred_height_for_width (GtkWidget *widget,
gint width, gint *minimum_height, gint *natural_height)
{
LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
*minimum_height = *natural_height = layout_for_width (self, width);
}
static void
on_size_allocate (GtkWidget *widget, GdkRectangle *allocation)
{
LdCategorySymbolView *self = LD_CATEGORY_SYMBOL_VIEW (widget);
layout_for_width (self, allocation->width);
} }
static gboolean static gboolean
on_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) on_draw (GtkWidget *widget, cairo_t *cr)
{ {
LdCategorySymbolView *self; LdCategorySymbolView *self;
GSList *iter; GSList *iter;
@ -450,10 +476,6 @@ ld_category_symbol_view_init (LdCategorySymbolView *self)
g_signal_connect (self, "size-allocate", g_signal_connect (self, "size-allocate",
G_CALLBACK (on_size_allocate), NULL); G_CALLBACK (on_size_allocate), NULL);
g_signal_connect (self, "size-request",
G_CALLBACK (on_size_request), NULL);
g_signal_connect (self, "draw",
G_CALLBACK (on_draw), NULL);
g_signal_connect (self, "motion-notify-event", g_signal_connect (self, "motion-notify-event",
G_CALLBACK (on_motion_notify), NULL); G_CALLBACK (on_motion_notify), NULL);