[evolution-patches] Patch for week_view keyboard navigation



Hi,

We find that the focus can be moved around in day view. But in week view
we can't. We propose to add this feathure so that the behaviour in both views
can be consistent.

Enclosed is the patch for this aim. Thanks.

Regards
Kidd
Index: calendar/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.2322
diff -u -r1.2322 ChangeLog
--- calendar/ChangeLog	14 May 2004 12:09:12 -0000	1.2322
+++ calendar/ChangeLog	17 May 2004 09:55:28 -0000
@@ -1,3 +1,15 @@
+2004-05-17  Kidd Wang  <kidd wang sun com>
+
+	* gui/e-week-view.c: (e_week_view_do_cursor_key_up),
+	(e_week_view_do_cursor_key_down), (e_week_view_do_cursor_key_left),
+	(e_week_view_do_cursor_key_right), (e_month_view_do_cursor_key_up),
+	(e_month_view_do_cursor_key_down),
+	(e_month_view_do_cursor_key_left),
+	(e_month_view_do_cursor_key_right), (e_week_view_cursor_key_up),
+	(e_week_view_cursor_key_down), (e_week_view_cursor_key_left),
+	(e_week_view_cursor_key_right), (e_week_view_do_key_press): make
+	the focus movable in week/month view when no events are selected.
+
 2004-05-14  Rodrigo Moya <rodrigo ximian com>
 
 	* gui/e-day-view.c (process_component):
Index: calendar/gui/e-week-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-week-view.c,v
retrieving revision 1.208
diff -u -r1.208 e-week-view.c
--- calendar/gui/e-week-view.c	14 May 2004 12:09:12 -0000	1.208
+++ calendar/gui/e-week-view.c	17 May 2004 09:55:30 -0000
@@ -3495,6 +3495,172 @@
 	return FALSE;
 }
 
+static gint map_left[] = {0, 1, 2, 0, 1, 2, 2};
+static gint map_right[] = {3, 4, 5, 3, 4, 5, 6};
+
+static void
+e_week_view_do_cursor_key_up (EWeekView *week_view)
+{
+	if (week_view->selection_start_day <= 0)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day--;
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_week_view_do_cursor_key_down (EWeekView *week_view)
+{
+	if (week_view->selection_start_day == -1 ||
+		week_view->selection_start_day >= 6)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day++;
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_week_view_do_cursor_key_left (EWeekView *week_view)
+{
+	if (week_view->selection_start_day == -1)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day = map_left[week_view->selection_start_day];
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_week_view_do_cursor_key_right (EWeekView *week_view)
+{
+	if (week_view->selection_start_day == -1)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day = map_right[week_view->selection_start_day];
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_month_view_do_cursor_key_up (EWeekView *week_view)
+{
+	if (week_view->selection_start_day < 7)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day -= 7;
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_month_view_do_cursor_key_down (EWeekView *week_view)
+{
+	gint weeks_shown = e_week_view_get_weeks_shown (week_view);
+
+	if (week_view->selection_start_day == -1 ||
+		week_view->selection_start_day >= (weeks_shown - 1) * 7)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day += 7;
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_month_view_do_cursor_key_left (EWeekView *week_view)
+{
+	if (week_view->selection_start_day <= 0)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day--;
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_month_view_do_cursor_key_right (EWeekView *week_view)
+{
+	gint weeks_shown = e_week_view_get_weeks_shown (week_view);
+
+	if (week_view->selection_start_day == -1 ||
+		week_view->selection_start_day >= weeks_shown * 7 - 1)
+		return;
+	
+	g_signal_emit_by_name (week_view, "selected_time_changed");
+	week_view->selection_start_day++;
+	week_view->selection_end_day = week_view->selection_start_day;
+	gtk_widget_queue_draw (week_view->main_canvas);
+}
+
+static void
+e_week_view_cursor_key_up (EWeekView *week_view, GnomeCalendarViewType view_type)
+{
+	switch (view_type) {
+	case GNOME_CAL_WEEK_VIEW:
+		e_week_view_do_cursor_key_up (week_view);
+		break;
+	case GNOME_CAL_MONTH_VIEW:
+		e_month_view_do_cursor_key_up (week_view);
+		break;
+	default:
+		g_assert_not_reached ();
+	}
+}
+
+static void
+e_week_view_cursor_key_down (EWeekView *week_view, GnomeCalendarViewType view_type)
+{
+	switch (view_type) {
+	case GNOME_CAL_WEEK_VIEW:
+		e_week_view_do_cursor_key_down (week_view);
+		break;
+	case GNOME_CAL_MONTH_VIEW:
+		e_month_view_do_cursor_key_down (week_view);
+		break;
+	default:
+		g_assert_not_reached ();
+	}
+}
+
+static void
+e_week_view_cursor_key_left (EWeekView *week_view, GnomeCalendarViewType view_type)
+{
+	switch (view_type) {
+	case GNOME_CAL_WEEK_VIEW:
+		e_week_view_do_cursor_key_left (week_view);
+		break;
+	case GNOME_CAL_MONTH_VIEW:
+		e_month_view_do_cursor_key_left (week_view);
+		break;
+	default:
+		g_assert_not_reached ();
+	}
+}
+
+static void
+e_week_view_cursor_key_right (EWeekView *week_view, GnomeCalendarViewType view_type)
+{
+	switch (view_type) {
+	case GNOME_CAL_WEEK_VIEW:
+		e_week_view_do_cursor_key_right (week_view);
+		break;
+	case GNOME_CAL_MONTH_VIEW:
+		e_month_view_do_cursor_key_right (week_view);
+		break;
+	default:
+		g_assert_not_reached ();
+	}
+}
+
 static gboolean
 e_week_view_do_key_press (GtkWidget *widget, GdkEventKey *event)
 {
@@ -3512,6 +3678,8 @@
 	AddEventData add_event_data;
 	guint keyval;
 	gboolean read_only = TRUE;
+	gboolean stop_emission;
+	GnomeCalendarViewType view_type;
 	
 	g_return_val_if_fail (widget != NULL, FALSE);
 	g_return_val_if_fail (E_IS_WEEK_VIEW (widget), FALSE);
@@ -3530,6 +3698,32 @@
 	}
 #endif
 
+	/* Handle the cursor keys for moving the selection */
+	view_type = gnome_calendar_get_view (e_calendar_view_get_calendar (E_CAL_VIEW (week_view)));
+	stop_emission = TRUE;
+	if (!(event->state & GDK_SHIFT_MASK)
+		&& !(event->state & GDK_MOD1_MASK)) {
+		switch (keyval) {
+		case GDK_Up:
+			e_week_view_cursor_key_up (week_view, view_type);
+			break;
+		case GDK_Down:
+			e_week_view_cursor_key_down (week_view, view_type);
+			break;
+		case GDK_Left:
+			e_week_view_cursor_key_left (week_view, view_type);
+			break;
+		case GDK_Right:
+			e_week_view_cursor_key_right (week_view, view_type);
+			break;
+		default:
+			stop_emission = FALSE;
+			break;
+		}
+	}
+	if (stop_emission)
+		return TRUE;
+	
 	/*Navigation through days with arrow keys*/
 	if (((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
 		&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]