diff console/libgnt/gnttree.c @ 14793:8a0cfee11af8

[gaim-migrate @ 17558] Introduce actions. You can specify the bindings for the actions. Right now, only the tree and the entry widget have them. The manual includes the details. I believe Ethan had suggested something like this a while back. It made sense, so here it is. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 21 Oct 2006 21:08:24 +0000
parents 811464ba52de
children 10244943bbc9
line wrap: on
line diff
--- a/console/libgnt/gnttree.c	Sat Oct 21 20:40:12 2006 +0000
+++ b/console/libgnt/gnttree.c	Sat Oct 21 21:08:24 2006 +0000
@@ -480,32 +480,95 @@
 	return g_hash_table_lookup(tree->hash, key);
 }
 
-static void
-action_down(GntTree *tree)
+static gboolean
+action_down(GntWidget *widget, GList *null)
 {
 	int dist;
+	GntTree *tree = GNT_TREE(widget);
+	GntTreeRow *old = tree->current;
 	GntTreeRow *row = get_next(tree->current);
 	if (row == NULL)
-		return;
+		return FALSE;
 	tree->current = row;
 	if ((dist = get_distance(tree->current, tree->bottom)) < 0)
 		gnt_tree_scroll(tree, -dist);
 	else
 		redraw_tree(tree);
+	if (old != tree->current)
+		tree_selection_changed(tree, old, tree->current);
+	return TRUE;
 }
 
-static void
-action_up(GntTree *tree)
+static gboolean
+action_up(GntWidget *widget, GList *list)
 {
 	int dist;
+	GntTree *tree = GNT_TREE(widget);
+	GntTreeRow *old = tree->current;
 	GntTreeRow *row = get_prev(tree->current);
 	if (!row)
-		return;
+		return FALSE;
 	tree->current = row;
 	if ((dist = get_distance(tree->current, tree->top)) > 0)
 		gnt_tree_scroll(tree, -dist);
 	else
 		redraw_tree(tree);
+	if (old != tree->current)
+		tree_selection_changed(tree, old, tree->current);
+
+	return TRUE;
+}
+
+static gboolean
+action_page_down(GntWidget *widget, GList *null)
+{
+	GntTree *tree = GNT_TREE(widget);
+	GntTreeRow *old = tree->current;
+	GntTreeRow *row = get_next(tree->bottom);
+	if (row)
+	{
+		int dist = get_distance(tree->top, tree->current);
+		tree->top = tree->bottom;
+		tree->current = get_next_n_opt(tree->top, dist, NULL);
+		redraw_tree(tree);
+	}
+	else if (tree->current != tree->bottom)
+	{
+		tree->current = tree->bottom;
+		redraw_tree(tree);
+	}
+
+	if (old != tree->current)
+		tree_selection_changed(tree, old, tree->current);
+	return TRUE;
+}
+
+static gboolean
+action_page_up(GntWidget *widget, GList *null)
+{
+	GntTree *tree = GNT_TREE(widget);
+	GntTreeRow *row;
+	GntTreeRow *old = tree->current;
+
+	if (tree->top != tree->root)
+	{
+		int dist = get_distance(tree->top, tree->current);
+		row = get_prev_n(tree->top, widget->priv.height - 1 -
+			tree->show_title * 2 - 2 * (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) == 0));
+		if (row == NULL)
+			row = tree->root;
+		tree->top = row;
+		tree->current = get_next_n_opt(tree->top, dist, NULL);
+		redraw_tree(tree);
+	}
+	else if (tree->current != tree->top)
+	{
+		tree->current = tree->top;
+		redraw_tree(tree);
+	}
+	if (old != tree->current)
+		tree_selection_changed(tree, old, tree->current);
+	return TRUE;
 }
 
 static gboolean
@@ -516,75 +579,9 @@
 	GntTreeRow *row;
 	int dist;
 
