Files
gio/widget/material/editor.go
T
Elias Naur ac97b9d6e1 widget: [API] add content widget argument to Editor.Layout
To make the semantic relation between the editor and its content clear,
the editor clip operation must cover the content. This change adds an
explicit widget argument to editor, and lays it out inside the clip
rect.

This is an API change. Users of Editor.Layout must provide a content
widget.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2021-12-01 17:23:54 +01:00

86 lines
2.2 KiB
Go

// SPDX-License-Identifier: Unlicense OR MIT
package material
import (
"image/color"
"gioui.org/internal/f32color"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/op/paint"
"gioui.org/text"
"gioui.org/unit"
"gioui.org/widget"
)
type EditorStyle struct {
Font text.Font
TextSize unit.Value
// Color is the text color.
Color color.NRGBA
// Hint contains the text displayed when the editor is empty.
Hint string
// HintColor is the color of hint text.
HintColor color.NRGBA
// SelectionColor is the color of the background for selected text.
SelectionColor color.NRGBA
Editor *widget.Editor
shaper text.Shaper
}
func Editor(th *Theme, editor *widget.Editor, hint string) EditorStyle {
return EditorStyle{
Editor: editor,
TextSize: th.TextSize,
Color: th.Palette.Fg,
shaper: th.Shaper,
Hint: hint,
HintColor: f32color.MulAlpha(th.Palette.Fg, 0xbb),
SelectionColor: f32color.MulAlpha(th.Palette.ContrastBg, 0x60),
}
}
func (e EditorStyle) Layout(gtx layout.Context) layout.Dimensions {
macro := op.Record(gtx.Ops)
paint.ColorOp{Color: e.HintColor}.Add(gtx.Ops)
var maxlines int
if e.Editor.SingleLine {
maxlines = 1
}
tl := widget.Label{Alignment: e.Editor.Alignment, MaxLines: maxlines}
dims := tl.Layout(gtx, e.shaper, e.Font, e.TextSize, e.Hint)
call := macro.Stop()
if w := dims.Size.X; gtx.Constraints.Min.X < w {
gtx.Constraints.Min.X = w
}
if h := dims.Size.Y; gtx.Constraints.Min.Y < h {
gtx.Constraints.Min.Y = h
}
dims = e.Editor.Layout(gtx, e.shaper, e.Font, e.TextSize, func(gtx layout.Context) layout.Dimensions {
disabled := gtx.Queue == nil
if e.Editor.Len() > 0 {
paint.ColorOp{Color: blendDisabledColor(disabled, e.SelectionColor)}.Add(gtx.Ops)
e.Editor.PaintSelection(gtx)
paint.ColorOp{Color: blendDisabledColor(disabled, e.Color)}.Add(gtx.Ops)
e.Editor.PaintText(gtx)
} else {
call.Add(gtx.Ops)
}
if !disabled {
paint.ColorOp{Color: e.Color}.Add(gtx.Ops)
e.Editor.PaintCaret(gtx)
}
return dims
})
return dims
}
func blendDisabledColor(disabled bool, c color.NRGBA) color.NRGBA {
if disabled {
return f32color.Disabled(c)
}
return c
}