adagui

package module
v1.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 14, 2024 License: MIT Imports: 25 Imported by: 1

README

AdaGui with Go

Waehrend das Package adatft ein Low-Level Interface zum Bildschirm und zum Touchscreen des TFT-Displays von AdaFruit enthalten, versteht sich dieses Package als Sammlung von High-Level Typen und Funktionen zur Erstellung von graphischen Oberflaechen.

Dieses Package enthaelt Datentypen, welche die Verbindung zur Hardware weiter abstrahieren und viele komplizierte Verarbeitungen uebernehmen. Der Typ [Screen] zum Beispiel, vereinigt in sich alles, was fuer die Kommunikation mit der Hardware noch notwendig ist. Ihm untergeordnet ist der Typ [Window] die Repraesentation einer Sammlung von GUI-Objekten, welche eine konkrete Bildschirmseite konstituieren.

Documentation

Overview

In diesem File befinden sich alle Widgets, die im Zusammenhang mit adagui existieren. Aktuell sind dies:

Container Widgets -----------------

Group
Panel
ScrollPanel

Einheitliche Flags und Funktionen fuer das Profiling von Programmen.

In diesem File befinden sich alle Widgets, die im Zusammenhang mit adagui existieren. Aktuell sind dies:

Leaf Widgets (GUI bezogen) --------------------------

Button
TextButton
IconButton
RadioButton
Checkbox
Slider     A.k.a. Scrollbar
PageButton
Label      Nur fuer kurze, einzeilige Texte
Text       (Geplant, wie Label aber fuer groessere Textmengen mit spez.
           Ausrichtung, waehlbarer Schrift und ev. Scrollbalken)

Index

Constants

View Source
const (
	AnimationRepeatForever = -1
	DurationStandard       = time.Millisecond * 300
	DurationShort          = time.Millisecond * 150
)
View Source
const (
	MarkNeedsMeasure = Marks(1 << 0)
	MarkNeedsLayout  = Marks(1 << 1)
	MarkNeedsPaint   = Marks(1 << 2)
	MarkNeedsRecalc  = Marks(1 << 3)
)

Variables

View Source
var (
	AnimationEaseInOut = animationEaseInOut
	AnimationEaseIn    = animationEaseIn
	AnimationEaseOut   = animationEaseOut
	AnimationLinear    = animationLinear
)
View Source
var (
	Debugf = func(domain DebugDomain, format string, a ...any) {}
)
View Source
var (
	LayoutProps = PropsMap["Layout"]
)

Functions

func AddDebugDomain added in v1.1.0

func AddDebugDomain(domain DebugDomain)

func SetDebugDomain added in v1.1.0

func SetDebugDomain(domain DebugDomain)

func StartProfiling added in v1.2.1

func StartProfiling()

func StopProfiling added in v1.2.1

func StopProfiling()

Types

type AlignType

type AlignType int

Der Typ AlignType dient der Ausrichtung von Text.

const (
	AlignLeft AlignType = 1 << iota
	AlignCenter
	AlignRight
	AlignTop
	AlignMiddle
	AlignBottom
)

type Animation

type Animation struct {
	AutoReverse bool
	Curve       AnimationCurve
	Duration    time.Duration
	RepeatCount int
	Tick        func(float64)
}

func NewAnimation

func NewAnimation(d time.Duration, fn func(float64)) *Animation

func NewColorAnimation

func NewColorAnimation(start, stop color.Color, d time.Duration,
	fn func(color.Color)) *Animation

func NewPositionAnimation

func NewPositionAnimation(start, stop geom.Point, d time.Duration,
	fn func(geom.Point)) *Animation

func NewSizeAnimation

func NewSizeAnimation(start, stop geom.Point, d time.Duration,
	fn func(geom.Point)) *Animation

func (*Animation) Start

func (a *Animation) Start()

func (*Animation) Stop

func (a *Animation) Stop()

type AnimationCurve

type AnimationCurve func(float64) float64

Als nächstes folgen die Typen, mit welchen man Animation in die Bude bringen kann.

type Border

type Border int

Der Typ Border wird fuer die Bezeichnung der vier Bildschirmseiten oder Richtungen verwendet.

const (
	Left Border = iota
	Top
	Right
	Bottom
)

type BorderLayout

type BorderLayout struct {
	// contains filtered or unexported fields
}

Das BorderLayout ist ein rechtes Monster. Damit können Fenster mit Titel- oder Menuzeile, rechter und linker Randspalte sowie Fusszeile verwaltet werden. Die einzelnen Zeilen können auch leer gelassen werden (verwende nil).

func (*BorderLayout) Layout

func (l *BorderLayout) Layout(childList *list.List, size geom.Point)

func (*BorderLayout) MinSize

func (l *BorderLayout) MinSize(childList *list.List) geom.Point

type BoxLayout

type BoxLayout struct {
	// contains filtered or unexported fields
}

Die BoxLayouts gibt es in zwei Varianten: horizontal oder vertikal. Alle verwalteten Kinder werden neben oder untereinander angeordnet und auf die gleiche Höhe, resp. gleiche Breite getrimmt. Bei diesem Layout kommen auch die Spacer-Widgets zum Einsatz: sie dehnen sich auf die maximale Breite, resp. Höhe aus, haben aber sonst keinen Inhalt oder Einfluss.

func NewHBoxLayout

func NewHBoxLayout(pads ...float64) *BoxLayout

func NewVBoxLayout

func NewVBoxLayout(pads ...float64) *BoxLayout

func (*BoxLayout) Layout

func (l *BoxLayout) Layout(childList *list.List, size geom.Point)

func (*BoxLayout) MinSize

func (l *BoxLayout) MinSize(childList *list.List) geom.Point

type Button

type Button struct {
	LeafEmbed
	PushEmbed
	// contains filtered or unexported fields
}