-	if (text[0] == 27)
+	if (text[0] == '\r')
 	{
-		if (strcmp(text+1, GNT_KEY_DOWN) == 0)
-		{
-			action_down(tree);
-		}
-		else if (strcmp(text+1, GNT_KEY_UP) == 0)
-		{
-			action_up(tree);
-		}
-		else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0)
-		{
-			row = get_next(tree->bottom);
-			if (row)
-			{
-				int dist = get_distance(tree->top, tree->current);
-				tree->top = tree->bottom;
-				tree->current = get_next_n_opt(tree->top, dist, NULL);
-				redraw_tree(tree);
-			}
-			else if (tree->current != tree->bottom)
-			{
-				tree->current = tree->bottom;
-				redraw_tree(tree);
-			}
-		}
-		else if (strcmp(text+1, GNT_KEY_PGUP) == 0)
-		{
-			if (tree->top != tree->root)
-			{
-				int dist = get_distance(tree->top, tree->current);
-				row = get_prev_n(tree->top, widget->priv.height - 1 -
-					tree->show_title * 2 - 2 * (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) == 0));
-				if (row == NULL)
-					row = tree->root;
-				tree->top = row;
-				tree->current = get_next_n_opt(tree->top, dist, NULL);
-				redraw_tree(tree);
-			}
-			else if (tree->current != tree->top)
-			{
-				tree->current = tree->top;
-				redraw_tree(tree);
-			}
-		}
-	}
-	else if (iscntrl(text[0]))
-	{
-		if (strcmp(text, GNT_KEY_CTRL_N) == 0 && (row = get_next(tree->current)) != NULL)
-		{
-			tree->current = row;
-			if ((dist = get_distance(tree->current, tree->bottom)) < 0)
-				gnt_tree_scroll(tree, -dist);
-			else
-				redraw_tree(tree);
-		}
-		else if (strcmp(text, GNT_KEY_CTRL_P) == 0 && (row = get_prev(tree->current)) != NULL)
-		{
-			tree->current = row;
-
-			if ((dist = get_distance(tree->current, tree->top)) > 0)
-				gnt_tree_scroll(tree, -dist);
-			else
-				redraw_tree(tree);
-		}
-		else if (text[0] == '\r')
-		{
-			gnt_widget_activate(widget);
-		}
+		gnt_widget_activate(widget);
 	}
 	else if (text[0] == ' ' && text[1] == 0)
 	{
@@ -634,9 +631,9 @@
 	GntTree *tree = GNT_TREE(widget);
 	GntTreeRow *old = tree->current;
 	if (event == GNT_MOUSE_SCROLL_UP) {
-		action_up(GNT_TREE(widget));
+		action_up(widget, NULL);
 	} else if (event == GNT_MOUSE_SCROLL_DOWN) {
-		action_down(GNT_TREE(widget));
+		action_down(widget, NULL);
 	} else if (event == GNT_LEFT_MOUSE_DOWN) {
 		GntTreeRow *row;
 		GntTree *tree = GNT_TREE(widget);
@@ -706,6 +703,24 @@
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
 
+	parent_class->actions = g_hash_table_duplicate(parent_class->actions, g_str_hash,
+				g_str_equal, g_free, (GDestroyNotify)gnt_widget_action_free);
+	parent_class->bindings = g_hash_table_duplicate(parent_class->bindings, g_str_hash,
+				g_str_equal, g_free, (GDestroyNotify)gnt_widget_action_param_free);
+
+	gnt_widget_class_register_action(parent_class, "move-up", action_up,
+				"\033" GNT_KEY_UP, NULL);
+	gnt_widget_register_binding(parent_class, "move-up", "\033" GNT_KEY_CTRL_N, NULL);
+	gnt_widget_class_register_action(parent_class, "move-down", action_down,
+				"\033" GNT_KEY_DOWN, NULL);
+	gnt_widget_register_binding(parent_class, "move-down", "\033" GNT_KEY_CTRL_P, NULL);
+	gnt_widget_class_register_action(parent_class, "page-up", action_page_up,
+				"\033" GNT_KEY_PGUP, NULL);
+	gnt_widget_class_register_action(parent_class, "page-down", action_page_down,
+				"\033" GNT_KEY_PGDOWN, NULL);
+
+	gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), klass);
+
 	GNTDEBUG;
 }
 
@@ -1350,11 +1365,9 @@
 	for (i = 0; i < tree->ncol; i++) {
 		gnt_tree_set_col_width(tree, i, widths[i]);
 		twidth += widths[i] + (tree->show_separator ? 1 : 0) + 1;
-		fprintf(stderr, "column width for col %d: %d\n", i, widths[i]);
 	}
 	g_free(widths);
 
-	fprintf(stderr, "tree width: %d\n", twidth);
 	gnt_widget_get_size(GNT_WIDGET(tree), NULL, &height);
 	gnt_widget_set_size(GNT_WIDGET(tree), twidth, height);
 }