Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198938
  • 博文数量: 60
  • 博客积分: 3269
  • 博客等级: 中校
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2005-09-21 10:48
文章存档

2012年(6)

2011年(6)

2010年(30)

2009年(8)

2007年(6)

2005年(4)

我的朋友

分类: C/C++

2010-01-17 05:10:18

/* *********************************************************
 * lgx_storeview module version 1.0 manual
 *     edited by LGX. based on GTK 2.
 *     2010.01.15
 * http://leadgenius.cublog.cn/
 *
 *     current version 0.9.1
 *
 * 1、通过一个结构数组定义stroe和treeview显示
 * 2、支持文本、整数、toggle控件、combox控件和图片样式的列column
 * 3、支持可编辑cell/column的修改更新
 * 4、自动记录行row的添加/修改状态标记,支持标记列的显示
 * 5、可自定义column宽度,支持宽度自适应
 * 6、column可拖动调整宽度
 * 7、鼠标点击列排序
 * 8、支持列的edit/activate/sensitive属性的设置
 * 9、目前只支持基于liststore的treeview,简单的行列表形式
 * 10、最大支持255列
 *
 * a、每种属性和设置直接针对一列应用,丧失treeview的可对每个row^column(cell)的属性控制能力。
 * **********************************************************/
 
 说明:

 一、定义结构
    typedef struct STORVIEW_DATA {
 GType column_type;  // store field data type
 gchar *column_name;  // column text
 gint column_size;  // column width. >0 the fixed. auto when =0
 unsigned int attr;  // column type and attributions
 void *udata;   // user data. see example
 StoreView_ChgCallback ucallback; // a user call back
    }StorView_data;
 
    GtkTreeView * liststoreview_new(guint dnum, StorView_data *data, guint type);
 
 二、简单例子
    StorView_data exampleSVdata[] = {
 {G_TYPE_STRING, "编号", 70, SVCOL_TEXT, NULL, NULL},
 {G_TYPE_STRING, "姓名", 100, SVCOL_TEXT|SVCOL_EDITABLE, NULL, NULL},
 {G_TYPE_STRING, "电话", 70, SVCOL_TEXT|SVCOL_EDITABLE|SVCOL_SORTABLE, NULL, NULL},
 {G_TYPE_STRING, "地址", 0, SVCOL_TEXT|SVCOL_RESZABLE, NULL, NULL},
 {G_TYPE_STRING, "adder", 0, SVCOL_INVISIABLE, NULL, NULL},
 {G_TYPE_STRING, "addtime", 0, SVCOL_INVISIABLE, NULL, NULL}
 };
    GtkTreeView * lgx_listview;
    lgx_listview = liststoreview_new(sizeof(exampleSVdata)/sizeof(*exampleSVdata), exampleSVdata, SVTYPE_NOFLAG);
    这个例子生成一个6个字段的liststore,并且显示编号、姓名、电话、地址4个列的treeview。
    store的type全是G_TYPE_STRING。
    SVCOL_TEXT|SVCOL_EDITABLE|SVCOL_SORTABLE表示text类型的column显示,并且可直接编辑可通过鼠标点击列头部分进行排序。
    SVCOL_INVISIABLE表示这一列只在liststore中存在,但并不显示在view中。其他属性忽略。
    // 获得model
 GtkTreeModel *model = gtk_tree_view_get_model (lgx_listview);
    // 获得store
 GtkListStore *store = GTK_LIST_STORE (model);
    就可以操作treeview的显示内容了
    // 取得修改标记列序号,按照习惯也可以用对store的枚举数值
 gint colmaxnum = gtk_tree_model_get_n_columns(model);
    colmaxnum列中记录每一行的修改状态,如下:
        SVCOL_ST_EDITED:行已经被修改过
        SVCOL_ST_APPEND:新添加的行
        SVCOL_ST_REMOVE:行已经删除,用于假删除需要
    状态值可或操作。

 三、其他的定义
    // new一个LGX storeview widget
    GtkTreeView * liststoreview_new(guint dnum, StorView_data *data, guint type);
    type取值为:
        SVTYPE_NOFLAG:不显示操作标记列
        SVTYPE_CHRFLAG:显示操作标记列,并以字符标明行的修改状态
        SVTYPE_STRFLAG:显示操作标记列,并以文本标明行的修改状态
        SVTYPE_PICFLAG:显示操作标记列,并以图标标明行的修改状态
    目前v1.0只有 SVTYPE_NOFLAG和SVTYPE_CHRFLAG。
    // 查看LGX storeview是否有所修改,返回1已经修改,0没有修改
    gint liststoreview_model_ischanged(GtkTreeModel *model);
    gint liststoreview_treeview_ischanged(GtkTreeView *treeview);
 
 四、另一个例子
    StorView_data exampleSVdata[] = {
 {G_TYPE_UINT, "编号", 70, SVCOL_TEXT|SVCOL_DESENSABLE, NULL, NULL},
 {G_TYPE_STRING, "姓名", 100, SVCOL_TEXT|SVCOL_EDITABLE|SVCOL_RESZABLE, NULL, NULL},
 {G_TYPE_STRING, "电话", 70, SVCOL_TEXT|SVCOL_EDITABLE|SVCOL_SORTABLE, NULL, NULL},
 {G_TYPE_STRING, "性别", 0, SVCOL_COMBO, NULL, NULL},
 {G_TYPE_BOOLEAN, "可见?", 0, SVCOL_TOGGLE|SVCOL_DEACTIABLE, NULL, NULL},
 {G_TYPE_OBJECT, "醒目:)", 0, SVCOL_PIXBUF, NULL, NULL}
 };
    SVCOL_PIXBUF列column对应的store中放入GdkPixbuf的指针就行。
    SVCOL_COMBO列column在new之后通过udata返回一个gtk_list_store_new (1, G_TYPE_STRING)的指针,向这个store中append数据加入下拉内容。
 
