diff options
-rw-r--r-- | src/idoscalemenuitem.c | 128 |
1 files changed, 33 insertions, 95 deletions
diff --git a/src/idoscalemenuitem.c b/src/idoscalemenuitem.c index 51e41b3..8fec7df 100644 --- a/src/idoscalemenuitem.c +++ b/src/idoscalemenuitem.c @@ -72,9 +72,6 @@ struct _IdoScaleMenuItemPrivate { GtkWidget *primary_label; GtkWidget *secondary_label; GtkWidget *hbox; - GtkAllocation child_allocation; - gdouble left_padding; - gdouble right_padding; gboolean reverse_scroll; gboolean grabbed; IdoScaleMenuItemStyle style; @@ -138,72 +135,6 @@ ido_scale_menu_item_scroll_event (GtkWidget *menuitem, } static void -ido_scale_menu_item_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - IdoScaleMenuItemPrivate *priv = GET_PRIVATE (widget); - GtkRequisition primary_req; - GtkRequisition secondary_req; - gint horizontal_padding; - gint primary_padding, secondary_padding; - - GTK_WIDGET_CLASS (ido_scale_menu_item_parent_class)->size_allocate (widget, allocation); - - switch (priv->style) - { - case IDO_SCALE_MENU_ITEM_STYLE_IMAGE: - gtk_widget_get_preferred_size (priv->primary_image, &primary_req, NULL); - gtk_widget_get_preferred_size (priv->secondary_image, &secondary_req, NULL); - primary_padding = gtk_widget_get_visible (priv->primary_image) ? primary_req.width : 0; - secondary_padding = gtk_widget_get_visible (priv->secondary_image) ? secondary_req.width : 0; - break; - - case IDO_SCALE_MENU_ITEM_STYLE_LABEL: - gtk_widget_get_preferred_size (priv->primary_label, &primary_req, NULL); - gtk_widget_get_preferred_size (priv->secondary_label, &secondary_req, NULL); - primary_padding = gtk_widget_get_visible (priv->primary_label) ? primary_req.width : 0; - secondary_padding = gtk_widget_get_visible (priv->secondary_label) ? secondary_req.width : 0; - break; - - default: - primary_req.width = primary_req.height = 0; - secondary_req.width = secondary_req.height = 0; - primary_padding = 0; - secondary_padding = 0; - break; - } - - gtk_widget_style_get (widget, - "horizontal-padding", &horizontal_padding, - NULL); - - priv->left_padding = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ? primary_padding : secondary_padding; - - if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) - { - priv->left_padding = primary_padding; - priv->right_padding = secondary_padding; - } - else - { - priv->left_padding = secondary_padding; - priv->right_padding = primary_padding; - } - - priv->child_allocation.x = gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->xthickness; - priv->child_allocation.y = gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->ythickness; - - priv->child_allocation.x += horizontal_padding; - priv->child_allocation.x += priv->toggle_size; - - priv->child_allocation.width = MAX (1, (gint)allocation->width - priv->child_allocation.x * 2); - priv->child_allocation.width -= (primary_padding + secondary_padding); - priv->child_allocation.height = MAX (1, (gint)allocation->height - priv->child_allocation.y * 2); - - gtk_widget_set_size_request (priv->scale, priv->child_allocation.width, -1); -} - -static void ido_scale_menu_item_toggle_size_allocate (IdoScaleMenuItem *item, gint toggle_size, gpointer user_data) @@ -292,7 +223,6 @@ ido_scale_menu_item_class_init (IdoScaleMenuItemClass *item_class) widget_class->button_release_event = ido_scale_menu_item_button_release_event; widget_class->motion_notify_event = ido_scale_menu_item_motion_notify_event; widget_class->scroll_event = ido_scale_menu_item_scroll_event; - widget_class->size_allocate = ido_scale_menu_item_size_allocate; widget_class->parent_set = ido_scale_menu_item_parent_set; gobject_class->constructed = ido_scale_menu_item_constructed; @@ -523,13 +453,17 @@ ido_scale_menu_item_get_property (GObject *object, } static void -translate_event_coordinates (GtkWidget *widget, - gdouble in_x, - gdouble *out_x) +ido_scale_menu_item_get_scale_allocation (IdoScaleMenuItem *menuitem, + GtkAllocation *allocation) { - IdoScaleMenuItemPrivate *priv = GET_PRIVATE (widget); + IdoScaleMenuItemPrivate *priv = GET_PRIVATE (menuitem); + GtkAllocation parent_allocation; + + gtk_widget_get_allocation (GTK_WIDGET (menuitem), &parent_allocation); + gtk_widget_get_allocation (priv->scale, allocation); - *out_x = in_x - priv->child_allocation.x - priv->left_padding; + allocation->x -= parent_allocation.x; + allocation->y -= parent_allocation.y; } static gboolean @@ -586,15 +520,17 @@ ido_scale_menu_item_button_press_event (GtkWidget *menuitem, GdkEventButton *event) { IdoScaleMenuItemPrivate *priv = GET_PRIVATE (menuitem); - gdouble x; - + GtkAllocation alloc; + + ido_scale_menu_item_get_scale_allocation (IDO_SCALE_MENU_ITEM (menuitem), &alloc); + // can we block emissions of "grab-notify" on parent?? - translate_event_coordinates (menuitem, event->x, &x); - event->x = x; + event->x -= alloc.x; + event->y -= alloc.y; - translate_event_coordinates (menuitem, event->x_root, &x); - event->x_root = x; + event->x_root -= alloc.x; + event->y_root -= alloc.y; gtk_widget_event (priv->scale, ((GdkEvent *)(void*)(event))); @@ -615,11 +551,12 @@ ido_scale_menu_item_button_release_event (GtkWidget *menuitem, IdoScaleMenuItem *item = IDO_SCALE_MENU_ITEM (menuitem); IdoScaleMenuItemPrivate *priv = GET_PRIVATE (menuitem); GtkWidget *scale = priv->scale; - gdouble x; + GtkAllocation alloc; + + ido_scale_menu_item_get_scale_allocation (IDO_SCALE_MENU_ITEM (menuitem), &alloc); /* if user clicked to the left of the scale... */ - if (event->x > priv->child_allocation.x && - event->x < priv->child_allocation.x + priv->left_padding) + if (event->x < alloc.x) { if (gtk_widget_get_direction (menuitem) == GTK_TEXT_DIR_LTR) { @@ -632,8 +569,7 @@ ido_scale_menu_item_button_release_event (GtkWidget *menuitem, } /* if user clicked to the right of the scale... */ - else if (event->x < priv->child_allocation.x + priv->child_allocation.width + priv->right_padding + priv->left_padding && - event->x > priv->child_allocation.x + priv->child_allocation.width + priv->left_padding) + else if (event->x > alloc.x + alloc.width) { if (gtk_widget_get_direction (menuitem) == GTK_TEXT_DIR_LTR) { @@ -648,11 +584,11 @@ ido_scale_menu_item_button_release_event (GtkWidget *menuitem, /* user clicked on the scale... */ else { - translate_event_coordinates (menuitem, event->x, &x); - event->x = x; + event->x -= alloc.x; + event->y -= alloc.y; - translate_event_coordinates (menuitem, event->x_root, &x); - event->x_root= x; + event->x_root -= alloc.x; + event->y_root -= alloc.y; gtk_widget_event (scale, (GdkEvent*)event); } @@ -672,13 +608,15 @@ ido_scale_menu_item_motion_notify_event (GtkWidget *menuitem, { IdoScaleMenuItemPrivate *priv = GET_PRIVATE (menuitem); GtkWidget *scale = priv->scale; - gdouble x; + GtkAllocation alloc; + + ido_scale_menu_item_get_scale_allocation (IDO_SCALE_MENU_ITEM (menuitem), &alloc); - translate_event_coordinates (menuitem, event->x, &x); - event->x = x; + event->x -= alloc.x; + event->y -= alloc.y; - translate_event_coordinates (menuitem, event->x_root, &x); - event->x_root= x; + event->x_root -= alloc.x; + event->y_root -= alloc.y; gtk_widget_event (scale, ((GdkEvent *)(void*)(event))); |