Buttons sind neutrale Knoepfe, ohne spezifischen Inhalt, d.h. ohne Text oder Icons. Sie werden selten direkt verwendet, sondern dienen als generische Grundlage fuer die weiter unten definierten Text- oder Icon- Buttons.

func NewButton

func NewButton(w, h float64) *Button

func (*Button) OnInputEvent

func (b *Button) OnInputEvent(evt touch.Event)

func (*Button) Paint

func (b *Button) Paint(gc *gg.Context)

type CanvasObject

type CanvasObject interface {
	Paint(gc *gg.Context)
}

type CenterLayout

type CenterLayout struct{}

CenterLayout zentiert alle Kinder, verändert ihre Grössen jedoch nicht. Auch hier gilt das gleiche wie oben: nur für ein Kind zu verwenden.

func (*CenterLayout) Layout

func (l *CenterLayout) Layout(childList *list.List, size geom.Point)

func (*CenterLayout) MinSize

func (l *CenterLayout) MinSize(childList *list.List) geom.Point

type Checkbox

type Checkbox struct {
	Button
	// contains filtered or unexported fields
}

Checkboxen verhalten sich sehr aehnlich zu RadioButtons, sind jedoch eigen- staendig und nicht Teil einer Gruppe.

func NewCheckbox

func NewCheckbox(label string) *Checkbox

func NewCheckboxWithCallback

func NewCheckboxWithCallback(label string, callback func(bool)) *Checkbox

func NewCheckboxWithData

func NewCheckboxWithData(label string, data binding.Bool) *Checkbox

func (*Checkbox) Checked

func (c *Checkbox) Checked() bool

func (*Checkbox) OnInputEvent

func (c *Checkbox) OnInputEvent(evt touch.Event)

func (*Checkbox) Paint

func (c *Checkbox) Paint(gc *gg.Context)

func (*Checkbox) SetChecked

func (c *Checkbox) SetChecked(val bool)

type Circle

type Circle struct {
	Shape
}

Kreis

func NewCircle

func NewCircle(r float64) *Circle

func (*Circle) Contains

func (c *Circle) Contains(pt geom.Point) bool

func (*Circle) Paint

func (c *Circle) Paint(gc *gg.Context)

func (*Circle) Pos added in v1.1.0

func (c *Circle) Pos() geom.Point

func (*Circle) Radius

func (c *Circle) Radius() float64

func (*Circle) SetPos added in v1.1.0

func (c *Circle) SetPos(mp geom.Point)

func (*Circle) SetRadius

func (c *Circle) SetRadius(r float64)

type Container

type Container interface {
	Add(n ...Node)
	Del(n Node)
	DelAll()
}

Dieses Interface implementieren zusaetzlich alle Nodes, welche als Container agieren koennen, d.h. eine Liste von weiteren Nodes fuehren.

type ContainerEmbed

type ContainerEmbed struct {
	Embed
	touch.TouchEmbed
	ChildList *list.List
	Layout    LayoutManager
}

Alle GUI-Typen, welche weitere Nodes verwalten können (Fenster, Panels, etc.) müssen dagegen diesen Typ einbetten. Damit kann über die ChildList die angehängten Nodes verwaltet werden. Ebenso kann ein LayoutManager verwendet werden, der für die Platzierung der Nodes zuständig ist. Per Default wird das NullLayout verwendet, d.h. die Kinder müssen per SetPos platziert werden und bleiben an dieser Stelle.

func (*ContainerEmbed) Add

func (c *ContainerEmbed) Add(n ...Node)

func (*ContainerEmbed) Del

func (c *ContainerEmbed) Del(n Node)

func (*ContainerEmbed) DelAll

func (c *ContainerEmbed) DelAll()

func (*ContainerEmbed) Init

func (c *ContainerEmbed) Init()

func (*ContainerEmbed) MinSize

func (c *ContainerEmbed) MinSize() geom.Point

func (*ContainerEmbed) OnChildMarked

func (c *ContainerEmbed) OnChildMarked(child Node, newMarks Marks)

func (*ContainerEmbed) Paint

func (c *ContainerEmbed) Paint(gc *gg.Context)

func (*ContainerEmbed) SelectTarget

func (c *ContainerEmbed) SelectTarget(pt geom.Point) Node

func (*ContainerEmbed) SetSize

func (c *ContainerEmbed) SetSize(s geom.Point)

type DebugDomain added in v1.1.0

type DebugDomain uint64
const (
	Painting DebugDomain = 1 << iota
	Coordinates
	Events
)

func NewDebugDomain added in v1.1.0

func NewDebugDomain() DebugDomain

type Ellipse

type Ellipse struct {
	Shape
}

Ein allgemeinerer Widget Typ ist die Ellipse.

func NewEllipse

func NewEllipse(rx, ry float64) *Ellipse

func (*Ellipse) Contains

func (e *Ellipse) Contains(pt geom.Point) bool

func (*Ellipse) Paint

func (e *Ellipse) Paint(gc *gg.Context)

func (*Ellipse) Pos added in v1.1.0

func (e *Ellipse) Pos() geom.Point

func (*Ellipse) Radius

func (e *Ellipse) Radius() (float64, float64)

func (*Ellipse) SetPos added in v1.1.0

func (e *Ellipse) SetPos(mp geom.Point)

func (*Ellipse) SetRadius

func (e *Ellipse) SetRadius(rx, ry float64)

type Embed

type Embed struct {
	Win     *Window
	Wrapper Node
	Parent  *ContainerEmbed

	Marks Marks

	props.PropertyEmbed
	// contains filtered or unexported fields
}

Dieser Typ ist die Basis für alle graphischen Typen von AdaGui. Er kann jedoch nicht direkt verwendet werden, sondern dient als Basis für zwei weitere Embed-Typen (siehe weiter unten), welche für eigene Typen verwendet werden können.

