file chooser
This commit is contained in:
parent
533d5b173f
commit
75208cfe85
|
@ -34,7 +34,7 @@ func main() {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
w, err := model.Parse(*f)
|
w, err := model.Parse(*f, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
|
@ -61,16 +61,25 @@ func NewLegendsParser(file string) (*util.XMLParser, *os.File, *pb.ProgressBar,
|
||||||
return d, xmlFile, bar, err
|
return d, xmlFile, bar, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func Parse(file string) (*DfWorld, error) {
|
type LoadProgress struct {
|
||||||
|
Message string
|
||||||
|
ProgressBar *pb.ProgressBar
|
||||||
|
}
|
||||||
|
|
||||||
|
func Parse(file string, lp *LoadProgress) (*DfWorld, error) {
|
||||||
InitSameFields()
|
InitSameFields()
|
||||||
|
|
||||||
p, xmlFile, bar, err := NewLegendsParser(file)
|
p, xmlFile, bar, err := NewLegendsParser(file)
|
||||||
|
if lp != nil {
|
||||||
|
lp.Message = "Loading " + file
|
||||||
|
lp.ProgressBar = bar
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer xmlFile.Close()
|
defer xmlFile.Close()
|
||||||
|
|
||||||
world := &DfWorld{}
|
var world *DfWorld
|
||||||
|
|
||||||
BaseLoop:
|
BaseLoop:
|
||||||
for {
|
for {
|
||||||
|
@ -98,6 +107,10 @@ BaseLoop:
|
||||||
file = strings.Replace(file, "-legends.xml", "-legends_plus.xml", 1)
|
file = strings.Replace(file, "-legends.xml", "-legends_plus.xml", 1)
|
||||||
|
|
||||||
p, xmlFile, bar, err = NewLegendsParser(file)
|
p, xmlFile, bar, err = NewLegendsParser(file)
|
||||||
|
if lp != nil {
|
||||||
|
lp.Message = "Loading " + file
|
||||||
|
lp.ProgressBar = bar
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
@ -46,20 +45,3 @@ func (srv *DfServer) RegisterWorldResourcePage(path string, template string, acc
|
||||||
return accessor(id)
|
return accessor(id)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type paths struct {
|
|
||||||
Current string
|
|
||||||
List []fs.FileInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func (srv *DfServer) renderLoading(w http.ResponseWriter, r *http.Request) {
|
|
||||||
if srv.context.isLoading {
|
|
||||||
err := srv.templates.Render(w, "loading.html", nil)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(w, err)
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
http.Redirect(w, r, "/load", http.StatusSeeOther)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -17,10 +18,12 @@ import (
|
||||||
type DfServerContext struct {
|
type DfServerContext struct {
|
||||||
world *model.DfWorld
|
world *model.DfWorld
|
||||||
isLoading bool
|
isLoading bool
|
||||||
|
progress *model.LoadProgress
|
||||||
}
|
}
|
||||||
|
|
||||||
type DfServer struct {
|
type DfServer struct {
|
||||||
router *mux.Router
|
router *mux.Router
|
||||||
|
loader *loadHandler
|
||||||
templates *templates.Template
|
templates *templates.Template
|
||||||
context *DfServerContext
|
context *DfServerContext
|
||||||
}
|
}
|
||||||
|
@ -31,8 +34,10 @@ func StartServer(world *model.DfWorld, static embed.FS) {
|
||||||
context: &DfServerContext{
|
context: &DfServerContext{
|
||||||
world: world,
|
world: world,
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
|
progress: &model.LoadProgress{},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
srv.loader = &loadHandler{server: srv}
|
||||||
srv.LoadTemplates()
|
srv.LoadTemplates()
|
||||||
|
|
||||||
srv.RegisterWorldResourcePage("/entity/{id}", "entity.html", func(id int) any { return srv.context.world.Entities[id] })
|
srv.RegisterWorldResourcePage("/entity/{id}", "entity.html", func(id int) any { return srv.context.world.Entities[id] })
|
||||||
|
@ -45,7 +50,7 @@ func StartServer(world *model.DfWorld, static embed.FS) {
|
||||||
srv.RegisterWorldPage("/events", "eventTypes.html", func(p Parms) any { return srv.context.world.AllEventTypes() })
|
srv.RegisterWorldPage("/events", "eventTypes.html", func(p Parms) any { return srv.context.world.AllEventTypes() })
|
||||||
srv.RegisterWorldPage("/events/{type}", "eventType.html", func(p Parms) any { return srv.context.world.EventsOfType(p["type"]) })
|
srv.RegisterWorldPage("/events/{type}", "eventType.html", func(p Parms) any { return srv.context.world.EventsOfType(p["type"]) })
|
||||||
|
|
||||||
srv.router.PathPrefix("/load").Handler(loadHandler{server: srv})
|
srv.router.PathPrefix("/load").Handler(srv.loader)
|
||||||
|
|
||||||
spa := spaHandler{staticFS: static, staticPath: "static", indexPath: "index.html"}
|
spa := spaHandler{staticFS: static, staticPath: "static", indexPath: "index.html"}
|
||||||
srv.router.PathPrefix("/").Handler(spa)
|
srv.router.PathPrefix("/").Handler(spa)
|
||||||
|
@ -106,7 +111,35 @@ type loadHandler struct {
|
||||||
server *DfServer
|
server *DfServer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type loadProgress struct {
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
Progress float64 `json:"progress"`
|
||||||
|
Done bool `json:"done"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h loadHandler) Progress() *loadProgress {
|
||||||
|
percent := 0.0
|
||||||
|
p := h.server.context.progress
|
||||||
|
if p.ProgressBar != nil {
|
||||||
|
percent = float64(p.ProgressBar.Current()*100) / float64(p.ProgressBar.Total())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &loadProgress{
|
||||||
|
Msg: h.server.context.progress.Message,
|
||||||
|
Progress: percent,
|
||||||
|
Done: h.server.context.world != nil,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (h loadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (h loadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.URL.Path == "/load/progress" {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusCreated)
|
||||||
|
|
||||||
|
json.NewEncoder(w).Encode(h.Progress())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
path := r.URL.Query().Get("p")
|
path := r.URL.Query().Get("p")
|
||||||
|
|
||||||
p := &paths{
|
p := &paths{
|
||||||
|
@ -132,8 +165,7 @@ func (h loadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
h.server.context.isLoading = true
|
h.server.context.isLoading = true
|
||||||
wrld, _ := model.Parse(p.Current)
|
go loadWorld(h.server, p.Current)
|
||||||
h.server.context.world = wrld
|
|
||||||
http.Redirect(w, r, "/", http.StatusSeeOther)
|
http.Redirect(w, r, "/", http.StatusSeeOther)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -144,3 +176,26 @@ func (h loadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
func isLegendsXml(f fs.FileInfo) bool {
|
func isLegendsXml(f fs.FileInfo) bool {
|
||||||
return strings.HasSuffix(f.Name(), "-legends.xml")
|
return strings.HasSuffix(f.Name(), "-legends.xml")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func loadWorld(server *DfServer, file string) {
|
||||||
|
wrld, _ := model.Parse(file, server.context.progress)
|
||||||
|
server.context.world = wrld
|
||||||
|
server.context.isLoading = false
|
||||||
|
}
|
||||||
|
|
||||||
|
type paths struct {
|
||||||
|
Current string
|
||||||
|
List []fs.FileInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func (srv *DfServer) renderLoading(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if srv.context.isLoading {
|
||||||
|
err := srv.templates.Render(w, "loading.html", srv.loader.Progress())
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(w, err)
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
http.Redirect(w, r, "/load", http.StatusSeeOther)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -8,6 +8,7 @@
|
||||||
<title>{{block "title" .}}{{end}}</title>
|
<title>{{block "title" .}}{{end}}</title>
|
||||||
<link href="/css/bootstrap.min.css" rel="stylesheet">
|
<link href="/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<link href="/css/legends.css" rel="stylesheet">
|
<link href="/css/legends.css" rel="stylesheet">
|
||||||
|
<script src="/js/jquery-3.6.0.min.js"></script>
|
||||||
<script src="/js/bootstrap.min.js"></script>
|
<script src="/js/bootstrap.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
{{template "layout.html" .}}
|
||||||
|
|
||||||
|
{{define "title"}}Loading{{end}}
|
||||||
|
|
||||||
|
{{define "content"}}
|
||||||
|
<h1>Loading...</h1>
|
||||||
|
<p id="msg">{{ .Msg }}</p>
|
||||||
|
<div class="progress">
|
||||||
|
<div id="progress" class="progress-bar" role="progressbar" style="width: {{ .Progress }}%" aria-valuenow="25" aria-valuemin="0"
|
||||||
|
aria-valuemax="100">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
setInterval(() => {
|
||||||
|
$.ajax({
|
||||||
|
url: "/load/progress",
|
||||||
|
context: document.body,
|
||||||
|
success: function (data) {
|
||||||
|
$("#msg").text(data.msg);
|
||||||
|
$("#progress").css("width", data.progress + "%");
|
||||||
|
if (data.done) {
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 300);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{- end }}
|
Loading…
Reference in New Issue