[sound-juicer] Add movement keys to SjCellRendererText
- From: Phillip Wood <pwood src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sound-juicer] Add movement keys to SjCellRendererText
- Date: Fri, 15 Aug 2014 13:26:27 +0000 (UTC)
commit 372c001b704b1bf75bcf845d0292f1011eff81cd
Author: Phillip Wood <phillip wood dunelm org uk>
Date: Fri May 9 11:07:06 2014 +0100
Add movement keys to SjCellRendererText
Allow the user to move cells while editing. This makes editing much
quicker as the user no longer has to press 'Enter' to confirm their
changes, then move and then press 'Enter' again to start editing the
new cell.
[Shift]Tab - move to the [previous]next activatable/editable column
[Page]Up - move up a [page]row
[Page]Down - move down a [page]row
Control-Home - move to the top of the current column
Control-End - move to the bottom if the current column
Control-Tab - move the keyboard focus to the next widget
https://bugzilla.gnome.org/show_bug.cgi?id=151469
src/sj-cell-renderer-text.c | 117 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 112 insertions(+), 5 deletions(-)
---
diff --git a/src/sj-cell-renderer-text.c b/src/sj-cell-renderer-text.c
index 9cde025..1c45b6c 100644
--- a/src/sj-cell-renderer-text.c
+++ b/src/sj-cell-renderer-text.c
@@ -37,6 +37,106 @@ struct _SjCellRendererTextPrivate
G_DEFINE_TYPE_WITH_PRIVATE (SjCellRendererText, sj_cell_renderer_text, GTK_TYPE_CELL_RENDERER_TEXT);
+static gboolean
+move_focus (GtkWidget *entry,
+ GtkWidget *tree_view,
+ GtkDirectionType dir)
+{
+ gboolean ret_val;
+
+ gtk_cell_editable_editing_done (GTK_CELL_EDITABLE (entry));
+ gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (entry));
+ g_signal_emit_by_name (tree_view, "move-focus", dir, &ret_val);
+ return ret_val;
+}
+
+static gboolean
+sj_cell_renderer_text_key_press (GtkWidget *entry,
+ GdkEventKey *event,
+ gpointer tree_view)
+{
+ guint modifier = event->state & gtk_accelerator_get_default_mod_mask ();
+ guint key = event->keyval;
+ gboolean ret_val = FALSE;
+
+ if (gtk_entry_im_context_filter_keypress (GTK_ENTRY (entry), event))
+ return TRUE;
+
+ if (modifier == 0 || modifier == GDK_SHIFT_MASK) {
+ switch(key) {
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_Page_Down:
+ case GDK_KEY_KP_Page_Down:
+ case GDK_KEY_Page_Up:
+ case GDK_KEY_KP_Page_Up:
+ g_signal_emit_by_name (tree_view, "key-press-event", event, &ret_val);
+ return TRUE;
+ case GDK_KEY_Tab:
+ case GDK_KEY_KP_Tab:
+ case GDK_KEY_ISO_Left_Tab:
+ case GDK_KEY_3270_BackTab:
+ g_signal_emit_by_name (tree_view, "key-press-event", event, &ret_val);
+ if (!ret_val) {
+ GtkDirectionType direction;
+ if (modifier == 0 && (key == GDK_KEY_Tab ||
+ key == GDK_KEY_KP_Tab))
+ direction = GTK_DIR_TAB_FORWARD;
+ else
+ direction = GTK_DIR_TAB_BACKWARD;
+
+ move_focus (entry, tree_view, direction);
+ }
+ return TRUE;
+ }
+ }
+
+ if (modifier == GDK_CONTROL_MASK ||
+ modifier == (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) {
+ gint count = 1;
+ switch (key) {
+ case GDK_KEY_Home:
+ case GDK_KEY_KP_Home:
+ count = -1;
+ /* Fall through */
+ case GDK_KEY_End:
+ case GDK_KEY_KP_End:
+ event->state ^= GDK_CONTROL_MASK;
+ g_signal_emit_by_name (tree_view, "move-cursor",
+ GTK_MOVEMENT_BUFFER_ENDS, count, &ret_val);
+ event->state ^= GDK_CONTROL_MASK;
+ return TRUE;
+ }
+ }
+
+ if (modifier == GDK_CONTROL_MASK) {
+ switch (key) {
+ case GDK_KEY_Tab:
+ case GDK_KEY_KP_Tab:
+ move_focus (entry, tree_view, GTK_DIR_TAB_FORWARD);
+ return TRUE;
+ case GDK_KEY_ISO_Left_Tab:
+ case GDK_KEY_3270_BackTab:
+ move_focus (entry, tree_view, GTK_DIR_TAB_BACKWARD);
+ return TRUE;
+ }
+ }
+
+ if (modifier == (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) {
+ switch (key) {
+ case GDK_KEY_Tab:
+ case GDK_KEY_KP_Tab:
+ case GDK_KEY_ISO_Left_Tab:
+ case GDK_KEY_3270_BackTab:
+ move_focus (entry, tree_view, GTK_DIR_TAB_BACKWARD);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
static void
sj_cell_renderer_text_editing_done (GtkCellEditable *entry,
gpointer data)
@@ -129,8 +229,10 @@ sj_cell_renderer_text_populate_popup (GtkEntry *entry,
priv->in_entry_menu = TRUE;
- g_signal_connect (menu, "unmap",
- G_CALLBACK (sj_cell_renderer_text_popup_unmap), data);
+ g_signal_connect (menu,
+ "unmap",
+ G_CALLBACK (sj_cell_renderer_text_popup_unmap),
+ data);
}
static gboolean
@@ -148,7 +250,6 @@ sj_cell_renderer_text_focus_out_event (GtkWidget *entry,
gtk_cell_editable_editing_done (GTK_CELL_EDITABLE (entry));
gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (entry));
- /* entry needs focus-out-event */
return FALSE;
}
@@ -199,13 +300,19 @@ sj_cell_renderer_text_start_editing (GtkCellRenderer *cell,
}
g_signal_connect (priv->entry,
+ "key-press-event",
+ G_CALLBACK (sj_cell_renderer_text_key_press),
+ widget);
+ g_signal_connect (priv->entry,
"editing-done",
G_CALLBACK (sj_cell_renderer_text_editing_done),
celltext);
- priv->focus_out_id = g_signal_connect_after (priv->entry, "focus-out-event",
+ priv->focus_out_id = g_signal_connect_after (priv->entry,
+ "focus-out-event",
G_CALLBACK (sj_cell_renderer_text_focus_out_event),
celltext);
- priv->populate_popup_id = g_signal_connect (priv->entry, "populate-popup",
+ priv->populate_popup_id = g_signal_connect (priv->entry,
+ "populate-popup",
G_CALLBACK (sj_cell_renderer_text_populate_popup),
celltext);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]