func (*Embed) Bounds

func (m *Embed) Bounds() geom.Rectangle

func (*Embed) Contains

func (m *Embed) Contains(pt geom.Point) bool

Contains ermittelt, ob sich der Punkt pt innerhalb des Widgets befindet. Die Koordianten in pt muessen relativ zum Bezugssystem von m sein.

func (*Embed) Enabled added in v1.2.1

func (m *Embed) Enabled() bool

func (*Embed) Init

func (m *Embed) Init()

func (*Embed) IsAtFront

func (m *Embed) IsAtFront() bool

func (*Embed) Local2Parent

func (m *Embed) Local2Parent(pt geom.Point) geom.Point

Rechnet die Koordinaten in pt relativ zum Parent-Node um.

func (*Embed) Local2Screen

func (m *Embed) Local2Screen(pt geom.Point) geom.Point

Rechnet die lokalen Koordianten pt in Bildschirmkoordinaten um.

func (*Embed) LocalBounds

func (m *Embed) LocalBounds() geom.Rectangle

func (*Embed) Mark

func (m *Embed) Mark(marks Marks)

func (*Embed) Matrix

func (m *Embed) Matrix() *geom.Matrix

Liefert die aktuelle Transformationsmatrix des Nodes.

func (*Embed) MinSize

func (m *Embed) MinSize() geom.Point

func (*Embed) Paint

func (m *Embed) Paint(gc *gg.Context)

func (*Embed) Parent2Local

func (m *Embed) Parent2Local(pt geom.Point) geom.Point

Rechnet die Koordinaten in pt vom relativen Bezugsystem des Parent-Nodes zu lokalen Koordinaten um.

func (*Embed) ParentBounds

func (m *Embed) ParentBounds() geom.Rectangle

func (*Embed) Pos

func (m *Embed) Pos() geom.Point

func (*Embed) Rect

func (m *Embed) Rect() geom.Rectangle

func (*Embed) Remove

func (m *Embed) Remove()

func (*Embed) Rotate

func (m *Embed) Rotate(a float64)

Ersetzt die aktuelle Rotation des Nodes durch eine Rotation um a um den Mittelpunkt des Nodes.

func (*Embed) RotateAbout

func (m *Embed) RotateAbout(rp geom.Point, a float64)

Ersetzt die aktuelle Rotation des Nodes durch eine Rotation um a um den angegebenen Drehpunkt.

func (*Embed) Scale

func (m *Embed) Scale(sx, sy float64)

Ersetzt die aktuelle Skalierung des Nodes durch eine Skalierung um sx, sy. Zentrum der Skalierung ist der Mittelpunkt des Nodes.

func (*Embed) ScaleAbout

func (m *Embed) ScaleAbout(sp geom.Point, sx, sy float64)

Ersetzt die aktuelle Skalierung des Nodes durch eine Skalierung um sx, sy mit sp als Zentrum der Skalierung.

func (*Embed) Screen2Local

func (m *Embed) Screen2Local(pt geom.Point) geom.Point

Rechnet die Bildschirmkoordinaten pt in lokale Koordianten um.

func (*Embed) SetEnabled added in v1.2.1

func (m *Embed) SetEnabled(e bool)

func (*Embed) SetMinSize

func (m *Embed) SetMinSize(s geom.Point)

func (*Embed) SetPos

func (m *Embed) SetPos(p geom.Point)

func (*Embed) SetSize

func (m *Embed) SetSize(s geom.Point)

func (*Embed) SetVisible

func (m *Embed) SetVisible(v bool)

func (*Embed) Size

func (m *Embed) Size() geom.Point

func (*Embed) ToBack

func (m *Embed) ToBack()

func (*Embed) ToFront

func (m *Embed) ToFront()

func (*Embed) Translate

func (m *Embed) Translate(dp geom.Point)

Ersetzt die aktuelle Translation des Nodes durch eine Translation um dp.

func (*Embed) Visible

func (m *Embed) Visible() bool

func (*Embed) Wrappee

func (m *Embed) Wrappee() *Embed

type GridLayout

type GridLayout struct {
	Cols int
	// contains filtered or unexported fields
}

GridLayout ordnet die Kinder in einer bestimmten, fixen Anzahl Spalten (resp. Zeilen) an. Ueberschreitet die Anzahl der hinzugefuegten Kinder diese Groesse, dann wird eine weitere Zeile (resp. Spalte) erstellt und weitere Kinder analog zur ersten Zeile fortlaufend angeordnet.

func (*GridLayout) Layout

func (l *GridLayout) Layout(childList *list.List, size geom.Point)

func (*GridLayout) MinSize

func (l *GridLayout) MinSize(childList *list.List) geom.Point

type Group

type Group struct {
	ContainerEmbed
}

Eine Group ist die einfachste Form eines Containers. Sie dient hauptsaechlich als logisches Sammelbecken fuer Widgets auf dem Screen. Sie hat zwar ein eigenes Koordinatensystem und beherrscht alle Layouts, ist jedoch selber unsichtbar, d.h. dieses Widget hat weder Farbe, Rahmen noch andere optische Merkmale.

func NewGroup

func NewGroup() *Group

func NewGroupPL added in v1.2.1

func NewGroupPL(parent Container, layout LayoutManager) *Group

func (*Group) Paint

func (g *Group) Paint(gc *gg.Context)

type IconButton

type IconButton struct {
	Button
	// contains filtered or unexported fields
}

Der IconButton stellt ein kleines Bild dar, welches als PNG-Datei beim Erstellen des Buttons angegeben wird. Die Groesse des Buttons passt sich der Groess der Bilddatei an.

func NewIconButton

func NewIconButton(imgFile string) *IconButton

func NewIconButtonWithCallback

func NewIconButtonWithCallback(imgFile string, btnData int, callback func(int)) *IconButton

