Commit 35bc893b authored by Milan Crha's avatar Milan Crha

I#681 - Cannot type the date of a meeting ][

Extends the initial fix to cover auto-select in GtkEntry and
better report errors with time portion of the date/time.

Closes #681
parent 44fbd356
......@@ -67,14 +67,14 @@ ece_event_update_times (ECompEditorEvent *event_editor,
EDateEdit *date_edit,
gboolean change_end_datetime)
{
GtkWidget *widget;
guint flags;
g_return_if_fail (E_IS_COMP_EDITOR_EVENT (event_editor));
g_return_if_fail (E_IS_DATE_EDIT (date_edit));
widget = e_date_edit_get_entry (date_edit);
if (widget && gtk_widget_has_focus (widget))
if (e_date_edit_has_focus (date_edit) ||
!e_date_edit_date_is_valid (date_edit) ||
!e_date_edit_time_is_valid (date_edit))
return;
if (!e_comp_editor_get_updating (E_COMP_EDITOR (event_editor))) {
......
......@@ -668,6 +668,23 @@ ecepp_datetime_get_current_time_cb (EDateEdit *date_edit,
return tm;
}
static void
ecepp_datetime_changed_cb (ECompEditorPropertyPart *property_part)
{
GtkWidget *edit_widget;
g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DATETIME (property_part));
edit_widget = e_comp_editor_property_part_get_edit_widget (property_part);
if (!edit_widget || e_date_edit_has_focus (E_DATE_EDIT (edit_widget)) ||
!e_date_edit_date_is_valid (E_DATE_EDIT (edit_widget)) ||
!e_date_edit_time_is_valid (E_DATE_EDIT (edit_widget)))
return;
e_comp_editor_property_part_emit_changed (property_part);
}
static void
ecepp_datetime_create_widgets (ECompEditorPropertyPart *property_part,
GtkWidget **out_label_widget,
......@@ -700,9 +717,9 @@ ecepp_datetime_create_widgets (ECompEditorPropertyPart *property_part,
e_weak_ref_new (property_part), (GDestroyNotify) e_weak_ref_free);
g_signal_connect_swapped (*out_edit_widget, "changed",
G_CALLBACK (e_comp_editor_property_part_emit_changed), property_part);
G_CALLBACK (ecepp_datetime_changed_cb), property_part);
g_signal_connect_swapped (*out_edit_widget, "notify::show-time",
G_CALLBACK (e_comp_editor_property_part_emit_changed), property_part);
G_CALLBACK (ecepp_datetime_changed_cb), property_part);
}
static void
......
......@@ -112,10 +112,10 @@ ece_restore_focus (ECompEditor *comp_editor)
g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
if (comp_editor->priv->restore_focus) {
gtk_widget_grab_focus (comp_editor->priv->restore_focus);
if (GTK_IS_ENTRY (comp_editor->priv->restore_focus))
gtk_editable_set_position (GTK_EDITABLE (comp_editor->priv->restore_focus), 0);
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (comp_editor->priv->restore_focus));
else
gtk_widget_grab_focus (comp_editor->priv->restore_focus);
comp_editor->priv->restore_focus = NULL;
}
......@@ -2683,8 +2683,12 @@ e_comp_editor_fill_component (ECompEditor *comp_editor,
is_valid = comp_editor_class->fill_component (comp_editor, component);
if (focused_widget)
gtk_window_set_focus (GTK_WINDOW (comp_editor), focused_widget);
if (focused_widget) {
if (GTK_IS_ENTRY (focused_widget))
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (focused_widget));
else
gtk_widget_grab_focus (focused_widget);
}
if (is_valid && comp_editor->priv->validation_alert) {
e_alert_response (comp_editor->priv->validation_alert, GTK_RESPONSE_CLOSE);
......
......@@ -526,6 +526,13 @@ e_date_edit_new (void)
return GTK_WIDGET (dedit);
}
static void
on_time_entry_changed_cb (GtkEditable *editable,
EDateEdit *dedit)
{
e_date_edit_check_time_changed (dedit);
}
static void
create_children (EDateEdit *dedit)
{
......@@ -636,6 +643,9 @@ create_children (EDateEdit *dedit)
g_signal_connect_after (
child, "focus_out_event",
G_CALLBACK (on_time_entry_focus_out), dedit);
g_signal_connect (
child, "changed",
G_CALLBACK (on_time_entry_changed_cb), dedit);
g_signal_connect_after (
priv->time_combo, "changed",
G_CALLBACK (on_date_edit_time_selected), dedit);
......@@ -2010,8 +2020,7 @@ on_date_entry_focus_out (GtkEntry *entry,
if (!e_date_edit_date_is_valid (dedit)) {
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, "dialog-warning");
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, _("Invalid Date Value"));
gtk_widget_grab_focus (GTK_WIDGET (entry));
gtk_editable_set_position (GTK_EDITABLE (entry), -1);
gtk_entry_grab_focus_without_selecting (entry);
return FALSE;
} else if (e_date_edit_get_date (
dedit, &tmp_tm.tm_year, &tmp_tm.tm_mon, &tmp_tm.tm_mday)) {
......@@ -2044,13 +2053,12 @@ on_time_entry_focus_out (GtkEntry *entry,
e_date_edit_check_time_changed (dedit);
if (!e_date_edit_time_is_valid (dedit)) {
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, "dialog-warning");
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, _("Invalid Time Value"));
gtk_widget_grab_focus (GTK_WIDGET (entry));
gtk_editable_set_position (GTK_EDITABLE (entry), -1);
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, "dialog-warning");
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, _("Invalid Time Value"));
gtk_entry_grab_focus_without_selecting (entry);
} else {
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
}
return FALSE;
......@@ -2350,7 +2358,7 @@ e_date_edit_check_time_changed (EDateEdit *dedit)
tmp_tm.tm_min);
if (time_changed) {
e_date_edit_update_time_entry (dedit);
/* Do not call e_date_edit_update_time_entry (dedit); let the user correct the value */
g_signal_emit (dedit, signals[CHANGED], 0);
}
}
......@@ -2517,11 +2525,11 @@ e_date_edit_set_time_internal (EDateEdit *dedit,
entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (dedit->priv->time_combo)));
if (priv->time_is_valid) {
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
} else {
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, "dialog-warning");
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, _("Invalid Time Value"));
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, "dialog-warning");
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, _("Invalid Time Value"));
}
}
......@@ -2576,3 +2584,13 @@ e_date_edit_get_entry (EDateEdit *dedit)
return GTK_WIDGET (dedit->priv->date_entry);
}
gboolean
e_date_edit_has_focus (EDateEdit *dedit)
{
g_return_val_if_fail (E_IS_DATE_EDIT (dedit), FALSE);
return gtk_widget_has_focus (GTK_WIDGET (dedit)) ||
(dedit->priv->date_entry && gtk_widget_has_focus (dedit->priv->date_entry)) ||
(dedit->priv->time_combo && gtk_widget_has_focus (dedit->priv->time_combo));
}
......@@ -211,6 +211,8 @@ void e_date_edit_set_get_time_callback
GtkWidget * e_date_edit_get_entry (EDateEdit *dedit);
gboolean e_date_edit_has_focus (EDateEdit *dedit);
G_END_DECLS
#endif /* E_DATE_EDIT_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment