42 lines
2.6 KiB
Plaintext
42 lines
2.6 KiB
Plaintext
// 托管 Window 资源与原生窗口相连:源码排出 resize/title 命令,成功刷新后由 GUI 线程执行。
|
||
// 实际可用视口再返回布局约束,原生窗口尺寸不是业务对象上凭空写入的一份几何副本。
|
||
// 保存目标 Window,两个按钮对同一资源请求不同尺寸。
|
||
class WindowActions {
|
||
// 保存一个 Window 资源引用;事件发生在哪个按钮并不重新选择目标窗口,两个方法始终使用这个字段。
|
||
window: Window
|
||
// 请求 900x600 逻辑尺寸,最终大小仍由窗口管理器决定。
|
||
function compact(self: WindowActions, event: Event): Unit {
|
||
// compactConnection 派发此绑定方法,只发 resize 请求,不给 band 或 Mount 直接写宽高。
|
||
self.window.resize(900, 600)
|
||
}
|
||
// 请求 1120x720;同次输入多次 resize 可由命令队列合并到最后值。
|
||
function wide(self: WindowActions, event: Event): Unit {
|
||
// wideConnection 调用此事件入口;实际窗口变化回报后,新父约束才进入下面 WindowBand.measure。
|
||
self.window.resize(1120, 720)
|
||
}
|
||
}
|
||
// 原生矩形的测量覆盖展示父约束如何随窗口变化。
|
||
class WindowBand: RectBlock {
|
||
// 取当前出现位置 maxWidth 作为期望宽度,固定高 32;不读取其他窗口的尺寸。
|
||
function measure(self: WindowBand, mount: Mount, constraints: Constraints): MeasureResult {
|
||
// source_layout 在每个出现的测量阶段调用,maxWidth 是上层已扣除布局预算的约束,不是整窗原始宽度。
|
||
return MeasureResult(constraints.maxWidth, 32)
|
||
}
|
||
}
|
||
// 此文件顶层在默认主窗口上下文执行,ui.window() 因而取主窗口;事件/渲染回调中则跟随其当前窗口上下文。
|
||
// page.open 指定保存的同一资源,后面的 title/resize 为异步原生命令,不等于已改变原生实际尺寸。
|
||
window = ui.window()
|
||
actions = WindowActions(window)
|
||
band = WindowBand(80, 32, 0, "#237A45")
|
||
compact = Button("紧凑窗口 900 × 600")
|
||
wide = Button("宽窗口 1120 × 720")
|
||
compactConnection = compact.on("click", actions.compact)
|
||
// 两个回调均接收 Event,保存连接不等于立即请求尺寸;初次尺寸由文件最后的 resize 设置。
|
||
wideConnection = wide.on("click", actions.wide)
|
||
page = Page()
|
||
page.render(Column(24, 16, TextBlock("代码与 GUI 操作同一个受管窗口对象"), band, compact, wide))
|
||
page.open(window)
|
||
// 明确归属后向同一 window 排队标题和尺寸命令;Page 的业务内容与原生窗口资源分别保留身份。
|
||
window.setTitle("Endor Window")
|
||
window.resize(1120, 720)
|