Noah Petherbridge
6e40d58010
* Added Feature Flag support, run doodle with --experimental to enable all flags. Eraser Tool is behind a feature flag now. * + and - on the top row of keyboard keys will zoom the drawing in and out in Edit Mode. The wallpaper zooms nicely enough, but level chunkers need work. * A View menu is added with Zoom in/out, reset zoom, and scroll to origin options. The whole menu is behind the Zoom feature flag. * Update README with lots of details for fun debug mode options to play around with.
98 lines
2.0 KiB
Go
98 lines
2.0 KiB
Go
package uix
|
|
|
|
import (
|
|
"git.kirsle.net/apps/doodle/pkg/drawtool"
|
|
"git.kirsle.net/go/render"
|
|
)
|
|
|
|
// Functions related to the Zoom Tool to magnify the size of the canvas.
|
|
|
|
/*
|
|
GetZoomMultiplier parses the .Zoom integer and returns a multiplier.
|
|
|
|
Examples:
|
|
|
|
Zoom = 0: neutral (100% scale, 1x)
|
|
Zoom = 1: 2x zoom
|
|
Zoom = 2: 4x zoom
|
|
Zoom = 3: 8x zoom
|
|
Zoom = -1: 0.5x zoom
|
|
Zoom = -2: 0.25x zoom
|
|
*/
|
|
func (w *Canvas) GetZoomMultiplier() float64 {
|
|
// Get and bounds cap the zoom setting.
|
|
if w.Zoom < -2 {
|
|
w.Zoom = -2
|
|
} else if w.Zoom > 3 {
|
|
w.Zoom = 3
|
|
}
|
|
|
|
// Return the multipliers.
|
|
switch w.Zoom {
|
|
case -2:
|
|
return 0.25
|
|
case -1:
|
|
return 0.5
|
|
case 0:
|
|
return 1
|
|
case 1:
|
|
return 1.5
|
|
case 2:
|
|
return 2
|
|
case 3:
|
|
return 2.5
|
|
default:
|
|
return 1
|
|
}
|
|
}
|
|
|
|
/*
|
|
ZoomMultiply multiplies a width or height value by the Zoom Multiplier and
|
|
returns the modified integer.
|
|
|
|
Usage is like:
|
|
|
|
// when building a render.Rect destination box.
|
|
dest.W *= ZoomMultiply(dest.W)
|
|
dest.H *= ZoomMultiply(dest.H)
|
|
*/
|
|
func (w *Canvas) ZoomMultiply(value int) int {
|
|
return int(float64(value) * w.GetZoomMultiplier())
|
|
}
|
|
|
|
/*
|
|
ZoomStroke adjusts a drawn stroke on the canvas to account for the zoom level.
|
|
|
|
Returns a copy Stroke value without changing the original.
|
|
*/
|
|
func (w *Canvas) ZoomStroke(stroke *drawtool.Stroke) drawtool.Stroke {
|
|
copy := drawtool.Stroke{
|
|
ID: stroke.ID,
|
|
Shape: stroke.Shape,
|
|
Color: stroke.Color,
|
|
Thickness: stroke.Thickness,
|
|
ExtraData: stroke.ExtraData,
|
|
PointA: stroke.PointA,
|
|
PointB: stroke.PointB,
|
|
Points: stroke.Points,
|
|
OriginalPoints: stroke.OriginalPoints,
|
|
}
|
|
return copy
|
|
|
|
// Multiply all coordinates in this stroke, which should be World
|
|
// Coordinates in the level data, by the zoom multiplier.
|
|
adjust := func(p render.Point) render.Point {
|
|
p.X = w.ZoomMultiply(p.X)
|
|
p.Y = w.ZoomMultiply(p.Y)
|
|
return p
|
|
}
|
|
|
|
copy.PointA = adjust(copy.PointA)
|
|
copy.PointB = adjust(copy.PointB)
|
|
for i := range copy.Points {
|
|
copy.Points[i] = adjust(copy.Points[i])
|
|
}
|
|
|
|
return copy
|
|
}
|