gtk4listmodel知多少?(代码片段)

从善若水 从善若水     2022-12-17     628

关键词:

【GTK4】LIST MODEL总结

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


博客内容主要围绕:
       5G协议讲解
       算力网络讲解(云计算,边缘计算,端计算)
       高级C语言讲解
       Rust语言讲解

一、LIST MODEL创建、管理工具

通过这些工具我们可以通过修改、结合我们现有的models,去创建新的models

1️⃣ GtkSliceListModel

       取一个现有model的切片,由偏移量和大小给出,并创建一个只包含这些项的新model。如果你想在页面视图中显示一个大列表,这是很有用的——前进和后退按钮将根据大小增加或减少偏移量。切片模型还可以用来递增地填充列表,方法是随着时间的推移增大切片。

2️⃣ GtkFlattenListModel

       取几个list model并将它们组合成一个。当您需要组合来自多个来源的数据时,这是非常有用的,例如GTK在打印对话框中处理纸张大小。

Note:组合成flatten model之后,原始model继续存在,并且原始model的更新将传播到flatten model。

3️⃣ GtkMapListModel

       有时,你的 list model 中有数据,但它的形式并不完全正确。在这种情况下,可以使用GtkMapListModel将原始模型中的每个项替换为不同的项


二、LIST MODEL的具体应用

1️⃣ Pango objects

       这里的第一个例子是Pango objects,它为自己的数据对象实现了list model 接口:

  • PangoFontMap是PangoFontFamily对象的list model,PangoFontFamily是PangoFontFace对象的list model。字体选择器正在使用这些模型。

2️⃣ GtkDirectoryList和GtkBookmarkList

       下一个示例是GtkDirectoryList和GtkBookmarkList对象,它们将在文件选择器中用于表示目录内容和书签。一个有趣的细节是,它们都需要做IO来填充它们的内容,而且它们是异步进行的,以避免阻塞UI很长时间。

3️⃣ GtkDropDown

       GtkStringList是一个简单的 list model 包装非常常见的字符串数组。经常使用这种列表模型的一个例子是GtkDropDown。这是如此常见,以至于GtkDropDown有一个方便的构造函数,它接受一个字符串数组,并为你创建GtkStringList:

GtkWidget * gtk_drop_down_new_from_strings (const char * const * strings)

三、LIST MODEL的增强版本

GtkSelectionModel

GtkSelectionModel对list model进行了扩展

GtkSelectionModel 对 list model 中的每个项,无论是否被选中都会维护信息。可以通过下面的函数获取item 的选择状态👇

gboolean gtk_selection_model_is_selected (GtkSelectionModel *model ,guint pos)

GtkBitset * gtk_selection_model_get_selection (GtkSelectionModel *model)

所以你可以获得单个项目的选择信息,或者以bitset的形式获得整个项目的选择信息。当然,还有一个::selection-changed信号,其工作方式与GListModel的::items-changed信号非常相似。

三种GtkSelectionModel实现

GTK有三种GtkSelectionModel实现:

  • GtkSingleSelection :同一时刻只能选择一个item
  • GtkMultiSelection : 同一时刻可以选择多个item
  • GtkNoSelection : 任何item 都不可以被选中

gtk4-demo中关于GtkMultiSelection 的例子

GtkGridView colors demo


四、可实现动态过滤、排序的 LIST MODEL

       这两个model分别为 GtkFilterListModelGtkSortListModel。它们俩都使用辅助对象GtkFilter 和 GtkSorter来帮助实现item 的过滤与排序。

这里有一个gtk4-demo中的例子,它就是使用GtkFilterListModel 实现的关键字过滤👇

GtkFilterListModel

下面👇附上具体的code,以供参考:

#include <gtk/gtk.h>

static GtkWidget *window = NULL;
static GtkWidget *progress;

const char *factory_text =
"<?xml version='1.0' encoding='UTF-8'?>\\n"
"<interface>\\n"
"  <template class='GtkListItem'>\\n"
"    <property name='child'>\\n"
"      <object class='GtkLabel'>\\n"
"        <property name='ellipsize'>end</property>\\n"
"        <property name='xalign'>0</property>\\n"
"        <binding name='label'>\\n"
"          <lookup name='string' type='GtkStringObject'>\\n"
"            <lookup name='item'>GtkListItem</lookup>\\n"
"          </lookup>\\n"
"        </binding>\\n"
"      </object>\\n"
"    </property>\\n"
"  </template>\\n"
"</interface>\\n";

