OnlineLibrary
170 строк · 4.5 Кб
1package gui
2
3import (
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
12var (
13next_fragment = msg.Message{Code: msg.PLAYER_OFFSET_FRAGMENT, Data: +1}
14previous_fragment = msg.Message{Code: msg.PLAYER_OFFSET_FRAGMENT, Data: -1}
15)
16
17// Messages for rewinding a fragment
18var (
19rewind_5sec_forward = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * 5}
20rewind_5sec_back = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * -5}
21rewind_30sec_forward = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * 30}
22rewind_30sec_back = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Second * -30}
23rewind_1min_forward = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Minute}
24rewind_1min_back = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: -time.Minute}
25rewind_5min_forward = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Minute * 5}
26rewind_5min_back = msg.Message{Code: msg.PLAYER_OFFSET_POSITION, Data: time.Minute * -5}
27)
28
29type MainListBox struct {
30*walk.ListBox
31label *walk.TextLabel
32items []ListItem
33msgCH chan msg.Message
34}
35
36type ListItem interface {
37Label() string
38}
39
40func (mlb *MainListBox) SetItems(items []ListItem, label string, contextMenu *walk.Menu) {
41mlb.Synchronize(func() {
42mlb.label.SetText(label)
43mlb.Accessibility().SetName(label)
44mlb.items = items
45labels := make([]string, len(mlb.items))
46for i, v := range mlb.items {
47labels[i] = v.Label()
48}
49mlb.SetModel(labels)
50mlb.ListBox.SetContextMenu(contextMenu)
51mlb.SetCurrentIndex(0)
52})
53}
54
55func (mlb *MainListBox) Clear() {
56mlb.SetItems(nil, "", nil)
57}
58
59func (mlb *MainListBox) CurrentItem() ListItem {
60ic := make(chan int)
61mlb.Synchronize(func() {
62ic <- mlb.ListBox.CurrentIndex()
63})
64return mlb.items[<-ic]
65}
66
67func (mlb *MainListBox) WndProc(hwnd win.HWND, winmsg uint32, wParam, lParam uintptr) uintptr {
68switch winmsg {
69case win.WM_CHAR:
70if wParam <= 32 || walk.ModifiersDown() != 0 {
71return 0
72}
73
74case win.WM_KEYDOWN:
75mods := walk.ModifiersDown()
76key := walk.Key(wParam)
77
78if mods == walk.ModControl|walk.ModShift {
79switch key {
80case walk.KeyLeft:
81mlb.msgCH <- rewind_5min_back
82return 0
83case walk.KeyRight:
84mlb.msgCH <- rewind_5min_forward
85return 0
86}
87}
88
89if mods == walk.ModShift {
90switch key {
91case walk.KeyLeft:
92mlb.msgCH <- rewind_1min_back
93return 0
94case walk.KeyRight:
95mlb.msgCH <- rewind_1min_forward
96return 0
97case walk.KeyUp:
98mlb.msgCH <- msg.Message{Code: msg.PLAYER_SPEED_UP}
99return 0
100case walk.KeyDown:
101mlb.msgCH <- msg.Message{Code: msg.PLAYER_SPEED_DOWN}
102return 0
103case walk.Key1, walk.Key2, walk.Key3, walk.Key4, walk.Key5, walk.Key6, walk.Key7, walk.Key8, walk.Key9, walk.Key0:
104mlb.msgCH <- msg.Message{Code: msg.BOOKMARK_SET, Data: key.String()}
105return 0
106case walk.KeyR:
107mlb.msgCH <- msg.Message{Code: msg.PLAYER_SPEED_RESET}
108return 0
109}
110}
111
112if mods == walk.ModControl {
113switch key {
114case walk.KeyLeft:
115mlb.msgCH <- rewind_30sec_back
116return 0
117case walk.KeyRight:
118mlb.msgCH <- rewind_30sec_forward
119return 0
120case walk.KeyUp:
121mlb.msgCH <- msg.Message{Code: msg.PLAYER_VOLUME_UP}
122return 0
123case walk.KeyDown:
124mlb.msgCH <- msg.Message{Code: msg.PLAYER_VOLUME_DOWN}
125return 0
126case walk.KeyPrior:
127mlb.msgCH <- previous_fragment
128return 0
129case walk.KeyNext:
130mlb.msgCH <- next_fragment
131return 0
132case walk.Key1, walk.Key2, walk.Key3, walk.Key4, walk.Key5, walk.Key6, walk.Key7, walk.Key8, walk.Key9, walk.Key0:
133mlb.msgCH <- msg.Message{Code: msg.BOOKMARK_FETCH, Data: key.String()}
134return 0
135case walk.KeyR:
136mlb.msgCH <- msg.Message{Code: msg.PLAYER_VOLUME_RESET}
137return 0
138}
139}
140
141if mods == 0 {
142switch key {
143case walk.KeyRight:
144mlb.msgCH <- rewind_5sec_forward
145return 0
146case walk.KeyLeft:
147mlb.msgCH <- rewind_5sec_back
148return 0
149case walk.KeySpace:
150mlb.msgCH <- msg.Message{Code: msg.PLAYER_PLAY_PAUSE}
151return 0
152case walk.KeyMediaPlayPause:
153mlb.msgCH <- msg.Message{Code: msg.PLAYER_PLAY_PAUSE}
154return 0
155case walk.KeyMediaStop:
156mlb.msgCH <- msg.Message{Code: msg.PLAYER_STOP}
157return 0
158case walk.KeyMediaNextTrack:
159mlb.msgCH <- next_fragment
160return 0
161case walk.KeyMediaPrevTrack:
162mlb.msgCH <- previous_fragment
163return 0
164}
165}
166
167}
168
169return mlb.ListBox.WndProc(hwnd, winmsg, wParam, lParam)
170}
171