1 Star 1 Fork 0

妙音 / oils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
service.go 2.25 KB
一键复制 编辑 原始数据 按行查看 历史
妙音 提交于 2021-04-29 16:22 . add gui
package gui
import (
"fmt"
"io/fs"
"net"
"net/http"
"runtime"
"strings"
"sync"
"github.com/zserge/lorca"
)
// service 图形用户界面服务.
type service struct {
listener net.Listener
htmls map[string]string
binds map[string]interface{}
handler http.Handler
wg sync.WaitGroup
}
// NewGui 新建图形用户界面服务.
func NewGui() GUI {
l, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
panic(err)
}
s := &service{
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 *service) Bind(name string, f interface{}) {
p.binds[name] = f
}
// Close 关闭.
func (p *service) Close() error {
if p.listener != nil {
return p.listener.Close()
}
return nil
}
// FS 设置文件系统.
func (p *service) FS(dir string, fsys fs.FS) {
if dir != "" {
fsys, _ = fs.Sub(fsys, dir)
}
p.handler = http.FileServer(http.FS(fsys))
}
// Handler 设置回调.
func (p *service) Handler(handler http.Handler) {
p.handler = handler
}
// HTML 设置HTML页面.
func (p *service) HTML(url, html string) {
p.htmls[url] = html
}
func getArgs() []string {
args := []string{}
if runtime.GOOS == "linux" {
args = append(args, "--class=Lorca")
}
return args
}
// Open 打开窗口,返回UI对象.
func (p *service) Open(url string, width, height int) (lorca.UI, error) {
if strings.HasPrefix(url, "/") {
url = fmt.Sprintf("http://%s%s", p.listener.Addr(), url)
}
ui, err := lorca.New(url, "", width, height, getArgs()...)
if err != nil {
return ui, err
}
if len(p.binds) > 0 {
for name, f := range p.binds {
_ = ui.Bind(name, f)
}
err = ui.Load(url)
if err != nil {
return ui, err
}
}
p.wg.Add(1)
go func() {
<-ui.Done()
p.wg.Done()
}()
return ui, nil
}
// Run 运行.
func (p *service) Run() {
p.wg.Wait()
}
// ServeHTTP web服务.
func (p *service) 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.38

搜索帮助

344bd9b3 5694891 D2dac590 5694891