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 {