andlabs-ui/zz_drawtext.go

168 lines
4.3 KiB
Go

// 19 august 2018
// +build OMIT
package main
// TODO probably a bug in libui: changing the font away from skia leads to a crash
import (
"github.com/andlabs/ui"
)
var (
fontButton *ui.FontButton
alignment *ui.Combobox
attrstr *ui.AttributedString
)
func appendWithAttributes(what string, attrs ...ui.Attribute) {
start := len(attrstr.String())
end := start + len(what)
attrstr.AppendUnattributed(what)
for _, a := range attrs {
attrstr.SetAttribute(a, start, end)
}
}
func makeAttributedString() {
attrstr = ui.NewAttributedString(
"Drawing strings with package ui is done with the ui.AttributedString and ui.DrawTextLayout objects.\n" +
"ui.AttributedString lets you have a variety of attributes: ")
appendWithAttributes("font family", ui.TextFamily("Courier New"))
attrstr.AppendUnattributed(", ")
appendWithAttributes("font size", ui.TextSize(18))
attrstr.AppendUnattributed(", ")
appendWithAttributes("font weight", ui.TextWeightBold)
attrstr.AppendUnattributed(", ")
appendWithAttributes("font italicness", ui.TextItalicItalic)
attrstr.AppendUnattributed(", ")
appendWithAttributes("font stretch", ui.TextStretchCondensed)
attrstr.AppendUnattributed(", ")
appendWithAttributes("text color", ui.TextColor{0.75, 0.25, 0.5, 0.75})
attrstr.AppendUnattributed(", ")
appendWithAttributes("text background color", ui.TextBackground{0.5, 0.5, 0.25, 0.5})
attrstr.AppendUnattributed(", ")
appendWithAttributes("underline style", ui.UnderlineSingle)
attrstr.AppendUnattributed(", ")
attrstr.AppendUnattributed("and ")
appendWithAttributes("underline color",
ui.UnderlineDouble,
ui.UnderlineColorCustom{1.0, 0.0, 0.5, 1.0})
attrstr.AppendUnattributed(". ")
attrstr.AppendUnattributed("Furthermore, there are attributes allowing for ")
appendWithAttributes("special underlines for indicating spelling errors",
ui.UnderlineSuggestion,
ui.UnderlineColorSpelling)
attrstr.AppendUnattributed(" (and other types of errors) ")
attrstr.AppendUnattributed("and control over OpenType features such as ligatures (for instance, ")
appendWithAttributes("afford", ui.OpenTypeFeatures{
ui.ToOpenTypeTag('l', 'i', 'g', 'a'): 0,
})
attrstr.AppendUnattributed(" vs. ")
appendWithAttributes("afford", ui.OpenTypeFeatures{
ui.ToOpenTypeTag('l', 'i', 'g', 'a'): 1,
})
attrstr.AppendUnattributed(").\n")
attrstr.AppendUnattributed("Use the controls opposite to the text to control properties of the text.")
}
type areaHandler struct{}
func (areaHandler) Draw(a *ui.Area, p *ui.AreaDrawParams) {
tl := ui.DrawNewTextLayout(&ui.DrawTextLayoutParams{
String: attrstr,
DefaultFont: fontButton.Font(),
Width: p.AreaWidth,
Align: ui.DrawTextAlign(alignment.Selected()),
})
defer tl.Free()
p.Context.Text(tl, 0, 0)
}
func (areaHandler) MouseEvent(a *ui.Area, me *ui.AreaMouseEvent) {
// do nothing
}
func (areaHandler) MouseCrossed(a *ui.Area, left bool) {
// do nothing
}
func (areaHandler) DragBroken(a *ui.Area) {
// do nothing
}
func (areaHandler) KeyEvent(a *ui.Area, ke *ui.AreaKeyEvent) (handled bool) {
// reject all keys
return false
}
func setupUI() {
makeAttributedString()
mainwin := ui.NewWindow("libui Text-Drawing Example", 640, 480, true)
mainwin.SetMargined(true)
mainwin.OnClosing(func(*ui.Window) bool {
mainwin.Destroy()
ui.Quit()
return false
})
ui.OnShouldQuit(func() bool {
mainwin.Destroy()
return true
})
hbox := ui.NewHorizontalBox()
hbox.SetPadded(true)
mainwin.SetChild(hbox)
vbox := ui.NewVerticalBox()
vbox.SetPadded(true)
hbox.Append(vbox, false)
area := ui.NewArea(areaHandler{})
fontButton = ui.NewFontButton()
fontButton.OnChanged(func(*ui.FontButton) {
area.QueueRedrawAll()
})
vbox.Append(fontButton, false)
form := ui.NewForm()
form.SetPadded(true)
// TODO on OS X if this is set to 1 then the window can't resize; does the form not have the concept of stretchy trailing space?
vbox.Append(form, false)
alignment = ui.NewCombobox()
// note that the items match with the values of the uiDrawTextAlign values
alignment.Append("Left")
alignment.Append("Center")
alignment.Append("Right")
alignment.SetSelected(0) // start with left alignment
alignment.OnSelected(func(*ui.Combobox) {
area.QueueRedrawAll()
})
form.Append("Alignment", alignment, false)
hbox.Append(area, true)
mainwin.Show()
}
func main() {
ui.Main(setupUI)
}