Fix LdCategorySymbolView size negotiation
In GTK+ 3 I don't need the negotiation hack anymore.
This commit is contained in:
parent
5c17944454
commit
616650c558
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue