You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
3.3 KiB
Go
169 lines
3.3 KiB
Go
![]()
4 years ago
|
package nucular
|
||
|
|
||
|
import (
|
||
|
"github.com/aarzilli/nucular/rect"
|
||
|
nstyle "github.com/aarzilli/nucular/style"
|
||
|
|
||
|
"golang.org/x/mobile/event/mouse"
|
||
|
)
|
||
|
|
||
|
type ScalableSplit struct {
|
||
|
Size int
|
||
|
MinSize int
|
||
|
Spacing int
|
||
|
lastsize int
|
||
|
resize bool
|
||
|
}
|
||
|
|
||
|
func (s *ScalableSplit) Horizontal(w *Window, bounds rect.Rect) (bounds0, bounds1 rect.Rect) {
|
||
|
scaling := w.Master().Style().Scaling
|
||
|
|
||
|
var rszbounds rect.Rect
|
||
|
bounds0, bounds1, rszbounds = s.horizontalnw(bounds, scaling)
|
||
|
|
||
|
w.LayoutSpacePushScaled(rszbounds)
|
||
|
rszbounds, _ = w.Custom(nstyle.WidgetStateInactive)
|
||
|
|
||
|
if w.Input().Mouse.IsClickDownInRect(mouse.ButtonLeft, rszbounds, true) {
|
||
|
s.resize = true
|
||
|
}
|
||
|
if s.resize {
|
||
|
if !w.Input().Mouse.Down(mouse.ButtonLeft) {
|
||
|
s.resize = false
|
||
|
} else {
|
||
|
s.Size += int(float64(w.Input().Mouse.Delta.Y) / scaling)
|
||
|
if s.Size <= s.MinSize {
|
||
|
s.Size = s.MinSize
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (s *ScalableSplit) horizontalnw(bounds rect.Rect, scaling float64) (bounds0, bounds1, rszbounds rect.Rect) {
|
||
|
if bounds.H < 0 || bounds.W < 0 {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if s.lastsize == 0 {
|
||
|
s.lastsize = bounds.H
|
||
|
}
|
||
|
if s.lastsize != bounds.H {
|
||
|
diff := int(float64(bounds.H-s.lastsize) / scaling)
|
||
|
s.Size += diff / 2
|
||
|
s.lastsize = bounds.H
|
||
|
}
|
||
|
|
||
|
hs := int(float64(s.Spacing) * scaling)
|
||
|
h := bounds.H - hs
|
||
|
var h0, h1 int
|
||
|
if s.Size == 0 {
|
||
|
h0 = h / 2
|
||
|
h1 = h - h0
|
||
|
s.Size = int(float64(h0) / scaling)
|
||
|
} else {
|
||
|
h0 = int(float64(s.Size) * scaling)
|
||
|
h1 = h - h0
|
||
|
}
|
||
|
|
||
|
minh := int(float64(s.MinSize) * scaling)
|
||
|
if h1 < minh {
|
||
|
h1 = minh
|
||
|
h0 = h - h1
|
||
|
}
|
||
|
if h0 < minh {
|
||
|
h0 = minh
|
||
|
h1 = h - h0
|
||
|
}
|
||
|
|
||
|
bounds0 = bounds
|
||
|
bounds0.H = h0
|
||
|
|
||
|
rszbounds = bounds
|
||
|
rszbounds.Y += bounds0.H
|
||
|
rszbounds.H = hs
|
||
|
|
||
|
bounds1 = bounds
|
||
|
bounds1.Y = rszbounds.Y + rszbounds.H
|
||
|
bounds1.H = h1
|
||
|
|
||
|
return bounds0, bounds1, rszbounds
|
||
|
}
|
||
|
|
||
|
func (s *ScalableSplit) Vertical(w *Window, bounds rect.Rect) (bounds0, bounds1 rect.Rect) {
|
||
|
scaling := w.Master().Style().Scaling
|
||
|
|
||
|
var rszbounds rect.Rect
|
||
|
bounds0, bounds1, rszbounds = s.verticalnw(bounds, scaling)
|
||
|
|
||
|
w.LayoutSpacePushScaled(rszbounds)
|
||
|
rszbounds, _ = w.Custom(nstyle.WidgetStateInactive)
|
||
|
|
||
|
if w.Input().Mouse.IsClickDownInRect(mouse.ButtonLeft, rszbounds, true) {
|
||
|
s.resize = true
|
||
|
}
|
||
|
if s.resize {
|
||
|
if !w.Input().Mouse.Down(mouse.ButtonLeft) {
|
||
|
s.resize = false
|
||
|
} else {
|
||
|
s.Size += int(float64(w.Input().Mouse.Delta.X) / scaling)
|
||
|
if s.Size <= s.MinSize {
|
||
|
s.Size = s.MinSize
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bounds0, bounds1
|
||
|
}
|
||
|
|
||
|
func (s *ScalableSplit) verticalnw(bounds rect.Rect, scaling float64) (bounds0, bounds1, rszbounds rect.Rect) {
|
||
|
if bounds.H < 0 || bounds.W < 0 {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if s.lastsize == 0 {
|
||
|
s.lastsize = bounds.W
|
||
|
}
|
||
|
if s.lastsize != bounds.W {
|
||
|
diff := int(float64(bounds.W-s.lastsize) / scaling)
|
||
|
s.Size += diff / 2
|
||
|
s.lastsize = bounds.W
|
||
|
}
|
||
|
|
||
|
ws := int(float64(s.Spacing) * scaling)
|
||
|
wt := bounds.W - ws
|
||
|
var w0, w1 int
|
||
|
if s.Size == 0 {
|
||
|
w0 = wt / 2
|
||
|
w1 = wt - w0
|
||
|
s.Size = int(float64(w0) / scaling)
|
||
|
} else {
|
||
|
w0 = int(float64(s.Size) * scaling)
|
||
|
w1 = wt - w0
|
||
|
}
|
||
|
|
||
|
minw := int(float64(s.MinSize) * scaling)
|
||
|
if w1 < minw {
|
||
|
w1 = minw
|
||
|
w0 = wt - w1
|
||
|
}
|
||
|
if w0 < minw {
|
||
|
w0 = minw
|
||
|
w1 = wt - w0
|
||
|
}
|
||
|
|
||
|
bounds0 = bounds
|
||
|
bounds0.W = w0
|
||
|
|
||
|
rszbounds = bounds
|
||
|
rszbounds.X += bounds0.W
|
||
|
rszbounds.W = ws
|
||
|
|
||
|
bounds1 = bounds
|
||
|
bounds1.X = rszbounds.X + rszbounds.W
|
||
|
bounds1.W = w1
|
||
|
|
||
|
return bounds0, bounds1, rszbounds
|
||
|
}
|