file chooser

This commit is contained in:
Robert Janetzko 2022-04-26 19:00:09 +00:00
parent 533d5b173f
commit 75208cfe85
7 changed files with 107 additions and 24 deletions

View File

@ -34,7 +34,7 @@ func main() {
}()
}
w, err := model.Parse(*f)
w, err := model.Parse(*f, nil)
if err != nil {
fmt.Println(err)
os.Exit(1)

View File

@ -61,16 +61,25 @@ func NewLegendsParser(file string) (*util.XMLParser, *os.File, *pb.ProgressBar,
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()
p, xmlFile, bar, err := NewLegendsParser(file)
if lp != nil {
lp.Message = "Loading " + file
lp.ProgressBar = bar
}
if err != nil {
return nil, err
}
defer xmlFile.Close()
world := &DfWorld{}
var world *DfWorld
BaseLoop:
for {
@ -98,6 +107,10 @@ BaseLoop:
file = strings.Replace(file, "-legends.xml", "-legends_plus.xml", 1)
p, xmlFile, bar, err = NewLegendsParser(file)
if lp != nil {
lp.Message = "Loading " + file
lp.ProgressBar = bar
}
if err != nil {
return nil, err
}

View File

@ -2,7 +2,6 @@ package server
import (
"fmt"
"io/fs"
"net/http"
"strconv"
@ -46,20 +45,3 @@ func (srv *DfServer) RegisterWorldResourcePage(path string, template string, acc
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)
}
}

View File

@ -2,6 +2,7 @@ package server
import (
"embed"
"encoding/json"
"fmt"
"io/fs"
"io/ioutil"
@ -17,10 +18,12 @@ import (
type DfServerContext struct {
world *model.DfWorld
isLoading bool
progress *model.LoadProgress
}
type DfServer struct {
router *mux.Router
loader *loadHandler
templates *templates.Template
context *DfServerContext
}
@ -31,8 +34,10 @@ func StartServer(world *model.DfWorld, static embed.FS) {
context: &DfServerContext{
world: world,
isLoading: false,
progress: &model.LoadProgress{},
},
}
srv.loader = &loadHandler{server: srv}
srv.LoadTemplates()
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/{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"}
srv.router.PathPrefix("/").Handler(spa)
@ -106,7 +111,35 @@ type loadHandler struct {
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) {
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")
p := &paths{
@ -132,8 +165,7 @@ func (h loadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return
} else {
h.server.context.isLoading = true
wrld, _ := model.Parse(p.Current)
h.server.context.world = wrld
go loadWorld(h.server, p.Current)
http.Redirect(w, r, "/", http.StatusSeeOther)
return
}
@ -144,3 +176,26 @@ func (h loadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
func isLegendsXml(f fs.FileInfo) bool {
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)
}
}

2
backend/static/js/jquery-3.6.0.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -8,6 +8,7 @@
<title>{{block "title" .}}{{end}}</title>
<link href="/css/bootstrap.min.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>
</head>

View File

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