diff --git a/exp/examples/basic/main.go b/exp/examples/basic/main.go index a89e11f0f..ef301dc00 100644 --- a/exp/examples/basic/main.go +++ b/exp/examples/basic/main.go @@ -28,6 +28,10 @@ func main() { AlwaysOnTop: false, URL: "https://google.com", DisableResize: false, + MinWidth: 100, + MinHeight: 100, + MaxWidth: 1000, + MaxHeight: 1000, }) myWindow2 := app.NewWindow(&options.Window{ @@ -45,6 +49,8 @@ func main() { myWindow.SetAlwaysOnTop(true) myWindow2.SetTitle("OMFG") myWindow2.NavigateToURL("https://wails.io") + myWindow.SetMinSize(600, 600) + myWindow.SetMaxSize(650, 650) }() err := app.Run() diff --git a/exp/pkg/application/window.go b/exp/pkg/application/window.go index dc6e58ad5..5c70c4439 100644 --- a/exp/pkg/application/window.go +++ b/exp/pkg/application/window.go @@ -9,6 +9,8 @@ type windowImpl interface { run() error navigateToURL(url string) setResizable(resizable bool) + setMinSize(width, height int) + setMaxSize(width, height int) } type Window struct { @@ -67,3 +69,34 @@ func (w *Window) SetResizable(b bool) { } w.impl.setResizable(b) } + +func (w *Window) SetMinSize(minWidth, minHeight int) { + if w.impl == nil { + w.options.MinWidth = minWidth + if w.options.Width < minWidth { + w.options.Width = minWidth + } + w.options.MinHeight = minHeight + if w.options.Height < minHeight { + w.options.Height = minHeight + } + return + } + w.impl.setSize(w.options.Width, w.options.Height) + w.impl.setMinSize(minWidth, minHeight) +} +func (w *Window) SetMaxSize(maxWidth, maxHeight int) { + if w.impl == nil { + w.options.MinWidth = maxWidth + if w.options.Width > maxWidth { + w.options.Width = maxWidth + } + w.options.MinHeight = maxHeight + if w.options.Height > maxHeight { + w.options.Height = maxHeight + } + return + } + w.impl.setSize(w.options.Width, w.options.Height) + w.impl.setMaxSize(maxWidth, maxHeight) +} diff --git a/exp/pkg/application/window_darwin.go b/exp/pkg/application/window_darwin.go index 2f229f8dc..c3a0f823c 100644 --- a/exp/pkg/application/window_darwin.go +++ b/exp/pkg/application/window_darwin.go @@ -95,6 +95,36 @@ void windowSetResizable(void* nsWindow, bool resizable) { }); } +// Set NSWindow min size +void windowSetMinSize(void* nsWindow, int width, int height) { + // Set window min size on main thread + dispatch_async(dispatch_get_main_queue(), ^{ + [(NSWindow*)nsWindow setContentMinSize:NSMakeSize(width, height)]; + }); +} + +// Set NSWindow max size +void windowSetMaxSize(void* nsWindow, int width, int height) { + // Set window max size on main thread + dispatch_async(dispatch_get_main_queue(), ^{ + [(NSWindow*)nsWindow setContentMaxSize:NSMakeSize(width, height)]; + }); +} + +// Reset NSWindow min and max size +void windowResetMinSize(void* nsWindow) { + // Reset window min size on main thread + dispatch_async(dispatch_get_main_queue(), ^{ + [(NSWindow*)nsWindow setContentMinSize:NSMakeSize(0, 0)]; + }); +} + +void windowResetMaxSize(void* nsWindow) { + // Reset window max size on main thread + dispatch_async(dispatch_get_main_queue(), ^{ + [(NSWindow*)nsWindow setContentMaxSize:NSMakeSize(0, 0)]; + }); +} */ import "C" @@ -133,6 +163,13 @@ func (w *macosWindow) setSize(width, height int) { C.windowSetSize(w.nsWindow, C.int(width), C.int(height)) } +func (w *macosWindow) setMinSize(width, height int) { + C.windowSetMinSize(w.nsWindow, C.int(width), C.int(height)) +} +func (w *macosWindow) setMaxSize(width, height int) { + C.windowSetMaxSize(w.nsWindow, C.int(width), C.int(height)) +} + func (w *macosWindow) setResizable(resizable bool) { C.windowSetResizable(w.nsWindow, C.bool(resizable)) } @@ -142,7 +179,11 @@ func (w *macosWindow) run() error { w.setTitle(w.options.Title) w.setAlwaysOnTop(w.options.AlwaysOnTop) w.setResizable(!w.options.DisableResize) + w.setMinSize(w.options.MinWidth, w.options.MinHeight) + w.setMaxSize(w.options.MaxWidth, w.options.MaxHeight) + if w.options.URL != "" { + w.navigateToURL(w.options.URL) + } C.windowShow(w.nsWindow) - C.navigationLoadURL(w.nsWindow, C.CString(w.options.URL)) return nil } diff --git a/exp/pkg/options/application.go b/exp/pkg/options/application.go index 8c178bce7..a223ec367 100644 --- a/exp/pkg/options/application.go +++ b/exp/pkg/options/application.go @@ -27,4 +27,8 @@ type Window struct { URL string DisableResize bool Resizable bool + MinWidth int + MinHeight int + MaxWidth int + MaxHeight int }