forked from wailsapp/wails
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tabview.go
107 lines (86 loc) · 2.34 KB
/
tabview.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//go:build windows
/*
* Copyright (C) 2019 The Winc Authors. All Rights Reserved.
*/
package winc
import (
"syscall"
"unsafe"
"github.com/rribou/wails/v2/internal/frontend/desktop/windows/winc/w32"
)
// TabView creates MultiPanel internally and manages tabs as panels.
type TabView struct {
ControlBase
panels *MultiPanel
onSelectedChange EventManager
}
func NewTabView(parent Controller) *TabView {
tv := new(TabView)
tv.InitControl("SysTabControl32", parent, 0,
w32.WS_CHILD|w32.WS_VISIBLE|w32.WS_TABSTOP|w32.WS_CLIPSIBLINGS)
RegMsgHandler(tv)
tv.panels = NewMultiPanel(parent)
tv.SetFont(DefaultFont)
tv.SetSize(200, 24)
return tv
}
func (tv *TabView) Panels() *MultiPanel {
return tv.panels
}
func (tv *TabView) tcitemFromPage(panel *Panel) *w32.TCITEM {
text := syscall.StringToUTF16(panel.Text())
item := &w32.TCITEM{
Mask: w32.TCIF_TEXT,
PszText: &text[0],
CchTextMax: int32(len(text)),
}
return item
}
func (tv *TabView) AddPanel(text string) *Panel {
panel := NewPanel(tv.panels)
panel.SetText(text)
item := tv.tcitemFromPage(panel)
index := tv.panels.Count()
idx := int(w32.SendMessage(tv.hwnd, w32.TCM_INSERTITEM, uintptr(index), uintptr(unsafe.Pointer(item))))
if idx == -1 {
panic("SendMessage(TCM_INSERTITEM) failed")
}
tv.panels.AddPanel(panel)
tv.SetCurrent(idx)
return panel
}
func (tv *TabView) DeletePanel(index int) {
w32.SendMessage(tv.hwnd, w32.TCM_DELETEITEM, uintptr(index), 0)
tv.panels.DeletePanel(index)
switch {
case tv.panels.Count() > index:
tv.SetCurrent(index)
case tv.panels.Count() == 0:
tv.SetCurrent(0)
}
}
func (tv *TabView) Current() int {
return tv.panels.Current()
}
func (tv *TabView) SetCurrent(index int) {
if index < 0 || index >= tv.panels.Count() {
panic("invalid index")
}
if ret := int(w32.SendMessage(tv.hwnd, w32.TCM_SETCURSEL, uintptr(index), 0)); ret == -1 {
panic("SendMessage(TCM_SETCURSEL) failed")
}
tv.panels.SetCurrent(index)
}
func (tv *TabView) WndProc(msg uint32, wparam, lparam uintptr) uintptr {
switch msg {
case w32.WM_NOTIFY:
nmhdr := (*w32.NMHDR)(unsafe.Pointer(lparam))
switch int32(nmhdr.Code) {
case w32.TCN_SELCHANGE:
cur := int(w32.SendMessage(tv.hwnd, w32.TCM_GETCURSEL, 0, 0))
tv.SetCurrent(cur)
tv.onSelectedChange.Fire(NewEvent(tv, nil))
}
}
return w32.DefWindowProc(tv.hwnd, msg, wparam, lparam)
}