func NewIconButtonWithData

func NewIconButtonWithData(imgFile string, btnData int, data binding.Int) *IconButton

func (*IconButton) DataChanged

func (b *IconButton) DataChanged(data binding.DataItem)

func (*IconButton) OnInputEvent

func (b *IconButton) OnInputEvent(evt touch.Event)

func (*IconButton) Paint

func (b *IconButton) Paint(gc *gg.Context)

type Label

type Label struct {
	LeafEmbed
	// contains filtered or unexported fields
}

Unter einem Label verstehen wir einfach eine Konserve für Text, kurzen Text!

func NewLabel

func NewLabel(txt string) *Label

func NewLabelWithData

func NewLabelWithData(data binding.String) *Label

func (*Label) Align

func (l *Label) Align() AlignType

func (*Label) Paint

func (l *Label) Paint(gc *gg.Context)

func (*Label) SetAlign

func (l *Label) SetAlign(a AlignType)

func (*Label) SetFont

func (l *Label) SetFont(fontFont *fonts.Font)

Die Property-Funktionen SetFont und SetFontSize muessen ueberschrieben werden, da sie ggf. die Groesse des Widgets beeinflussen.

func (*Label) SetFontSize

func (l *Label) SetFontSize(fontSize float64)

func (*Label) SetSize

func (l *Label) SetSize(size geom.Point)

func (*Label) SetText

func (l *Label) SetText(str string)

func (*Label) Text

func (l *Label) Text() string

type LayoutManager

type LayoutManager interface {
	Layout(childList *list.List, size geom.Point)
	MinSize(childList *list.List) geom.Point
}

LayoutManager eben...

func NewBorderLayout

func NewBorderLayout(top, bottom, left, right Node) LayoutManager

func NewCenterLayout

func NewCenterLayout() LayoutManager

func NewColumnGridLayout

func NewColumnGridLayout(cols int) LayoutManager

Fixiert die Anzahl Spalten des GridLayouts.

func NewMaxLayout

func NewMaxLayout() LayoutManager

func NewRowGridLayout

func NewRowGridLayout(rows int) LayoutManager

Fixiert die Anzahl Zeilen des GridLayouts.

func NewStackLayout

func NewStackLayout() LayoutManager

type LeafEmbed

type LeafEmbed struct {
	Embed
	touch.TouchEmbed
}

Jeder GUI-Typ, der selber keine weiteren Kinder verwaltet, muss diesen Typ einbetten.

func (*LeafEmbed) Local2Parent

func (m *LeafEmbed) Local2Parent(pt geom.Point) geom.Point

func (*LeafEmbed) Local2Screen

func (m *LeafEmbed) Local2Screen(pt geom.Point) geom.Point

Umrechnungsmethoden fuer Koordinaten.

func (*LeafEmbed) OnChildMarked

func (m *LeafEmbed) OnChildMarked(child Node, newMarks Marks)

func (*LeafEmbed) Paint

func (m *LeafEmbed) Paint(gc *gg.Context)

func (*LeafEmbed) Parent2Local

func (m *LeafEmbed) Parent2Local(pt geom.Point) geom.Point

func (*LeafEmbed) Screen2Local

func (m *LeafEmbed) Screen2Local(pt geom.Point) geom.Point

func (*LeafEmbed) SelectTarget

func (m *LeafEmbed) SelectTarget(pt geom.Point) Node

type Line added in v1.1.0

type Line struct {
	Shape
	// contains filtered or unexported fields
}

Geraden

func NewLine added in v1.1.0

func NewLine(p0, p1 geom.Point) *Line

func (*Line) Contains added in v1.1.0

func (l *Line) Contains(pt geom.Point) bool

func (*Line) P0 added in v1.1.0

func (l *Line) P0() geom.Point

func (*Line) P1 added in v1.1.0

func (l *Line) P1() geom.Point

func (*Line) Paint added in v1.1.0

func (l *Line) Paint(gc *gg.Context)

func (*Line) SetP0 added in v1.1.0

func (l *Line) SetP0(pt geom.Point)

func (*Line) SetP1 added in v1.1.0

func (l *Line) SetP1(pt geom.Point)

type ListButton

type ListButton struct {
	Button

	Options []string

	Selected string
	// contains filtered or unexported fields
}

Der Versuch, ein ListButton zu implementieren...

func NewListButton

func NewListButton(options []string) *ListButton

func (*ListButton) OnInputEvent

func (b *ListButton) OnInputEvent(evt touch.Event)

func (*ListButton) Paint

func (b *ListButton) Paint(gc *gg.Context)

func (*ListButton) SelectedIndex

func (b *ListButton) SelectedIndex() int

func (*ListButton) SetOptions

func (b *ListButton) SetOptions(options []string)

func (*ListButton) SetSelectedIndex

func (b *ListButton) SetSelectedIndex(i int)

type Marks

type Marks uint32

func (Marks) NeedsLayout

func (m Marks) NeedsLayout() bool

func (Marks) NeedsMeasure

func (m Marks) NeedsMeasure() bool

func (Marks) NeedsPaint

func (m Marks) NeedsPaint() bool

func (Marks) NeedsRecalc

func (m Marks) NeedsRecalc() bool

func (*Marks) UnmarkNeedsLayout

func (m *Marks) UnmarkNeedsLayout()

func (*Marks) UnmarkNeedsMeasure

func (m *Marks) UnmarkNeedsMeasure()

func (*Marks) UnmarkNeedsPaint

func (m *Marks) UnmarkNeedsPaint()

func (*Marks) UnmarkNeedsRecalc

func (m *Marks) UnmarkNeedsRecalc()

type Node

