summaryrefslogtreecommitdiffstatshomepage
path: root/splitterhandle.go
blob: 69c4cea9c63489bef1554ff26969e404d8240e0f (plain) (blame)
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
// Copyright 2011 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build windows

package walk

import (
	"github.com/lxn/win"
)

const splitterHandleWindowClass = "WireGuard UI - SplitterHandle"

func init() {
	MustRegisterWindowClass(splitterHandleWindowClass)
}

type splitterHandle struct {
	WidgetBase
}

func newSplitterHandle(splitter *Splitter) (*splitterHandle, error) {
	if splitter == nil {
		return nil, newError("splitter cannot be nil")
	}

	sh := new(splitterHandle)
	sh.parent = splitter

	if err := InitWindow(
		sh,
		splitter,
		splitterHandleWindowClass,
		win.WS_CHILD|win.WS_VISIBLE,
		0); err != nil {
		return nil, err
	}

	sh.SetBackground(NullBrush())

	if err := sh.setAndClearStyleBits(0, win.WS_CLIPSIBLINGS); err != nil {
		return nil, err
	}

	return sh, nil
}

func (sh *splitterHandle) LayoutFlags() LayoutFlags {
	splitter, ok := sh.Parent().(*Splitter)
	if !ok {
		return 0
	}

	if splitter.Orientation() == Horizontal {
		return ShrinkableVert | GrowableVert | GreedyVert
	}

	return ShrinkableHorz | GrowableHorz | GreedyHorz
}

func (sh *splitterHandle) MinSizeHint() Size {
	return sh.SizeHint()
}

func (sh *splitterHandle) SizeHint() Size {
	splitter, ok := sh.Parent().(*Splitter)
	if !ok {
		return Size{}
	}

	handleWidth := splitter.HandleWidth()
	var size Size

	if splitter.Orientation() == Horizontal {
		size.Width = handleWidth
	} else {
		size.Height = handleWidth
	}

	return size
}

func (sh *splitterHandle) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
	switch msg {
	case win.WM_ERASEBKGND:
		if sh.Background() == nullBrushSingleton {
			return 1
		}

	case win.WM_PAINT:
		if sh.Background() == nullBrushSingleton {
			var ps win.PAINTSTRUCT

			win.BeginPaint(hwnd, &ps)
			defer win.EndPaint(hwnd, &ps)

			return 0
		}
	}

	return sh.WidgetBase.WndProc(hwnd, msg, wParam, lParam)
}