1 Star 1 Fork 0

妙音 / oils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
webview.go 2.21 KB
一键复制 编辑 原始数据 按行查看 历史
妙音 提交于 2021-05-20 14:42 . gui add webview
package gui
import (
"fmt"
"io/fs"
"net"
"net/http"
"strings"
"sync"
"github.com/webview/webview"
)
type webView struct {
listener net.Listener
htmls map[string]string
binds map[string]interface{}
handler http.Handler
wg sync.WaitGroup
w webview.WebView
}
// NewWebView 新建基于webview的用户界面.
func NewWebView() GUI {
l, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
panic(err)
}
s := &webView{
htmls: make(map[string]string),
binds: make(map[string]interface{}),
listener: l,
wg: sync.WaitGroup{},
}
// nolint: errcheck
go http.Serve(s.listener, s)
return s
}
// Bind 事件绑定.
func (p *webView) Bind(name string, f interface{}) {
p.binds[name] = f
}
// Close 关闭.
func (p *webView) Close() error {
if p.listener != nil {
return p.listener.Close()
}
p.w.Destroy()
return nil
}
// FS 设置文件系统.
func (p *webView) FS(dir string, fsys fs.FS) {
if dir != "" {
fsys, _ = fs.Sub(fsys, dir)
}
p.handler = http.FileServer(http.FS(fsys))
}
// Handler 设置回调.
func (p *webView) Handler(handler http.Handler) {
p.handler = handler
}
// HTML 设置HTML页面.
func (p *webView) HTML(url, html string) {
p.htmls[url] = html
}
// Open 打开窗口,返回UI对象.
func (p *webView) Open(url, name string, width, height int) error {
if strings.HasPrefix(url, "/") {
url = fmt.Sprintf("http://%s%s", p.listener.Addr(), url)
}
if p.w == nil {
p.wg.Add(1)
go func() {
p.w = webview.New(true)
p.w.SetTitle(name)
p.w.SetSize(width, height, webview.HintNone)
if len(p.binds) > 0 {
for name, f := range p.binds {
_ = p.w.Bind(name, f)
}
}
p.w.Navigate(url)
p.w.Run()
p.wg.Done()
}()
return nil
}
p.w.SetTitle(name)
p.w.SetSize(width, height, webview.HintNone)
p.w.Navigate(url)
return nil
}
// Run 运行.
func (p *webView) Run() {
p.wg.Wait()
}
// ServeHTTP web服务.
func (p *webView) ServeHTTP(w http.ResponseWriter, req *http.Request) {
if html, has := p.htmls[req.URL.Path]; has {
fmt.Fprint(w, html)
return
}
if p.handler != nil {
p.handler.ServeHTTP(w, req)
return
}
w.WriteHeader(http.StatusNotFound)
fmt.Fprintf(w, "no such page: %s\n", req.URL)
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/xuender/oils.git
git@gitee.com:xuender/oils.git
xuender
oils
oils
v1.0.40

搜索帮助

344bd9b3 5694891 D2dac590 5694891