go: add current comic logic
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
be97641245
commit
0fc49afc6b
@ -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")
|
||||
}
|
||||
|
230
xkcdreader/comic.go
Normal file
230
xkcdreader/comic.go
Normal file
@ -0,0 +1,230 @@
|
||||
// Copyright 2022 wanderer <a_mirre at utb dot cz>
|
||||
// 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
|
||||
}
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user