您的位置:首页 > 其它

用gtk写的动态添加删除菜单、菜单项、子菜单的接口

2010-01-29 16:11 609 查看
接口代码:

menu.h

/*
* menu.h
*
* -- Dynamic menu facility.
*/

#ifndef __MENU_H__
#define __MENU_H__

struct path_nc
{
char *path_name[100];
int i;
};

/* 获得菜单项的名字 */
gchar *g_menu_item_get_label (GtkWidget *menu_item);

/* 获得path的各个名字和个数 */
struct path_nc g_path_get(char path[]);

/* 获得菜单, 比如 "/文件/打开..." */
GtkWidget *g_menu_shell_get_menu (GtkWidget *menu_shell, char path[]);

/* 在菜单条中插入一个菜单 */
GtkWidget *g_menu_shell_insert_menu (GtkWidget *menu_shell,
char path[],
int position);

/* 在菜单中插入一个菜单项 */
GtkWidget *g_menu_shell_insert_item (GtkWidget *menu_shell,
char path[],
int position,
GCallback callback,
gpointer data);

/* 删除一个菜单项 */
void g_menu_shell_delete (GtkWidget *menu_shell, char path[]);

#endif

menu.c

/*
*
* menu.c
*
* -- Dynamic menu facility.
*/

#include <gtk/gtk.h>
#include <string.h>
#include "menu.h"

/* 获得菜单项的名字 */
gchar *g_menu_item_get_label (GtkWidget *menu_item)
{
if(GTK_BIN(menu_item)->child)
{
GtkWidget *child;

child = GTK_BIN(menu_item)->child;
if(GTK_IS_LABEL(child))
{
gchar *text;

gtk_label_get(GTK_LABEL(child), &text);
return text;
}
}
}

/* 获得path的各个名字和个数 */
struct path_nc g_path_get(char path[])
{
char *name = NULL;
struct path_nc pnc;
char *p = "/";
int i = 0;

path = strdup(path);
name = strtok(path, p);

while(name != NULL)
{
pnc.path_name[i] = name;
name = strtok(NULL, p);
i++;
pnc.i = i;
}

return pnc;
}

/* 获得菜单, 比如 "/文件/打开..." */
GtkWidget *g_menu_shell_get_menu (GtkWidget *menu_shell, char path[])
{
GList *menu_list = NULL;
gchar *purpose_menu_name = NULL;
GtkWidget *purpose_menu;
GtkWidget *all_menubar;
gboolean yes_no = FALSE;
GtkWidget *menu;
GtkWidget *rootmenu;
int j = 0, k = 1, l = 0;
struct path_nc pnc;

pnc = g_path_get(path);
all_menubar = menu_shell;

for(j=0; j<pnc.i; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
purpose_menu = menu_list->data;
yes_no = TRUE;
break;
}
}

if(yes_no)
{
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(purpose_menu));
}
else
{
for(l=0; l<(pnc.i-k); l++)
{
rootmenu = gtk_menu_item_new_with_label(pnc.path_name[j]);
j++;
menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu);
gtk_menu_shell_append(GTK_MENU_SHELL(all_menubar), rootmenu);
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(rootmenu));
gtk_widget_show_all(menu);
}
break;
}
k++;
yes_no = FALSE;
}
return all_menubar;
}

/* 在菜单条中插入一个菜单/子菜单 */
GtkWidget *g_menu_shell_insert_menu (GtkWidget *menu_shell,
char path[],
int position)
{
GtkWidget *menu;
GtkWidget *rootmenu;
GtkWidget *purpose_menu;
struct path_nc pnc;

pnc = g_path_get(path);
rootmenu = gtk_menu_item_new_with_label(pnc.path_name[pnc.i-1]);
menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu);
if(pnc.i == 1)
{
gtk_menu_shell_insert(GTK_MENU_SHELL(menu_shell), rootmenu, position-1);
}
else
{
purpose_menu = g_menu_shell_get_menu(menu_shell, path);
gtk_menu_shell_insert(GTK_MENU_SHELL(purpose_menu), rootmenu, position-1);
}
gtk_widget_show_all(menu);
return menu;
}