static void
update_title_cb (GtkFilterListModel *model)

  guint total;
  char *title;
  guint pending;

  total = g_list_model_get_n_items (gtk_filter_list_model_get_model (model));
  pending = gtk_filter_list_model_get_pending (model);

  title = g_strdup_printf ("%u lines", g_list_model_get_n_items (G_LIST_MODEL (model)));

  gtk_widget_set_visible (progress, pending != 0);
  gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), (total - pending) / (double) total);
  gtk_window_set_title (GTK_WINDOW (window), title);
  g_free (title);


GtkWidget *
do_listview_words (GtkWidget *do_widget)

  if (window == NULL)
    
      GtkWidget *listview, *sw, *vbox, *search_entry, *overlay;
      GtkFilterListModel *filter_model;
      GtkStringList *stringlist;
      GtkFilter *filter;

      char **words;
      words = g_strsplit ("lorem ipsum dolor sit amet consectetur adipisci elit sed eiusmod tempor incidunt labore et dolore magna aliqua ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat", " ", -1);
      stringlist = gtk_string_list_new ((const char **) words);
      g_strfreev (words);
      g_object_unref (file);

      filter = GTK_FILTER (gtk_string_filter_new (gtk_property_expression_new (GTK_TYPE_STRING_OBJECT, NULL, "string")));
      filter_model = gtk_filter_list_model_new (G_LIST_MODEL (stringlist), filter);
      gtk_filter_list_model_set_incremental (filter_model, TRUE);

      window = gtk_window_new ();
      gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);

      gtk_window_set_display (GTK_WINDOW (window),
                              gtk_widget_get_display (do_widget));
      g_object_add_weak_pointer (G_OBJECT (window), (gpointer*)&window);

      vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
      gtk_window_set_child (GTK_WINDOW (window), vbox);

      search_entry = gtk_search_entry_new ();
      g_object_bind_property (search_entry, "text", filter, "search", 0);
      gtk_box_append (GTK_BOX (vbox), search_entry);

      overlay = gtk_overlay_new ();
      gtk_box_append (GTK_BOX (vbox), overlay);

      progress = gtk_progress_bar_new ();
      gtk_widget_set_halign (progress, GTK_ALIGN_FILL);
      gtk_widget_set_valign (progress, GTK_ALIGN_START);
      gtk_widget_set_hexpand (progress, TRUE);
      gtk_overlay_add_overlay (GTK_OVERLAY (overlay), progress);

      sw = gtk_scrolled_window_new ();
      gtk_widget_set_vexpand (sw, TRUE);
      gtk_overlay_set_child (GTK_OVERLAY (overlay), sw);

      listview = gtk_list_view_new (
          GTK_SELECTION_MODEL (gtk_no_selection_new (G_LIST_MODEL (filter_model))),
          gtk_builder_list_item_factory_new_from_bytes (NULL,
              g_bytes_new_static (factory_text, strlen (factory_text))));
              
      gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), listview);

      g_signal_connect (filter_model, "items-changed", G_CALLBACK (update_title_cb), progress);
      g_signal_connect (filter_model, "notify::pending", G_CALLBACK (update_title_cb), progress);
      update_title_cb (filter_model);

    

  if (!gtk_widget_get_visible (window))
    gtk_widget_show (window);
  else
    gtk_window_destroy (GTK_WINDOW (window));

  return window;



五、其它的 LIST MODEL

       在GTK4中还有一些列表模型实现不能很好地适合上述任何组,如GtkTreeListModel、GtkSelectionFilterModel或GtkShortcutController。今天我就不讲这些了。


unitofwork知多少(代码片段)

原文链接:https://www.cnblogs.com/sheng-jie/p/7416302.html1.引言Maintainsalistofobjectsaffectedbyabusinesstransactionandcoordinatesthewritingoutofchangesandtheresolutionofconcurrencyproblems.UnitofWork  查看详情

玩转springboot原理篇(核心注解知多少)(代码片段)

type=FilterType.CUSTOM,classes=TypeExcludeFilter.classtype=FilterType.CUSTOM,classes=AutoConfigurationExcludeFilter.classSpringBootApplicationSpringBootConfigurationComponentScanEnableAutoConfiguratio 查看详情

__attribute__你知多少(代码片段)

__ATTRIBUTE__你知多少?GNUC 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(FunctionAttribute )、变量属性(VariableAttribute )和类型属性(TypeAttribute )。__attribute__ 书写特征是:__attribu 查看详情

io模型知多少|代码篇(代码片段)

引言之前的一篇介绍IO模型的文章IO模型知多少|理论篇比较偏理论,很多同学反应不是很好理解。这一篇咱们换一个角度,从代码角度来分析一下。socket编程基础开始之前,我们先来梳理一下,需要提前了解的几个概念:socket:直... 查看详情

typescriptinterfacevstype知多少(代码片段)

