MyGo v0.5.5 returns ui.Element as a checked value handle instead of a
pointer. Migrated with `mygo migrate-ui`, then fixed what the codemod
leaves to review:
- Element nil checks become .Valid(); absent elements are ui.Element{}.
- Input handlers and paint callbacks run outside the build pass, where
elements expire and Context methods are inert: read IsDisabled into a
local during the build, keep a ui.Handle for Focus, use c.Services()
for clipboard access, create ui.Local state during the build.
- Add core.AutoFocus: v0.5.5 records an overlay's opener after its
content builds, so same-frame autofocus lost focus restore on close.
It focuses one frame later; cascader rows defer their focus likewise.
- core.OverlayLayer identifies build passes by the root element, not
c.Now(), which repeats across passes and under the Tester clock.
- Context menus survive the opening press counted as PressedOutside;
split button tooltip no longer reorders its open menu; disabled
menubar rows pass presses to the panel; Form defers blur-started
async checks so the growing message no longer moves Submit away
from the release; Combobox drops its disabled copy now that MyGo
blocks typing under a disabled wrapper (canary flipped to a guard).
- The Tester clock is virtual: tests use Advance/Now instead of
time.Sleep/time.Now and read element state inside the view. The web
mirror advances the clock to wall time before each frame and input.
- AGENTS.md and docs describe the value Element API and the new pin.
Snapshot goldens are darwin-only and were not re-verified here.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2.4 KiB
2.4 KiB
019 Link 链接
用途
带下划线的链接文本:打开外部地址、在 MyGo Router 中跳转路径,或作为应用内动作。可以显示打开失败的反馈。
最小示例
details := false
view := func(c *ui.Context) {
core.Use(c, core.Settings{})
display.Link(c, "Read the charter", display.LinkOptions{URL: "https://example.com/charter"})
if display.Link(c, "Show details", display.LinkOptions{}).Clicked() {
details = !details
}
}
参数
func Link(c *ui.Context, label string, opts LinkOptions) ui.Element
label 必填,空字符串 panic。
| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
URL |
string |
"" |
有协议的地址用系统默认应用打开。没有协议的路径(如 /notes/42、?tab=info)在 MyGo Router 中跳转。为空时是应用内动作。 |
Error |
string |
"" |
调用方提供的打开失败说明,显示在链接下方,也报告给辅助技术。 |
状态
- 默认:
AccentText颜色,始终带 1 DIP 下划线。外部地址后面带“外部链接”小图标。 - 悬停 / 按下:文字与下划线变为
Text颜色,布局不变。 - 聚焦:2 DIP 焦点环。
- 错误:格式不正确的地址(无法解析,或 http/https 缺少主机名)不会打开,下方显示“无法打开此链接:地址”;
Error非空时优先显示Error。
事件
Clicked():每次点击或按 Enter 都会报告,无论是否打开了地址。同时记录slog.Debug("mujica: link activate")。
键盘操作
| 按键 | 作用 |
|---|---|
| Tab | 聚焦链接 |
| Enter | 激活 |
限制
- MyGo v0.2.10 不报告打开失败。
ui.Link和Context.OpenURL不返回结果(ui/context.go:270、ui/window.go:583)。窗口宿主在 goroutine 中调用Shell.OpenExternal并丢弃它的错误(content.go:55)。因此组件只能自行检查地址格式,系统打开失败无法自动显示。需要这种反馈时,传空URL,在Clicked()后由调用方在 goroutine 中调用mygo.Shell.OpenExternal(url)。它会返回 error,把结果通过Window.Update写回Error。 - 路径是否交给 Router 由 MyGo 决定。没有 Router 时,路径会被当作 URL 交给系统打开。
- 链接不能嵌入
ui.RichText句子中作为行内元素,因为外部图标和错误说明需要额外的行布局。行内链接请直接使用ui.Link。