You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.8 KiB
Go
123 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"math"
|
|
"strconv"
|
|
|
|
"github.com/gotk3/gotk3/glib"
|
|
"github.com/gotk3/gotk3/gtk"
|
|
)
|
|
|
|
const UIMain = "tip_calc_window.glade"
|
|
|
|
func graphicalUI() {
|
|
// Create Gtk Application, change appID to your application domain name reversed.
|
|
const appID = "fr.abrivard.tip_calc"
|
|
application, err := gtk.ApplicationNew(appID, glib.APPLICATION_FLAGS_NONE)
|
|
// Check to make sure no errors when creating Gtk Application
|
|
if err != nil {
|
|
log.Fatal("Could not create application.", err)
|
|
}
|
|
|
|
application.Connect("activate", func() {
|
|
builder, err := gtk.BuilderNew()
|
|
if err != nil {
|
|
log.Fatalln("Couldn't make builder:", err)
|
|
}
|
|
|
|
err = builder.AddFromFile(UIMain)
|
|
if err != nil {
|
|
log.Fatalln("Couldn't add UI XML to builder:", err)
|
|
}
|
|
|
|
var obj glib.IObject
|
|
|
|
obj, _ = builder.GetObject("TipScale")
|
|
scale := obj.(*gtk.Scale)
|
|
scaleAdj := scale.GetAdjustment()
|
|
|
|
obj, _ = builder.GetObject("TipEntry")
|
|
tipEntry := obj.(*gtk.Entry)
|
|
|
|
_ = glib.BindProperty(scaleAdj.Object, "value", tipEntry.Object, "text", glib.BINDING_DEFAULT|glib.BINDING_BIDIRECTIONAL|glib.BINDING_SYNC_CREATE)
|
|
|
|
obj, _ = builder.GetObject("BillEntry")
|
|
billEntry := obj.(*gtk.Entry)
|
|
|
|
obj, _ = builder.GetObject("TipAmountLbl")
|
|
tipAmount := obj.(*gtk.Label)
|
|
|
|
obj, _ = builder.GetObject("TotalBillLbl")
|
|
totalBill := obj.(*gtk.Label)
|
|
|
|
obj, _ = builder.GetObject("ComputeCmd")
|
|
button := obj.(*gtk.Button)
|
|
|
|
button.Connect("clicked", func() {
|
|
billText, _ := billEntry.GetText()
|
|
tipText, _ := tipEntry.GetText()
|
|
|
|
if bill, err := strconv.ParseFloat(billText, 64); err == nil && bill >= 0 {
|
|
if tipPercent, err := strconv.ParseFloat(tipText, 64); err == nil && tipPercent >= 0 {
|
|
tip := math.Round(tipPercent*bill) / 100
|
|
tipAmount.SetLabel(fmt.Sprintf("The tip is %.2f", tip))
|
|
totalBill.SetLabel(fmt.Sprintf("The total is %.2f", bill+tip))
|
|
return
|
|
}
|
|
}
|
|
|
|
tipAmount.SetLabel("Please enter numbers >= 0")
|
|
totalBill.SetLabel("")
|
|
})
|
|
|
|
obj, _ = builder.GetObject("MainWindow")
|
|
wnd := obj.(*gtk.ApplicationWindow)
|
|
wnd.ShowAll()
|
|
application.AddWindow(wnd)
|
|
})
|
|
// Run Gtk application
|
|
application.Run([]string{})
|
|
}
|
|
|
|
func readPositiveFloat() float64 {
|
|
for {
|
|
var line string
|
|
_, err := fmt.Scanln(&line)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if value, err := strconv.ParseFloat(line, 64); err == nil && value >= 0 {
|
|
return value
|
|
}
|
|
|
|
fmt.Print("Please enter a value >= 0 : ")
|
|
}
|
|
}
|
|
|
|
func consoleUI() {
|
|
fmt.Print("What is the bill? ")
|
|
bill := readPositiveFloat()
|
|
|
|
fmt.Print("What is the tip percentage? ")
|
|
tipPercent := readPositiveFloat()
|
|
|
|
tip := math.Round(tipPercent*bill) / 100
|
|
|
|
fmt.Printf("The tip is %.2f\nThe total is %.2f\n", tip, bill+tip)
|
|
}
|
|
|
|
func main() {
|
|
uiPtr := flag.String("ui", "c", "c for console, g for GUI")
|
|
flag.Parse()
|
|
|
|
if *uiPtr == "c" {
|
|
consoleUI()
|
|
} else {
|
|
graphicalUI()
|
|
}
|
|
}
|