mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 14:45:49 +01:00
Add more Window API
This commit is contained in:
parent
5a37091bb0
commit
05803fb5d5
7 changed files with 81 additions and 14 deletions
2
app.go
2
app.go
|
|
@ -141,7 +141,7 @@ func (a *App) start() error {
|
|||
// Defer the shutdown
|
||||
defer a.shutdown()
|
||||
|
||||
// Run the renderer
|
||||
// run the renderer
|
||||
err = a.renderer.Run()
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -22,17 +22,21 @@ func main() {
|
|||
println("TERMINATION!!")
|
||||
})
|
||||
myWindow := app.NewWindow(&options.Window{
|
||||
Title: "Basic",
|
||||
Width: 600,
|
||||
Height: 400,
|
||||
AlwaysOnTop: false,
|
||||
Title: "Basic",
|
||||
Width: 600,
|
||||
Height: 400,
|
||||
AlwaysOnTop: false,
|
||||
URL: "https://google.com",
|
||||
DisableResize: false,
|
||||
})
|
||||
|
||||
myWindow2 := app.NewWindow(&options.Window{
|
||||
Title: "#2",
|
||||
Width: 1024,
|
||||
Height: 768,
|
||||
AlwaysOnTop: false,
|
||||
Title: "#2",
|
||||
Width: 1024,
|
||||
Height: 768,
|
||||
AlwaysOnTop: false,
|
||||
URL: "https://google.com",
|
||||
DisableResize: true,
|
||||
})
|
||||
|
||||
go func() {
|
||||
|
|
@ -40,6 +44,7 @@ func main() {
|
|||
myWindow.SetTitle("Wooooo")
|
||||
myWindow.SetAlwaysOnTop(true)
|
||||
myWindow2.SetTitle("OMFG")
|
||||
myWindow2.NavigateToURL("https://wails.io")
|
||||
}()
|
||||
|
||||
err := app.Run()
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ func (a *App) Run() error {
|
|||
}
|
||||
}()
|
||||
|
||||
// Run windows
|
||||
// run windows
|
||||
for _, window := range a.windows {
|
||||
err := window.Run()
|
||||
if err != nil {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ type windowImpl interface {
|
|||
setTitle(title string)
|
||||
setSize(width, height int)
|
||||
setAlwaysOnTop(alwaysOnTop bool)
|
||||
Run() error
|
||||
run() error
|
||||
navigateToURL(url string)
|
||||
setResizable(resizable bool)
|
||||
}
|
||||
|
||||
type Window struct {
|
||||
|
|
@ -39,7 +41,7 @@ func (w *Window) SetSize(width, height int) {
|
|||
|
||||
func (w *Window) Run() error {
|
||||
w.impl = newWindowImpl(w.options)
|
||||
return w.impl.Run()
|
||||
return w.impl.run()
|
||||
}
|
||||
|
||||
func (w *Window) SetAlwaysOnTop(b bool) {
|
||||
|
|
@ -49,3 +51,19 @@ func (w *Window) SetAlwaysOnTop(b bool) {
|
|||
}
|
||||
w.impl.setAlwaysOnTop(b)
|
||||
}
|
||||
|
||||
func (w *Window) NavigateToURL(s string) {
|
||||
if w.impl == nil {
|
||||
w.options.URL = s
|
||||
return
|
||||
}
|
||||
w.impl.navigateToURL(s)
|
||||
}
|
||||
|
||||
func (w *Window) SetResizable(b bool) {
|
||||
if w.impl == nil {
|
||||
w.options.DisableResize = !b
|
||||
return
|
||||
}
|
||||
w.impl.setResizable(b)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,12 +4,14 @@ package application
|
|||
|
||||
/*
|
||||
#cgo CFLAGS: -mmacosx-version-min=10.10 -x objective-c
|
||||
#cgo LDFLAGS: -framework Cocoa
|
||||
#cgo LDFLAGS: -framework Cocoa -framework WebKit
|
||||
|
||||
#include "application.h"
|
||||
#include "window_delegate.h"
|
||||
#include <stdlib.h>
|
||||
#include "Cocoa/Cocoa.h"
|
||||
#import <WebKit/WebKit.h>
|
||||
|
||||
|
||||
// Create a new Window
|
||||
void* windowNew(int width, int height) {
|
||||
|
|
@ -22,6 +24,13 @@ void* windowNew(int width, int height) {
|
|||
// Set delegate
|
||||
[window setDelegate:delegate];
|
||||
|
||||
// Embed wkwebview in window
|
||||
NSRect frame = NSMakeRect(0, 0, width, height);
|
||||
WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init];
|
||||
WKWebView* webView = [[WKWebView alloc] initWithFrame:frame configuration:config];
|
||||
[window setContentView:webView];
|
||||
delegate.webView = webView;
|
||||
|
||||
delegate.hideOnClose = false;
|
||||
return window;
|
||||
}
|
||||
|
|
@ -67,6 +76,26 @@ void windowSetAlwaysOnTop(void* nsWindow, bool alwaysOnTop) {
|
|||
});
|
||||
}
|
||||
|
||||
// Load URL in NSWindow
|
||||
void navigationLoadURL(void* nsWindow, char* url) {
|
||||
// Load URL on main thread
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
NSURL* nsURL = [NSURL URLWithString:[NSString stringWithUTF8String:url]];
|
||||
NSURLRequest* request = [NSURLRequest requestWithURL:nsURL];
|
||||
[[(WindowDelegate*)[(NSWindow*)nsWindow delegate] webView] loadRequest:request];
|
||||
free(url);
|
||||
});
|
||||
}
|
||||
|
||||
// Set NSWindow resizable
|
||||
void windowSetResizable(void* nsWindow, bool resizable) {
|
||||
// Set window resizable on main thread
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[(NSWindow*)nsWindow setStyleMask:resizable ? NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask : NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask];
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
|
|
@ -80,6 +109,10 @@ type macosWindow struct {
|
|||
options *options.Window
|
||||
}
|
||||
|
||||
func (w *macosWindow) navigateToURL(url string) {
|
||||
C.navigationLoadURL(w.nsWindow, C.CString(url))
|
||||
}
|
||||
|
||||
func (w *macosWindow) setAlwaysOnTop(alwaysOnTop bool) {
|
||||
C.windowSetAlwaysOnTop(w.nsWindow, C.bool(alwaysOnTop))
|
||||
}
|
||||
|
|
@ -100,10 +133,16 @@ func (w *macosWindow) setSize(width, height int) {
|
|||
C.windowSetSize(w.nsWindow, C.int(width), C.int(height))
|
||||
}
|
||||
|
||||
func (w *macosWindow) Run() error {
|
||||
func (w *macosWindow) setResizable(resizable bool) {
|
||||
C.windowSetResizable(w.nsWindow, C.bool(resizable))
|
||||
}
|
||||
|
||||
func (w *macosWindow) run() error {
|
||||
w.nsWindow = C.windowNew(C.int(w.options.Width), C.int(w.options.Height))
|
||||
w.setTitle(w.options.Title)
|
||||
w.setAlwaysOnTop(w.options.AlwaysOnTop)
|
||||
w.setResizable(!w.options.DisableResize)
|
||||
C.windowShow(w.nsWindow)
|
||||
C.navigationLoadURL(w.nsWindow, C.CString(w.options.URL))
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,12 @@
|
|||
#define WindowDelegate_h
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <WebKit/WebKit.h>
|
||||
|
||||
@interface WindowDelegate : NSObject <NSWindowDelegate>
|
||||
|
||||
@property bool hideOnClose;
|
||||
@property (retain) WKWebView* webView;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
|||
|
|
@ -24,4 +24,7 @@ type Window struct {
|
|||
Title string
|
||||
Width, Height int
|
||||
AlwaysOnTop bool
|
||||
URL string
|
||||
DisableResize bool
|
||||
Resizable bool
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue