forked from joejulian/gio
e1b3928819
The double-negative DisabledOp is harder to understand than a straightforward EnabledOp. Note that the absence of an EnabledOp implies still means that the widget is enabled. Signed-off-by: Elias Naur <mail@eliasnaur.com>
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
|
|
|
|
// EnabledOp describes the enabled state.
|
|
type EnabledOp bool
|
|
|
|
func (l LabelOp) Add(o *op.Ops) {
|
|
data := ops.Write1String(&o.Internal, ops.TypeSemanticLabelLen, string(l))
|
|
data[0] = byte(ops.TypeSemanticLabel)
|
|
}
|
|
|
|
func (d DescriptionOp) Add(o *op.Ops) {
|
|
data := ops.Write1String(&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 (e EnabledOp) Add(o *op.Ops) {
|
|
data := ops.Write(&o.Internal, ops.TypeSemanticEnabledLen)
|
|
data[0] = byte(ops.TypeSemanticEnabled)
|
|
if e {
|
|
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")
|
|
}
|
|
}
|