type Node interface {
	Wrappee() *Embed

	// Bewegt den aufrufenden Node an das Ende, resp. den Anfang der
	// Node-Liste seines Parents.
	ToBack()
	ToFront()
	IsAtFront() bool

	// Loescht den aufrufenden Node aus der Node-Liste seines Parents.
	Remove()

	// Setzt den Node an die angegebene Stelle, resp. retourniert die Position
	// des Widgets. Da jedes Widget seine 'Position' grundsätzlich selber
	// interpretieren kann, ist die Position nur über Methoden veränderbar,
	// resp. abrufbar.
	Pos() geom.Point
	SetPos(p geom.Point)

	Size() geom.Point
	SetSize(s geom.Point)

	MinSize() geom.Point
	SetMinSize(s geom.Point)

	// LocalBounds, resp. Bounds liefert das umfassende Rechteck des Nodes
	// in lokalen Koordinaten.
	LocalBounds() geom.Rectangle
	Bounds() geom.Rectangle

	// ParentBounds, resp. Rect liefert das umfassende Rechteck aus Sicht
	// des Parent-Nodes.
	ParentBounds() geom.Rectangle
	Rect() geom.Rectangle

	// Ist dieser node sichtbar?
	Visible() bool
	SetVisible(v bool)

	// Ist dieser node aktiv, resp. deaktiviert?
	Enabled() bool
	SetEnabled(e bool)

	// Zeichnet das Widget im Graphik-Kontext von gc. Dabei muss sich das
	// Widget nicht um irgendwelche Koordinaten kuemmern, sondern kann davon
	// ausgehen, dass die notwendigen Transformationen durch das
	// darueberliegende Container-Widget (sofern vorhanden) gemacht wurden.
	Paint(gc *gg.Context)

	// Dient der Markierung von Nodes, bspw. um anzuzeigen, dass sie neu
	// gezeichnet werden muessen.
	Mark(m Marks)
	OnChildMarked(child Node, newMarks Marks)
	OnInputEvent(evt touch.Event)

	// Retourniert true, falls sich der Punkt pt innerhalb oder auf dem
	// Node befindet und false andernfalls.
	Contains(pt geom.Point) bool

	// Mit SelectTarget kann ermittelt werden, welcher Node sich an der
	// Position pt befindet. Es kann sein, dass diese Methode 'nil'
	// zurueck gibt.
	SelectTarget(pt geom.Point) Node

	Local2Parent(pt geom.Point) geom.Point
	Parent2Local(pt geom.Point) geom.Point
	Local2Screen(pt geom.Point) geom.Point
	Screen2Local(pt geom.Point) geom.Point

	// Methoden für die Koordinatentransformationen.
	// Die Methoden Translate, Rotate und Scale setzen jeweils unabhängig
	// voneinander eine Matrix, welche die jeweilige Transformation enthält.
	// Mit Matrix erhält man dann die Transformation, welche sich aus der
	// Aneinanderreihung von Translate, Rotate und Scale ergibt.
	Translate(dp geom.Point)
	Rotate(a float64)
	RotateAbout(rp geom.Point, a float64)
	Scale(sx, sy float64)
	ScaleAbout(sp geom.Point, sx, sy float64)
	Matrix() *geom.Matrix
}

Alle Elemente im Scenegraph des GUI haben dieses Interface zu implementieren.

type NullLayout

type NullLayout struct{}

Mit dem NullLayout werden die verwalteten Nodes per SetPos platziert und werden durch den Container nicht mehr weiter verwaltet. MinSize liefert die maximale Grösse aller verwalteten Nodes.

func (*NullLayout) Layout

func (l *NullLayout) Layout(childList *list.List, size geom.Point)

func (*NullLayout) MinSize

func (l *NullLayout) MinSize(childList *list.List) geom.Point

type Orientation

type Orientation int

Mit dem Typ Orientation koennen horizontale Ausrichtungen gegenueber vertikalen abgegrenzt werden.

const (
	Horizontal Orientation = iota
	Vertical
)

type PaddedLayout

type PaddedLayout struct {
	// contains filtered or unexported fields
}

Mit PaddedLayout kann sinnvollerweise nur ein Node verwaltet werden, der mit einem konfigurierbaren Abstand auf die ganze Grösse des Containers expandiert wird.

func NewPaddedLayout

func NewPaddedLayout(pads ...float64) *PaddedLayout

Mit den variablen Parametern pads können die Ränder definiert werden. Dabei gilt:

  • : verwende das Property 'Padding' a : verwende a für alle Ränder a,b : verwende a für die horizontalen und b für die vertikalen Ränder a,b,c : verwende a für links, b für oben und unten c für rechts a,b,c,d : (dito) und d für den unteren Rand.

func (*PaddedLayout) Layout

func (l *PaddedLayout) Layout(childList *list.List, size geom.Point)

func (*PaddedLayout) MinSize

func (l *PaddedLayout) MinSize(childList *list.List) geom.Point

type Panel

type Panel struct {
	ContainerEmbed
	Image image.Image
}

Ein Panel ist eine etwas komplexere Version eines Containers. Im Gegensatz zur Group ist ein Panel auf dem Bildschirm sichtbar. Ueber Properties laesst sich die visuelle Erscheinung beeinflussen. Panels beschneiden ihren Inhalt auf ihre Groesse. Sie koennen eine Hintergrundfarbe oder ein Hitergundbild haben.

func NewPanel

func NewPanel(w, h float64) *Panel

func (*Panel) Paint

func (p *Panel) Paint(gc *gg.Context)

type Point added in v1.1.0

type Point struct {
	Shape
}

Punkte

func NewPoint added in v1.1.0

func NewPoint() *Point

func (*Point) Contains added in v1.1.0

func (p *Point) Contains(pt geom.Point) bool

func (*Point) Paint added in v1.1.0

func (p *Point) Paint(gc *gg.Context)

func (*Point) Pos added in v1.1.0

func (p *Point) Pos() geom.Point

