5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 03:52:41 +08:00
wails/v2/internal/frontend/desktop/windows/winc/resizer.go
Lea Anthony af1c530442
Remove usage of unsafe.Pointer in winc (#1556)
* Remove usage of unsafe.Pointer

* [windows] Remove MakeIntResource and add overloads for Load functions

* Fix `EnumProc` race condition.

* Refactor `EnumDisplayMonitors` to use `unsafe.Pointer` instead of `uintptr`

Co-authored-by: stffabi <stffabi@users.noreply.github.com>
2022-07-18 18:22:46 +10:00

215 lines
4.1 KiB
Go

/*
* Copyright (C) 2019 The Winc Authors. All Rights Reserved.
*/
package winc
import (
"github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/winc/w32"
)
type VResizer struct {
ControlBase
control1 Dockable
control2 Dockable
dir Direction
mouseLeft bool
drag bool
}
func NewVResizer(parent Controller) *VResizer {
sp := new(VResizer)
RegClassOnlyOnce("winc_VResizer")
sp.hwnd = CreateWindow("winc_VResizer", parent, w32.WS_EX_CONTROLPARENT, w32.WS_CHILD|w32.WS_VISIBLE)
sp.parent = parent
sp.mouseLeft = true
RegMsgHandler(sp)
sp.SetFont(DefaultFont)
sp.SetText("")
sp.SetSize(20, 100)
return sp
}
func (sp *VResizer) SetControl(control1, control2 Dockable, dir Direction, minSize int) {
sp.control1 = control1
sp.control2 = control2
if dir != Left && dir != Right {
panic("invalid direction")
}
sp.dir = dir
// TODO(vi): ADDED
/*internalTrackMouseEvent(control1.Handle())
internalTrackMouseEvent(control2.Handle())
control1.OnMouseMove().Bind(func(e *Event) {
if sp.drag {
x := e.Data.(*MouseEventData).X
sp.update(x)
w32.SetCursor(w32.LoadCursorWithResourceID(0, w32.IDC_SIZEWE))
}
fmt.Println("control1.OnMouseMove")
})
control2.OnMouseMove().Bind(func(e *Event) {
if sp.drag {
x := e.Data.(*MouseEventData).X
sp.update(x)
w32.SetCursor(w32.LoadCursorWithResourceID(0, w32.IDC_SIZEWE))
}
fmt.Println("control2.OnMouseMove")
})
control1.OnLBUp().Bind(func(e *Event) {
sp.drag = false
sp.mouseLeft = true
fmt.Println("control1.OnLBUp")
})
control2.OnLBUp().Bind(func(e *Event) {
sp.drag = false
sp.mouseLeft = true
fmt.Println("control2.OnLBUp")
})*/
// ---- finish ADDED
}
func (sp *VResizer) update(x int) {
pos := x - 10
w1, h1 := sp.control1.Width(), sp.control1.Height()
if sp.dir == Left {
w1 += pos
} else {
w1 -= pos
}
sp.control1.SetSize(w1, h1)
fm := sp.parent.(*Form)
fm.UpdateLayout()
w32.SetCursor(w32.LoadCursorWithResourceID(0, w32.IDC_ARROW))
}
func (sp *VResizer) WndProc(msg uint32, wparam, lparam uintptr) uintptr {
switch msg {
case w32.WM_CREATE:
internalTrackMouseEvent(sp.hwnd)
case w32.WM_MOUSEMOVE:
if sp.drag {
x, _ := genPoint(lparam)
sp.update(x)
} else {
w32.SetCursor(w32.LoadCursorWithResourceID(0, w32.IDC_SIZEWE))
}
if sp.mouseLeft {
internalTrackMouseEvent(sp.hwnd)
sp.mouseLeft = false
}
case w32.WM_MOUSELEAVE:
sp.drag = false
sp.mouseLeft = true
case w32.WM_LBUTTONUP:
sp.drag = false
case w32.WM_LBUTTONDOWN:
sp.drag = true
}
return w32.DefWindowProc(sp.hwnd, msg, wparam, lparam)
}
type HResizer struct {
ControlBase
control1 Dockable
control2 Dockable
dir Direction
mouseLeft bool
drag bool
}
func NewHResizer(parent Controller) *HResizer {
sp := new(HResizer)
RegClassOnlyOnce("winc_HResizer")
sp.hwnd = CreateWindow("winc_HResizer", parent, w32.WS_EX_CONTROLPARENT, w32.WS_CHILD|w32.WS_VISIBLE)
sp.parent = parent
sp.mouseLeft = true
RegMsgHandler(sp)
sp.SetFont(DefaultFont)
sp.SetText("")
sp.SetSize(100, 20)
return sp
}
func (sp *HResizer) SetControl(control1, control2 Dockable, dir Direction, minSize int) {
sp.control1 = control1
sp.control2 = control2
if dir != Top && dir != Bottom {
panic("invalid direction")
}
sp.dir = dir
}
func (sp *HResizer) update(y int) {
pos := y - 10
w1, h1 := sp.control1.Width(), sp.control1.Height()
if sp.dir == Top {
h1 += pos
} else {
h1 -= pos
}
sp.control1.SetSize(w1, h1)
fm := sp.parent.(*Form)
fm.UpdateLayout()
w32.SetCursor(w32.LoadCursorWithResourceID(0, w32.IDC_ARROW))
}
func (sp *HResizer) WndProc(msg uint32, wparam, lparam uintptr) uintptr {
switch msg {
case w32.WM_CREATE:
internalTrackMouseEvent(sp.hwnd)
case w32.WM_MOUSEMOVE:
if sp.drag {
_, y := genPoint(lparam)
sp.update(y)
} else {
w32.SetCursor(w32.LoadCursorWithResourceID(0, w32.IDC_SIZENS))
}
if sp.mouseLeft {
internalTrackMouseEvent(sp.hwnd)
sp.mouseLeft = false
}
case w32.WM_MOUSELEAVE:
sp.drag = false
sp.mouseLeft = true
case w32.WM_LBUTTONUP:
sp.drag = false
case w32.WM_LBUTTONDOWN:
sp.drag = true
}
return w32.DefWindowProc(sp.hwnd, msg, wparam, lparam)
}