接口和类型别名非常相似,在大多情况下二者可以互换。在写TS的时候,想必大家都问过自己这个问题,我到底应该用哪个呢?希望看完本文会给你一个答案。知道什么时候应该用哪个,首先应该了解二者之间的相同点和不同点... 查看详情

int类型知多少(代码片段)

前言:整型是MySQL中最常用的字段类型之一,通常用于存储整数,其中int是整型中最常用的,对于int类型你是否真正了解呢?本文会带你熟悉int类型相关知识,也会介绍其他整型字段的使用。1.整型分类及存储范围整数类型字节... 查看详情

编码命名方式知多少(代码片段)

文章目录1.camelcase(驼峰式)2.snakecase(蛇形式)3.kebabcase(烤串式)4.匈牙利命名法5.小结参考文献编码时,命名无处不在。比如我们需要对文件命令,对目录命名,对变量命名,还有其他类... 查看详情

eshoponcontainers知多少[4]:catalogmicroservice(代码片段)

引言Catalogmicroservice(目录微服务)维护着所有产品信息,包括库存、价格。所以该微服务的核心业务为:产品信息的维护库存的更新价格的维护架构模式如上图所示,本微服务采用简单的数据驱动的CRUD微服务架构,来执行产品... 查看详情

[转]梦里babel知多少(代码片段)

平时开发中,经常需要用到ES6/ES7的语法。那么就需要用到Babel来对代码进行转码处理。 之前用Vue比较多,所以以Vue-cli作为参考来分析。 第一张图是几个月前的Vue-cli生成的 第二个图是今天使用Vue-cli生成的Babel-core顾... 查看详情

elasticsearch语法知多少之matchquery(代码片段)

目录目标ES版本信息官方文档相关术语创建相关的索引和文档(数据用于实战案例)创建索引索引文档Matchquery常见参数实战基本语法analyzer(指定分词器查询)operator(解释查询条件的布尔逻辑)minimum_should_match(最少匹配数)fuzzy... 查看详情

asp.netcore反向代理部署知多少(代码片段)

Nginx配置路由转发首先来看下IdentityServer4.Admin的项目结构:IdentityServer4.Admin/├──Id4.Admin.Api#用于提供访问Id4资源的WebApi项目├──Id4.Admin#用于提供管理Id4资源的Web管理面板├──Id4.STS.Identity#用于提供STS服务的Web项目作为... 查看详情

字符串匹配算法知多少?(代码片段)

...代码实现KMP算法一说到字符串匹配算法,不知道会有多少小伙伴不由自主的想起那个kmp算法呢?想到是很正常的,谁让它那么优秀呢。BF算法不要被事物的表面现象所迷惑,这个算法全称:BruteForce,有个拉... 查看详情

oauth2.0知多少(代码片段)

 1.引言周末逛简书,看了一篇写的极好的文章,点击大红心点赞,就直接给我跳转到登录界面了,原来点赞是需要登录的。可是没有我并没有简书账号,一直使用的QQ的集成登录。下面有一排社交登录按钮,我们可以用第三... 查看详情

大前端快闪:package.json文件知多少?(代码片段)

...构建完整的全栈技能体系。快闪一:package.json文件知多少如果你使用了nodejs、npm项目、Angular项目等&#x 查看详情

shell:liteos在线调试工具知多少(代码片段)

摘要:Shell作为HuaweiLiteos在线调试工具,可以通过串口工具输入输出,支持常用的基本调试功能。同时用户可以新增定制的命令,新增命令需重新编译烧录后才能执行本文分享自华为云社区《LIteOS----shell应用(... 查看详情

软能力那点事,你知多少(代码片段)

目录一、软能力是什么二、软能力-程序猿生存指南A.沟通能力B.学习能力C.时间管理D.分解能力E.总结改进三、程序猿成长路线1.架构师2.项目经理3.产品经理四、小结在我们日常工作中,常常会听到软能力这一个词汇,尤其是在称... 查看详情

carson带你学java:泛型知识知多少(代码片段)

目录定义意义(即为什么要使用泛型)作用及特点原理额外说明:List能否转为List?定义可理解为适配广泛的类型,即参数化类型,可以把类型像方法的参数那样进行传递。//以ArrayList为示例//泛型T可以是... 查看详情

纯纯的爬虫知识,pythonscrapy下载中间件知多少(代码片段)

这篇博客咱们聊聊scrapy中的DownloaderMiddleware,即下载中间件相关知识。DownloaderMiddlerware首先看一下中间件在scrapy数据流中的位置,下图黑色箭头即下载中间件。结合上图就能看出来,Requests和Response都会通过DownloaderMiddl... 查看详情