glade3 r2072 - in trunk: . plugins/gtk+



Author: tvb
Date: Mon Dec 29 17:23:05 2008
New Revision: 2072
URL: http://svn.gnome.org/viewvc/glade3?rev=2072&view=rev

Log:

	* plugins/gtk+/glade-cell-renderer-button.c: Made it possible
	to tab into the i18n button.

	* plugins/gtk+/glade-model-data.c: Added sequential editing mode option
	(TODO: maybe add this to session data ?)



Modified:
   trunk/ChangeLog
   trunk/plugins/gtk+/glade-cell-renderer-button.c
   trunk/plugins/gtk+/glade-model-data.c

Modified: trunk/plugins/gtk+/glade-cell-renderer-button.c
==============================================================================
--- trunk/plugins/gtk+/glade-cell-renderer-button.c	(original)
+++ trunk/plugins/gtk+/glade-cell-renderer-button.c	Mon Dec 29 17:23:05 2008
@@ -23,6 +23,7 @@
 #include <config.h>
 #include <gladeui/glade.h>
 #include <glib/gi18n-lib.h>
+#include <gdk/gdkkeysyms.h>
 
 #include "glade-cell-renderer-button.h"
 #include "glade-text-button.h"
@@ -32,7 +33,8 @@
 
 typedef struct
 {
-	gboolean entry_editable;
+	GladeTextButton *button;
+	gboolean         entry_editable;
 } GladeCellRendererButtonPrivate;
 
 static void glade_cell_renderer_button_finalize   (GObject                  *object);
@@ -194,6 +196,25 @@
 	return FALSE;
 }
 
+static gboolean
+glade_cell_renderer_button_key_press_event (GtkWidget    *entry,
+					    GdkEventKey  *event,
+					    GtkCellRendererText *cell_text)
+{
+	GladeCellRendererButtonPrivate *priv;
+
+	priv = GLADE_CELL_RENDERER_BUTTON_GET_PRIVATE (cell_text);
+
+	if (event->keyval == GDK_Tab)
+	{
+		g_signal_handlers_block_by_func (entry, glade_cell_renderer_button_focus_out_event, cell_text);
+		gtk_widget_grab_focus (priv->button->button);
+		g_signal_handlers_unblock_by_func (entry, glade_cell_renderer_button_focus_out_event, cell_text);
+		return TRUE;
+	}
+
+	return FALSE;
+}
 
 static void
 glade_cell_renderer_button_activate (GtkCellEditable *entry,
@@ -263,7 +284,7 @@
 	if (cell_text->editable == FALSE)
 		return NULL;
 
-	text_button = (GladeTextButton *)glade_text_button_new ();
+	priv->button = text_button = (GladeTextButton *)glade_text_button_new ();
 	gtk_entry_set_text (GTK_ENTRY (text_button->entry), cell_text->text ? cell_text->text : "");
 	gtk_entry_set_editable (GTK_ENTRY (text_button->entry), priv->entry_editable);
 
@@ -290,6 +311,10 @@
 			  G_CALLBACK (glade_cell_renderer_button_editing_done),
 			  cell);
 
+	g_signal_connect (text_button->entry, "key-press-event",
+			  G_CALLBACK (glade_cell_renderer_button_key_press_event),
+			  cell);
+
 	g_signal_connect_after (text_button->entry, "focus-out-event",
 				G_CALLBACK (glade_cell_renderer_button_focus_out_event),
 				cell);

Modified: trunk/plugins/gtk+/glade-model-data.c
==============================================================================
--- trunk/plugins/gtk+/glade-model-data.c	(original)
+++ trunk/plugins/gtk+/glade-model-data.c	Mon Dec 29 17:23:05 2008
@@ -241,6 +241,12 @@
 	NUM_COLUMNS
 };
 
+typedef enum {
+	SEQ_NONE,
+	SEQ_HORIZONTAL,
+	SEQ_VERTICAL
+} EditSequence;
+
 typedef struct
 {
 	GladeEditorProperty parent_instance;
@@ -250,12 +256,17 @@
 	GtkTreeSelection *selection;
 	GNode *pending_data_tree;
 
+	EditSequence         sequence;
+
 	/* Used for setting focus on newly added rows */
 	gboolean             adding_row;
 	gboolean             want_focus;
+	gboolean             want_next_focus;
 	gboolean             setting_focus;
 	gint                 editing_row;
 	gint                 editing_column;
+
+	guint                next_focus_idle;
 } GladeEPropModelData;
 
 GLADE_MAKE_EPROP (GladeEPropModelData, glade_eprop_model_data)
@@ -326,6 +337,7 @@
 	GValue               value = { 0, };
 
 	eprop_data->want_focus = TRUE;
+	eprop_data->want_next_focus = TRUE;
 	
 	g_value_init (&value, GLADE_TYPE_MODEL_DATA_TREE);
 	g_value_take_boxed (&value, eprop_data->pending_data_tree);
