mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 15:45:38 +00:00
b6e0376ad2
Putting a string in an interface value has to (normally) heap allocate the string header and string. However, putting the address of a local string variable in an interface value has the same effect, as this causes the local variable to escape to the heap. Signed-off-by: Dominik Honnef <dominik@honnef.co>
92 lines
2.0 KiB
Go
92 lines
2.0 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
// Package semantic provides operations for semantic descriptions of a user
|
|
// interface, to facilitate presentation and interaction in external software
|
|
// such as screen readers.
|
|
//
|
|
// Semantic descriptions are organized in a tree, with clip operations as
|
|
// nodes. Operations in this package are associated with the current semantic
|
|
// node, that is the most recent pushed clip operation.
|
|
package semantic
|
|
|
|
import (
|
|
"gioui.org/internal/ops"
|
|
"gioui.org/op"
|
|
)
|
|
|
|
// LabelOp provides the content of a textual component.
|
|
type LabelOp string
|
|
|
|
// DescriptionOp describes a component.
|
|
type DescriptionOp string
|
|
|
|
// ClassOp provides the component class.
|
|
type ClassOp int
|
|
|
|
const (
|
|
Unknown ClassOp = iota
|
|
Button
|
|
CheckBox
|
|
Editor
|
|
RadioButton
|
|
Switch
|
|
)
|
|
|
|
// SelectedOp describes the selected state for components that have
|
|
// boolean state.
|
|
type SelectedOp bool
|
|
|
|
// DisabledOp describes the disabled state.
|
|
type DisabledOp bool
|
|
|
|
func (l LabelOp) Add(o *op.Ops) {
|
|
data := ops.Write1(&o.Internal, ops.TypeSemanticLabelLen, string(l))
|
|
data[0] = byte(ops.TypeSemanticLabel)
|
|
}
|
|
|
|
func (d DescriptionOp) Add(o *op.Ops) {
|
|
data := ops.Write1(&o.Internal, ops.TypeSemanticDescLen, string(d))
|
|
data[0] = byte(ops.TypeSemanticDesc)
|
|
}
|
|
|
|
func (c ClassOp) Add(o *op.Ops) {
|
|
data := ops.Write(&o.Internal, ops.TypeSemanticClassLen)
|
|
data[0] = byte(ops.TypeSemanticClass)
|
|
data[1] = byte(c)
|
|
}
|
|
|
|
func (s SelectedOp) Add(o *op.Ops) {
|
|
data := ops.Write(&o.Internal, ops.TypeSemanticSelectedLen)
|
|
data[0] = byte(ops.TypeSemanticSelected)
|
|
if s {
|
|
data[1] = 1
|
|
}
|
|
}
|
|
|
|
func (d DisabledOp) Add(o *op.Ops) {
|
|
data := ops.Write(&o.Internal, ops.TypeSemanticDisabledLen)
|
|
data[0] = byte(ops.TypeSemanticDisabled)
|
|
if d {
|
|
data[1] = 1
|
|
}
|
|
}
|
|
|
|
func (c ClassOp) String() string {
|
|
switch c {
|
|
case Unknown:
|
|
return "Unknown"
|
|
case Button:
|
|
return "Button"
|
|
case CheckBox:
|
|
return "CheckBox"
|
|
case Editor:
|
|
return "Editor"
|
|
case RadioButton:
|
|
return "RadioButton"
|
|
case Switch:
|
|
return "Switch"
|
|
default:
|
|
panic("invalid ClassOp")
|
|
}
|
|
}
|