func (*Point) SetPos added in v1.1.0

func (p *Point) SetPos(mp geom.Point)

type Polygon added in v1.2.1

type Polygon struct {
	Shape

	Closed bool
	// contains filtered or unexported fields
}

Polygone

func NewPolygon added in v1.2.1

func NewPolygon(p0 geom.Point) *Polygon

func (*Polygon) AddPoint added in v1.2.1

func (p *Polygon) AddPoint(pt geom.Point)

func (*Polygon) Contains added in v1.2.1

func (p *Polygon) Contains(pt geom.Point) bool

func (*Polygon) Flatten added in v1.2.1

func (p *Polygon) Flatten()

func (*Polygon) Paint added in v1.2.1

func (p *Polygon) Paint(gc *gg.Context)

func (*Polygon) Points added in v1.2.1

func (p *Polygon) Points() []geom.Point

type PushEmbed added in v1.1.0

type PushEmbed struct {
	// contains filtered or unexported fields
}

Mit diesem Embed erhaelt ein Widget die Moeglichkeit, "gedrueckt" zu werden.

func (*PushEmbed) DataChanged added in v1.1.0

func (e *PushEmbed) DataChanged(pushed binding.DataItem)

Wird autom. aufgerufen, sobald der Wert von 'pushed' veraendert wird.

func (*PushEmbed) Init added in v1.1.0

func (e *PushEmbed) Init(node Node, extData binding.Bool)

Initialisert wird das Embed mit einem Verweis auf das eigentliche Widget und der Moeglichkeit, den Status mit anderen Widgets zu teilen.

func (*PushEmbed) OnInputEvent added in v1.1.0

func (e *PushEmbed) OnInputEvent(evt touch.Event)

Muss vom umschliessenden Widget aufgerufen werden.

func (*PushEmbed) Pushed added in v1.1.0

func (e *PushEmbed) Pushed() bool

Ermittelt den Status des Embed.

type RadioButton

type RadioButton struct {
	Button
	// contains filtered or unexported fields
}

Der RadioButton ist insofern ein Spezialfall, als er erstens zwei Zustaende haben kann (aktiv und nicht aktiv) und moeglicherweise einer Gruppe von RadioButtons angehoert, von denen nur einer aktiviert sein kann.

func NewRadioButtonWithData

func NewRadioButtonWithData(label string, value int, data binding.Int) *RadioButton

func (*RadioButton) DataChanged

func (b *RadioButton) DataChanged(data binding.DataItem)

func (*RadioButton) OnInputEvent

func (b *RadioButton) OnInputEvent(evt touch.Event)

func (*RadioButton) Paint

func (b *RadioButton) Paint(gc *gg.Context)

type Rectangle

type Rectangle struct {
	Shape
}

Und wo es Kreise gibt, da sind auch die Rechtecke nicht weit.

func NewRectangle

func NewRectangle(w, h float64) *Rectangle

func (*Rectangle) Contains added in v1.1.0

func (r *Rectangle) Contains(pt geom.Point) bool

func (*Rectangle) Paint

func (r *Rectangle) Paint(gc *gg.Context)

type Screen

type Screen struct {
	// contains filtered or unexported fields
}

Dies ist die Datenstruktur, welche das TFT-Display aus einer hoeheren Abstraktion beschreibt. Diese Struktur darf es nur einmal (1) in einer Applikation geben.

func CurrentScreen

func CurrentScreen() *Screen

Mit CurrentScreen wird die Referenz auf den aktuellen (einzigen) Bildschirm retourniert. Man könnte dies auch über eine globale Variable lösen.

func NewScreen

func NewScreen(rotation adatft.RotationType) *Screen

Mit NewScreen wird ein neues Screen-Objekt erzeugt und alle technischen Objekte in Zusammenhang mit der Ansteuerung des Bildschirm und Touch- Screens erzeugt. Aktuell darf es nur ein (1) solches Objekt geben - ein mehrfaches Aufrufen von NewScreen führt zu einem Abbruch der Applikation.

func (*Screen) NewWindow

func (s *Screen) NewWindow() *Window

Mit NewWindow wird ein neues Fenster erzeugt. Im Gegensatz zum Screen darf es in einer Applikation beliebig viele Fenster geben, von denen jedoch nur eines sichtbar, resp. aktiv ist.

func (*Screen) Quit

func (s *Screen) Quit()

Mit Quit wird die Applikation (d.h. der MainEvent-Loop) terminiert. Da Run im Main-Thread gestartet wird und während der Laufzeit der Applikation nicht zurückkehrt, muss diese Methode aus einer weiteren Go-Routine (bspw. dem Callback-Handler eines Buttons) aufgerufen werden.

func (*Screen) Run

func (s *Screen) Run()

Mit Run schliesslich wird der MainEvent-Loop der Applikation gestartet, das aktive Fenster wird dargestellt und mit Touch-Events beliefert. Wichtig: diese Methode kehrt nicht zurück, solange die Applikation läuft. Ein Aufruf dieser Methode via Go-Routine ist nicht sinnvoll, da sonst die Applikation gar nie richtig läuft (siehe auch Methode Quit).

func (*Screen) Save added in v1.2.1

func (s *Screen) Save(fileName string)

func (*Screen) SetWindow

func (s *Screen) SetWindow(w *Window)

Mit SetWindow wird das übergebene Fenster zum sichtbaren und aktiven Fenster. Nur aktive Fenster erhalten die Touch-Events vom Touchscreen und nur aktive Fenster werden dargestellt.

func (*Screen) StartAnimation

func (s *Screen) StartAnimation(a *Animation)

func (*Screen) StopAnimation

func (s *Screen) StopAnimation(a *Animation)

func (*Screen) Window

func (s *Screen) Window() *Window

Liefert das aktuell angezeigte Window zurueck.

