Support min/max window size

This commit is contained in:
Lea Anthony 2022-12-07 23:44:19 +11:00
commit af6daa273e
No known key found for this signature in database
GPG key ID: 33DAF7BB90A58405
4 changed files with 85 additions and 1 deletions

View file

@ -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()

View file

@ -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)
}

View file

@ -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
}

View file

@ -27,4 +27,8 @@ type Window struct {
URL string
DisableResize bool
Resizable bool
MinWidth int
MinHeight int
MaxWidth int
MaxHeight int
}