Passed
Push — main ( 05b53a...cd1aeb )
by Rafael
01:13
created

ui/clickable_list_widget.go   A

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 23
eloc 73
dl 0
loc 116
rs 10
c 0
b 0
f 0

10 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
B ui.*ListWithListener.labelClick 0 20 7
A ui.*ListWithListener.AddListener 0 2 1
A ui.*ListWithListener.CanvasObject 0 2 1
A ui.*ClickableLabel.DoubleTapped 0 3 2
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 Event struct {
10
	EventType   string
11
	EventSource string
12
}
13
14
type EventListener func(event Event)
15
16
type ListWithListener struct {
17
	list     *widget.List
18
	data     binding.StringList
19
	selected int
20
21
	listeners []EventListener
22
}
23
24
type ClickableLabel struct {
25
	widget.Label
26
27
	listeners []EventListener
28
}
29
30
func NewClickableLabel(text string) *ClickableLabel {
31
	label := &ClickableLabel{}
32
	label.ExtendBaseWidget(label)
33
	label.SetText(text)
34
	label.listeners = make([]EventListener, 0)
35
	return label
36
}
37
38
func (l *ClickableLabel) AddListener(listener EventListener) {
39
	l.listeners = append(l.listeners, listener)
40
}
41
42
func (l *ClickableLabel) Tapped(_ *fyne.PointEvent) {
43
	for _, listener := range l.listeners {
44
		listener(Event{"click", l.Text})
45
	}
46
}
47
48
func (l *ClickableLabel) DoubleTapped(_ *fyne.PointEvent) {
49
	for _, listener := range l.listeners {
50
		listener(Event{"dblclick", l.Text})
51
	}
52
}
53
54
func NewSelectableList(data binding.StringList) *ListWithListener {
55
	var list *ListWithListener
56
	list = &ListWithListener{widget.NewListWithData(
57
		data,
58
		func() fyne.CanvasObject {
59
			clickableLabel := NewClickableLabel("template")
60
			clickableLabel.AddListener(list.labelClick)
61
			return clickableLabel
62
		},
63
		func(di binding.DataItem, co fyne.CanvasObject) {
64
			co.(*ClickableLabel).Bind(di.(binding.String))
65
		},
66
	), data, -1, make([]EventListener, 0)}
67
	return list
68
}
69
70
func (l *ListWithListener) labelClick(event Event) {
71
	if event.EventType == "dblclick" {
72
		for _, listener := range l.listeners {
73
			listener(event)
74
		}
75
	} else if event.EventType == "click" {
76
		label := event.EventSource
77
78
		idx := l.getIndex(label)
79
		if idx > -1 {
80
			l.list.Select(idx)
81
			if l.selected != idx {
82
				l.selected = idx
83
				for _, listener := range l.listeners {
84
					listener(event)
85
				}
86
			}
87
		} else {
88
			l.list.Unselect(l.selected)
89
			l.selected = -1
90
		}
91
	}
92
}
93
94
func (l *ListWithListener) getIndex(text string) int {
95
	values, _ := l.data.Get()
96
97
	for i, value := range values {
98
		if value == text {
99
			return i
100
		}
101
	}
102
	return -1
103
}
104
105
func (l *ListWithListener) CanvasObject() fyne.CanvasObject {
106
	return l.list
107
}
108
109
func (l *ListWithListener) AddListener(listener EventListener) {
110
	l.listeners = append(l.listeners, listener)
111
}
112
113
func (l *ListWithListener) ClearSelected() {
114
	if l.selected > -1 {
115
		l.list.Unselect(l.selected)
116
		l.selected = -1
117
	}
118
}
119