[glade/margins: 12/15] Added the avility to choose fill/center alignment using the scrollweel
- From: Juan Pablo Ugarte <jpu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glade/margins: 12/15] Added the avility to choose fill/center alignment using the scrollweel
- Date: Tue, 14 Jun 2011 19:17:32 +0000 (UTC)
commit 88054a1bcc670b35b1369c1c9cc48d1b8695ec2c
Author: Juan Pablo Ugarte <juanpablougarte gmail com>
Date: Tue May 31 22:31:40 2011 -0300
Added the avility to choose fill/center alignment using the scrollweel
gladeui/glade-design-layout.c | 234 ++++++++++++++++++++++++++++-------------
1 files changed, 160 insertions(+), 74 deletions(-)
---
diff --git a/gladeui/glade-design-layout.c b/gladeui/glade-design-layout.c
index 8d446f1..796b5fa 100644
--- a/gladeui/glade-design-layout.c
+++ b/gladeui/glade-design-layout.c
@@ -98,6 +98,7 @@ struct _GladeDesignLayoutPrivate
GtkAlign valign, halign;
Margins current_align_node;
gint align_dash_start;
+ gboolean vedit, hedit;
/* state machine */
Activity activity; /* the current activity */
@@ -308,40 +309,34 @@ update_align_control_rectangle (GtkWidget *widget,
priv->current_align_node = 0;
priv->align_control.x = priv->child_offset - OUTLINE_WIDTH;
priv->align_control.y = priv->child_offset - OUTLINE_WIDTH;
- priv->align_control.width = OUTLINE_WIDTH*2;
- priv->align_control.height = OUTLINE_WIDTH*2;
+ priv->align_control.width = 9;
+ priv->align_control.height = 9;
- switch (halign)
+ if (halign == GTK_ALIGN_START)
{
- case GTK_ALIGN_START:
- priv->align_control.x += alloc.x - left;
- priv->current_align_node |= MARGIN_LEFT;
- break;
- case GTK_ALIGN_END:
- priv->align_control.x += alloc.x + alloc.width + right;
- priv->current_align_node |= MARGIN_RIGHT;
- break;
- case GTK_ALIGN_FILL:
- case GTK_ALIGN_CENTER:
- priv->align_control.x += alloc.x + alloc.width/2;
- break;
+ priv->align_control.x += alloc.x - left;
+ priv->current_align_node |= MARGIN_LEFT;
}
+ else if (halign == GTK_ALIGN_END)
+ {
+ priv->align_control.x += alloc.x + alloc.width + right;
+ priv->current_align_node |= MARGIN_RIGHT;
+ }
+ else
+ priv->align_control.x += alloc.x + alloc.width/2;
- switch (valign)
+ if (valign == GTK_ALIGN_START)
{
- case GTK_ALIGN_START:
- priv->align_control.y += alloc.y - top;
- priv->current_align_node |= MARGIN_TOP;
- break;
- case GTK_ALIGN_END:
- priv->align_control.y += alloc.y + alloc.height + bottom;
- priv->current_align_node |= MARGIN_BOTTOM;
- break;
- case GTK_ALIGN_FILL:
- case GTK_ALIGN_CENTER:
- priv->align_control.y += alloc.y + alloc.height/2;
- break;
+ priv->align_control.y += alloc.y - top;
+ priv->current_align_node |= MARGIN_TOP;
+ }
+ else if (valign == GTK_ALIGN_END)
+ {
+ priv->align_control.y += alloc.y + alloc.height + bottom;
+ priv->current_align_node |= MARGIN_BOTTOM;
}
+ else
+ priv->align_control.y += alloc.y + alloc.height/2;
}
#define ALIGN_NODE_WIDTH 6
@@ -349,7 +344,10 @@ update_align_control_rectangle (GtkWidget *widget,
#define CHECK_X_AXIS_ALIGN(halign,x,alloc,left,right) if (ABS(x - (alloc.x - left)) < ALIGN_NODE_WIDTH) \
halign = GTK_ALIGN_START; \
else if (ABS(x - (alloc.x + alloc.width/2)) < ALIGN_NODE_WIDTH) \
- halign = GTK_ALIGN_FILL; \
+ { \
+ if (halign != GTK_ALIGN_FILL && halign != GTK_ALIGN_CENTER) \
+ halign = GTK_ALIGN_FILL; \
+ } \
else if (ABS(x - (alloc.x + alloc.width + right)) < ALIGN_NODE_WIDTH) \
halign = GTK_ALIGN_END; \
else return FALSE;
@@ -413,7 +411,8 @@ glade_design_layout_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev)
}
else if (ABS(y - (alloc.y + alloc.height/2)) < ALIGN_NODE_WIDTH)
{
- valign = GTK_ALIGN_FILL;
+ if (valign != GTK_ALIGN_FILL && valign != GTK_ALIGN_CENTER)
+ valign = GTK_ALIGN_FILL;
CHECK_X_AXIS_ALIGN (halign, x, alloc, left, right);
}
else if (ABS(y - (alloc.y + alloc.height + bottom)) < ALIGN_NODE_WIDTH)
@@ -581,6 +580,8 @@ gdl_margins_set_selection (GladeDesignLayoutPrivate *priv, GtkWidget *selection)
update_align_control_rectangle (selection, priv);
+ priv->hedit = priv->vedit = TRUE;
+
glade_project_set_pointer_mode (priv->project, GLADE_POINTER_MARGIN_MODE);
g_signal_connect (selection, "size-allocate",
@@ -658,22 +659,16 @@ on_edit_alignment_timeout (gpointer data)
static gboolean
glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev)
{
- GladeDesignLayoutPrivate *priv;
GtkWidget *child;
- gint x, y;
- if (ev->button != 1 ||
- (child = gtk_bin_get_child (GTK_BIN (widget))) == NULL)
+ if (ev->button != 1 || (child = gtk_bin_get_child (GTK_BIN (widget))) == NULL)
return FALSE;
- priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (widget);
-
- x = ev->x;
- y = ev->y;
-
if (ev->type == GDK_BUTTON_PRESS)
{
+ GladeDesignLayoutPrivate *priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (widget);
GtkAllocation child_allocation;
+ gint x = ev->x, y = ev->y;
priv->activity = gdl_get_activity_from_pointer (GLADE_DESIGN_LAYOUT (widget), x, y);
@@ -701,7 +696,7 @@ glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev)
break;
case ACTIVITY_EDIT_ALIGNMENT:
priv->align_dash_start = 0;
- g_timeout_add (100, on_edit_alignment_timeout, widget);
+ g_timeout_add (128, on_edit_alignment_timeout, widget);
gtk_widget_queue_draw (widget);
default:
gdl_set_cursor (priv, priv->cursors[priv->activity]);
@@ -726,6 +721,78 @@ glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev)
return FALSE;
}
+static void
+gdl_margins_alignment_save (GladeDesignLayoutPrivate *priv)
+{
+ GtkWidget *selection = priv->selection;
+ GladeWidget *gwidget = glade_widget_get_from_gobject (selection);
+ GladeProperty *property;
+ GtkAlign valign, halign;
+
+ glade_command_push_group (_("Editing alignments of %s"),
+ glade_widget_get_name (gwidget));
+
+ valign = gtk_widget_get_valign (selection);
+ halign = gtk_widget_get_halign (selection);
+
+ if (priv->valign != valign &&
+ (property = glade_widget_get_property (gwidget, "valign")))
+ glade_command_set_property (property, valign);
+
+ if (priv->halign != halign &&
+ (property = glade_widget_get_property (gwidget, "halign")))
+ glade_command_set_property (property, halign);
+
+ glade_command_pop_group ();
+}
+
+static gboolean
+glade_design_layout_scroll_event (GtkWidget *widget, GdkEventScroll *ev)
+{
+ GladeDesignLayout *layout = GLADE_DESIGN_LAYOUT (widget);
+ GladeDesignLayoutPrivate *priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (layout);
+
+ if (priv->selection &&
+ gdl_get_activity_from_pointer (layout, ev->x, ev->y) == ACTIVITY_EDIT_ALIGNMENT)
+ {
+ GtkWidget *selection = priv->selection;
+ GtkAlign halign, valign;
+
+ halign = gtk_widget_get_halign (selection);
+ valign = gtk_widget_get_valign (selection);
+
+ if (priv->current_align_node) priv->vedit = priv->hedit = TRUE;
+
+ if (priv->vedit)
+ {
+ if (valign == GTK_ALIGN_CENTER)
+ gtk_widget_set_valign (selection, GTK_ALIGN_FILL);
+ else if (valign == GTK_ALIGN_FILL)
+ gtk_widget_set_valign (selection, GTK_ALIGN_CENTER);
+ }
+
+ if (priv->hedit)
+ {
+ if (halign == GTK_ALIGN_CENTER)
+ gtk_widget_set_halign (selection, GTK_ALIGN_FILL);
+ else if (halign == GTK_ALIGN_FILL)
+ gtk_widget_set_halign (selection, GTK_ALIGN_CENTER);
+ }
+
+ if (!priv->current_align_node)
+ {
+ if (priv->vedit) priv->hedit = !priv->hedit;
+ else if (priv->hedit) priv->vedit = !priv->vedit;
+ }
+
+ gdl_margins_alignment_save (priv);
+
+ return TRUE;;
+ }
+
+ return FALSE;
+}
+
static gboolean
glade_design_layout_button_release_event (GtkWidget *widget,
GdkEventButton *ev)
@@ -777,29 +844,8 @@ glade_design_layout_button_release_event (GtkWidget *widget,
}
else if (priv->selection && priv->activity == ACTIVITY_EDIT_ALIGNMENT)
{
- GladeWidget *gwidget = glade_widget_get_from_gobject (priv->selection);
- GladeProperty *property;
- GtkAlign valign, halign;
-
- glade_command_push_group (_("Editing alignments of %s"),
- glade_widget_get_name (gwidget));
-
- valign = gtk_widget_get_valign (priv->selection);
- halign = gtk_widget_get_halign (priv->selection);
-
- if (priv->valign != valign)
- {
- if ((property = glade_widget_get_property (gwidget, "valign")))
- glade_command_set_property (property, valign);
- }
- if (priv->halign != halign)
- {
- if ((property = glade_widget_get_property (gwidget, "halign")))
- glade_command_set_property (property, halign);
- }
- glade_command_pop_group ();
-
- gtk_widget_queue_draw (widget);
+ gdl_margins_alignment_save (priv);
+ gtk_widget_queue_draw (priv->selection);
}
priv->activity = ACTIVITY_NONE;
@@ -1282,11 +1328,11 @@ draw_pixel_value (cairo_t *cr,
}
static void
-draw_stroke_lines (cairo_t *cr, GdkRGBA *bg, GdkRGBA *fg, gboolean remark)
+draw_stroke_lines (cairo_t *cr, GdkRGBA *bg, GdkRGBA *fg, gboolean remark, gdouble alpha)
{
if (remark)
{
- cairo_set_source_rgba (cr, bg->red, bg->green, bg->blue, .9);
+ cairo_set_source_rgba (cr, bg->red, bg->green, bg->blue, alpha);
cairo_set_line_width (cr, 3);
cairo_stroke_preserve (cr);
cairo_set_line_width (cr, 1);
@@ -1338,7 +1384,7 @@ draw_dimensions (cairo_t *cr,
draw_vguide (cr, x, yy, DIMENSION_OFFSET);
draw_vguide (cr, x + w, yy, DIMENSION_OFFSET);
- draw_stroke_lines (cr, bg, &color, top < DIMENSION_OFFSET+OUTLINE_WIDTH);
+ draw_stroke_lines (cr, bg, &color, top < DIMENSION_OFFSET+OUTLINE_WIDTH, .9);
/* Draw dimension line marks */
if (left) draw_hmark (cr, x - left, yy);
@@ -1346,7 +1392,7 @@ draw_dimensions (cairo_t *cr,
draw_hmark (cr, x + w, yy);
if (right) draw_hmark (cr, x + w + right, yy);
- draw_stroke_lines (cr, bg, fg, top < DIMENSION_OFFSET+OUTLINE_WIDTH);
+ draw_stroke_lines (cr, bg, fg, top < DIMENSION_OFFSET+OUTLINE_WIDTH, .9);
/* Draw pixel values */
draw_pixel_value (cr, bg, fg, x + w/2, yy, FALSE, h_clutter, w+1);
@@ -1369,7 +1415,7 @@ draw_dimensions (cairo_t *cr,
draw_hguide (cr, xx, y, DIMENSION_OFFSET);
draw_hguide (cr, xx, y + h, DIMENSION_OFFSET);
- draw_stroke_lines (cr, bg, &color, v_clutter);
+ draw_stroke_lines (cr, bg, &color, v_clutter, .9);
/* Draw marks */
if (top) draw_vmark (cr, xx, y - top);
@@ -1377,7 +1423,7 @@ draw_dimensions (cairo_t *cr,
draw_vmark (cr, xx, y + h);
if (bottom) draw_vmark (cr, xx, y + h + bottom);
- draw_stroke_lines (cr, bg, fg, v_clutter);
+ draw_stroke_lines (cr, bg, fg, v_clutter, .9);
/* Draw pixel values */
draw_pixel_value (cr,bg, fg, xx, y + h/2, TRUE, v_clutter, h+1);
@@ -1399,6 +1445,14 @@ draw_node (cairo_t *cr, gint x, gint y, GdkRGBA *c1, GdkRGBA *c2)
cairo_fill (cr);
}
+static void
+draw_arrow (cairo_t *cr, gint x, gint y, gint s1, gint s2, gint s3, gint s4)
+{
+ cairo_move_to (cr, x + s1, y + s2);
+ cairo_line_to (cr, x, y);
+ cairo_line_to (cr, x + s3, y + s4);
+}
+
static inline void
draw_selection_nodes (cairo_t *cr,
GladeDesignLayoutPrivate *priv,
@@ -1408,8 +1462,9 @@ draw_selection_nodes (cairo_t *cr,
gint top, bottom, left, right;
gint x1, x2, x3, y1, y2, y3;
GtkAllocation alloc, palloc;
+ GtkAlign halign, valign;
+ gint x, y, w, h, cx, cy;
GdkRGBA *c1, *c2, *fg;
- gint x, y, w, h;
Margins align;
gtk_widget_get_allocation (widget, &alloc);
@@ -1431,6 +1486,8 @@ draw_selection_nodes (cairo_t *cr,
left = gtk_widget_get_margin_left (widget);
right = gtk_widget_get_margin_right (widget);
+ halign = gtk_widget_get_halign (widget);
+ valign = gtk_widget_get_valign (widget);
align = priv->current_align_node;
/* Draw nodes */
@@ -1441,10 +1498,38 @@ draw_selection_nodes (cairo_t *cr,
y2 = y + h/2;
y3 = y + h + bottom;
+ cairo_translate (cr, .5, .5);
+
+ cx = priv->align_control.x;
+ cy = priv->align_control.y;
+
/* Draw align control node */
+ if (valign == GTK_ALIGN_FILL || halign == GTK_ALIGN_FILL)
+ {
+ /* Draw fill indicator */
+ if (halign == GTK_ALIGN_FILL)
+ {
+ cairo_move_to (cr, cx - 6, cy + 4);
+ cairo_line_to (cr, cx + 14, cy + 4);
+
+ draw_arrow (cr, cx - 7, cy + 4, 3, 3, 3, -3);
+ draw_arrow (cr, cx + 15, cy + 4, -3, -3, -3, 3);
+ }
+ if (valign == GTK_ALIGN_FILL)
+ {
+ cairo_move_to (cr, cx + 4, cy - 6);
+ cairo_line_to (cr, cx + 4, cy + 14);
+
+ draw_arrow (cr, cx + 4, cy - 7, -3, 3, 3, 3);
+ draw_arrow (cr, cx + 4, cy + 15, 3, -3, -3, -3);
+ }
+
+ draw_stroke_lines (cr, c2, c1, TRUE, 1);
+ }
+
cairo_set_line_width (cr, OUTLINE_WIDTH);
gdk_cairo_set_source_rgba (cr, c2);
- gdk_cairo_rectangle (cr, &priv->align_control);
+ cairo_rectangle (cr, cx-.5, cy-.5, 9, 9);
cairo_stroke_preserve (cr);
gdk_cairo_set_source_rgba (cr, c1);
cairo_fill (cr);
@@ -1459,7 +1544,7 @@ draw_selection_nodes (cairo_t *cr,
if (top || bottom || left || right)
{
cairo_set_line_width (cr, 1);
- draw_dimensions (cr, c2, fg, x+.5, y+.5, w, h, top, bottom, left, right);
+ draw_dimensions (cr, c2, fg, x, y, w, h, top, bottom, left, right);
}
/* Draw animated placeholders for alignment node */
@@ -1467,7 +1552,7 @@ draw_selection_nodes (cairo_t *cr,
{
gdouble dashes[] = { 3, 2 };
- cairo_translate (cr, -5.5, -5.5);
+ cairo_translate (cr, -6, -6);
if (!(align & MARGIN_TOP && align & MARGIN_LEFT))
cairo_rectangle (cr, x1, y1, 12, 12);
@@ -1483,7 +1568,7 @@ draw_selection_nodes (cairo_t *cr,
if (align) cairo_rectangle (cr, x2, y2, 12, 12);
- cairo_translate (cr, 5.5, 5.5);
+ cairo_translate (cr, 6, 6);
if (align != MARGIN_TOP)
{
@@ -1970,6 +2055,7 @@ glade_design_layout_class_init (GladeDesignLayoutClass * klass)
widget_class->leave_notify_event = glade_design_layout_leave_notify_event;
widget_class->button_press_event = glade_design_layout_button_press_event;
widget_class->button_release_event = glade_design_layout_button_release_event;
+ widget_class->scroll_event = glade_design_layout_scroll_event;
widget_class->draw = glade_design_layout_draw;
widget_class->get_preferred_height = glade_design_layout_get_preferred_height;
widget_class->get_preferred_width = glade_design_layout_get_preferred_width;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]