DreamGUI
.dui 语言

设计器写回

设计器是 .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 }
    }
}

写回的诊断

代码情况怎么办
DUI7001改动在文件里没有落点:不认识的节点、被绑定的属性、没有块的槽位被绑定的属性由绑定决定,改绑定;其余在文本里补上落点
DUI7002待写的改动期间文件变了,什么也没写等设计器按新文本刷新后再改一次
DUI7003语言写不出的值(非有限数),那一行保持不动换一个有限的值
DUI7004改动的东西没有哪一行写着:if 决定的可见性、写不下改动的简写、表格行照上文改文本
DUI7005改动的是样式 + 行给节点的值在节点上加那一行,或改样式

本页目录