package main import "log" import "fmt" import "strings" import "reflect" import "os" import "os/exec" import "bytes" import "github.com/gookit/config" import "github.com/andlabs/ui" import "github.com/davecgh/go-spew/spew" // dns // import "github.com/miekg/dns" // reminder to use protobuf // https://github.com/golang/protobuf // reminder to use this for JSON // https://github.com/tidwall/gjson // value := gjson.Get(json, "name.last") // println(value.String()) // value := gjson.Get(json, friends.#[last=="Murphy"].first) // use mergo to merge structs // import "github.com/imdario/mergo" // mergo.Merge(&dest, src) // always sorted slice (new project) // https://github.com/yaa110/sslice var mainwin *ui.Window func doButton(mybut *ui.Button) { log.Println("doButton() hostname = test", config.String("hostname")) log.Println("doButton() mybut =", reflect.ValueOf(mybut).Elem()) spew.Dump(mybut) mybut.Enabled() } func rsync(mybut *ui.Button) { log.Println("doButton() mybut =", reflect.ValueOf(mybut).Elem()) log.Println("run rsync here") } func exampleCommand(a string, b ...string) { // cmd := exec.Command(range myargs) // args := []string{"/tmp", "/"} // cmd := exec.Command(args) cmd := exec.Command(a, b...) cmd.Stdin = strings.NewReader("foobar") var out bytes.Buffer cmd.Stdout = &out err := cmd.Run() if err != nil { log.Fatal(err) } fmt.Println(out.String()) // fmt.Printf("in all caps: %q\n", out.String()) } func format(mybut *ui.Button) { log.Println("doButton() mybut =", reflect.ValueOf(mybut).Elem()) log.Println("format and mount here") // exampleCommand("ls", "/tmp") // stdoutExec("ls /tmp", 50) // ping("git.wit.com", 5) // simpleProcess("ping git.wit.com") // simpleProcess("dd if=/home/pinebook/factory/factory-pine14inch of=/dev/sdb status=progress bs=1M oflag=sync count=300"); // simpleProcess("dd if=/home/pinebook/factory/factory-pine14inch of=/dev/sdb status=progress bs=1M oflag=sync count=300"); simpleProcess("pwd") simpleProcess("ls -l") os.Chdir("/mnt") simpleProcess("pwd") simpleProcess("ls -l /aksd") return simpleProcess("parted -s /dev/sdb mklabel msdos") simpleProcess("parted -s /dev/sdb mkpart primary ext4 1MiB 8GB") simpleProcess("parted -s /dev/sdb mkpart primary ext4 8GB 32GB") simpleProcess("sleep 1") simpleProcess("mkfs.ext4 /dev/sdb1") simpleProcess("mkfs.ext4 /dev/sdb2") simpleProcess("e2label /dev/sdb1 root") simpleProcess("e2label /dev/sdb2 factory-image") simpleProcess("mount /dev/sdb1 /mnt/sdcard/") simpleProcess("dd if=../u-boot/u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1K seek=8") } func hostnameButton(hostname string, something func(*ui.Button)) ui.Control { tmpbox := ui.NewHorizontalBox() tmpbox.SetPadded(true) tmpButton := ui.NewButton(hostname) tmpbox.Append(tmpButton, false) tmpButton.OnClicked(something) /* tmpButton.OnClicked(func(*ui.Button) { log.Println("hostname =", config.String("hostname"), tmpButton) }) */ return tmpbox } func addButton(vbox *ui.Box, hostname string, buttonClick func(*ui.Button)) { tmpbox := ui.NewHorizontalBox() tmpbox.SetPadded(true) /* tmpButton := ui.NewButton(hostname) tmpbox.Append(tmpButton, false) tmpButton.OnClicked(doButton) log.Println("addButton() set doButton =", tmpButton) tmpButton.OnClicked(func(*ui.Button) { log.Println("hostname =", config.String("hostname"), tmpButton) }) */ vbox.Append(hostnameButton(hostname, buttonClick), false) } func makeButtonsPage(names []string) ui.Control { vbox := ui.NewVerticalBox() vbox.SetPadded(true) hbox := ui.NewHorizontalBox() hbox.SetPadded(true) vbox.Append(hbox, false) for _, hostname := range names { fmt.Println("hostname=", hostname) addButton(vbox, hostname, doButton) } vbox.Append(ui.NewHorizontalSeparator(), false) return vbox } func makeGroupEntries() ui.Control { group := ui.NewGroup("Entries") group.SetMargined(true) group.SetChild(ui.NewNonWrappingMultilineEntry()) entryForm := ui.NewForm() entryForm.SetPadded(true) group.SetChild(entryForm) entryForm.Append("Entry", ui.NewEntry(), false) entryForm.Append("Password Entry", ui.NewPasswordEntry(), false) entryForm.Append("Search Entry", ui.NewSearchEntry(), false) entryForm.Append("Multiline Entry", ui.NewMultilineEntry(), true) entryForm.Append("Multiline Entry No Wrap", ui.NewNonWrappingMultilineEntry(), true) return group } func addGroupBox(hbox *ui.Box, name string) *ui.Box { groupDrive := ui.NewGroup(name) groupDrive.SetMargined(true) vbox := ui.NewVerticalBox() vbox.SetPadded(true) groupDrive.SetChild(vbox) hbox.Append(groupDrive, true) log.Println("groupDrive =", reflect.TypeOf(groupDrive)) vbox.SetPadded(true) return vbox } func makeBurnSDcardPage() *ui.Box { hbox := ui.NewVerticalBox() hbox.SetPadded(true) vbox := addGroupBox(hbox, "Drive to Format") cbox := ui.NewCombobox() cbox.Append("/dev/sdb") cbox.Append("/dev/sr0") cbox.Append("Combobox Item 3") cbox.OnSelected(func(*ui.Combobox) { spew.Dump(cbox.Visible()) spew.Dump(cbox.Selected()) log.Println("selected = ", cbox.Selected()) }) vbox.Append(cbox, false) vbox2 := addGroupBox(hbox, "Select the Image") rb := ui.NewRadioButtons() rb.Append("Radio Button 1") rb.Append("Radio Button 2") rb.Append("Radio Button 3") vbox2.Append(rb, false) addButton(vbox2, "Partition and Format", format) addButton(vbox2, "rsync filesystem", rsync) vbox3 := addGroupBox(hbox, "Select the Image") rb2 := ui.NewRadioButtons() rb2.Append("stuff") vbox3.Append(rb2, false) return hbox } func makeNumbersPage() ui.Control { hbox := ui.NewHorizontalBox() hbox.SetPadded(true) group := ui.NewGroup("Numbers") group.SetMargined(true) hbox.Append(group, true) vbox := ui.NewVerticalBox() vbox.SetPadded(true) group.SetChild(vbox) spinbox := ui.NewSpinbox(47, 100) slider := ui.NewSlider(21, 100) pbar := ui.NewProgressBar() spinbox.OnChanged(func(*ui.Spinbox) { slider.SetValue(spinbox.Value()) pbar.SetValue(spinbox.Value()) log.Println("slider = ", slider.Value()) }) slider.OnChanged(func(*ui.Slider) { spinbox.SetValue(slider.Value()) pbar.SetValue(slider.Value()) }) vbox.Append(spinbox, false) vbox.Append(slider, false) vbox.Append(pbar, false) ip := ui.NewProgressBar() ip.SetValue(-1) vbox.Append(ip, false) group = ui.NewGroup("Lists") group.SetMargined(true) hbox.Append(group, true) vbox = ui.NewVerticalBox() vbox.SetPadded(true) group.SetChild(vbox) cbox := ui.NewCombobox() cbox.Append("Combobox Item 1") cbox.Append("Combobox Item 2") cbox.Append("Combobox Item 3") vbox.Append(cbox, false) ecbox := ui.NewEditableCombobox() ecbox.Append("Editable Item 1") ecbox.Append("Editable Item 2") ecbox.Append("Editable Item 3") vbox.Append(ecbox, false) rb := ui.NewRadioButtons() rb.Append("Radio Button 1") rb.Append("Radio Button 2") rb.Append("Radio Button 3") vbox.Append(rb, false) return hbox } func makeDataChoosersPage() ui.Control { hbox := ui.NewHorizontalBox() hbox.SetPadded(true) vbox := ui.NewVerticalBox() vbox.SetPadded(true) hbox.Append(vbox, false) vbox.Append(ui.NewDatePicker(), false) vbox.Append(ui.NewTimePicker(), false) vbox.Append(ui.NewDateTimePicker(), false) vbox.Append(ui.NewFontButton(), false) vbox.Append(ui.NewColorButton(), false) hbox.Append(ui.NewVerticalSeparator(), false) vbox = ui.NewVerticalBox() vbox.SetPadded(true) hbox.Append(vbox, true) grid := ui.NewGrid() grid.SetPadded(true) vbox.Append(grid, false) button := ui.NewButton("Open File") entry := ui.NewEntry() entry.SetReadOnly(true) button.OnClicked(func(*ui.Button) { filename := ui.OpenFile(mainwin) if filename == "" { filename = "(cancelled)" } entry.SetText(filename) }) grid.Append(button, 0, 0, 1, 1, false, ui.AlignFill, false, ui.AlignFill) grid.Append(entry, 1, 0, 1, 1, true, ui.AlignFill, false, ui.AlignFill) button = ui.NewButton("Save File") entry2 := ui.NewEntry() entry2.SetReadOnly(true) button.OnClicked(func(*ui.Button) { filename := ui.SaveFile(mainwin) if filename == "" { filename = "(cancelled)" } entry2.SetText(filename) }) grid.Append(button, 0, 1, 1, 1, false, ui.AlignFill, false, ui.AlignFill) grid.Append(entry2, 1, 1, 1, 1, true, ui.AlignFill, false, ui.AlignFill) msggrid := ui.NewGrid() msggrid.SetPadded(true) grid.Append(msggrid, 0, 2, 2, 1, false, ui.AlignCenter, false, ui.AlignStart) button = ui.NewButton("Message Box") button.OnClicked(func(*ui.Button) { ui.MsgBox(mainwin, "This is a normal message box.", "More detailed information can be shown here.") }) msggrid.Append(button, 0, 0, 1, 1, false, ui.AlignFill, false, ui.AlignFill) button = ui.NewButton("Error Box") button.OnClicked(func(*ui.Button) { ui.MsgBoxError(mainwin, "This message box describes an error.", "More detailed information can be shown here.") }) msggrid.Append(button, 1, 0, 1, 1, false, ui.AlignFill, false, ui.AlignFill) return hbox } func setupUI() { mainwin = ui.NewWindow("Make a Pinebook SDCARD", config.Int("width"), config.Int("height"), false) mainwin.OnClosing(func(*ui.Window) bool { ui.Quit() return true }) ui.OnShouldQuit(func() bool { mainwin.Destroy() return true }) tab := ui.NewTab() mainwin.SetChild(tab) mainwin.SetMargined(true) tab.Append("Burn SDCARD", makeBurnSDcardPage()) tab.SetMargined(0, true) tab.Append("VMs", makeNumbersPage()) tab.SetMargined(1, true) tab.Append("Data Choosers", makeDataChoosersPage()) tab.SetMargined(2, true) mainwin.Show() } func main() { parseConfig() ui.Main(setupUI) }