diff options
author | Christopher James Lahey <clahey@helixcode.com> | 2000-03-11 08:32:15 +0800 |
---|---|---|
committer | Chris Lahey <clahey@src.gnome.org> | 2000-03-11 08:32:15 +0800 |
commit | 0a908b7fe481dd3bf216021fd8e04489f5f2aa66 (patch) | |
tree | cd22b484c729a21684ef46b6c99483847c43dae2 /addressbook/gui | |
parent | 8c65f8861bd16321eeafac1d827d1fb4a557247c (diff) | |
download | gsoc2013-evolution-0a908b7fe481dd3bf216021fd8e04489f5f2aa66.tar gsoc2013-evolution-0a908b7fe481dd3bf216021fd8e04489f5f2aa66.tar.gz gsoc2013-evolution-0a908b7fe481dd3bf216021fd8e04489f5f2aa66.tar.bz2 gsoc2013-evolution-0a908b7fe481dd3bf216021fd8e04489f5f2aa66.tar.lz gsoc2013-evolution-0a908b7fe481dd3bf216021fd8e04489f5f2aa66.tar.xz gsoc2013-evolution-0a908b7fe481dd3bf216021fd8e04489f5f2aa66.tar.zst gsoc2013-evolution-0a908b7fe481dd3bf216021fd8e04489f5f2aa66.zip |
Designed a new system for doing hierarchical displays in the canvas. Adds
2000-03-10 Christopher James Lahey <clahey@helixcode.com>
* e-util/e-canvas.c, e-util/e-canvas.h: Designed a new system for
doing hierarchical displays in the canvas. Adds an extra idle
loop to the canvas system.
* widgets/e-minicard/e-minicard.c,
widgets/e-minicard/e-minicard-label.c,
widgets/e-minicard/e-minicard-label.h,
widgets/e-minicard/e-reflow.c, widgets/e-minicard/test-reflow.c,
widgets/e-text/e-text.c, widgets/e-text/e-text.h: Adapted to use
the new e-canvas reflow system.
svn path=/trunk/; revision=2096
Diffstat (limited to 'addressbook/gui')
-rw-r--r-- | addressbook/gui/minicard/e-minicard-label.c | 86 | ||||
-rw-r--r-- | addressbook/gui/minicard/e-minicard-label.h | 2 | ||||
-rw-r--r-- | addressbook/gui/minicard/e-minicard.c | 93 | ||||
-rw-r--r-- | addressbook/gui/minicard/e-reflow.c | 102 | ||||
-rw-r--r-- | addressbook/gui/minicard/test-reflow.c | 8 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard-label.c | 86 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard-label.h | 2 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard.c | 93 | ||||
-rw-r--r-- | addressbook/gui/widgets/test-reflow.c | 8 |
9 files changed, 150 insertions, 330 deletions
diff --git a/addressbook/gui/minicard/e-minicard-label.c b/addressbook/gui/minicard/e-minicard-label.c index 3f6a80a890..25f7f939fc 100644 --- a/addressbook/gui/minicard/e-minicard-label.c +++ b/addressbook/gui/minicard/e-minicard-label.c @@ -33,19 +33,12 @@ static void e_minicard_label_get_arg (GtkObject *object, GtkArg *arg, guint arg_ static gboolean e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event); static void e_minicard_label_realize (GnomeCanvasItem *item); static void e_minicard_label_unrealize (GnomeCanvasItem *item); +static void e_minicard_label_reflow(GnomeCanvasItem *item, int flags); -static void update_label( EMinicardLabel *minicard_label ); -static void resize( GtkObject *object, gpointer data ); +static void e_minicard_label_resize_children( EMinicardLabel *e_minicard_label ); static GnomeCanvasGroupClass *parent_class = NULL; -enum { - E_MINICARD_LABEL_RESIZE, - E_MINICARD_LABEL_LAST_SIGNAL -}; - -static guint e_minicard_label_signals[E_MINICARD_LABEL_LAST_SIGNAL] = { 0 }; - /* The arguments we take */ enum { ARG_0, @@ -92,17 +85,6 @@ e_minicard_label_class_init (EMinicardLabelClass *klass) parent_class = gtk_type_class (gnome_canvas_group_get_type ()); - e_minicard_label_signals[E_MINICARD_LABEL_RESIZE] = - gtk_signal_new ("resize", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardLabelClass, resize), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - - gtk_object_class_add_signals (object_class, e_minicard_label_signals, E_MINICARD_LABEL_LAST_SIGNAL); - gtk_object_add_arg_type ("EMinicardLabel::width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("EMinicardLabel::height", GTK_TYPE_DOUBLE, @@ -113,8 +95,6 @@ e_minicard_label_class_init (EMinicardLabelClass *klass) GTK_ARG_READWRITE, ARG_FIELD); gtk_object_add_arg_type ("EMinicardLabel::fieldname", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FIELDNAME); - - klass->resize = NULL; object_class->set_arg = e_minicard_label_set_arg; object_class->get_arg = e_minicard_label_get_arg; @@ -136,6 +116,8 @@ e_minicard_label_init (EMinicardLabel *minicard_label) minicard_label->field = NULL; minicard_label->fieldname_text = NULL; minicard_label->field_text = NULL; + + e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard_label), e_minicard_label_reflow); } static void @@ -150,8 +132,8 @@ e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_WIDTH: e_minicard_label->width = GTK_VALUE_DOUBLE (*arg); - update_label( e_minicard_label ); - gnome_canvas_item_request_update (item); + e_minicard_label_resize_children(e_minicard_label); + e_canvas_item_request_reflow (item); break; case ARG_HAS_FOCUS: if (e_minicard_label->field && (GTK_VALUE_ENUM(*arg) != E_FOCUS_NONE)) @@ -241,7 +223,6 @@ e_minicard_label_realize (GnomeCanvasItem *item) e_text_get_type(), "anchor", GTK_ANCHOR_NW, "clip_width", (double) ( e_minicard_label->width / 2 - 4 ), - "clip_height", (double) 1, "clip", TRUE, "use_ellipsis", TRUE, "font_gdk", font, @@ -255,17 +236,12 @@ e_minicard_label_realize (GnomeCanvasItem *item) NULL ); g_free( e_minicard_label->fieldname_text ); } - gtk_signal_connect(GTK_OBJECT(e_minicard_label->fieldname), - "resize", - GTK_SIGNAL_FUNC(resize), - (gpointer) e_minicard_label); e_minicard_label->field = gnome_canvas_item_new( group, e_text_get_type(), "anchor", GTK_ANCHOR_NW, "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ), - "clip_height", (double) 1, "clip", TRUE, "use_ellipsis", TRUE, "font_gdk", font, @@ -281,12 +257,7 @@ e_minicard_label_realize (GnomeCanvasItem *item) g_free( e_minicard_label->field_text ); } - gtk_signal_connect(GTK_OBJECT(e_minicard_label->field), - "resize", - GTK_SIGNAL_FUNC(resize), - (gpointer) e_minicard_label); - - update_label (e_minicard_label); + e_canvas_item_request_reflow(item); if (!item->canvas->aa) { @@ -344,10 +315,11 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) case GDK_MOTION_NOTIFY: case GDK_ENTER_NOTIFY: case GDK_LEAVE_NOTIFY: { + gboolean return_val; +#if 0 GnomeCanvasItem *field; ArtPoint p; double inv[6], affine[6]; - gboolean return_val; field = e_minicard_label->field; art_affine_identity (affine); @@ -389,7 +361,7 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) default: break; } - +#endif gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val); return return_val; break; @@ -405,8 +377,22 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) } static void -update_label( EMinicardLabel *e_minicard_label ) +e_minicard_label_resize_children(EMinicardLabel *e_minicard_label) { + if ( GTK_OBJECT_FLAGS( e_minicard_label ) & GNOME_CANVAS_ITEM_REALIZED ) { + gnome_canvas_item_set( e_minicard_label->fieldname, + "clip_width", (double) ( e_minicard_label->width / 2 - 4 ), + NULL ); + gnome_canvas_item_set( e_minicard_label->field, + "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ), + NULL ); + } +} + +static void +e_minicard_label_reflow(GnomeCanvasItem *item, int flags) +{ + EMinicardLabel *e_minicard_label = E_MINICARD_LABEL(item); if ( GTK_OBJECT_FLAGS( e_minicard_label ) & GNOME_CANVAS_ITEM_REALIZED ) { gint old_height; @@ -416,9 +402,6 @@ update_label( EMinicardLabel *e_minicard_label ) gtk_object_get(GTK_OBJECT(e_minicard_label->fieldname), "text_height", &text_height, NULL); - gnome_canvas_item_set(e_minicard_label->fieldname, - "clip_height", (double) text_height, - NULL); e_minicard_label->height = text_height; @@ -426,9 +409,6 @@ update_label( EMinicardLabel *e_minicard_label ) gtk_object_get(GTK_OBJECT(e_minicard_label->field), "text_height", &text_height, NULL); - gnome_canvas_item_set(e_minicard_label->field, - "clip_height", (double) text_height, - NULL); if (e_minicard_label->height < text_height) e_minicard_label->height = text_height; @@ -438,24 +418,10 @@ update_label( EMinicardLabel *e_minicard_label ) "x2", (double) e_minicard_label->width - 1, "y2", (double) e_minicard_label->height - 1, NULL ); - gnome_canvas_item_set( e_minicard_label->fieldname, - "clip_width", (double) ( e_minicard_label->width / 2 - 4 ), - NULL ); - gnome_canvas_item_set( e_minicard_label->field, - "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ), - NULL ); e_canvas_item_move_absolute(e_minicard_label->field, ( e_minicard_label->width / 2 + 2), 1); if (old_height != e_minicard_label->height) - gtk_signal_emit_by_name (GTK_OBJECT (e_minicard_label), "resize"); + e_canvas_item_request_parent_reflow(item); } } - - -static void -resize( GtkObject *object, gpointer data ) -{ - update_label(E_MINICARD_LABEL(data)); -} - diff --git a/addressbook/gui/minicard/e-minicard-label.h b/addressbook/gui/minicard/e-minicard-label.h index 3311e3c9af..b439c53f9d 100644 --- a/addressbook/gui/minicard/e-minicard-label.h +++ b/addressbook/gui/minicard/e-minicard-label.h @@ -69,8 +69,6 @@ struct _EMinicardLabel struct _EMinicardLabelClass { GnomeCanvasGroupClass parent_class; - - void (* resize) (EMinicardLabel *text); }; diff --git a/addressbook/gui/minicard/e-minicard.c b/addressbook/gui/minicard/e-minicard.c index b8d25f5dc6..79668b6507 100644 --- a/addressbook/gui/minicard/e-minicard.c +++ b/addressbook/gui/minicard/e-minicard.c @@ -34,19 +34,12 @@ static void e_minicard_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); static gboolean e_minicard_event (GnomeCanvasItem *item, GdkEvent *event); static void e_minicard_realize (GnomeCanvasItem *item); static void e_minicard_unrealize (GnomeCanvasItem *item); +static void e_minicard_reflow ( GnomeCanvasItem *item, int flags ); -static void _update_card ( EMinicard *minicard ); -static void _resize( GtkObject *object, gpointer data ); +static void e_minicard_resize_children( EMinicard *e_minicard ); static GnomeCanvasGroupClass *parent_class = NULL; -enum { - E_MINICARD_RESIZE, - E_MINICARD_LAST_SIGNAL -}; - -static guint e_minicard_signals[E_MINICARD_LAST_SIGNAL] = { 0 }; - /* The arguments we take */ enum { ARG_0, @@ -92,17 +85,6 @@ e_minicard_class_init (EMinicardClass *klass) parent_class = gtk_type_class (gnome_canvas_group_get_type ()); - e_minicard_signals[E_MINICARD_RESIZE] = - gtk_signal_new ("resize", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardClass, resize), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - - gtk_object_class_add_signals (object_class, e_minicard_signals, E_MINICARD_LAST_SIGNAL); - gtk_object_add_arg_type ("EMinicard::width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("EMinicard::height", GTK_TYPE_DOUBLE, @@ -131,6 +113,8 @@ e_minicard_init (EMinicard *minicard) minicard->width = 10; minicard->height = 10; minicard->has_focus = FALSE; + + e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard), e_minicard_reflow); } static void @@ -146,8 +130,8 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) case ARG_WIDTH: if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) { e_minicard->width = GTK_VALUE_DOUBLE (*arg); - _update_card(e_minicard); - gnome_canvas_item_request_update (item); + e_minicard_resize_children(e_minicard); + e_canvas_item_request_reflow(item); } break; case ARG_HAS_FOCUS: @@ -237,7 +221,7 @@ e_minicard_realize (GnomeCanvasItem *item) gnome_canvas_item_new( group, e_text_get_type(), "anchor", GTK_ANCHOR_NW, - "clip_width", (double) ( e_minicard->width - 12 ), + "width", (double) ( e_minicard->width - 12 ), "clip", TRUE, "use_ellipsis", TRUE, "font", "lucidasans-bold-10", @@ -246,10 +230,6 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_canvas_item_move_absolute(e_minicard->header_text, 6, 6); - gtk_signal_connect(GTK_OBJECT(e_minicard->header_text), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); if ( rand() % 2 ) { new_item = gnome_canvas_item_new( group, e_minicard_label_get_type(), @@ -259,11 +239,6 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_minicard->fields = g_list_append( e_minicard->fields, new_item); e_canvas_item_move_absolute(new_item, 2, e_minicard->height); - - gtk_signal_connect(GTK_OBJECT(new_item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); } if (rand() % 2) { @@ -275,11 +250,6 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_minicard->fields = g_list_append( e_minicard->fields, new_item); e_canvas_item_move_absolute(new_item, 2, e_minicard->height); - - gtk_signal_connect(GTK_OBJECT(new_item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); } if (rand() % 2) { @@ -291,13 +261,8 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_minicard->fields = g_list_append( e_minicard->fields, new_item); e_canvas_item_move_absolute(new_item, 2, e_minicard->height); - - gtk_signal_connect(GTK_OBJECT(new_item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); } - _update_card( e_minicard ); + e_canvas_item_request_reflow(item); if (!item->canvas->aa) { } @@ -402,8 +367,26 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) } static void -_update_card( EMinicard *e_minicard ) +e_minicard_resize_children( EMinicard *e_minicard ) +{ + if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED ) { + GList *list; + + gnome_canvas_item_set( e_minicard->header_text, + "width", (double) e_minicard->width - 12, + NULL ); + for ( list = e_minicard->fields; list; list = g_list_next( list ) ) { + gnome_canvas_item_set( GNOME_CANVAS_ITEM( list->data ), + "width", (double) e_minicard->width - 4.0, + NULL ); + } + } +} + +static void +e_minicard_reflow( GnomeCanvasItem *item, int flags ) { + EMinicard *e_minicard = E_MINICARD(item); if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED ) { GList *list; gdouble text_height; @@ -421,10 +404,6 @@ _update_card( EMinicard *e_minicard ) "y2", text_height + 9.0, NULL ); - gnome_canvas_item_set( e_minicard->header_text, - "clip_height", (double)text_height, - NULL ); - for(list = e_minicard->fields; list; list = g_list_next(list)) { gtk_object_get (GTK_OBJECT(list->data), "height", &text_height, @@ -445,22 +424,8 @@ _update_card( EMinicard *e_minicard ) gnome_canvas_item_set( e_minicard->header_rect, "x2", (double) e_minicard->width - 3.0, NULL ); - gnome_canvas_item_set( e_minicard->header_text, - "clip_width", (double) e_minicard->width - 12, - NULL ); - for ( list = e_minicard->fields; list; list = g_list_next( list ) ) { - gnome_canvas_item_set( GNOME_CANVAS_ITEM( list->data ), - "width", (double) e_minicard->width - 4.0, - NULL ); if (old_height != e_minicard->height) - gtk_signal_emit_by_name (GTK_OBJECT (e_minicard), "resize"); - } - } -} - -static void -_resize( GtkObject *object, gpointer data ) -{ - _update_card(E_MINICARD(data)); + e_canvas_item_request_parent_reflow(item); + } } diff --git a/addressbook/gui/minicard/e-reflow.c b/addressbook/gui/minicard/e-reflow.c index 984e972f0c..4af46bd4a4 100644 --- a/addressbook/gui/minicard/e-reflow.c +++ b/addressbook/gui/minicard/e-reflow.c @@ -24,6 +24,7 @@ #include <math.h> #include "e-reflow.h" #include "e-canvas-utils.h" +#include "e-canvas.h" #include "e-util.h" static void e_reflow_init (EReflow *card); static void e_reflow_class_init (EReflowClass *klass); @@ -36,10 +37,9 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height); static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags); static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); +static void e_reflow_reflow (GnomeCanvasItem *item, int flags); -static void _update_reflow ( EReflow *reflow ); -static void _resize( GtkObject *object, gpointer data ); -static void _queue_reflow(EReflow *e_reflow); +static void e_reflow_resize_children (GnomeCanvasItem *item); #define E_REFLOW_DIVIDER_WIDTH 2 #define E_REFLOW_BORDER_WIDTH 7 @@ -47,13 +47,6 @@ static void _queue_reflow(EReflow *e_reflow); static GnomeCanvasGroupClass *parent_class = NULL; -enum { - E_REFLOW_RESIZE, - E_REFLOW_LAST_SIGNAL -}; - -static guint e_reflow_signals[E_REFLOW_LAST_SIGNAL] = { 0 }; - /* The arguments we take */ enum { ARG_0, @@ -98,16 +91,6 @@ e_reflow_class_init (EReflowClass *klass) parent_class = gtk_type_class (gnome_canvas_group_get_type ()); - e_reflow_signals[E_REFLOW_RESIZE] = - gtk_signal_new ("resize", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EReflowClass, resize), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, e_reflow_signals, E_REFLOW_LAST_SIGNAL); - gtk_object_add_arg_type ("EReflow::minimum_width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_MINIMUM_WIDTH); gtk_object_add_arg_type ("EReflow::width", GTK_TYPE_DOUBLE, @@ -149,6 +132,8 @@ e_reflow_init (EReflow *reflow) reflow->default_cursor_shown = TRUE; reflow->arrow_cursor = NULL; reflow->default_cursor = NULL; + + e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(reflow), e_reflow_reflow); } static void @@ -163,11 +148,11 @@ e_reflow_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_HEIGHT: e_reflow->height = GTK_VALUE_DOUBLE (*arg); - _queue_reflow(e_reflow); + e_canvas_item_request_reflow(item); break; case ARG_MINIMUM_WIDTH: e_reflow->minimum_width = GTK_VALUE_DOUBLE (*arg); - _queue_reflow(e_reflow); + e_canvas_item_request_reflow(item); break; } } @@ -214,17 +199,13 @@ e_reflow_realize (GnomeCanvasItem *item) for(list = e_reflow->items; list; list = g_list_next(list)) { GnomeCanvasItem *item = GNOME_CANVAS_ITEM(list->data); - gtk_signal_connect(GTK_OBJECT(item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_reflow); gnome_canvas_item_set(item, "width", (double) e_reflow->column_width, NULL); } - _queue_reflow( e_reflow ); - + e_canvas_item_request_reflow(item); + adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2; adjustment->page_increment = adjustment->page_size - adjustment->step_increment; @@ -365,11 +346,11 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) adjustment->step_increment = (e_reflow->column_width + E_REFLOW_FULL_GUTTER) / 2; adjustment->page_increment = adjustment->page_size - adjustment->step_increment; gtk_adjustment_changed(adjustment); - _queue_reflow(e_reflow); - } else { - e_reflow->need_column_resize = TRUE; - gnome_canvas_item_request_update(item); + e_reflow_resize_children(item); + e_canvas_item_request_reflow(item); } + e_reflow->need_column_resize = TRUE; + gnome_canvas_item_request_update(item); gnome_canvas_item_ungrab (item, button->time); return TRUE; } @@ -452,14 +433,10 @@ e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item) { e_reflow->items = g_list_append(e_reflow->items, item); if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) { - gtk_signal_connect(GTK_OBJECT(item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_reflow); gnome_canvas_item_set(item, "width", (double) e_reflow->column_width, NULL); - _queue_reflow(e_reflow); + e_canvas_item_request_reflow(item); } } @@ -621,6 +598,21 @@ e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gin } } +static void +e_reflow_resize_children (GnomeCanvasItem *item) +{ + GList *list; + EReflow *e_reflow; + + e_reflow = E_REFLOW (item); + for ( list = e_reflow->items; list; list = list->next ) { + GnomeCanvasItem *child = GNOME_CANVAS_ITEM(list->data); + gnome_canvas_item_set(child, + "width", (double) e_reflow->column_width, + NULL); + } +} + static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, @@ -696,8 +688,9 @@ _reflow( EReflow *e_reflow ) } static void -_update_reflow( EReflow *e_reflow ) +e_reflow_reflow( GnomeCanvasItem *item, int flags ) { + EReflow *e_reflow = E_REFLOW(item); if ( GTK_OBJECT_FLAGS( e_reflow ) & GNOME_CANVAS_ITEM_REALIZED ) { gdouble old_width; @@ -719,9 +712,6 @@ _update_reflow( EReflow *e_reflow ) running_height = E_REFLOW_BORDER_WIDTH; list = e_reflow->items; - gtk_object_set (GTK_OBJECT(list->data), - "width", e_reflow->column_width, - NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); @@ -733,9 +723,6 @@ _update_reflow( EReflow *e_reflow ) list = g_list_next(list); for( ; list; list = g_list_next(list)) { - gtk_object_set (GTK_OBJECT(list->data), - "width", e_reflow->column_width, - NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); @@ -757,31 +744,6 @@ _update_reflow( EReflow *e_reflow ) if ( e_reflow->width < e_reflow->minimum_width ) e_reflow->width = e_reflow->minimum_width; if (old_width != e_reflow->width) - gtk_signal_emit_by_name (GTK_OBJECT (e_reflow), "resize"); + e_canvas_item_request_parent_reflow(item); } } - - -static gboolean -_idle_reflow(gpointer data) -{ - EReflow *e_reflow = E_REFLOW(data); - _update_reflow(e_reflow); - e_reflow->need_height_update = TRUE; - gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(e_reflow)); - e_reflow->idle = 0; - return FALSE; -} - -static void -_queue_reflow(EReflow *e_reflow) -{ - if (e_reflow->idle == 0) - e_reflow->idle = g_idle_add(_idle_reflow, e_reflow); -} - -static void -_resize( GtkObject *object, gpointer data ) -{ - _queue_reflow(E_REFLOW(data)); -} diff --git a/addressbook/gui/minicard/test-reflow.c b/addressbook/gui/minicard/test-reflow.c index 319a3f5626..8cedbaac28 100644 --- a/addressbook/gui/minicard/test-reflow.c +++ b/addressbook/gui/minicard/test-reflow.c @@ -55,14 +55,14 @@ static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpoi NULL ); } -static void resize(GnomeCanvasItem *item, gpointer data) +static void resize(GnomeCanvas *canvas, gpointer data) { double width; gtk_object_get(GTK_OBJECT(reflow), - "width", &width, + "width", &width, NULL); width = MAX(width, last_alloc.width); - gnome_canvas_set_scroll_region(item->canvas , 0, 0, width, last_alloc.height ); + gnome_canvas_set_scroll_region(canvas , 0, 0, width, last_alloc.height ); gnome_canvas_item_set( rect, "x2", (double) width, "y2", (double) last_alloc.height, @@ -121,7 +121,7 @@ int main( int argc, char *argv[] ) "height", (double) 100, "minimum_width", (double) 100, NULL ); - gtk_signal_connect( GTK_OBJECT( reflow ), "resize", + gtk_signal_connect( GTK_OBJECT( canvas ), "reflow", GTK_SIGNAL_FUNC( resize ), ( gpointer ) app); for ( i = 0; i < 200; i++ ) diff --git a/addressbook/gui/widgets/e-minicard-label.c b/addressbook/gui/widgets/e-minicard-label.c index 3f6a80a890..25f7f939fc 100644 --- a/addressbook/gui/widgets/e-minicard-label.c +++ b/addressbook/gui/widgets/e-minicard-label.c @@ -33,19 +33,12 @@ static void e_minicard_label_get_arg (GtkObject *object, GtkArg *arg, guint arg_ static gboolean e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event); static void e_minicard_label_realize (GnomeCanvasItem *item); static void e_minicard_label_unrealize (GnomeCanvasItem *item); +static void e_minicard_label_reflow(GnomeCanvasItem *item, int flags); -static void update_label( EMinicardLabel *minicard_label ); -static void resize( GtkObject *object, gpointer data ); +static void e_minicard_label_resize_children( EMinicardLabel *e_minicard_label ); static GnomeCanvasGroupClass *parent_class = NULL; -enum { - E_MINICARD_LABEL_RESIZE, - E_MINICARD_LABEL_LAST_SIGNAL -}; - -static guint e_minicard_label_signals[E_MINICARD_LABEL_LAST_SIGNAL] = { 0 }; - /* The arguments we take */ enum { ARG_0, @@ -92,17 +85,6 @@ e_minicard_label_class_init (EMinicardLabelClass *klass) parent_class = gtk_type_class (gnome_canvas_group_get_type ()); - e_minicard_label_signals[E_MINICARD_LABEL_RESIZE] = - gtk_signal_new ("resize", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardLabelClass, resize), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - - gtk_object_class_add_signals (object_class, e_minicard_label_signals, E_MINICARD_LABEL_LAST_SIGNAL); - gtk_object_add_arg_type ("EMinicardLabel::width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("EMinicardLabel::height", GTK_TYPE_DOUBLE, @@ -113,8 +95,6 @@ e_minicard_label_class_init (EMinicardLabelClass *klass) GTK_ARG_READWRITE, ARG_FIELD); gtk_object_add_arg_type ("EMinicardLabel::fieldname", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FIELDNAME); - - klass->resize = NULL; object_class->set_arg = e_minicard_label_set_arg; object_class->get_arg = e_minicard_label_get_arg; @@ -136,6 +116,8 @@ e_minicard_label_init (EMinicardLabel *minicard_label) minicard_label->field = NULL; minicard_label->fieldname_text = NULL; minicard_label->field_text = NULL; + + e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard_label), e_minicard_label_reflow); } static void @@ -150,8 +132,8 @@ e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_WIDTH: e_minicard_label->width = GTK_VALUE_DOUBLE (*arg); - update_label( e_minicard_label ); - gnome_canvas_item_request_update (item); + e_minicard_label_resize_children(e_minicard_label); + e_canvas_item_request_reflow (item); break; case ARG_HAS_FOCUS: if (e_minicard_label->field && (GTK_VALUE_ENUM(*arg) != E_FOCUS_NONE)) @@ -241,7 +223,6 @@ e_minicard_label_realize (GnomeCanvasItem *item) e_text_get_type(), "anchor", GTK_ANCHOR_NW, "clip_width", (double) ( e_minicard_label->width / 2 - 4 ), - "clip_height", (double) 1, "clip", TRUE, "use_ellipsis", TRUE, "font_gdk", font, @@ -255,17 +236,12 @@ e_minicard_label_realize (GnomeCanvasItem *item) NULL ); g_free( e_minicard_label->fieldname_text ); } - gtk_signal_connect(GTK_OBJECT(e_minicard_label->fieldname), - "resize", - GTK_SIGNAL_FUNC(resize), - (gpointer) e_minicard_label); e_minicard_label->field = gnome_canvas_item_new( group, e_text_get_type(), "anchor", GTK_ANCHOR_NW, "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ), - "clip_height", (double) 1, "clip", TRUE, "use_ellipsis", TRUE, "font_gdk", font, @@ -281,12 +257,7 @@ e_minicard_label_realize (GnomeCanvasItem *item) g_free( e_minicard_label->field_text ); } - gtk_signal_connect(GTK_OBJECT(e_minicard_label->field), - "resize", - GTK_SIGNAL_FUNC(resize), - (gpointer) e_minicard_label); - - update_label (e_minicard_label); + e_canvas_item_request_reflow(item); if (!item->canvas->aa) { @@ -344,10 +315,11 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) case GDK_MOTION_NOTIFY: case GDK_ENTER_NOTIFY: case GDK_LEAVE_NOTIFY: { + gboolean return_val; +#if 0 GnomeCanvasItem *field; ArtPoint p; double inv[6], affine[6]; - gboolean return_val; field = e_minicard_label->field; art_affine_identity (affine); @@ -389,7 +361,7 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) default: break; } - +#endif gtk_signal_emit_by_name(GTK_OBJECT(e_minicard_label->field), "event", event, &return_val); return return_val; break; @@ -405,8 +377,22 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) } static void -update_label( EMinicardLabel *e_minicard_label ) +e_minicard_label_resize_children(EMinicardLabel *e_minicard_label) { + if ( GTK_OBJECT_FLAGS( e_minicard_label ) & GNOME_CANVAS_ITEM_REALIZED ) { + gnome_canvas_item_set( e_minicard_label->fieldname, + "clip_width", (double) ( e_minicard_label->width / 2 - 4 ), + NULL ); + gnome_canvas_item_set( e_minicard_label->field, + "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ), + NULL ); + } +} + +static void +e_minicard_label_reflow(GnomeCanvasItem *item, int flags) +{ + EMinicardLabel *e_minicard_label = E_MINICARD_LABEL(item); if ( GTK_OBJECT_FLAGS( e_minicard_label ) & GNOME_CANVAS_ITEM_REALIZED ) { gint old_height; @@ -416,9 +402,6 @@ update_label( EMinicardLabel *e_minicard_label ) gtk_object_get(GTK_OBJECT(e_minicard_label->fieldname), "text_height", &text_height, NULL); - gnome_canvas_item_set(e_minicard_label->fieldname, - "clip_height", (double) text_height, - NULL); e_minicard_label->height = text_height; @@ -426,9 +409,6 @@ update_label( EMinicardLabel *e_minicard_label ) gtk_object_get(GTK_OBJECT(e_minicard_label->field), "text_height", &text_height, NULL); - gnome_canvas_item_set(e_minicard_label->field, - "clip_height", (double) text_height, - NULL); if (e_minicard_label->height < text_height) e_minicard_label->height = text_height; @@ -438,24 +418,10 @@ update_label( EMinicardLabel *e_minicard_label ) "x2", (double) e_minicard_label->width - 1, "y2", (double) e_minicard_label->height - 1, NULL ); - gnome_canvas_item_set( e_minicard_label->fieldname, - "clip_width", (double) ( e_minicard_label->width / 2 - 4 ), - NULL ); - gnome_canvas_item_set( e_minicard_label->field, - "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ), - NULL ); e_canvas_item_move_absolute(e_minicard_label->field, ( e_minicard_label->width / 2 + 2), 1); if (old_height != e_minicard_label->height) - gtk_signal_emit_by_name (GTK_OBJECT (e_minicard_label), "resize"); + e_canvas_item_request_parent_reflow(item); } } - - -static void -resize( GtkObject *object, gpointer data ) -{ - update_label(E_MINICARD_LABEL(data)); -} - diff --git a/addressbook/gui/widgets/e-minicard-label.h b/addressbook/gui/widgets/e-minicard-label.h index 3311e3c9af..b439c53f9d 100644 --- a/addressbook/gui/widgets/e-minicard-label.h +++ b/addressbook/gui/widgets/e-minicard-label.h @@ -69,8 +69,6 @@ struct _EMinicardLabel struct _EMinicardLabelClass { GnomeCanvasGroupClass parent_class; - - void (* resize) (EMinicardLabel *text); }; diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index b8d25f5dc6..79668b6507 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -34,19 +34,12 @@ static void e_minicard_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); static gboolean e_minicard_event (GnomeCanvasItem *item, GdkEvent *event); static void e_minicard_realize (GnomeCanvasItem *item); static void e_minicard_unrealize (GnomeCanvasItem *item); +static void e_minicard_reflow ( GnomeCanvasItem *item, int flags ); -static void _update_card ( EMinicard *minicard ); -static void _resize( GtkObject *object, gpointer data ); +static void e_minicard_resize_children( EMinicard *e_minicard ); static GnomeCanvasGroupClass *parent_class = NULL; -enum { - E_MINICARD_RESIZE, - E_MINICARD_LAST_SIGNAL -}; - -static guint e_minicard_signals[E_MINICARD_LAST_SIGNAL] = { 0 }; - /* The arguments we take */ enum { ARG_0, @@ -92,17 +85,6 @@ e_minicard_class_init (EMinicardClass *klass) parent_class = gtk_type_class (gnome_canvas_group_get_type ()); - e_minicard_signals[E_MINICARD_RESIZE] = - gtk_signal_new ("resize", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMinicardClass, resize), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - - gtk_object_class_add_signals (object_class, e_minicard_signals, E_MINICARD_LAST_SIGNAL); - gtk_object_add_arg_type ("EMinicard::width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("EMinicard::height", GTK_TYPE_DOUBLE, @@ -131,6 +113,8 @@ e_minicard_init (EMinicard *minicard) minicard->width = 10; minicard->height = 10; minicard->has_focus = FALSE; + + e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard), e_minicard_reflow); } static void @@ -146,8 +130,8 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) case ARG_WIDTH: if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) { e_minicard->width = GTK_VALUE_DOUBLE (*arg); - _update_card(e_minicard); - gnome_canvas_item_request_update (item); + e_minicard_resize_children(e_minicard); + e_canvas_item_request_reflow(item); } break; case ARG_HAS_FOCUS: @@ -237,7 +221,7 @@ e_minicard_realize (GnomeCanvasItem *item) gnome_canvas_item_new( group, e_text_get_type(), "anchor", GTK_ANCHOR_NW, - "clip_width", (double) ( e_minicard->width - 12 ), + "width", (double) ( e_minicard->width - 12 ), "clip", TRUE, "use_ellipsis", TRUE, "font", "lucidasans-bold-10", @@ -246,10 +230,6 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_canvas_item_move_absolute(e_minicard->header_text, 6, 6); - gtk_signal_connect(GTK_OBJECT(e_minicard->header_text), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); if ( rand() % 2 ) { new_item = gnome_canvas_item_new( group, e_minicard_label_get_type(), @@ -259,11 +239,6 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_minicard->fields = g_list_append( e_minicard->fields, new_item); e_canvas_item_move_absolute(new_item, 2, e_minicard->height); - - gtk_signal_connect(GTK_OBJECT(new_item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); } if (rand() % 2) { @@ -275,11 +250,6 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_minicard->fields = g_list_append( e_minicard->fields, new_item); e_canvas_item_move_absolute(new_item, 2, e_minicard->height); - - gtk_signal_connect(GTK_OBJECT(new_item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); } if (rand() % 2) { @@ -291,13 +261,8 @@ e_minicard_realize (GnomeCanvasItem *item) NULL ); e_minicard->fields = g_list_append( e_minicard->fields, new_item); e_canvas_item_move_absolute(new_item, 2, e_minicard->height); - - gtk_signal_connect(GTK_OBJECT(new_item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); } - _update_card( e_minicard ); + e_canvas_item_request_reflow(item); if (!item->canvas->aa) { } @@ -402,8 +367,26 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) } static void -_update_card( EMinicard *e_minicard ) +e_minicard_resize_children( EMinicard *e_minicard ) +{ + if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED ) { + GList *list; + + gnome_canvas_item_set( e_minicard->header_text, + "width", (double) e_minicard->width - 12, + NULL ); + for ( list = e_minicard->fields; list; list = g_list_next( list ) ) { + gnome_canvas_item_set( GNOME_CANVAS_ITEM( list->data ), + "width", (double) e_minicard->width - 4.0, + NULL ); + } + } +} + +static void +e_minicard_reflow( GnomeCanvasItem *item, int flags ) { + EMinicard *e_minicard = E_MINICARD(item); if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED ) { GList *list; gdouble text_height; @@ -421,10 +404,6 @@ _update_card( EMinicard *e_minicard ) "y2", text_height + 9.0, NULL ); - gnome_canvas_item_set( e_minicard->header_text, - "clip_height", (double)text_height, - NULL ); - for(list = e_minicard->fields; list; list = g_list_next(list)) { gtk_object_get (GTK_OBJECT(list->data), "height", &text_height, @@ -445,22 +424,8 @@ _update_card( EMinicard *e_minicard ) gnome_canvas_item_set( e_minicard->header_rect, "x2", (double) e_minicard->width - 3.0, NULL ); - gnome_canvas_item_set( e_minicard->header_text, - "clip_width", (double) e_minicard->width - 12, - NULL ); - for ( list = e_minicard->fields; list; list = g_list_next( list ) ) { - gnome_canvas_item_set( GNOME_CANVAS_ITEM( list->data ), - "width", (double) e_minicard->width - 4.0, - NULL ); if (old_height != e_minicard->height) - gtk_signal_emit_by_name (GTK_OBJECT (e_minicard), "resize"); - } - } -} - -static void -_resize( GtkObject *object, gpointer data ) -{ - _update_card(E_MINICARD(data)); + e_canvas_item_request_parent_reflow(item); + } } diff --git a/addressbook/gui/widgets/test-reflow.c b/addressbook/gui/widgets/test-reflow.c index 319a3f5626..8cedbaac28 100644 --- a/addressbook/gui/widgets/test-reflow.c +++ b/addressbook/gui/widgets/test-reflow.c @@ -55,14 +55,14 @@ static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpoi NULL ); } -static void resize(GnomeCanvasItem *item, gpointer data) +static void resize(GnomeCanvas *canvas, gpointer data) { double width; gtk_object_get(GTK_OBJECT(reflow), - "width", &width, + "width", &width, NULL); width = MAX(width, last_alloc.width); - gnome_canvas_set_scroll_region(item->canvas , 0, 0, width, last_alloc.height ); + gnome_canvas_set_scroll_region(canvas , 0, 0, width, last_alloc.height ); gnome_canvas_item_set( rect, "x2", (double) width, "y2", (double) last_alloc.height, @@ -121,7 +121,7 @@ int main( int argc, char *argv[] ) "height", (double) 100, "minimum_width", (double) 100, NULL ); - gtk_signal_connect( GTK_OBJECT( reflow ), "resize", + gtk_signal_connect( GTK_OBJECT( canvas ), "reflow", GTK_SIGNAL_FUNC( resize ), ( gpointer ) app); for ( i = 0; i < 200; i++ ) |