/* 在菜单中插入一个菜单项 */
GtkWidget *g_menu_shell_insert_item (GtkWidget *menu_shell,
char path[],
int position,
GCallback callback,
gpointer data)
{
GtkWidget *item;
gint menu_len;
GtkWidget *purpose_menu;
struct path_nc pnc;

pnc = g_path_get(path);
purpose_menu = g_menu_shell_get_menu(menu_shell, path);
item = gtk_menu_item_new_with_label(pnc.path_name[pnc.i-1]);
gtk_menu_shell_insert(GTK_MENU_SHELL(purpose_menu), item, position-1);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(callback), data);

gtk_widget_show(item);
return item;
}

/* 删除一个菜单项 */
void g_menu_shell_delete (GtkWidget *menu_shell, char path[])
{
GList *list = NULL, *lt = NULL;
GList *menu_list = NULL;
GtkWidget *purpose_menu, *menu_item;
GtkWidget *all_menubar;
gchar *purpose_menu_name = NULL;
int j = 0, position = 0;
struct path_nc pnc;
gboolean yes_no = FALSE;

pnc = g_path_get(path);
all_menubar = menu_shell;

for(j=0; j<pnc.i-1; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
purpose_menu = menu_list->data;
yes_no = TRUE;
break;
}
}

if(yes_no)
{
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(purpose_menu));
yes_no = FALSE;
}
else
{
printf("Please cheak your PATH!/nIs there %s ?/n/n/n", pnc.path_name[j]);
yes_no = TRUE;
break;
}
}

if(!yes_no)
{
purpose_menu = all_menubar;

for(j=0; j<pnc.i; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
menu_item = menu_list->data;
yes_no = TRUE;
break;
}
}
}

if(yes_no)
{
list = g_list_find(GTK_MENU_SHELL(purpose_menu)->children, menu_item);
GTK_MENU_SHELL(purpose_menu)->children = g_list_remove(GTK_MENU_SHELL(purpose_menu)->children, list->data);
}
else
{
printf("Please cheak your PATH!/nIs there %s ?/n", pnc.path_name[pnc.i-1]);
return;
}
}
else
return;
}

测试程序:

addmenu.c

/*hxy--addmenu*/

#include <gtk/gtk.h>
#include "menu.h"

int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *rootmenu,*menubar;
GtkWidget *menu;
GtkWidget *item;
gchar *ch;
gint i;
GtkWidget *testmenu;
GtkWidget *all_menubar;
struct path_nc pnc;

gtk_init(&argc,&argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"Add menu test");
gtk_window_set_default_size(GTK_WINDOW(window),300,200);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);

menubar = gtk_menu_bar_new();
gtk_box_pack_start(GTK_BOX(vbox),menubar,0,0,0);

menu = gtk_menu_new();
rootmenu = gtk_menu_item_new_with_label("rootmenu");

item = gtk_menu_item_new_with_label("menuitem 1");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);

item = gtk_menu_item_new_with_label("menuitem 2");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
ch = g_menu_item_get_label(item);
printf("%s/n", ch);

gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);

pnc = g_path_get("File/recent/1");
//printf("%s/n", pnc.path_name[1]);
//printf("%d/n", pnc.i);

//item = g_menu_shell_insert_item(menubar, "/rootmenu/item 1", 1, gtk_main_quit, NULL);

menu = gtk_menu_new();
rootmenu = gtk_menu_item_new_with_label("rootmenu 2");

item = gtk_menu_item_new_with_label("menuitem 21");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);

item = gtk_menu_item_new_with_label("menuitem 22");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);

gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);

//menu = g_menu_shell_insert_menu(menubar, "menu 1", 1);
//item = g_menu_shell_insert_item(menubar, "/menu 1/item 4", 2, gtk_main_quit, NULL);
menu = g_menu_shell_insert_menu(menubar, "/rootmenu/submenu", 2);
//item = g_menu_shell_insert_item(menubar, "/rootmenu/item 6", 1, gtk_main_quit, NULL);
item = g_menu_shell_insert_item(menubar, "/rootmenu/submenu/item 7/a/b/c/d/f/g/h/i", 1, gtk_main_quit, NULL);
item = g_menu_shell_insert_item(menubar, "/rootmenu/submenu/item 8", 10, gtk_main_quit, NULL);

g_menu_shell_delete(menubar, "/rootmenu/submenu/item 77");
//g_menu_shell_delete(menubar, "/rootmenu/submenu");

gtk_widget_show_all(window);
gtk_main();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: