From e68337886facddc1398ff1ad80558f85c78f19cf Mon Sep 17 00:00:00 2001 From: Belac Darkstorm Date: Wed, 5 Apr 2017 15:49:21 -0500 Subject: [PATCH] Settings, wine download and more! --- main.go | 5 ++- settings.go | 108 +++++++++++++++++++++++++++++++++++++++++++++++++ setup.go | 31 +++++--------- ui.go | 9 ++++- update.go | 7 +--- wine.go | 113 +++++++++++++++++++++++++++++++++++++++------------- 6 files changed, 217 insertions(+), 56 deletions(-) create mode 100644 settings.go diff --git a/main.go b/main.go index ff3fb7f..ffc74f0 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,7 @@ import ( ) const ( - version = "2.0.0.1" + version = "2.0.1.0" defIni = "" ) @@ -19,7 +19,8 @@ var ( lin []string wine bool comEnbld bool - darkTheme = true + wineAvail bool + showMsg = true ) func main() { diff --git a/settings.go b/settings.go new file mode 100644 index 0000000..ffa2be4 --- /dev/null +++ b/settings.go @@ -0,0 +1,108 @@ +package main + +import ( + "io/ioutil" + "os" + + "github.com/gotk3/gotk3/gtk" +) + +func settingsUI() { + win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) + win.SetDefaultSize(600, 300) + win.SetPosition(gtk.WIN_POS_CENTER) + comTagTbl, _ := gtk.TextTagTableNew() + comBuf, _ := gtk.TextBufferNew(comTagTbl) + ntbk, _ := gtk.NotebookNew() + gnrl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5) + gnrl.SetMarginStart(10) + gnrl.SetMarginEnd(10) + gnrl.SetMarginTop(10) + gnrl.SetMarginBottom(10) + dlWine, _ := gtk.ButtonNewWithLabel("Download Wine") + wineLbl, _ := gtk.LabelNew("PortableApps/LinuxPACom/Wine present") + gnrl.Add(wineLbl) + dlWine.Connect("clicked", func() { + cb := make(chan bool) + downloadWine(win, cb) + go func() { + v := <-cb + if v { + setupTxt(comBuf) + wineLbl.Show() + } + }() + }) + if !comEnbld { + dlWine.SetSensitive(false) + dlWine.SetTooltipText("common.sh needed") + } + gnrl.Add(dlWine) + ntbk.AppendPage(gnrl, getLabel("General")) + com, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5) + com.SetMarginStart(10) + com.SetMarginEnd(10) + com.SetMarginTop(10) + com.SetMarginBottom(10) + comEdit, _ := gtk.TextViewNewWithBuffer(comBuf) + comEdit.SetVExpand(true) + comEdit.SetHExpand(true) + vScroll, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0) + hScroll, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0) + comScrl, _ := gtk.ScrolledWindowNew(hScroll, vScroll) + comScrl.Add(comEdit) + com.Add(comScrl) + svBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 5) + sv, _ := gtk.ButtonNewWithLabel("Save") + sv.Connect("clicked", func() { + beg, end := comBuf.GetBounds() + txt, _ := comBuf.GetText(beg, end, true) + ioutil.WriteFile("PortableApps/LinuxPACom/common.sh", []byte(txt), 0777) + }) + cnl, _ := gtk.ButtonNewWithLabel("Cancel") + cnl.Connect("clicked", func() { + setupTxt(comBuf) + }) + svBox.Add(sv) + svBox.Add(cnl) + com.Add(svBox) + ntbk.AppendPage(com, getLabel("common.sh")) + win.Add(ntbk) + win.ShowAll() + if !comEnbld { + comScrl.Hide() + svBox.Hide() + mkCom, _ := gtk.ButtonNewWithLabel("Create common.sh") + mkCom.Connect("clicked", func() { + err := ioutil.WriteFile("PortableApps/LinuxPACom/common.sh", []byte("export HOME=$PWD/PortableApps/LinuxPACom/Home"), 0777) + if err == nil { + mkCom.Hide() + comScrl.Show() + svBox.Show() + setupTxt(comBuf) + comEnbld = true + dlWine.SetSensitive(true) + dlWine.SetTooltipText("") + } + }) + mkCom.Show() + com.Add(mkCom) + } else { + setupTxt(comBuf) + } + if _, err := os.Open("PortableApps/LinuxPACom/Wine"); err != nil && os.IsNotExist(err) { + wineLbl.Hide() + } + win.Show() +} + +func setupTxt(buf *gtk.TextBuffer) { + fil, _ := os.Open("PortableApps/LinuxPACom/common.sh") + btys, _ := ioutil.ReadAll(fil) + buf.SetText(string(btys)) +} + +func getLabel(name string) *gtk.Label { + lbl, _ := gtk.LabelNew(name) + return lbl +} diff --git a/setup.go b/setup.go index 6428162..e4b9289 100644 --- a/setup.go +++ b/setup.go @@ -5,6 +5,7 @@ import ( "fmt" _ "image/png" "os" + "os/exec" "reflect" "sort" "strings" @@ -14,6 +15,13 @@ import ( ) func setup() { + if _, err := os.Open("PortableApps/LinuxPACom/Wine"); os.IsNotExist(err) { + if _, errd := exec.LookPath("wine"); errd == nil { + wineAvail = true + } + } else if err == nil { + wineAvail = true + } PortableAppsFold, err := os.Open("PortableApps") if PAStat, _ := PortableAppsFold.Stat(); err != nil || !PAStat.IsDir() { os.Mkdir("PortableApps", 0777) @@ -30,28 +38,9 @@ func setup() { if err == nil { comEnbld = true } - fi, err := os.Open("PortableApps/LinuxPACom/Info.ini") + _, err = os.Open("PortableApps/LinuxPACom/Info.ini") if err != nil { - fi, err = os.Create("PortableApps/LinuxPACom/Info.ini") - if err == nil { - wrt := bufio.NewWriter(fi) - wrt.WriteString(defIni) - wrt.Flush() - } - } - if err == nil { - rdr := bufio.NewReader(fi) - for err != nil { - ln, _, error := rdr.ReadLine() - err = error - str := string(ln) - if strings.HasPrefix(str, "theme=") { - str = strings.TrimPrefix(str, "theme=") - if str == "lt" { - darkTheme = false - } - } - } + os.Create("PortableApps/LinuxPACom/Info.ini") } PAFolds, _ := PortableAppsFold.Readdirnames(-1) sort.Strings(PAFolds) diff --git a/ui.go b/ui.go index 22fc40c..dd73a2f 100644 --- a/ui.go +++ b/ui.go @@ -16,7 +16,7 @@ func ui(win *gtk.Window) { header.SetSubtitle("PortableApps.com type launcher") settings, _ := gtk.ButtonNewFromIconName("applications-system", gtk.ICON_SIZE_SMALL_TOOLBAR) settings.Connect("clicked", func() { - //Open Settings window! + settingsUI() }) settings.SetTooltipText("Settings (Coming Soon!)") header.PackStart(settings) @@ -33,6 +33,7 @@ func ui(win *gtk.Window) { txtColumn, _ := gtk.TreeViewColumnNewWithAttribute("", txtRender, "text", 1) appsList.AppendColumn(pixColumn) appsList.AppendColumn(txtColumn) + appsList.SetHeadersVisible(false) catList.SetHExpand(true) catList.SetVExpand(true) appsList.SetHExpand(true) @@ -43,12 +44,18 @@ func ui(win *gtk.Window) { hScrollApp, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0) catScrl, _ := gtk.ScrolledWindowNew(hScrollCat, vScrollCat) catScrl.Add(catList) + catScrl.SetSizeRequest(170, 500) appScrl, _ := gtk.ScrolledWindowNew(hScrollApp, vScrollApp) appScrl.Add(appsList) + appScrl.SetSizeRequest(300, 500) lrBox.Add(catScrl) lrBox.Add(appScrl) botBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 2) wineCheck, _ := gtk.CheckButtonNewWithLabel("Show Windows apps (Wine)") + if !wineAvail { + wineCheck.SetSensitive(false) + wineCheck.SetTooltipText("Download wine to run windows apps") + } wineCheck.Connect("toggled", func() { wine = wineCheck.GetActive() for i := range ls { diff --git a/update.go b/update.go index 35a46ea..3b4a31e 100644 --- a/update.go +++ b/update.go @@ -112,7 +112,7 @@ func downloadUpdate(newVersion string) (bool, error) { } func update(win *gtk.Window) { - updateWin, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) + updateWin, _ := gtk.WindowNew(gtk.WINDOW_POPUP) updateWin.SetTransientFor(win) topLvl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5) spin, _ := gtk.SpinnerNew() @@ -129,6 +129,7 @@ func update(win *gtk.Window) { updateWin.ShowAll() updateWin.Show() go func(win, updateWin *gtk.Window) { + defer updateWin.Close() stat, err := versionDL() if stat { res := getVersionFileInfo() @@ -137,7 +138,6 @@ func update(win *gtk.Window) { if stat { lbl.SetText("Updating!") downloadUpdate(res) - updateWin.Close() win.Close() cmd := exec.Command("./LinuxPA") cmd.Stdin = os.Stdin @@ -145,15 +145,12 @@ func update(win *gtk.Window) { cmd.Start() } else { fmt.Println(err) - updateWin.Close() } } else { fmt.Println("Failed Version File Info") - updateWin.Close() } } else { fmt.Println(err) - updateWin.Close() } }(win, updateWin) } diff --git a/wine.go b/wine.go index 52c64f8..427f0cf 100644 --- a/wine.go +++ b/wine.go @@ -1,10 +1,14 @@ package main import ( + "fmt" "io" + "io/ioutil" "net/http" "os" + "strings" + "github.com/gotk3/gotk3/gtk" "github.com/mholt/archiver" ) @@ -12,31 +16,86 @@ const ( wineURL = "https://www.playonlinux.com/wine/binaries/linux-amd64/PlayOnLinux-wine-2.5-linux-amd64.pol" ) -func downloadWine() (bool, error) { - wineTar, err := os.Create("PortableApps/LinuxPACom/wine2.5.tar.bz2") - if err != nil { - return false, err - } - wineTar.Chmod(0777) - defer wineTar.Close() - check := http.Client{ - CheckRedirect: func(r *http.Request, via []*http.Request) error { - r.URL.Opaque = r.URL.Path - return nil - }, - } - resp, err := check.Get(wineURL) - if err != nil { - return false, err - } - defer resp.Body.Close() - _, err = io.Copy(wineTar, resp.Body) - if err != nil { - return false, err - } - err = archiver.TarBz2.Open("PortableApps/LinuxPACom/wine2.5.tar.bz2", "PortableApps/LinuxPACom/Wine") - if err != nil { - return false, err - } - return true, nil +func downloadWine(parent *gtk.Window, cb chan bool) { + win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) + win.SetTransientFor(parent) + spin, _ := gtk.SpinnerNew() + spin.Start() + txt, _ := gtk.LabelNew("Downloading Wine") + 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) { + defer win.Close() + wineTar, err := os.Create("PortableApps/LinuxPACom/wine2.5.tar.bz2") + if err != nil { + fmt.Println(err) + cb <- false + return + } + wineTar.Chmod(0777) + defer wineTar.Close() + check := http.Client{ + CheckRedirect: func(r *http.Request, via []*http.Request) error { + r.URL.Opaque = r.URL.Path + return nil + }, + } + resp, err := check.Get(wineURL) + if err != nil { + fmt.Println(err) + cb <- false + return + } + defer resp.Body.Close() + _, err = io.Copy(wineTar, resp.Body) + if err != nil { + fmt.Println(err) + cb <- false + return + } + txt.SetText("Extracting Wine") + os.RemoveAll("PortableApps/LinuxPACom/Wine") + err = archiver.TarBz2.Open("PortableApps/LinuxPACom/wine2.5.tar.bz2", "PortableApps/LinuxPACom/Wine") + if err != nil { + fmt.Println(err) + cb <- false + return + } + os.Remove("PortableApps/LinuxPACom/wine2.5.tar.bz2") + fil, err := os.Open("PortableApps/LinuxPACom/common.sh") + if err != nil { + fmt.Println(err) + cb <- false + return + } + tmp, err := ioutil.ReadAll(fil) + if err != nil { + fmt.Println(err) + cb <- false + return + } + fmt.Println("Hello") + if !strings.Contains(string(tmp), "export PATH=$PWD/PortableApps/LinuxPACom/Wine/wineversion/2.5/bin:$PATH") { + tmp = append(tmp, []byte("\nexport PATH=$PWD/PortableApps/LinuxPACom/Wine/wineversion/2.5/bin:$PATH")...) + ioutil.WriteFile("PortableApps/LinuxPACom/common.sh", tmp, 0777) + fmt.Println("Hello2") + if err != nil { + fmt.Println(err) + cb <- false + return + } + } + fmt.Println("HelloT") + cb <- true + return + }(win) }