can now display multiple vehicles

which have the same number
button which requests check
now is disabled when the data
is being fetched
minor text formatting changes
and small UI changes
new icon
This commit is contained in:
HiszpanInk 2023-03-18 01:49:16 +01:00
parent 9a38ef2387
commit b38cb92788
4 changed files with 64 additions and 69 deletions

2
.gitignore vendored
View file

@ -1,2 +0,0 @@
fyne_metadata_init.go
ztm_vehicles_app.apk

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 KiB

BIN
yui.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 942 KiB

View file

@ -2,8 +2,7 @@ package main
import (
"fmt"
"strconv"
"strings"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
@ -11,42 +10,10 @@ import (
"github.com/gocolly/colly/v2"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/driver/mobile"
"fyne.io/fyne/v2/layout"
)
type numericalEntry struct {
widget.Entry
}
func newNumericalEntry() *numericalEntry {
entry := &numericalEntry{}
entry.ExtendBaseWidget(entry)
return entry
}
func (e *numericalEntry) TypedRune(r rune) {
if (r >= '0' && r <= '9') || r == '.' || r == ',' {
e.Entry.TypedRune(r)
}
}
func (e *numericalEntry) TypedShortcut(shortcut fyne.Shortcut) {
paste, ok := shortcut.(*fyne.ShortcutPaste)
if !ok {
e.Entry.TypedShortcut(shortcut)
return
}
content := paste.Clipboard.Content()
if _, err := strconv.ParseFloat(content, 64); err == nil {
e.Entry.TypedShortcut(shortcut)
}
}
func (e *numericalEntry) Keyboard() mobile.KeyboardType {
return mobile.NumberKeyboard
}
type vehicle struct {
producer string
model string
@ -60,21 +27,39 @@ type vehicle struct {
equipment string
}
func getVehicleByNum(vehicleNum string) string {
func vehicleToString(inputVehicle *vehicle) string {
registrationPlate := ""
if len(inputVehicle.vehicle_registration_plate) > 0 {
registrationPlate = fmt.Sprintf(`,o rejestracji %s`, inputVehicle.vehicle_registration_plate)
}
output_string := fmt.Sprintf(
"%s o numerze %s,"+"%s %s,"+"z roku %s,"+"w posiadaniu %s,"+"z zajezdni %s%s",
inputVehicle.traction_type,
inputVehicle.vehicle_number,
inputVehicle.producer,
inputVehicle.model,
inputVehicle.production_year,
inputVehicle.operator,
inputVehicle.garage,
registrationPlate)
return strings.Replace(output_string, ",", ",\n", -1)
}
func getVehiclesByNum(vehicleNum string) string {
searchURL := fmt.Sprintf("https://www.ztm.waw.pl/baza-danych-pojazdow/?ztm_traction=&ztm_make=&ztm_model=&ztm_year=&ztm_registration=&ztm_vehicle_number=%s&ztm_carrier=&ztm_depot=", vehicleNum)
vehicleURL := ""
var vehicleURLs []string
c2 := colly.NewCollector(
// Visit only domains:
colly.AllowedDomains("www.ztm.waw.pl"),
)
c2.OnHTML(".grid-row-active", func(e *colly.HTMLElement) {
text := e.Attr("href")
vehicleURL = text
vehicleURLs = append(vehicleURLs, text)
})
c2.Visit(searchURL)
if vehicleURL == "" {
return ""
} else {
output_string := ""
for _, vehicleURL := range vehicleURLs {
var retrievedData [10]string
// Instantiate default collector
c := colly.NewCollector(
@ -100,46 +85,58 @@ func getVehicleByNum(vehicleNum string) string {
ticket_machine: retrievedData[8],
equipment: retrievedData[9],
}
output_string := fmt.Sprintf(
`%s %s
z roku %s,
w posiadaniu %s,
z zajezdni %s,
o rejestracji %s`, retrievedVehicle.producer, retrievedVehicle.model, retrievedVehicle.production_year, retrievedVehicle.operator, retrievedVehicle.garage, retrievedVehicle.vehicle_registration_plate)
return output_string
output_string += vehicleToString(&retrievedVehicle)
output_string += "\n"
output_string += "\n"
}
return output_string
}
func main() {
a := app.New()
w := a.NewWindow("Hello")
w := a.NewWindow("ZTM vehicles")
entryLabel := widget.NewLabel("Podaj numer taborowy pojazdu:")
entry := widget.NewEntry()
output := widget.NewLabel("")
entry := newNumericalEntry()
form := &widget.Form{
Items: []*widget.FormItem{ // we can specify items in the constructor
{Text: "Podaj numer taborowy pojazdu:", Widget: entry}},
}
form.OnSubmit = func() {
output_data := getVehicleByNum(entry.Text)
if output_data != "" {
output.Text = output_data
} else {
output.Text = "Nie znaleziono pojazdu o podanym numerze taborowym w bazie pojazdów WTP"
}
output.Wrapping = fyne.TextWrapWord
//outputContainer := container.NewVScroll(output)
//I create button earlier in order to reference it later inside function of it so I can easily disable it for the time data is fetching. There is probably better way to do it but I could't find it so
executeButton := widget.NewButton("Sprawdź numer", func() {
output.Refresh()
}
})
executeButton = widget.NewButton("Sprawdź numer", func() {
executeButton.Disable()
executeButton.SetText("Wczytywanie")
if len(strings.TrimSpace(entry.Text)) != 0 {
output_data := getVehiclesByNum(entry.Text)
if output_data != "" {
output.Text = output_data
} else {
output.Text = "Nie znaleziono pojazdu o podanym numerze taborowym w bazie pojazdów WTP"
}
} else {
output.Text = "Nie wprowadzono prawidłowego numeru"
}
output.Refresh()
executeButton.Enable()
executeButton.SetText("Sprawdź numer")
})
executeButton.Importance = widget.HighImportance
clearButton := widget.NewButton("Wyczyść", func() {
entry.Text = ""
output.Text = ""
output.Refresh()
entry.Refresh()
})
buttons := container.New(layout.NewGridLayout(2), clearButton, executeButton)
inputs := container.New(layout.NewGridLayout(1), entryLabel, entry, buttons)
w.SetContent(container.NewVBox(
form,
clearButton,
inputs,
output,
))