@@ -337,8 +349,28 @@
 
 	eprop_data->pending_data_tree = NULL;
 
+	eprop_data->want_next_focus = FALSE;
+	eprop_data->want_focus = FALSE;
+
+	return FALSE;
+}
+
+
+static gboolean
+focus_next_data_tree_idle (GladeEditorProperty *eprop)
+{
+	GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
+
+	eprop_data->want_focus = TRUE;
+	eprop_data->want_next_focus = TRUE;
+
+	eprop_data_focus_editing_cell (eprop_data);
+
+	eprop_data->want_next_focus = FALSE;
 	eprop_data->want_focus = FALSE;
 
+	eprop_data->next_focus_idle = 0;
+	
 	return FALSE;
 }
 
@@ -435,6 +467,15 @@
 	glade_eprop_model_data_delete_selected (eprop);
 }
 
+static void
+glade_eprop_model_sequence_changed (GtkWidget           *combo, 
+				    GladeEditorProperty *eprop)
+{
+	GladeEPropModelData   *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
+
+	eprop_data->sequence = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
+}
+
 static gboolean
 eprop_treeview_key_press (GtkWidget           *treeview,
 			  GdkEventKey         *event,
@@ -458,7 +499,6 @@
 static gboolean
 data_changed_idle (GladeEditorProperty *eprop)
 {
-
 	GladeEPropModelData   *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
 	GNode                 *data_tree = NULL, *new_tree, *row;
 	GtkTreeIter            iter;
@@ -820,7 +860,13 @@
 		else
 			renderer = gtk_cell_renderer_text_new ();
 
-		g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL);
+		g_object_set (G_OBJECT (renderer), 
+			      "editable", TRUE, 
+			      "ellipsize", PANGO_ELLIPSIZE_END,
+			      "width", 90,
+			      NULL);
+
+
 		gtk_tree_view_column_pack_start (column, renderer, FALSE);
 		gtk_tree_view_column_set_attributes (column, renderer, 
 						     "text", NUM_COLUMNS + colnum,
@@ -942,6 +988,7 @@
 			  G_CALLBACK (data_editing_canceled), eprop);
 
 	g_object_set_data (G_OBJECT (renderer), "column-number", GINT_TO_POINTER (colnum));
+	g_object_set_data_full (G_OBJECT (column), "column-type", g_memdup (&type, sizeof (GType)), g_free);
 
 	return column;
 }
@@ -974,6 +1021,7 @@
 static void
 eprop_data_focus_new (GladeEPropModelData *eprop_data)
 {
+
 	/* Focus and edit the first column of a newly added row */
 	if (eprop_data->store)
 	{
@@ -985,13 +1033,12 @@
 		n_children = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (eprop_data->store), NULL);
 
 		if ((column = gtk_tree_view_get_column (eprop_data->view, eprop_data->editing_column)) != NULL &&
-		    n_children > 0 && 
-		    gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (eprop_data->store),
-						   &iter,
-						   NULL,
-						   n_children - 1))
-
+		    n_children > 0 &&  gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (eprop_data->store),
+								      &iter, NULL, n_children - 1))
+			
 		{
+			GType *column_type = g_object_get_data (G_OBJECT (column), "column-type");
+
 			new_item_path = gtk_tree_model_get_path (GTK_TREE_MODEL (eprop_data->store), &iter);
 
 			eprop_data->setting_focus = TRUE;
@@ -999,7 +1046,7 @@
 			gtk_widget_grab_focus (GTK_WIDGET (eprop_data->view));
 			gtk_tree_view_expand_to_path (eprop_data->view, new_item_path);
 			gtk_tree_view_set_cursor (eprop_data->view, new_item_path,
-						  column, TRUE);
+						  column, *column_type != G_TYPE_BOOLEAN);
 
 			eprop_data->setting_focus = FALSE;
 			
