From 028d1c25ac9b12126087b26c8ecf537e0fc49f08 Mon Sep 17 00:00:00 2001 From: qowevisa Date: Fri, 12 Jul 2024 20:33:26 +0300 Subject: [PATCH] Add extfyne packages --- extfyne/layouts/entbtn7030.go | 40 ++++++++++++ extfyne/layouts/fullwidth.go | 41 ++++++++++++ extfyne/layouts/vargridcols.go | 58 +++++++++++++++++ extfyne/layouts/vargridrows.go | 53 ++++++++++++++++ extfyne/main.go | 1 + extfyne/widgets/messageBoard.go | 106 ++++++++++++++++++++++++++++++++ 6 files changed, 299 insertions(+) create mode 100644 extfyne/layouts/entbtn7030.go create mode 100644 extfyne/layouts/fullwidth.go create mode 100644 extfyne/layouts/vargridcols.go create mode 100644 extfyne/layouts/vargridrows.go create mode 100644 extfyne/main.go create mode 100644 extfyne/widgets/messageBoard.go diff --git a/extfyne/layouts/entbtn7030.go b/extfyne/layouts/entbtn7030.go new file mode 100644 index 0000000..f82514d --- /dev/null +++ b/extfyne/layouts/entbtn7030.go @@ -0,0 +1,40 @@ +package layouts + +import "fyne.io/fyne/v2" + +// Implements: fyne.Layout +type EntryBtn7030 struct{} + +// Implements: fyne.Layout 1 +func (p *EntryBtn7030) MinSize(objects []fyne.CanvasObject) fyne.Size { + minWidth := float32(0) + minHeight := float32(0) + for _, obj := range objects { + minSize := obj.MinSize() + minWidth += minSize.Width + if minSize.Height > minHeight { + minHeight = minSize.Height + } + } + return fyne.NewSize(minWidth, minHeight) +} + +// Implements: fyne.Layout 2 +func (p *EntryBtn7030) Layout(objects []fyne.CanvasObject, size fyne.Size) { + if len(objects) != 2 { + return + } + + entryWidth := size.Width * 0.7 + buttonWidth := size.Width * 0.3 + + objects[0].Resize(fyne.NewSize(entryWidth, size.Height)) + objects[1].Resize(fyne.NewSize(buttonWidth, size.Height)) + + objects[0].Move(fyne.NewPos(0, 0)) + objects[1].Move(fyne.NewPos(entryWidth, 0)) +} + +func NewEntryBtn7030() fyne.Layout { + return &EntryBtn7030{} +} diff --git a/extfyne/layouts/fullwidth.go b/extfyne/layouts/fullwidth.go new file mode 100644 index 0000000..92698ab --- /dev/null +++ b/extfyne/layouts/fullwidth.go @@ -0,0 +1,41 @@ +package layouts + +import ( + "fyne.io/fyne/v2" +) + +// Implements: fyne.Layout +type FullScale struct { + size fyne.Size +} + +// Implements: fyne.Layout 1 +func (p *FullScale) MinSize(objects []fyne.CanvasObject) fyne.Size { + return p.size +} + +// Implements: fyne.Layout 2 +func (p *FullScale) Layout(objects []fyne.CanvasObject, size fyne.Size) { + if len(objects) != 1 { + return + } + if p.size.Width < size.Width { + p.size.Width = size.Width + } + if p.size.Height < size.Height { + p.size.Height = size.Height + } + + objects[0].Resize(fyne.NewSize(p.size.Width, p.size.Height)) + objects[0].Move(fyne.NewPos(0, 0)) +} + +func NewFullWidth() fyne.Layout { + return &FullScale{} +} + +func NewFullWidthWithSize(s fyne.Size) fyne.Layout { + return &FullScale{ + size: s, + } +} diff --git a/extfyne/layouts/vargridcols.go b/extfyne/layouts/vargridcols.go new file mode 100644 index 0000000..97546fa --- /dev/null +++ b/extfyne/layouts/vargridcols.go @@ -0,0 +1,58 @@ +package layouts + +import "fyne.io/fyne/v2" + +// Implements: fyne.Layout +type VarGridCols struct { + cols int + cfg []int +} + +func NewVariableGridWithColumns(cols int, cfg []int) *VarGridCols { + return &VarGridCols{ + cols: cols, + cfg: cfg, + } +} + +// Implements: fyne.Layout : 1 +func (v *VarGridCols) MinSize(objects []fyne.CanvasObject) fyne.Size { + w, h := float32(0), float32(0) + i := 0 + for _, o := range objects { + if !o.Visible() { + continue + } + childSize := o.MinSize() + + // NOTE: can be out-of-bounds error if not checked at creation + takenCols := v.cfg[i] + if takenCols > 1 { + w += childSize.Width * float32(takenCols) + } else { + w += childSize.Width + } + if h+childSize.Height > h { + h += childSize.Height + } + i++ + } + return fyne.NewSize(w, h) +} + +// Implements: fyne.Layout : 2 +func (v *VarGridCols) Layout(objects []fyne.CanvasObject, contSize fyne.Size) { + // pos := fyne.NewPos(0, contSize.Height-v.MinSize(objects).Height) + pos := fyne.NewPos(0, 0) + cellWidthSingular := float64(contSize.Width) / float64(v.cols) + cellHeight := contSize.Height + + for i, o := range objects { + numCols := v.cfg[i] + w := cellWidthSingular * float64(numCols) + o.Move(pos) + o.Resize(fyne.NewSize(float32(w), cellHeight)) + + pos = pos.Add(fyne.NewPos(float32(w), 0)) + } +} diff --git a/extfyne/layouts/vargridrows.go b/extfyne/layouts/vargridrows.go new file mode 100644 index 0000000..175e18e --- /dev/null +++ b/extfyne/layouts/vargridrows.go @@ -0,0 +1,53 @@ +package layouts + +import "fyne.io/fyne/v2" + +// Implements: fyne.Layout +type VarGridRows struct { + rows int + cfg []int +} + +func NewVariableGridWithRows(cols int, cfg []int) *VarGridRows { + return &VarGridRows{ + rows: cols, + cfg: cfg, + } +} + +// Implements: fyne.Layout : 1 +func (v *VarGridRows) MinSize(objects []fyne.CanvasObject) fyne.Size { + w, h := float32(0), float32(0) + for i, o := range objects { + childSize := o.MinSize() + + // NOTE: can be out-of-bounds error if not checked at creation + takenRows := v.cfg[i] + if takenRows > 1 { + h += childSize.Height * float32(takenRows) + } else { + h += childSize.Height + } + if h+childSize.Height > h { + w += childSize.Width + } + } + return fyne.NewSize(w, h) +} + +// Implements: fyne.Layout : 2 +func (v *VarGridRows) Layout(objects []fyne.CanvasObject, contSize fyne.Size) { + // pos := fyne.NewPos(0, contSize.Height-v.MinSize(objects).Height) + pos := fyne.NewPos(0, 0) + cellHeightSingular := float64(contSize.Height) / float64(v.rows) + cellWidth := contSize.Height + + for i, o := range objects { + numRows := v.cfg[i] + h := cellHeightSingular * float64(numRows) + o.Move(pos) + o.Resize(fyne.NewSize(cellWidth, float32(h))) + + pos = pos.Add(fyne.NewPos(0, float32(h))) + } +} diff --git a/extfyne/main.go b/extfyne/main.go new file mode 100644 index 0000000..a2e9864 --- /dev/null +++ b/extfyne/main.go @@ -0,0 +1 @@ +package extfyne diff --git a/extfyne/widgets/messageBoard.go b/extfyne/widgets/messageBoard.go new file mode 100644 index 0000000..373e6fe --- /dev/null +++ b/extfyne/widgets/messageBoard.go @@ -0,0 +1,106 @@ +package widgets + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/widget" +) + +type MBoardMessage struct { + LeftAlign bool + Data *widget.Label +} + +type MessageBoard struct { + widget.BaseWidget + Messages []MBoardMessage +} + +func NewEmptyMessageBoard() *MessageBoard { + board := &MessageBoard{ + Messages: make([]MBoardMessage, 0), + } + board.ExtendBaseWidget(board) + return board +} + +func NewMessageBoard(msgs []MBoardMessage) *MessageBoard { + board := &MessageBoard{ + Messages: msgs, + } + board.ExtendBaseWidget(board) + return board +} + +func (m *MessageBoard) Add(msg MBoardMessage) { + m.Messages = append(m.Messages, msg) + m.Refresh() +} + +func (m *MessageBoard) CreateRenderer() fyne.WidgetRenderer { + content := container.NewVBox() + for _, msg := range m.Messages { + hbox := container.NewHBox() + background := canvas.NewRectangle(&color.RGBA{R: 0, G: 0, B: 255, A: 128}) + background.SetMinSize(msg.Data.MinSize()) + + if msg.LeftAlign { + hbox.Add(container.NewStack(background, msg.Data)) + } else { + hbox.Add(layout.NewSpacer()) + hbox.Add(container.NewStack(background, msg.Data)) + } + content.Add(hbox) + } + + scrollContainer := container.NewScroll(content) + + return &messageBoardRenderer{ + board: m, + content: scrollContainer, + } +} + +type messageBoardRenderer struct { + board *MessageBoard + content *container.Scroll +} + +func (r *messageBoardRenderer) Layout(size fyne.Size) { + r.content.Resize(size) +} + +func (r *messageBoardRenderer) MinSize() fyne.Size { + return r.content.MinSize() +} + +func (r *messageBoardRenderer) Refresh() { + r.content.Content.(*fyne.Container).Objects = nil + for _, msg := range r.board.Messages { + hbox := container.NewHBox() + if msg.LeftAlign { + background := canvas.NewRectangle(&color.RGBA{R: 0, G: 0, B: 255, A: 128}) + background.SetMinSize(msg.Data.MinSize()) + hbox.Add(container.NewStack(background, msg.Data)) + } else { + background := canvas.NewRectangle(&color.RGBA{R: 0, G: 255, B: 0, A: 128}) + background.SetMinSize(msg.Data.MinSize()) + hbox.Add(layout.NewSpacer()) + hbox.Add(container.NewStack(background, msg.Data)) + } + r.content.Content.(*fyne.Container).Add(hbox) + } + r.content.Refresh() +} + +func (r *messageBoardRenderer) Destroy() { + // Clean up resources if needed +} + +func (r *messageBoardRenderer) Objects() []fyne.CanvasObject { + return []fyne.CanvasObject{r.content} +}