type ScrollPanel added in v1.1.0

type ScrollPanel struct {
	ContainerEmbed
	Image image.Image
	// contains filtered or unexported fields
}

Komplexeres Panel mit Scrollmoeglichkeit.

func NewScrollPanel added in v1.1.0

func NewScrollPanel(w, h float64) *ScrollPanel

func (*ScrollPanel) LocalBounds added in v1.1.0

func (p *ScrollPanel) LocalBounds() geom.Rectangle

func (*ScrollPanel) Paint added in v1.1.0

func (p *ScrollPanel) Paint(gc *gg.Context)

func (*ScrollPanel) SetVirtualSize added in v1.1.0

func (p *ScrollPanel) SetVirtualSize(sz geom.Point)

func (*ScrollPanel) SetXView added in v1.1.0

func (p *ScrollPanel) SetXView(vx float64)

func (*ScrollPanel) SetYView added in v1.1.0

func (p *ScrollPanel) SetYView(vy float64)

func (*ScrollPanel) ViewPort added in v1.1.0

func (p *ScrollPanel) ViewPort() geom.Point

func (*ScrollPanel) VirtualSize added in v1.1.0

func (p *ScrollPanel) VirtualSize() geom.Point

Bestimmt die neue virtuelle Groesse des ScrolledPanels. Man kann bei sz keine Angaben machen, die kleiner als die eigentliche Groesse des Widgets ist.

func (*ScrollPanel) VisibleRange added in v1.1.0

func (p *ScrollPanel) VisibleRange() geom.Point

type Scrollbar

type Scrollbar struct {
	LeafEmbed
	PushEmbed
	// contains filtered or unexported fields
}

Mit Slider kann man einen Schieberegler beliebiger Laenge horizontal oder vertikal im GUI positionieren. Als Werte sind aktuell nur Fliesskommazahlen vorgesehen.

func NewScrollbar

func NewScrollbar(len float64, orient Orientation) *Scrollbar

func NewScrollbarWithCallback

func NewScrollbarWithCallback(len float64, orient Orientation,
	callback func(float64)) *Scrollbar

func NewScrollbarWithData

func NewScrollbarWithData(len float64, orient Orientation, dat binding.Float) *Scrollbar

func (*Scrollbar) OnInputEvent

func (s *Scrollbar) OnInputEvent(evt touch.Event)

func (*Scrollbar) Paint

func (s *Scrollbar) Paint(gc *gg.Context)

func (*Scrollbar) SetSize

func (s *Scrollbar) SetSize(size geom.Point)

func (*Scrollbar) SetValue

func (s *Scrollbar) SetValue(v float64)

func (*Scrollbar) SetVisiRange

func (s *Scrollbar) SetVisiRange(vr float64)

func (*Scrollbar) Value

func (s *Scrollbar) Value() float64

func (*Scrollbar) VisiRange

func (s *Scrollbar) VisiRange() float64

type SelectEmbed added in v1.2.1

type SelectEmbed struct {
	BindVar binding.Bool
	// contains filtered or unexported fields
}

Mit diesem Embed erhaelt ein Widget die Moeglichkeit, "ausgewaehlt" oder "selektiert" zu werden.

func (*SelectEmbed) DataChanged added in v1.2.1

func (e *SelectEmbed) DataChanged(BindVar binding.DataItem)

Wird autom. aufgerufen, sobald der Wert von 'BindVar' veraendert wird.

func (*SelectEmbed) Init added in v1.2.1

func (e *SelectEmbed) Init(node Node, extData binding.Bool)

Initialisert wird das Embed mit einem Verweis auf das eigentliche Widget und der Moeglichkeit, den Status mit anderen Widgets zu teilen.

func (*SelectEmbed) OnInputEvent added in v1.2.1

func (e *SelectEmbed) OnInputEvent(evt touch.Event)

Muss vom umschliessenden Widget aufgerufen werden.

func (*SelectEmbed) Selected added in v1.2.1

func (e *SelectEmbed) Selected() bool

Ermittelt den Status des Embed.

type Separator

type Separator struct {
	LeafEmbed
	// contains filtered or unexported fields
}

Fuer die visuelle Abgrenzung in Box-Layouts.

func NewSeparator

func NewSeparator(orient Orientation) *Separator

func (*Separator) Paint

func (s *Separator) Paint(gc *gg.Context)

type Shape added in v1.1.0

type Shape struct {
	LeafEmbed
	PushEmbed
	SelectEmbed
}

Abstrakter, allgemeiner Typ fuer geometrische Formen

func (*Shape) Init added in v1.1.0

func (s *Shape) Init()

func (*Shape) OnInputEvent added in v1.1.0

func (s *Shape) OnInputEvent(evt touch.Event)

type Slider

type Slider struct {
	LeafEmbed
	PushEmbed
	// contains filtered or unexported fields
}

Mit Slider kann man einen Schieberegler beliebiger Laenge horizontal oder vertikal im GUI positionieren. Als Werte sind aktuell nur Fliesskommazahlen vorgesehen.

func NewSlider

func NewSlider(len float64, orient Orientation) *Slider

func NewSliderWithCallback

func NewSliderWithCallback(len float64, orient Orientation,
	callback func(float64)) *Slider

func NewSliderWithData

func NewSliderWithData(len float64, orient Orientation, dat binding.Float) *Slider

func (*Slider) Factor

func (s *Slider) Factor() float64

func (*Slider) InitValue

func (s *Slider) InitValue() float64

func (*Slider) OnInputEvent

func (s *Slider) OnInputEvent(evt touch.Event)

func (*Slider) Paint

func (s *Slider) Paint(gc *gg.Context)

func (*Slider) Range

func (s *Slider) Range() (float64, float64, float64)

func (*Slider) SetFactor

func (s *Slider) SetFactor(f float64)

