aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-calendar-view.c
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2013-06-21 21:56:34 +0800
committerMilan Crha <mcrha@redhat.com>2013-06-21 21:56:34 +0800
commit4a101290fdb546296f7bc0a9a34ba342e741895a (patch)
tree3a5cecac900e672a87f2865a8288f30dbeea4c34 /calendar/gui/e-calendar-view.c
parent97c70105b71adc9b7cb9f4db15bf44f98133a82c (diff)
downloadgsoc2013-evolution-4a101290fdb546296f7bc0a9a34ba342e741895a.tar
gsoc2013-evolution-4a101290fdb546296f7bc0a9a34ba342e741895a.tar.gz
gsoc2013-evolution-4a101290fdb546296f7bc0a9a34ba342e741895a.tar.bz2
gsoc2013-evolution-4a101290fdb546296f7bc0a9a34ba342e741895a.tar.lz
gsoc2013-evolution-4a101290fdb546296f7bc0a9a34ba342e741895a.tar.xz
gsoc2013-evolution-4a101290fdb546296f7bc0a9a34ba342e741895a.tar.zst
gsoc2013-evolution-4a101290fdb546296f7bc0a9a34ba342e741895a.zip
Calendar views inline text edit with Ctrl+C/V/X does not work
The shortcuts Ctrl+C/V/X are used for whole calendar items copy/paste/cut, not for text when editing event details inline, either in a day/week view or in a list view. By tracking the is-editing property of respective cell editor and using it when enabling/disabling clipboard actions makes the respective text operations work as expected.
Diffstat (limited to 'calendar/gui/e-calendar-view.c')
-rw-r--r--calendar/gui/e-calendar-view.c52
1 files changed, 47 insertions, 5 deletions
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index 8228e68285..54df73aac3 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -79,7 +79,8 @@ enum {
PROP_COPY_TARGET_LIST,
PROP_MODEL,
PROP_PASTE_TARGET_LIST,
- PROP_TIME_DIVISIONS
+ PROP_TIME_DIVISIONS,
+ PROP_IS_EDITING
};
/* FIXME Why are we emitting these event signals here? Can't the model just be listened to? */
@@ -313,6 +314,10 @@ calendar_view_get_property (GObject *object,
value, e_calendar_view_get_time_divisions (
E_CALENDAR_VIEW (object)));
return;
+
+ case PROP_IS_EDITING:
+ g_value_set_boolean (value, e_calendar_view_is_editing (E_CALENDAR_VIEW (object)));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -398,12 +403,14 @@ calendar_view_update_actions (ESelectable *selectable,
gboolean can_paste = FALSE;
gboolean sources_are_editable = TRUE;
gboolean recurring = FALSE;
+ gboolean is_editing;
gboolean sensitive;
const gchar *tooltip;
gint n_selected;
gint ii;
view = E_CALENDAR_VIEW (selectable);
+ is_editing = e_calendar_view_is_editing (view);
list = e_calendar_view_get_selected_events (view);
n_selected = g_list_length (list);
@@ -434,25 +441,25 @@ calendar_view_update_actions (ESelectable *selectable,
target_list, clipboard_targets[ii], NULL);
action = e_focus_tracker_get_cut_clipboard_action (focus_tracker);
- sensitive = (n_selected > 0) && sources_are_editable;
+ sensitive = (n_selected > 0) && sources_are_editable && !is_editing;
tooltip = _("Cut selected events to the clipboard");
gtk_action_set_sensitive (action, sensitive);
gtk_action_set_tooltip (action, tooltip);
action = e_focus_tracker_get_copy_clipboard_action (focus_tracker);
- sensitive = (n_selected > 0);
+ sensitive = (n_selected > 0) && !is_editing;
tooltip = _("Copy selected events to the clipboard");
gtk_action_set_sensitive (action, sensitive);
gtk_action_set_tooltip (action, tooltip);
action = e_focus_tracker_get_paste_clipboard_action (focus_tracker);
- sensitive = sources_are_editable && can_paste;
+ sensitive = sources_are_editable && can_paste && !is_editing;
tooltip = _("Paste events from the clipboard");
gtk_action_set_sensitive (action, sensitive);
gtk_action_set_tooltip (action, tooltip);
action = e_focus_tracker_get_delete_selection_action (focus_tracker);
- sensitive = (n_selected > 0) && sources_are_editable && !recurring;
+ sensitive = (n_selected > 0) && sources_are_editable && !recurring && !is_editing;
tooltip = _("Delete selected events");
gtk_action_set_sensitive (action, sensitive);
gtk_action_set_tooltip (action, tooltip);
@@ -884,6 +891,16 @@ e_calendar_view_class_init (ECalendarViewClass *class)
30,
G_PARAM_READWRITE));
+ g_object_class_install_property (
+ object_class,
+ PROP_IS_EDITING,
+ g_param_spec_boolean (
+ "is-editing",
+ "Whether is in an editing mode",
+ "Whether is in an editing mode",
+ FALSE,
+ G_PARAM_READABLE));
+
signals[POPUP_EVENT] = g_signal_new (
"popup-event",
G_TYPE_FROM_CLASS (class),
@@ -2348,3 +2365,28 @@ is_array_index_in_bounds_func (GArray *array,
return TRUE;
}
+
+gboolean
+e_calendar_view_is_editing (ECalendarView *cal_view)
+{
+ static gboolean in = FALSE;
+ gboolean is_editing = FALSE;
+
+ g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), FALSE);
+
+ /* this should be called from the main thread only,
+ and each descendant overrides the property,
+ thus might cause no call recursion */
+ if (in) {
+ g_warn_if_reached ();
+ return FALSE;
+ }
+
+ in = TRUE;
+
+ g_object_get (G_OBJECT (cal_view), "is-editing", &is_editing, NULL);
+
+ in = FALSE;
+
+ return is_editing;
+}