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

来源:互联网 发布:java 字节码增强 asm 编辑:程序博客网 时间:2024/04/26 01:50

接口代码:

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;
}

原创粉丝点击