func (*Slider) SetInitValue

func (s *Slider) SetInitValue(v float64)

func (*Slider) SetRange

func (s *Slider) SetRange(min, max, step float64)

func (*Slider) SetSize

func (s *Slider) SetSize(size geom.Point)

func (*Slider) SetValue

func (s *Slider) SetValue(v float64)

func (*Slider) Value

func (s *Slider) Value() float64

type Spacer

type Spacer struct {
	LeafEmbed
	FixHorizontal, FixVertical bool
}

Nimmt den verfügbaren Platz (vertikal oder horizontal) in Box-Layouts ein. Ist zwar ein Widget, passt aber irgendwie besser zum Layout-Zeugs.

func NewSpacer

func NewSpacer() *Spacer

func (*Spacer) ExpandHorizontal

func (s *Spacer) ExpandHorizontal() bool

func (*Spacer) ExpandVertical

func (s *Spacer) ExpandVertical() bool

type StackLayout

type StackLayout struct{}

Wie beim PaddedLayout wird man mit Stack- oder Max-Layout sinnvollerweise auch nur ein einziges Child verwalten können. Dieses wird auf die ganze Grösse des Containers ausgedehnt - einfach ohne Ränder.

func (*StackLayout) Layout

func (l *StackLayout) Layout(childList *list.List, size geom.Point)

func (*StackLayout) MinSize

func (l *StackLayout) MinSize(childList *list.List) geom.Point

type TabButton

type TabButton struct {
	Button
	// contains filtered or unexported fields
}

func NewTabButton

func NewTabButton(label string, idx int) *TabButton

func NewTabButtonWithData

func NewTabButtonWithData(label string, idx int, data binding.Int) *TabButton

func (*TabButton) DataChanged

func (b *TabButton) DataChanged(data binding.DataItem)

func (*TabButton) OnInputEvent

func (b *TabButton) OnInputEvent(evt touch.Event)

func (*TabButton) Paint

func (b *TabButton) Paint(gc *gg.Context)

func (*TabButton) SetTabIndex

func (b *TabButton) SetTabIndex(idx int)

func (*TabButton) TabIndex

func (b *TabButton) TabIndex() int

type TabMenu added in v1.1.0

type TabMenu struct {
	ContainerEmbed
	// contains filtered or unexported fields
}

func NewTabMenu added in v1.1.0

func NewTabMenu() *TabMenu

func (*TabMenu) AddTab added in v1.1.0

func (m *TabMenu) AddTab(label string, content Node) int

func (*TabMenu) Paint added in v1.1.0

func (m *TabMenu) Paint(gc *gg.Context)

func (*TabMenu) SetTab added in v1.1.0

func (m *TabMenu) SetTab(idx int)

type TabPanel added in v1.0.2

type TabPanel struct {
	ContainerEmbed
	// contains filtered or unexported fields
}

TabPanel und TabButton sind fuer Tabbed Windows gedacht.

func NewTabPanel added in v1.0.2

func NewTabPanel(w, h float64, menu *TabMenu, content *Panel) *TabPanel

type TextButton

type TextButton struct {
	Button
	// contains filtered or unexported fields
}

Ein TextButton verhaelt sich analog zum neutralen Button, stellt jedoch zusaetzlich Text dar und passt seine Groesse diesem Text an.

func NewTextButton

func NewTextButton(label string) *TextButton

func (*TextButton) Align added in v1.1.0

func (b *TextButton) Align() AlignType

func (*TextButton) Paint

func (b *TextButton) Paint(gc *gg.Context)

func (*TextButton) SetAlign added in v1.1.0

func (b *TextButton) SetAlign(a AlignType)

func (*TextButton) SetFont

func (b *TextButton) SetFont(fontFont *fonts.Font)

func (*TextButton) SetFontSize

func (b *TextButton) SetFontSize(fontSize float64)

func (*TextButton) SetSize

func (b *TextButton) SetSize(size geom.Point)

func (*TextButton) SetText

func (b *TextButton) SetText(str string)

func (*TextButton) Text

func (b *TextButton) Text() string

type Window

type Window struct {
	Rect geom.Rectangle
	// contains filtered or unexported fields
}

func (*Window) Close

func (w *Window) Close()

Schliesst das Fenster.

func (*Window) Repaint

func (w *Window) Repaint()

Mit dieser Methode wird ein Neuaufbau des Bildschirms angestossen. Ueber die interne Queue paintQ wird dem paintThread der Auftrag fuer den Neuaufbau gegeben. Diese Methode blockiert nie! Ist bereits ein Auftrag fuer den Neuaufbau in der Queue, dann ist soweit alles i.O. und wir sind sicher, dass auch unser Auftrag behandelt wird.

func (*Window) Root

func (w *Window) Root() Node

In jedem Fenster muss es ein GUI-Element geben, welches an der obersten Stelle (der Wurzel, 'root') des SceneGraphs steht. Dies ist ueblicherweise ein Container-Widget.

func (*Window) Save added in v1.2.1

func (w *Window) Save(fileName string)

func (*Window) SetRoot

func (w *Window) SetRoot(root Node)

type WindowStage

type WindowStage uint32
const (
	StageDead WindowStage = iota
	StageAlive
	StageVisible
	StageFocused
)

Directories

Path Synopsis
Enthält eine Sammlung von gebundenen Datentypen.
Enthält eine Sammlung von gebundenen Datentypen.
cmd
displayTest Module
tabPanel Module
touchCalib Module
touchTest Module
examples
tabPanel
Einfachstes Beispiel eines AdaGui-Programmes.
Einfachstes Beispiel eines AdaGui-Programmes.
Das Package touch enthaelt alles, um Events vom Touchscreen bequemer zu verarbeiten.
Das Package touch enthaelt alles, um Events vom Touchscreen bequemer zu verarbeiten.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL