package components import ( "fmt" "gitea.unprism.ru/yotia/display-test/drawer" ) type text struct { drawer drawer.Drawer // Drawer with dysplay mask mask // Flush mask str string rect rect // Rect } type Text interface { Component RectSetter SetStr(newStr string) // Update string and redraw Clear() // Clear space of bar } // Creation function // Now the only way to chage shape is to recreate component func NewText(d drawer.Drawer, x, y int) (Text, error) { if err := d.GetDisplay().IsReady(); err != nil { return nil, fmt.Errorf("display is ready: %w", err) } t := text{ drawer: d, rect: rect{x, y, 0, drawer.FontCharH}, } t.mask.Update(t.rect) //t.Draw() return &t, nil } func (t *text) Close() error { return nil } func (t *text) Clear() { t.drawer.FillBar(t.rect.x, t.rect.y, t.rect.x+t.rect.w, t.rect.y+t.rect.h, 0x00) } func (t *text) Draw() { t.drawer.PutText(t.rect.x, t.rect.y, t.str) t.drawer.GetDisplay().FlushByMask(t.mask.bits) } func (t *text) updateW() { t.rect.w = len(t.str)*(drawer.FontCharW+drawer.CharGap) - drawer.CharGap } func (t *text) SetStr(str string) { t.str = str newW := len(t.str)*(drawer.FontCharW+drawer.CharGap) - drawer.CharGap if t.rect.w-newW > 0 { // Need to clear some space t.Clear() t.drawer.FillBar(t.rect.x+newW, t.rect.y, t.rect.x+t.rect.w, t.rect.y+t.rect.h, 0) } else { t.rect.w = newW t.mask.Update(t.rect) } t.Draw() t.rect.w = newW t.mask.Update(t.rect) } func (t *text) GetPos() (int, int) { return t.rect.x, t.rect.y } func (t *text) GetSize() (int, int) { return t.rect.w, t.rect.h } func (t *text) SetPos(x, y int) { t.rect.x = x t.rect.y = y t.mask.Update(t.rect) } func (t *text) SetSize(w, h int) { // Empty }