Passed
Push — main ( 19af13...375dae )
by Rafael
01:23
created

ui/custom_widgets.go   A

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 18
eloc 63
dl 0
loc 99
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A ui.NewSelectableList 0 14 3
A ui.*ClickableLabel.Tapped 0 3 2
A ui.*ClickableLabel.AddListener 0 2 1
A ui.*ListWithListener.ClearSelected 0 4 2
A ui.NewClickableLabel 0 6 1
A ui.*ListWithListener.getIndex 0 9 3
A ui.*ListWithListener.labelClick 0 15 4
A ui.*ListWithListener.AddListener 0 2 1
A ui.*ListWithListener.CanvasObject 0 2 1
1
package ui
2
3
import (
4
	"fyne.io/fyne/v2"
5
	"fyne.io/fyne/v2/data/binding"
6
	"fyne.io/fyne/v2/widget"
7
)
8
9
type EventListener func(event interface{})
10
11
type ListWithListener struct {
12
	list     *widget.List
13
	data     binding.StringList
14
	selected int
15
16
	listeners []EventListener
17
}
18
19
type ClickableLabel struct {
20
	widget.Label
21
22
	listeners []EventListener
23
}
24
25
func NewClickableLabel(text string) *ClickableLabel {
26
	label := &ClickableLabel{}
27
	label.ExtendBaseWidget(label)
28
	label.SetText(text)
29
	label.listeners = make([]EventListener, 0)
30
	return label
31
}
32
33
func (l *ClickableLabel) AddListener(listener EventListener) {
34
	l.listeners = append(l.listeners, listener)
35
}
36
37
func (l *ClickableLabel) Tapped(_ *fyne.PointEvent) {
38
	for _, listener := range l.listeners {
39
		listener(l.Text)
40
	}
41
}
42
43
func NewSelectableList(data binding.StringList) *ListWithListener {
44
	var list *ListWithListener
45
	list = &ListWithListener{widget.NewListWithData(
46
		data,
47
		func() fyne.CanvasObject {
48
			clickableLabel := NewClickableLabel("template")
49
			clickableLabel.AddListener(list.labelClick)
50
			return clickableLabel
51
		},
52
		func(di binding.DataItem, co fyne.CanvasObject) {
53
			co.(*ClickableLabel).Bind(di.(binding.String))
54
		},
55
	), data, -1, make([]EventListener, 0)}
56
	return list
57
}
58
59
func (l *ListWithListener) labelClick(event interface{}) {
60
	label := event.(string)
61
62
	idx := l.getIndex(label)
63
	if idx > -1 {
64
		l.list.Select(idx)
65
		if l.selected != idx {
66
			l.selected = idx
67
			for _, listener := range l.listeners {
68
				listener(label)
69
			}
70
		}
71
	} else {
72
		l.list.Unselect(l.selected)
73
		l.selected = -1
74
	}
75
}
76
77
func (l *ListWithListener) getIndex(text string) int {
78
	values, _ := l.data.Get()
79
80
	for i, value := range values {
81
		if value == text {
82
			return i
83
		}
84
	}
85
	return -1
86
}
87
88
func (l *ListWithListener) CanvasObject() fyne.CanvasObject {
89
	return l.list
90
}
91
92
func (l *ListWithListener) AddListener(listener EventListener) {
93
	l.listeners = append(l.listeners, listener)
94
}
95
96
func (l *ListWithListener) ClearSelected() {
97
	if l.selected > -1 {
98
		l.list.Unselect(l.selected)
99
		l.selected = -1
100
	}
101
}
102