Files
ZacharyZhang-NYandClaude Opus 5.5 bcce34cda1 Upgrade MyGo to v0.5.5
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>
2026-10-17 01:37:54 -04:00

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。