@@ -1012,27 +1059,66 @@
 eprop_data_focus_editing_cell (GladeEPropModelData *eprop_data)
 {
 	/* Focus and edit the first column of a newly added row */
-	if (eprop_data->store && eprop_data->want_focus && 
+	if (!eprop_data->setting_focus && eprop_data->store && eprop_data->want_focus && 
 	    eprop_data->editing_column >= 0 && eprop_data->editing_row >= 0)
 	{
 		GtkTreePath *item_path;
 		GtkTreeIter  iter;
 		GtkTreeViewColumn *column;
+		gint row, col, rows, cols;
+		GList *column_list;
 
-		if ((column = gtk_tree_view_get_column (eprop_data->view, eprop_data->editing_column)) != NULL &&
-		    gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (eprop_data->store),
-						   &iter,
-						   NULL,
-						   eprop_data->editing_row))
+		column_list = gtk_tree_view_get_columns (eprop_data->view);
+		cols = g_list_length (column_list);
+		g_list_free (column_list);
+
+		rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (eprop_data->store), NULL);
+
+		col = eprop_data->editing_column;	
+		row = eprop_data->editing_row;
+
+		if (eprop_data->want_next_focus)
 		{
+			switch (eprop_data->sequence)
+			{
+			case SEQ_HORIZONTAL:
+				if (++col >= cols)
+				{
+					col = 0;
+					if (++row >= rows)
+						row = 0;
+				}
+				break;
+			case SEQ_VERTICAL:
+				if (++row >= rows)
+				{
+					row = 0;
+					if (++col >= cols)
+						col = 0;
+				}
+				break;
+			case SEQ_NONE:	
+			default:
+				break;
+			}
+		}
+
+		if ((column = gtk_tree_view_get_column (eprop_data->view, col)) != NULL &&
+		    gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (eprop_data->store), &iter, NULL, row))
+		{
+			GType *column_type = g_object_get_data (G_OBJECT (column), "column-type");
+
 			item_path = gtk_tree_model_get_path (GTK_TREE_MODEL (eprop_data->store), &iter);
 
 			eprop_data->setting_focus = TRUE;
 
 			gtk_widget_grab_focus (GTK_WIDGET (eprop_data->view));
 			gtk_tree_view_expand_to_path (eprop_data->view, item_path);
-			gtk_tree_view_set_cursor (eprop_data->view, item_path,
-						  column, FALSE);
+			gtk_tree_view_set_cursor (eprop_data->view, item_path, column, 
+						  eprop_data->want_next_focus && 
+						  eprop_data->sequence != SEQ_NONE &&
+						  *column_type != G_TYPE_BOOLEAN);
+
 			gtk_tree_path_free (item_path);
 
 			eprop_data->setting_focus = FALSE;
@@ -1080,7 +1166,13 @@
 			eprop_data_focus_new (eprop_data);
 		else if (eprop_data->want_focus && 
 			 eprop_data->editing_row >= 0 && eprop_data->editing_column >= 0)
-			eprop_data_focus_editing_cell (eprop_data);
+		{
+			if (eprop_data->want_next_focus && eprop_data->next_focus_idle == 0)
+				eprop_data->next_focus_idle = 
+					g_idle_add ((GSourceFunc)focus_next_data_tree_idle, eprop);
+			else
+				eprop_data_focus_editing_cell (eprop_data);
+		}
 	}
 }
 
@@ -1088,13 +1180,15 @@
 glade_eprop_model_data_create_input (GladeEditorProperty *eprop)
 {
 	GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
-	GtkWidget *vbox, *hbox, *button, *swin, *label;
+	GtkWidget *vbox, *hbox, *button, *swin, *label, *combo;
 	gchar *string;
 
 	vbox = gtk_vbox_new (FALSE, 2);
 	
 	hbox = gtk_hbox_new (FALSE, 4);
 
+	eprop_data->sequence = SEQ_NONE;
+
 	/* hbox with add/remove row buttons on the right... */
 	gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
 
@@ -1104,7 +1198,7 @@
 	gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
 	gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
 	gtk_misc_set_padding (GTK_MISC (label), 2, 0);
-	gtk_box_pack_start (GTK_BOX (hbox), label,  TRUE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), label,  FALSE, FALSE, 0);
 	
 	button = gtk_button_new ();
 	gtk_button_set_image (GTK_BUTTON (button),
@@ -1114,7 +1208,7 @@
 	g_signal_connect (G_OBJECT (button), "clicked",
 			  G_CALLBACK (glade_eprop_model_data_add_clicked), 
 			  eprop_data);
-	
+
 	button = gtk_button_new ();
 	gtk_button_set_image (GTK_BUTTON (button),
 			      gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON));
@@ -1124,6 +1218,33 @@
 			  G_CALLBACK (glade_eprop_model_data_delete_clicked), 
 			  eprop_data);
 
+	/* separator... */
+	label = gtk_label_new ("");
+	gtk_box_pack_start (GTK_BOX (hbox), label,  TRUE, TRUE, 0);
+
+	string = g_strdup_printf ("<b>%s</b>", _("Sequential editing:"));
+	label = gtk_label_new (string);
+	g_free (string);
+	gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+	gtk_misc_set_padding (GTK_MISC (label), 2, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), label,  FALSE, FALSE, 0);
+
+	combo = gtk_combo_box_new_text ();
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Off"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Horizontal"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("Vertical"));
+
+
+	gtk_combo_box_set_active (GTK_COMBO_BOX (combo), eprop_data->sequence);
+
+	gtk_box_pack_start (GTK_BOX (hbox), combo,  FALSE, FALSE, 0);
+
+	g_signal_connect (G_OBJECT (combo), "changed",
+			  G_CALLBACK (glade_eprop_model_sequence_changed), 
+			  eprop_data);
+	
+
 	/* Pack treeview/swindow on the left... */
 	swin = gtk_scrolled_window_new (NULL, NULL);
 	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), GTK_SHADOW_IN);



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