五、代码
    在MinGW2.0下编译运行通过。
 lgx_listview = liststoreview_new(sizeof(exampleSVdata)/sizeof(*exampleSVdata), exampleSVdata, SVTYPE_CHRFLAG);
 gtk_container_add (GTK_CONTAINER (scrollw), (GtkWidget *)lgx_listview);
 
 
 // Add some data into storeview here.
 GtkTreeModel *model;
 GtkListStore *store;
 GtkTreeIter iter;
 
 //// fill combox contents
 store = (GtkListStore *)exampleSVdata[EXPSV_COL_COMBOX].udata;
 gtk_list_store_append (store, &iter);
 gtk_list_store_set (store, &iter, 0, g_locale_to_utf8("男", -1,NULL,NULL,NULL), -1);
 gtk_list_store_append (store, &iter);
 gtk_list_store_set (store, &iter, 0, g_locale_to_utf8("女", -1,NULL,NULL,NULL), -1);
 gtk_list_store_append (store, &iter);
 gtk_list_store_set (store, &iter, 0, g_locale_to_utf8("二", -1,NULL,NULL,NULL), -1);
 model = gtk_tree_view_get_model(lgx_listview);
 store = GTK_LIST_STORE (model);
 
 gtk_list_store_append (store, &iter);
 gtk_list_store_set (store, &iter,
    EXPSV_COL_UINT, 1,
    EXPSV_COL_STR1, g_locale_to_utf8("酱油甲", -1,NULL,NULL,NULL),
    EXPSV_COL_STR2, g_locale_to_utf8("123456", -1,NULL,NULL,NULL),
    EXPSV_COL_COMBOX, g_locale_to_utf8("男", -1,NULL,NULL,NULL),
    EXPSV_COL_TOGGLE, TRUE,
    EXPSV_COL_PIC, gtk_image_get_pixbuf (GTK_IMAGE(gtk_image_new_from_file (FRIDAYBOX_ICON))),
    -1);
 // Stop add item now.
文件: lgx_storeview.rar
大小: 205KB
下载: 下载
阅读(877) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-01-19 23:52:12

谢谢,很好的学习资料哦