设计器写回
设计器是 .dui 的图形前端——它的改动写进哪一行、怎样不弄乱手写的文件,以及哪些改动它拒绝写(DUI7xxx)。
设计器是这个文件的一个前端:在设计器里做的改动,就是对文本的改动。值写进装着它的那一行——或者在节点已有的行后面新加一行—— 文件其余部分逐字节保持原样。设计器本身的用法见设计器。
写什么、不写什么
写回比较的是值,不是源文本。对每一个可能改过的属性,它问的是:按现在的文本重建,会不会得到树上现在的这个值? 会,就说明文件已经这么写了,不管拼法如何都不写。所以:
- 在设计器里打开一个手写的文件,什么也不会被写。你写的
(400,240)不会被改成(400, 240),0.50也不会变成0.5。 - 比较用的基准树是用编译器用的同一个建树器、从当前文本建出来的,所以样式、类默认值、枚举的拼法、本地化,答案都和真正编译时一致。
- 一个值来自样式的属性被改了,写成节点上的覆盖,而不会悄悄改动其他节点也在穿的样式。
- 没有
.dui写法的值——对象引用、没有短写形式的结构体——直接跳过,不去猜。往作者的文件里写一个看似合理的错值,比少一个功能更糟。 - 一次刷新是一步撤销。什么都没变时根本不写:空的撤销步骤会让 Ctrl+Z 看似无效,用户再按一次就丢了前一步。
- 文本解析不了或建不了树时什么也不写:没有基准,每个属性看起来都变了,一次刷新就会在作者修错的途中把整个文件重写一遍。
写出来的格式和 VS Code 扩展的格式化一致(= 和箭头两边各一个空格、} 独占一行等),两者不会互相打架。
改动落在装着值的那一行上,不管节点的类型是怎么写的(容器类型、别名、无名节点都一样);节点有 @slot { … } 块时写进那个块里;
无名节点按为它造的 id 定位。嵌套的组件实例里面的内容属于另一个文件,这里不写;for 在运行时造的副本不是任何一行,也不写。
文件在磁盘上被别人改了(比如在 VS Code 里保存),由此触发的重新编译以文件为准,不会把设计器里较旧的值刷回去。 设计器有一个待写的改动、而文件在它底下变了,这次什么也不写(DUI7002)。
结构上的改动
在设计器里加的 widget,按这个文件会用的类型写出来:这个类在本文件里有 use … as 别名就用别名,排布子节点的普通 widget 写成容器类型
(VerticalBox Column)。
拖进组件实例某个具名槽位的 widget,写进那个槽位的填充块 slot Detail { … };实例还没有这个块时先写出它。
给一个无名节点改名,会把它的第一个 id 写在类型后面。改名前:
Widget Root {
+ HorizontalBox { Spacing = 14 }
Text { Text = "Status" }
}在设计器里把那个 Text 改名为 Status 之后:
Widget Root {
+ HorizontalBox { Spacing = 14 }
Text Status { Text = "Status" }
}给一个有名字的节点改名,会写上 (was: OldId),让下一次编译把图表引用、绑定和动画轨道搬过去(见节点与值)。
for 或 each 的模板不会被删掉或移出循环:没有东西可重复的循环建不起来。
@fill 简写
新的权重替换 @fill 2 里的数字;一个裸的 @fill 被改成别的规则时,变成 @slot SizeRule = …。改之前:
Widget Root {
+ HorizontalBox { }
Text Label {
Text = "Volume"
@fill
}
}在设计器里把 Label 的 SizeRule 改成 Auto 之后:
Widget Root {
+ HorizontalBox { }
Text Label {
Text = "Volume"
@slot SizeRule = Auto
}
}设计器拒绝写的改动
有几种东西没有一行可以写进去,设计器会说出来(DUI7004),而不是凭空造一行:
- 由
if显示或隐藏的 widget 的可见性。 改条件,或者把 widget 移出分支。见 if 与 for。 @fill 2上 Fill 以外的SizeRule。 把它换成@slot SizeRule = …和@slot FillWeight = 2两行。rows表格里一行上的改动,除了某一列的值和这一行自己的块里的行。 行的那一行只写得下它的列。列的值会被替换在它的格子里; 但不能从设计器删除、移动、命名一行或给它加+块,也不能在表格旁边放节点(那个位置在表格里面)——这些去改文本。 见 rows 表格。
来自样式 + Component 行的值也不写(DUI7005):样式是共用的,节点自己又没有 + 行装这个改动。
在节点上加一行(+ VerticalBox { Spacing = 20 }),或者去改样式:
style Column {
+ VerticalBox { Spacing = 8 }
}
Widget Root {
+ HorizontalBox { }
Widget Left : Column {
+ VerticalBox { Spacing = 20 }
}
}