aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/gncal-full-day.c107
1 files changed, 72 insertions, 35 deletions
diff --git a/calendar/gui/gncal-full-day.c b/calendar/gui/gncal-full-day.c
index 7e3d2e0d41..6d95a79d41 100644
--- a/calendar/gui/gncal-full-day.c
+++ b/calendar/gui/gncal-full-day.c
@@ -41,14 +41,16 @@ struct layout_row {
struct drag_info {
enum {
DRAG_NONE,
- DRAG_SELECT, /* selecting a range in the main window */
- DRAG_MOVE, /* moving a child */
- DRAG_SIZE /* resizing a child */
+ DRAG_SELECT, /* selecting a range in the main window */
+ DRAG_MOVE, /* moving a child */
+ DRAG_SIZE_TOP, /* resizing a child */
+ DRAG_SIZE_BOTTOM
} drag_mode;
Child *child;
- int start_row;
- int rows_used;
+ int child_click_y;
+ int child_start_row;
+ int child_rows_used;
int sel_click_row;
int sel_start_row;
@@ -179,11 +181,14 @@ static void
child_set_text_pos (Child *child)
{
GtkAllocation allocation;
+ int has_focus;
- allocation.x = 0;
- allocation.y = (GTK_WIDGET_HAS_FOCUS (child->widget) ? HANDLE_SIZE : 0);
- allocation.width = child->width;
- allocation.height = child->height - (GTK_WIDGET_HAS_FOCUS (child->widget) ? (2 * HANDLE_SIZE) : 0);
+ has_focus = GTK_WIDGET_HAS_FOCUS (child->widget);
+
+ allocation.x = HANDLE_SIZE;
+ allocation.y = has_focus ? HANDLE_SIZE : 0;
+ allocation.width = child->width - HANDLE_SIZE;
+ allocation.height = child->height - (has_focus ? (2 * HANDLE_SIZE) : 0);
gtk_widget_size_request (child->widget, &child->widget->requisition); /* FIXME: is this needed? */
gtk_widget_size_allocate (child->widget, &allocation);
@@ -238,6 +243,7 @@ static void
child_draw (GncalFullDay *fullday, Child *child, GdkRectangle *area, int draw_child)
{
GdkRectangle arect, rect, dest;
+ int has_focus;
if (!area) {
arect.x = 0;
@@ -249,25 +255,40 @@ child_draw (GncalFullDay *fullday, Child *child, GdkRectangle *area, int draw_ch
area = &arect;
}
- /* Top handle */
+ has_focus = GTK_WIDGET_HAS_FOCUS (child->widget);
+
+ /* Left handle */
rect.x = 0;
rect.y = 0;
- rect.width = child->width;
- rect.height = HANDLE_SIZE;
+ rect.width = HANDLE_SIZE;
+ rect.height = has_focus ? (child->height - HANDLE_SIZE) : child->height;
if (gdk_rectangle_intersect (&rect, area, &dest))
view_utils_draw_textured_frame (GTK_WIDGET (fullday), child->window, &rect, GTK_SHADOW_OUT);
- /* Bottom handle */
+ if (has_focus) {
+ /* Top handle */
- rect.y = child->height - HANDLE_SIZE;
+ rect.x = HANDLE_SIZE;
+ rect.y = 0;
+ rect.width = child->width - HANDLE_SIZE;
+ rect.height = HANDLE_SIZE;
- if (gdk_rectangle_intersect (&rect, area, &dest))
- view_utils_draw_textured_frame (GTK_WIDGET (fullday), child->window, &rect, GTK_SHADOW_OUT);
+ if (gdk_rectangle_intersect (&rect, area, &dest))
+ view_utils_draw_textured_frame (GTK_WIDGET (fullday), child->window, &rect, GTK_SHADOW_OUT);
+
+ /* Bottom handle */
+
+ rect.y = child->height - HANDLE_SIZE;
+
+ if (gdk_rectangle_intersect (&rect, area, &dest))
+ view_utils_draw_textured_frame (GTK_WIDGET (fullday), child->window, &rect, GTK_SHADOW_OUT);
+ }
if (draw_child) {
- area->y -= HANDLE_SIZE;
+ area->x -= HANDLE_SIZE;
+ area->y -= has_focus ? HANDLE_SIZE : 0;
gtk_widget_draw (child->widget, area);
}
}
@@ -1309,9 +1330,9 @@ draw_xor_rect (GncalFullDay *fullday)
widget->style->white_gc,
FALSE,
di->child->x + i,
- di->start_row * row_height + ythickness + i,
+ di->child_start_row * row_height + ythickness + i,
di->child->width - 2 * i - 1,
- di->rows_used * row_height - 2 * i - 2);
+ di->child_rows_used * row_height - 2 * i - 2);
gdk_gc_set_function (widget->style->white_gc, GDK_COPY);
gdk_gc_set_subwindow (widget->style->white_gc, GDK_CLIP_BY_CHILDREN);
@@ -1419,17 +1440,20 @@ button_1 (GncalFullDay *fullday, GdkEventButton *event)
gtk_widget_get_pointer (widget, NULL, &y);
- if (event->y < HANDLE_SIZE)
+ if (event->x < HANDLE_SIZE)
di->drag_mode = DRAG_MOVE;
+ else if (event->y < HANDLE_SIZE)
+ di->drag_mode = DRAG_SIZE_TOP;
else
- di->drag_mode = DRAG_SIZE;
+ di->drag_mode = DRAG_SIZE_BOTTOM;
row_height = calc_row_height (fullday);
di->child = child;
- di->start_row = get_row_from_y (fullday, child->y, FALSE);
- di->rows_used = child->height / row_height;
+ di->child_click_y = event->y;
+ di->child_start_row = get_row_from_y (fullday, child->y, FALSE);
+ di->child_rows_used = child->height / row_height;
gdk_pointer_grab (child->window, FALSE,
(GDK_BUTTON_MOTION_MASK
@@ -1534,24 +1558,35 @@ recompute_motion (GncalFullDay *fullday, int y)
break;
case DRAG_MOVE:
- row = get_row_from_y (fullday, y, FALSE);
+ row = get_row_from_y (fullday, y - di->child_click_y, TRUE);
+
+ if (row > (f_rows - di->child_rows_used))
+ row = f_rows - di->child_rows_used;
+
+ di->child_start_row = row;
+
+ break;
+
+ case DRAG_SIZE_TOP:
+ row = get_row_from_y (fullday, y, TRUE);
- if (row > (f_rows - di->rows_used))
- row = f_rows - di->rows_used;
+ if (row > (di->child_start_row + di->child_rows_used - 1))
+ row = di->child_start_row + di->child_rows_used - 1;
- di->start_row = row;
+ di->child_rows_used = (di->child_start_row + di->child_rows_used) - row;
+ di->child_start_row = row;
break;
- case DRAG_SIZE:
+ case DRAG_SIZE_BOTTOM:
row = get_row_from_y (fullday, y, TRUE);
- if (row <= di->start_row)
- row = di->start_row + 1;
+ if (row <= di->child_start_row)
+ row = di->child_start_row + 1;
else if (row > f_rows)
row = f_rows;
- di->rows_used = row - di->start_row;
+ di->child_rows_used = row - di->child_start_row;
break;
@@ -1587,7 +1622,7 @@ update_from_drag_info (GncalFullDay *fullday)
widget = GTK_WIDGET (fullday);
- get_time_from_rows (fullday, di->start_row, di->rows_used,
+ get_time_from_rows (fullday, di->child_start_row, di->child_rows_used,
&di->child->ico->dtstart,
&di->child->ico->dtend);
@@ -1632,14 +1667,15 @@ gncal_full_day_button_release (GtkWidget *widget, GdkEventButton *event)
break;
case DRAG_MOVE:
- case DRAG_SIZE:
+ case DRAG_SIZE_TOP:
+ case DRAG_SIZE_BOTTOM:
draw_xor_rect (fullday);
recompute_motion (fullday, y);
gdk_pointer_ungrab (event->time);
update_from_drag_info (fullday);
- di->rows_used = 0;
+ di->child_rows_used = 0;
break;
@@ -1693,7 +1729,8 @@ gncal_full_day_motion (GtkWidget *widget, GdkEventMotion *event)
break;
case DRAG_MOVE:
- case DRAG_SIZE:
+ case DRAG_SIZE_TOP:
+ case DRAG_SIZE_BOTTOM:
draw_xor_rect (fullday);
recompute_motion (fullday, y);
draw_xor_rect (fullday);