diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5a2cbea..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -fyne_metadata_init.go -ztm_vehicles_app.apk \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..e121c2d Binary files /dev/null and b/icon.png differ diff --git a/yui.png b/yui.png deleted file mode 100644 index cb005a3..0000000 Binary files a/yui.png and /dev/null differ diff --git a/ztm_vehicles_app.go b/ztm_vehicles_app.go index 3abb438..1093776 100644 --- a/ztm_vehicles_app.go +++ b/ztm_vehicles_app.go @@ -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, ))