113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
//Package appimg is for downloading new AppImages for LinuxPA
|
|
package appimg
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gotk3/gotk3/glib"
|
|
"github.com/gotk3/gotk3/gtk"
|
|
)
|
|
|
|
const (
|
|
urlBase = "https://dl.bintray.com/probono/AppImages/"
|
|
)
|
|
|
|
//ShowUI shows the list of possible AppImages to be downloaded in a gtk.Window
|
|
func ShowUI(clsFunc func()) {
|
|
win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
|
win.Connect("destroy", func() {
|
|
clsFunc()
|
|
})
|
|
apps := make([]appimg, 0)
|
|
win.SetSizeRequest(400, 400)
|
|
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
|
appList, _ := gtk.ListBoxNew()
|
|
apch := make(chan appimg)
|
|
appList.SetHExpand(true)
|
|
appList.SetVExpand(true)
|
|
vScrollCat, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
|
hScrollCat, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
|
lst, _ := gtk.ScrolledWindowNew(hScrollCat, vScrollCat)
|
|
lst.SetSizeRequest(170, 500)
|
|
lst.Add(appList)
|
|
box.Add(lst)
|
|
win.Add(box)
|
|
appList.Connect("row-activated", func() {
|
|
if appList.GetSelectedRow().GetIndex() >= 0 {
|
|
downloadApp(win, apps[appList.GetSelectedRow().GetIndex()])
|
|
}
|
|
})
|
|
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
|
win.ShowAll()
|
|
win.Show()
|
|
getList(win, apch)
|
|
go func(win *gtk.Window, apch chan appimg, list *gtk.ListBox) {
|
|
for i := range apch {
|
|
glib.IdleAdd(func(list *gtk.ListBox, i appimg) {
|
|
lbl, _ := gtk.LabelNew(i.name)
|
|
list.Add(lbl)
|
|
apps = append(apps, i)
|
|
lbl.Show()
|
|
}, list, i)
|
|
}
|
|
}(win, apch, appList)
|
|
}
|
|
|
|
func getList(parent *gtk.Window, apch chan appimg) {
|
|
win, _ := gtk.WindowNew(gtk.WINDOW_POPUP)
|
|
win.SetTransientFor(parent)
|
|
win.SetDestroyWithParent(true)
|
|
win.Connect("destroy", func() {
|
|
parent.SetSensitive(true)
|
|
})
|
|
parent.SetSensitive(false)
|
|
spin, _ := gtk.SpinnerNew()
|
|
spin.Start()
|
|
txt, _ := gtk.LabelNew("Getting List...")
|
|
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
|
box.SetMarginBottom(10)
|
|
box.SetMarginEnd(10)
|
|
box.SetMarginStart(10)
|
|
box.SetMarginTop(10)
|
|
box.Add(spin)
|
|
box.Add(txt)
|
|
win.Add(box)
|
|
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
|
win.ShowAll()
|
|
win.Show()
|
|
go func(win *gtk.Window, apch chan appimg) {
|
|
check := http.Client{
|
|
CheckRedirect: func(r *http.Request, via []*http.Request) error {
|
|
r.URL.Opaque = r.URL.Path
|
|
return nil
|
|
},
|
|
}
|
|
resp, err := check.Get(urlBase)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
close(apch)
|
|
win.Close()
|
|
return
|
|
}
|
|
defer resp.Body.Close()
|
|
btys, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
close(apch)
|
|
win.Close()
|
|
return
|
|
}
|
|
tgs := convert(string(btys))
|
|
for _, v := range tgs {
|
|
if strings.HasSuffix(strings.ToLower(v.Meat), ".appimage") {
|
|
apch <- newApp(v.Meat)
|
|
}
|
|
}
|
|
close(apch)
|
|
win.Close()
|
|
}(win, apch)
|
|
}
|