From 0fc49afc6b212ff4f024e844c3d55f6bb251c16e Mon Sep 17 00:00:00 2001 From: surtur Date: Thu, 14 Jul 2022 22:17:26 +0200 Subject: [PATCH] go: add current comic logic --- xkcdreader/app.go | 96 ++++++++++++----- xkcdreader/comic.go | 230 ++++++++++++++++++++++++++++++++++++++++ xkcdreader/xkcd/xkcd.go | 29 +++++ 3 files changed, 328 insertions(+), 27 deletions(-) create mode 100644 xkcdreader/comic.go diff --git a/xkcdreader/app.go b/xkcdreader/app.go index 14c9584..c604990 100644 --- a/xkcdreader/app.go +++ b/xkcdreader/app.go @@ -4,7 +4,6 @@ package xkcdreader import ( - "fmt" "log" "os" @@ -12,6 +11,7 @@ import ( "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/data/binding" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/storage" "fyne.io/fyne/v2/theme" @@ -23,8 +23,10 @@ import ( const appGreeting = "welcome to go-xkcdreader" var ( - a fyne.App - latestComic = xkcd.GetLatest() + a fyne.App + latestComic = xkcd.GetLatest() + currentComic = latestComic + cc xkcdcomic ) // RunApp performs sets up and runs the main application. @@ -100,60 +102,98 @@ func makeTabs() *container.AppTabs { } func makeBrowseUI() *fyne.Container { + err := setCurrentComicBinding() + if err != nil { + log.Println(err) + } + + cc.pic = getImg(currentComic.Img, false) + // container for the image and surrounding elements imgC := container.New( layout.NewHBoxLayout(), widget.NewButtonWithIcon("", theme.NavigateBackIcon(), func() { log.Println("Previous comic") + showPrevious() + cc.refreshComicPic(getImg(currentComic.Img, false)) }), layout.NewSpacer(), container.NewCenter( // TODO(me): dynamically replace placeholder text with image once // fetched... // widget.NewLabel("img placeholder"), - getImg(latestComic.Img, false), + cc.pic, ), layout.NewSpacer(), widget.NewButtonWithIcon("", theme.NavigateNextIcon(), func() { log.Println("Next comic") + showNext() }), ) + year := widget.NewLabelWithData(comicCurrent.year) + month := widget.NewLabelWithData(comicCurrent.month) + day := widget.NewLabelWithData(comicCurrent.day) + title := widget.NewLabelWithData(comicCurrent.title) + num := widget.NewLabelWithData( + binding.IntToString(comicCurrent.num), + ) + altText := widget.NewLabelWithData(comicCurrent.alt) + + title.TextStyle.Bold = true + num.TextStyle.Monospace = true + altText.TextStyle.Italic = true + altText.Wrapping = fyne.TextTruncate + altText.Alignment = fyne.TextAlignCenter + browseUI := container.New( layout.NewVBoxLayout(), - layout.NewSpacer(), + // layout.NewSpacer(), container.NewCenter( container.NewVBox( - &widget.Label{ - Text: "published on " + - fmt.Sprint( - latestComic.Year, "-", - latestComic.Month, "-", - latestComic.Day, - ), - TextStyle: fyne.TextStyle{Italic: true}, - }, + ///&widget.Label{ + /// Text: "published on " + + /// fmt.Sprint( + /// currentComic.Year, "-", + /// currentComic.Month, "-", + /// currentComic.Day, + /// ), + /// TextStyle: fyne.TextStyle{Italic: true}, + ///}, container.NewHBox( - &widget.Label{ - Text: latestComic.Title, - TextStyle: fyne.TextStyle{Bold: true}, - }, - &widget.Label{ - Text: "(#" + fmt.Sprint(latestComic.Num) + ")", - TextStyle: fyne.TextStyle{Monospace: true}, - }, + year, month, day, + ), + container.NewHBox( + ///&widget.Label{ + /// Text: currentComic.Title, + /// TextStyle: fyne.TextStyle{Bold: true}, + ///}, + ///&widget.Label{ + /// Text: "(#" + fmt.Sprint(currentComic.Num) + ")", + /// TextStyle: fyne.TextStyle{Monospace: true}, + ///}, + title, + num, ), ), ), imgC, - layout.NewSpacer(), + // layout.NewSpacer(), container.NewCenter( // comic "alt text" - &widget.Label{ - Text: latestComic.Alt, - TextStyle: fyne.TextStyle{Italic: true}, - }, + ///&widget.Label{ + /// Text: currentComic.Alt, + /// TextStyle: fyne.TextStyle{Italic: true}, + ///}, + // container.NewCenter( + // container.NewAdaptiveGrid( + // 1, + // layout.NewSpacer(), + altText, + layout.NewSpacer(), + // ), ), + layout.NewSpacer(), ) return browseUI @@ -207,6 +247,8 @@ func getImg(imgURI string, local bool) *canvas.Image { // get the actual image img := canvas.NewImageFromURI(preImg) + log.Println("getImg: img name: ", img.Resource.Name()) + if img.Resource == nil { log.Println("error fetching the image file of the latest comic") } diff --git a/xkcdreader/comic.go b/xkcdreader/comic.go new file mode 100644 index 0000000..e12e23f --- /dev/null +++ b/xkcdreader/comic.go @@ -0,0 +1,230 @@ +// Copyright 2022 wanderer +// SPDX-License-Identifier: GPL-3.0-or-later + +package xkcdreader + +import ( + "log" + + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/data/binding" + x "git.dotya.ml/wanderer/go-xkcdreader/xkcdreader/xkcd" +) + +type xkcdcomic struct { + pic *canvas.Image +} + +var comicCurrent = struct { + num binding.Int `default:"0"` + alt binding.String + day binding.String + img binding.String + link binding.String + month binding.String + news binding.String + safeTitle binding.String + title binding.String + transcript binding.String + year binding.String +}{ + num: binding.NewInt(), + alt: binding.NewString(), + day: binding.NewString(), + img: binding.NewString(), + link: binding.NewString(), + month: binding.NewString(), + news: binding.NewString(), + safeTitle: binding.NewString(), + title: binding.NewString(), + transcript: binding.NewString(), + year: binding.NewString(), +} + +// showPrevious loads and shows a previous comic. +// nolint: dupl +func showPrevious() { + previous := x.GetPrevious(currentComic.Num) + + if previous != nil { + log.Printf("current num pre: %d", currentComic.Num) + + if err := comicCurrent.num.Set(previous.Num); err != nil { + log.Println(err) + } + + if err := comicCurrent.alt.Set(previous.Alt); err != nil { + log.Println(err) + } + + if err := comicCurrent.day.Set(previous.Day); err != nil { + log.Println(err) + } + + if err := comicCurrent.img.Set(previous.Img); err != nil { + log.Println(err) + } + + if err := comicCurrent.link.Set(previous.Link); err != nil { + log.Println(err) + } + + if err := comicCurrent.month.Set(previous.Month); err != nil { + log.Println(err) + } + + if err := comicCurrent.news.Set(previous.News); err != nil { + log.Println(err) + } + + if err := comicCurrent.safeTitle.Set(previous.SafeTitle); err != nil { + log.Println(err) + } + + if err := comicCurrent.title.Set(previous.Title); err != nil { + log.Println(err) + } + + if err := comicCurrent.transcript.Set(previous.Transcript); err != nil { + log.Println(err) + } + + if err := comicCurrent.year.Set(previous.Year); err != nil { + log.Println(err) + } + + cc.refreshComicPic(getImg(previous.Img, false)) + + currentComic = previous + + log.Printf("current num post: %d", currentComic.Num) + } else { + log.Println("no previous comic") + } +} + +// showNext loads and shows a next comic. +// nolint: dupl +func showNext() { + next := x.GetNext(currentComic.Num) + + if next != nil { + log.Printf("current num pre: %d", currentComic.Num) + + if err := comicCurrent.num.Set(next.Num); err != nil { + log.Println(err) + } + + if err := comicCurrent.alt.Set(next.Alt); err != nil { + log.Println(err) + } + + if err := comicCurrent.day.Set(next.Day); err != nil { + log.Println(err) + } + + if err := comicCurrent.img.Set(next.Img); err != nil { + log.Println(err) + } + + if err := comicCurrent.link.Set(next.Link); err != nil { + log.Println(err) + } + + if err := comicCurrent.month.Set(next.Month); err != nil { + log.Println(err) + } + + if err := comicCurrent.news.Set(next.News); err != nil { + log.Println(err) + } + + if err := comicCurrent.safeTitle.Set(next.SafeTitle); err != nil { + log.Println(err) + } + + if err := comicCurrent.title.Set(next.Title); err != nil { + log.Println(err) + } + + if err := comicCurrent.transcript.Set(next.Transcript); err != nil { + log.Println(err) + } + + if err := comicCurrent.year.Set(next.Year); err != nil { + log.Println(err) + } + + cc.refreshComicPic(getImg(next.Img, false)) + + currentComic = next + + log.Printf("current num post: %d", currentComic.Num) + } else { + log.Println("no next comic") + } +} + +func (xc *xkcdcomic) refreshComicPic(pic *canvas.Image) { + xc.pic.Resource = pic.Resource + xc.pic.Refresh() +} + +func setCurrentComicBinding() error { + err := comicCurrent.num.Set(currentComic.Num) + if err != nil { + return err + } + + err = comicCurrent.alt.Set(currentComic.Alt) + if err != nil { + return err + } + + err = comicCurrent.day.Set(currentComic.Day) + if err != nil { + return err + } + + err = comicCurrent.img.Set(currentComic.Img) + if err != nil { + return err + } + + err = comicCurrent.link.Set(currentComic.Link) + if err != nil { + return err + } + + err = comicCurrent.month.Set(currentComic.Month) + if err != nil { + return err + } + + err = comicCurrent.news.Set(currentComic.News) + if err != nil { + return err + } + + err = comicCurrent.safeTitle.Set(currentComic.SafeTitle) + if err != nil { + return err + } + + err = comicCurrent.title.Set(currentComic.Title) + if err != nil { + return err + } + + err = comicCurrent.transcript.Set(currentComic.Transcript) + if err != nil { + return err + } + + err = comicCurrent.year.Set(currentComic.Year) + if err != nil { + return err + } + + return nil +} diff --git a/xkcdreader/xkcd/xkcd.go b/xkcdreader/xkcd/xkcd.go index 4d0d437..0a102fb 100644 --- a/xkcdreader/xkcd/xkcd.go +++ b/xkcdreader/xkcd/xkcd.go @@ -35,3 +35,32 @@ func GetComic(num int) *xkcd.Comic { return comic } + +// GetPrevious returns a previous comic relative to the one provided. +func GetPrevious(current int) *xkcd.Comic { + if current == 1 { + log.Printf("error: there is no previous comic available, requested: '%d'", + current-1) + return GetComic(1) + } + + previous := GetComic(current - 1) + + if previous == nil { + return GetComic(current) + } + + return previous +} + +// GetNext returns a next comic relative to the one currently provided. +func GetNext(current int) *xkcd.Comic { + next := GetComic(current + 1) + + if next == nil { + log.Printf("error: there is no next comic available, requested: '%d'", + current+1) + } + + return next +}