ref: 3dfe00dc2f63fe2d93dc977a1973ab03a74b93bc
parent: cdae93dae8b27ebf26cca981be01088e01e9f865
author: Philip Silva <philip.silva@protonmail.com>
date: Tue Dec 29 06:33:58 EST 2020
Downloading
--- a/browser/browser.go
+++ b/browser/browser.go
@@ -17,6 +17,7 @@
"opossum/logger"
"opossum/nodes"
"opossum/style"
+ "os"
"strings"
"github.com/mjl-/duit"
@@ -1132,6 +1133,7 @@
StatusBar *duit.Label
LocationField *duit.Field
client *http.Client
+ Download func(done chan int) chan string
}
func NewBrowser(_dui *duit.DUI, initUrl string) (b *Browser) {@@ -1276,7 +1278,23 @@
if contentType.IsHTML() || contentType.IsPlain() {b.render(buf)
} else {- log.Errorf("unhandled content type: %v", contentType)+ done := make(chan int)
+ res := b.Download(done)
+
+ log.Infof("Download unhandled content type: %v", contentType)+
+ go func() {+ fn := <-res
+
+ if fn != "" {+ log.Infof("Download to %v", fn)+ f, _ := os.Create(fn)
+ f.Write(buf)
+ f.Close()
+ }
+
+ done <- 1
+ }()
}
return duit.Event{Consumed: true,
--- a/cmd/browse/main.go
+++ b/cmd/browse/main.go
@@ -37,24 +37,7 @@
logger.Quiet = flag.Bool("quiet", defaultQuietActive, "don't print info messages and non-fatal errors")}
-func Main() (err error) {- dui, err = duit.NewDUI("opossum", nil) // TODO: rm global var- if err != nil {- return fmt.Errorf("new dui: %w", err)- }
-
- style.Init(dui, log)
-
- w := dui.Display.Windows.Bounds().Dx()
- log.Printf("w=%v", w)- log.Printf("w'=%v", dui.Scale(w))- log.Printf("kid=%v", dui.Top.R)- browser.SetLogger(log)
- img.SetLogger(log)
- opossum.SetLogger(log)
- nodes.SetLogger(log)
- b := browser.NewBrowser(dui, *startPage)
-
+func render(b *browser.Browser) { dui.Top.UI = &duit.Box{Kids: duit.NewKids(
&duit.Grid{@@ -81,8 +64,88 @@
}
browser.PrintTree(b.Website.UI)
log.Printf("Render.....")+ dui.MarkLayout(dui.Top.UI)
+ dui.MarkDraw(dui.Top.UI)
dui.Render()
log.Printf("Rendering done")+}
+
+func confirm(b *browser.Browser, text, value string) chan string {+ res := make(chan string)
+
+ f := &duit.Field{+ Text: value,
+ }
+
+ dui.Top.UI = &duit.Box{+ Kids: duit.NewKids(
+ &duit.Grid{+ Columns: 3,
+ Padding: duit.NSpace(3, duit.SpaceXY(5, 3)),
+ Halign: []duit.Halign{duit.HalignLeft, duit.HalignLeft, duit.HalignRight},+ Valign: []duit.Valign{duit.ValignMiddle, duit.ValignMiddle, duit.ValignMiddle},+ Kids: duit.NewKids(
+ &duit.Button{+ Text: "Ok",
+ Font: browser.Style.Font(),
+ Click: func() (e duit.Event) {+ res <- f.Text
+ e.Consumed = true
+ return
+ },
+ },
+ &duit.Button{+ Text: "Abort",
+ Font: browser.Style.Font(),
+ Click: func() (e duit.Event) {+ res <- ""
+ e.Consumed = true
+ return
+ },
+ },
+ f,
+ ),
+ },
+ &duit.Label{+ Text: text,
+ },
+ ),
+ }
+ log.Printf("Render.....")+ dui.MarkLayout(dui.Top.UI)
+ dui.MarkDraw(dui.Top.UI)
+ dui.Render()
+ log.Printf("Rendering done")+
+ return res
+}
+
+func Main() (err error) {+ dui, err = duit.NewDUI("opossum", nil) // TODO: rm global var+ if err != nil {+ return fmt.Errorf("new dui: %w", err)+ }
+
+ style.Init(dui, log)
+
+ w := dui.Display.Windows.Bounds().Dx()
+ log.Printf("w=%v", w)+ log.Printf("w'=%v", dui.Scale(w))+ log.Printf("kid=%v", dui.Top.R)+ browser.SetLogger(log)
+ img.SetLogger(log)
+ opossum.SetLogger(log)
+ nodes.SetLogger(log)
+ b := browser.NewBrowser(dui, *startPage)
+ b.Download = func(done chan int) chan string {+ go func() {+ <-done
+ render(b)
+ }()
+ return confirm(b, fmt.Sprintf("Download %v", b.URL()), "/download.file")+ }
+
+ render(b)
for { select {--
⑨