OnlineLibrary

Форк
0
170 строк · 4.5 Кб
1
package gui
2

3
import (
4
	"time"
5

6
	"OnlineLibrary/internal/gui/msg"
7
	"gitverse.ru/kvark128/walk"
8
	"gitverse.ru/kvark128/win"
9
)
10

11
// Messages for switching fragments
12
var (
13
	next_fragment     = msg.Message{Code: msg.PLAYER_OFFSET_FRAGMENT, Data: +1}
14
	previous_fragment = msg.Message{Code: msg.PLAYER_OFFSET_FRAGMENT, Data: -1}
15
)
16

17
// Messages for rewinding a fragment
18
var (
19
	rewind_5sec_forward  = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * 5}
20
	rewind_5sec_back     = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * -5}
21
	rewind_30sec_forward = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * 30}
22
	rewind_30sec_back    = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * -30}
23
	rewind_1min_forward  = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Minute}
24
	rewind_1min_back     = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: -time.Minute}
25
	rewind_5min_forward  = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Minute * 5}
26
	rewind_5min_back     = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Minute * -5}
27
)
28

29
type MainListBox struct {
30
	*walk.ListBox
31
	label *walk.TextLabel
32
	items []ListItem
33
	msgCH chan msg.Message
34
}
35

36
type ListItem interface {
37
	Label() string
38
}
39

40
func (mlb *MainListBox) SetItems(items []ListItem, label string, contextMenu *walk.Menu) {
41
	mlb.Synchronize(func() {
42
		mlb.label.SetText(label)
43
		mlb.Accessibility().SetName(label)
44
		mlb.items = items
45
		labels := make([]string, len(mlb.items))
46
		for i, v := range mlb.items {
47
			labels[i] = v.Label()
48
		}
49
		mlb.SetModel(labels)
50
		mlb.ListBox.SetContextMenu(contextMenu)
51
		mlb.SetCurrentIndex(0)
52
	})
53
}
54

55
func (mlb *MainListBox) Clear() {
56
	mlb.SetItems(nil, "", nil)
57
}
58

59
func (mlb *MainListBox) CurrentItem() ListItem {
60
	ic := make(chan int)
61
	mlb.Synchronize(func() {
62
		ic <- mlb.ListBox.CurrentIndex()
63
	})
64
	return mlb.items[<-ic]
65
}
66

67
func (mlb *MainListBox) WndProc(hwnd win.HWND, winmsg uint32, wParam, lParam uintptr) uintptr {
68
	switch winmsg {
69
	case win.WM_CHAR:
70
		if wParam <= 32 || walk.ModifiersDown() != 0 {
71
			return 0
72
		}
73

74
	case win.WM_KEYDOWN:
75
		mods := walk.ModifiersDown()
76
		key := walk.Key(wParam)
77

78
		if mods == walk.ModControl|walk.ModShift {
79
			switch key {
80
			case walk.KeyLeft:
81
				mlb.msgCH <- rewind_5min_back
82
				return 0
83
			case walk.KeyRight:
84
				mlb.msgCH <- rewind_5min_forward
85
				return 0
86
			}
87
		}
88

89
		if mods == walk.ModShift {
90
			switch key {
91
			case walk.KeyLeft:
92
				mlb.msgCH <- rewind_1min_back
93
				return 0
94
			case walk.KeyRight:
95
				mlb.msgCH <- rewind_1min_forward
96
				return 0
97
			case walk.KeyUp:
98
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_SPEED_UP}
99
				return 0
100
			case walk.KeyDown:
101
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_SPEED_DOWN}
102
				return 0
103
			case walk.Key1, walk.Key2, walk.Key3, walk.Key4, walk.Key5, walk.Key6, walk.Key7, walk.Key8, walk.Key9, walk.Key0:
104
				mlb.msgCH <- msg.Message{Code: msg.BOOKMARK_SET, Data: key.String()}
105
				return 0
106
			case walk.KeyR:
107
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_SPEED_RESET}
108
				return 0
109
			}
110
		}
111

112
		if mods == walk.ModControl {
113
			switch key {
114
			case walk.KeyLeft:
115
				mlb.msgCH <- rewind_30sec_back
116
				return 0
117
			case walk.KeyRight:
118
				mlb.msgCH <- rewind_30sec_forward
119
				return 0
120
			case walk.KeyUp:
121
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_VOLUME_UP}
122
				return 0
123
			case walk.KeyDown:
124
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_VOLUME_DOWN}
125
				return 0
126
			case walk.KeyPrior:
127
				mlb.msgCH <- previous_fragment
128
				return 0
129
			case walk.KeyNext:
130
				mlb.msgCH <- next_fragment
131
				return 0
132
			case walk.Key1, walk.Key2, walk.Key3, walk.Key4, walk.Key5, walk.Key6, walk.Key7, walk.Key8, walk.Key9, walk.Key0:
133
				mlb.msgCH <- msg.Message{Code: msg.BOOKMARK_FETCH, Data: key.String()}
134
				return 0
135
			case walk.KeyR:
136
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_VOLUME_RESET}
137
				return 0
138
			}
139
		}
140

141
		if mods == 0 {
142
			switch key {
143
			case walk.KeyRight:
144
				mlb.msgCH <- rewind_5sec_forward
145
				return 0
146
			case walk.KeyLeft:
147
				mlb.msgCH <- rewind_5sec_back
148
				return 0
149
			case walk.KeySpace:
150
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_PLAY_PAUSE}
151
				return 0
152
			case walk.KeyMediaPlayPause:
153
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_PLAY_PAUSE}
154
				return 0
155
			case walk.KeyMediaStop:
156
				mlb.msgCH <- msg.Message{Code: msg.PLAYER_STOP}
157
				return 0
158
			case walk.KeyMediaNextTrack:
159
				mlb.msgCH <- next_fragment
160
				return 0
161
			case walk.KeyMediaPrevTrack:
162
				mlb.msgCH <- previous_fragment
163
				return 0
164
			}
165
		}
166

167
	}
168

169
	return mlb.ListBox.WndProc(hwnd, winmsg, wParam, lParam)
170
}
171

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.