基础属性
基础属性是每个组件都有的属性,可通过组件指针直接访问到它们。你可以在 include/LCUI/gui/widget_base.h 文件中找到它们的定义。
基础属性分为只读和可写两种:
只读的基础属性是经过计算后的结果,手动修改它们的值是没有意义的,因为它们的值会在下次计算后更新,例如:x、y、width、height 这些几何属性,它们是组件的样式经过布局引擎计算后的结果。
可写的基础属性能影响组件的功能和渲染效果,例如:修改 disabled
和 event_blocked
能控制组件的事件响应行为, 修改 custom_style
能覆盖组件原本的样式。这些属性大都有相关的函数来负责修改它们,我们只需要调用它们即可。
接下来让我们通过示例代码来了解一些常用的基础属性。
LCUI_Widget w = LCUIWidget_New(NULL);
// 几何属性的读取
printf("coordinate: (%f, %f)\n", w->x, w->y);
printf("size: (%f, %f)\n", w->width, w->height);
// 类的增删查
Widget_AddClass(w, "button disabled");
if (Widget_HasClass(w, "disabled")) {
Widget_RemoveClass(w, "disabled");
}
// id
Widget_SetId(w, "btn-submit");
printf("is same widget? %d\n", w == LCUIWidget_GetById("btn-submit"));
// 状态/伪类
if (Widget_HasStatus(w, "focus")) {
printf("widget has focus");
}
// 打印最终样式
LCUI_PrintStyleSheet(w->style);
// 打印匹配的样式
LCUI_PrintStyleSheet(w->inherited_style);
// 设置自定义样式
Widget_SetStyle(w, key_margin_left, 10, px);
Widget_SetStyleString(w, "margin-left", "10px");
// 获取已计算的样式
if (w->computed_style.visible) {
Widget_Hide(w);
} else {
Widget_Show(w);
}
扩展属性
扩展属性是可以任意添加、修改和删除的属性,常用于保存自定义数据,或是让特定组件支持用 xml 语言来设置相关功能。它们主要来自于 xml 文档和手动调用 Widget_SetAttribute()
函数,且都以字符串的形式保存在一个以属性名为索引键的哈希表中。
扩展属性的操作例子:
LCUI_Widget w = LCUIWidget_New(NULL);
Widget_SetAttribute(w, "attr", "value");
printf("%s\n", Widget_GetAttribute(w, "attr"));
如果你想让你的组件支持响应 xml 文档中设置属性,举个例子,假设你有个 Timeago 组件提供这些方法:
Timeago_SetDate(w, "2021-01-01T08:00:00.000Z");
Timeago_SetAutoUpdate(w, 60);
Timeago_SetLocale(w, "zh-CN");
那么,首先你需要添加一个 Timeago_SetAttribute()
函数来集中处理属性:
void MyWidget_SetAttribute(
LCUI_Widget w,
const char *name,
const char *val
)
{
if (strcmp(name, "date") === 0) {
...
}
...
}
然后,将它与组件原型上 setattr
方法进行绑定:
my_widget_proto->setattr = MyWidget_SetAttribute;
这样修改后,在 XML 文档中就能这样使用 Timeago 组件:
<timeago date="2021-01-01T08:00:00.000Z" auto-update="60" locale="zh-CN" />
而且还能支持用 Widget_SetAttribute()
函数设置属性:
Widget_SetAttribute(w, "date", "2021-01-01T08:00:00.000Z");
Widget_SetAttribute(w, "auto-update", "60");
Widget_SetAttribute(w, "locale", "zh-CN");
待办事项
给 LCUI_WidgetRec_
结构体中的只读成员加上只读注释
修改 include/LCUI/gui/widget_base.h 中的 LCUI_WidgetRec_
结构体定义,给只读属性加上 (Readonly)
之类的注释。