diff console/libgnt/gntmenu.c @ 14843:97977138cf29

[gaim-migrate @ 17612] Add a 'MenuItemCheck' thing. Use GntMenu for the context-menu in the buddylist. This patch has 666 lines ... but I'm sure it's a good patch! committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 28 Oct 2006 22:14:52 +0000
parents b7e145ea9076
children b1650510f4b8
line wrap: on
line diff
--- a/console/libgnt/gntmenu.c	Sat Oct 28 20:38:25 2006 +0000
+++ b/console/libgnt/gntmenu.c	Sat Oct 28 22:14:52 2006 +0000
@@ -1,4 +1,5 @@
 #include "gntmenu.h"
+#include "gntmenuitemcheck.h"
 
 #include <string.h>
 
@@ -60,8 +61,14 @@
 static void
 menu_tree_add(GntMenu *menu, GntMenuItem *item, GntMenuItem *parent)
 {
-	gnt_tree_add_row_last(GNT_TREE(menu), item,
-		gnt_tree_create_row(GNT_TREE(menu), item->text, item->submenu ? ">" : " "), parent);
+	if (GNT_IS_MENUITEM_CHECK(item)) {
+		gnt_tree_add_choice(GNT_TREE(menu), item,
+			gnt_tree_create_row(GNT_TREE(menu), item->text, " "), parent, NULL);
+		gnt_tree_set_choice(GNT_TREE(menu), item, gnt_menuitem_check_get_checked(GNT_MENUITEM_CHECK(item)));
+	} else
+		gnt_tree_add_row_last(GNT_TREE(menu), item,
+			gnt_tree_create_row(GNT_TREE(menu), item->text, item->submenu ? ">" : " "), parent);
+
 	if (0 && item->submenu) {
 		GntMenu *sub = GNT_MENU(item->submenu);
 		GList *iter;
@@ -126,8 +133,6 @@
 	int current = menu->selected;
 
 	if (menu->submenu) {
-		/*if (gnt_widget_key_pressed(GNT_WIDGET(menu->submenu), text))*/
-			/*return TRUE;*/
 		return (gnt_widget_key_pressed(GNT_WIDGET(menu->submenu), text));
 	}
 
@@ -178,6 +183,21 @@
 }
 
 static void
+gnt_menu_toggled(GntTree *tree, gpointer key)
+{
+	GntMenuItem *item = GNT_MENUITEM(key);
+	GntMenu *menu = GNT_MENU(tree);
+	gboolean check = gnt_menuitem_check_get_checked(GNT_MENUITEM_CHECK(item));
+	gnt_menuitem_check_set_checked(GNT_MENUITEM_CHECK(item), !check);
+	if (item->callback)
+		item->callback(item, item->callbackdata);
+	while (menu) {
+		gnt_widget_hide(GNT_WIDGET(menu));
+		menu = menu->parentmenu;
+	}
+}
+
+static void
 gnt_menu_activate(GntWidget *widget)
 {
 	GntMenu *menu = GNT_MENU(widget);
@@ -189,8 +209,12 @@
 		item = gnt_tree_get_selection_data(GNT_TREE(menu));
 	}
 
-	if (item)
-		menuitem_activate(menu, item);
+	if (item) {
+		if (GNT_MENUITEM_CHECK(item))
+			gnt_menu_toggled(GNT_TREE(widget), item);
+		else
+			menuitem_activate(menu, item);
+	}
 }
 
 static void
@@ -220,6 +244,8 @@
 	wid_class->activate = gnt_menu_activate;
 	wid_class->hide = gnt_menu_hide;
 
+	parent_class->toggled = gnt_menu_toggled;
+
 	GNTDEBUG;
 }