mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
Adds support for digital clock
This commit is contained in:
parent
6de3f0f5b9
commit
348b2ffa5d
81
modules/digitalclock/clocks.go
Normal file
81
modules/digitalclock/clocks.go
Normal file
@ -0,0 +1,81 @@
|
||||
package digitalclock
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
// AM defines the AM string format
|
||||
const AM = "A"
|
||||
|
||||
// PM defines the PM string format
|
||||
const PM = "P"
|
||||
const minRowsForBorder = 3
|
||||
|
||||
// Converts integer to string along with makes sure the lenght of string is > 2
|
||||
func intStrConv(val int) string {
|
||||
valStr := strconv.Itoa(val)
|
||||
|
||||
if len(valStr) < 2 {
|
||||
valStr = "0" + valStr
|
||||
}
|
||||
return valStr
|
||||
}
|
||||
|
||||
// Returns Hour + minute + AM/PM information based on the settings
|
||||
func getHourMinute(hourFormat string) string {
|
||||
strHours := intStrConv(time.Now().Hour())
|
||||
AMPM := " "
|
||||
|
||||
if hourFormat == "12" {
|
||||
hour := time.Now().Hour()
|
||||
strHours = intStrConv(hour % 12)
|
||||
if (hour % 12) == hour {
|
||||
AMPM = AM
|
||||
} else {
|
||||
AMPM = PM
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
strMintues := intStrConv(time.Now().Minute())
|
||||
fmt.Println(AMPM)
|
||||
strMintues = strMintues + AMPM
|
||||
return strHours + getColon() + strMintues
|
||||
}
|
||||
|
||||
// Returns the : with blinking based on the seconds
|
||||
func getColon() string {
|
||||
if time.Now().Second()%2 == 0 {
|
||||
return ":"
|
||||
}
|
||||
return " "
|
||||
}
|
||||
|
||||
func getDate() string {
|
||||
return fmt.Sprintf("Date: %s", time.Now().Format("Monday January 02 2006"))
|
||||
}
|
||||
|
||||
func getUTC() string {
|
||||
return fmt.Sprintf("UTC: %s", time.Now().UTC().Format(time.RFC3339))
|
||||
}
|
||||
|
||||
func getEpoch() string {
|
||||
return fmt.Sprintf("Epoch: %d", time.Now().Unix())
|
||||
}
|
||||
|
||||
// Renders the clock as string by accessing appropriate font from configured in settings
|
||||
func renderClock(widgetSettings Settings) (string, bool) {
|
||||
var digFont ClockFont
|
||||
clockTime := getHourMinute(widgetSettings.hourFormat)
|
||||
digFont = getFont(widgetSettings)
|
||||
|
||||
chars := [][]string{}
|
||||
for _, char := range clockTime {
|
||||
chars = append(chars, digFont.get(string(char)))
|
||||
}
|
||||
|
||||
needBorder := digFont.fontRows <= minRowsForBorder
|
||||
return fontsJoin(chars, digFont.fontRows, widgetSettings.color), needBorder
|
||||
}
|
28
modules/digitalclock/display.go
Normal file
28
modules/digitalclock/display.go
Normal file
@ -0,0 +1,28 @@
|
||||
package digitalclock
|
||||
|
||||
import "strings"
|
||||
|
||||
func mergeLines(outString []string) string {
|
||||
return strings.Join(outString[:], "\n")
|
||||
}
|
||||
|
||||
func renderWidget(widgetSettings Settings) string {
|
||||
outputStrings := []string{}
|
||||
clockString, needBorder := renderClock(widgetSettings)
|
||||
if needBorder {
|
||||
outputStrings = append(outputStrings, mergeLines([]string{"", clockString, ""}))
|
||||
} else {
|
||||
outputStrings = append(outputStrings, clockString)
|
||||
}
|
||||
outputStrings = append(outputStrings, getDate())
|
||||
outputStrings = append(outputStrings, getUTC())
|
||||
outputStrings = append(outputStrings, getEpoch())
|
||||
return mergeLines(outputStrings)
|
||||
}
|
||||
|
||||
func (widget *Widget) display(dateFormat string, timeFormat string) {
|
||||
widget.Redraw(func() (string, string, bool) {
|
||||
return widget.CommonSettings().Title, renderWidget(*widget.settings), false
|
||||
})
|
||||
|
||||
}
|
92
modules/digitalclock/fonts.go
Normal file
92
modules/digitalclock/fonts.go
Normal file
@ -0,0 +1,92 @@
|
||||
package digitalclock
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ClockFontInterface to makes sure all fonts implement join and get methods
|
||||
type ClockFontInterface interface {
|
||||
join() string
|
||||
get() string
|
||||
}
|
||||
|
||||
// ClockFont struct to hold the font info
|
||||
type ClockFont struct {
|
||||
fontRows int
|
||||
fonts map[string][]string
|
||||
}
|
||||
|
||||
// function to join fonts, since the fonts have multi rows
|
||||
func fontsJoin(fontCharArray [][]string, rows int, color string) string {
|
||||
outString := ""
|
||||
|
||||
for i := 0; i < rows; i++ {
|
||||
outString += fmt.Sprintf("[%s]", color)
|
||||
for _, charFont := range fontCharArray {
|
||||
outString += " " + fmt.Sprintf("[%s]%s", color, charFont[i])
|
||||
}
|
||||
outString += "\n"
|
||||
}
|
||||
return strings.TrimSuffix(outString, "\n")
|
||||
}
|
||||
|
||||
func (font *ClockFont) get(char string) []string {
|
||||
return font.fonts[char]
|
||||
}
|
||||
|
||||
func getDigitalFont() ClockFont {
|
||||
fontsMap := map[string][]string{
|
||||
"1": {"▄█ ", " █ ", "▄█▄"},
|
||||
"2": {"█▀█", " ▄▀", "█▄▄"},
|
||||
"3": {"█▀▀█", " ▀▄", "█▄▄█"},
|
||||
"4": {" █▀█ ", "█▄▄█▄", " █ "},
|
||||
"5": {"█▀▀", "▀▀▄", "▄▄▀"},
|
||||
"6": {"▄▀▀▄", "█▄▄ ", "▀▄▄▀"},
|
||||
"7": {"▀▀▀█", " █ ", " ▐▌ "},
|
||||
"8": {"▄▀▀▄", "▄▀▀▄", "▀▄▄▀"},
|
||||
"9": {"▄▀▀▄", "▀▄▄█", " ▄▄▀"},
|
||||
"0": {"█▀▀█", "█ █", "█▄▄█"},
|
||||
":": {"█", " ", "█"},
|
||||
// "A": {" ", " ", "█▀█ █▀█▀█"},
|
||||
// "P": {" ", " ", "█▀ █▀█▀█"},
|
||||
" ": {" ", " ", " "},
|
||||
"A": {"", "", "AM"},
|
||||
"P": {"", "", "PM"},
|
||||
}
|
||||
|
||||
digitalFont := ClockFont{fontRows: 3, fonts: fontsMap}
|
||||
return digitalFont
|
||||
}
|
||||
|
||||
func getBigFont() ClockFont {
|
||||
fontsMap := map[string][]string{
|
||||
"1": {" ┏┓ ", "┏┛┃ ", "┗┓┃ ", " ┃┃ ", "┏┛┗┓", "┗━━┛"},
|
||||
"2": {"┏━━━┓", "┃┏━┓┃", "┗┛┏┛┃", "┏━┛┏┛", "┃ ┗━┓", "┗━━━┛"},
|
||||
"3": {"┏━━━┓", "┃┏━┓┃", "┗┛┏┛┃", "┏┓┗┓┃", "┃┗━┛┃", "┗━━━┛"},
|
||||
"4": {"┏┓ ┏┓", "┃┃ ┃┃", "┃┗━┛┃", "┗━━┓┃", " ┃┃", " ┗┛"},
|
||||
"5": {"┏━━━┓", "┃┏━━┛", "┃┗━━┓", "┗━━┓┃", "┏━━┛┃", "┗━━━┛"},
|
||||
"6": {"┏━━━┓", "┃┏━━┛", "┃┗━━┓", "┃┏━┓┃", "┃┗━┛┃", "┗━━━┛"},
|
||||
"7": {"┏━━━┓", "┃┏━┓┃", "┗┛┏┛┃", " ┃┏┛", " ┃┃ ", " ┗┛ "},
|
||||
"8": {"┏━━━┓", "┃┏━┓┃", "┃┗━┛┃", "┃┏━┓┃", "┃┗━┛┃", "┗━━━┛"},
|
||||
"9": {"┏━━━┓", "┃┏━┓┃", "┃┗━┛┃", "┗━━┓┃", "┏━━┛┃", "┗━━━┛"},
|
||||
"0": {"┏━━━┓", "┃┏━┓┃", "┃┃ ┃┃", "┃┃ ┃┃", "┃┗━┛┃", "┗━━━┛"},
|
||||
":": {" ", "┏━┓", "┗━┛", "┏━┓", "┗━┛", " "},
|
||||
// "A": {" ", " ", " ", "┏━━┓ ┏┓┏┓", "┃┏━┛ ┃┗┛┃", "┗┛ ┗┻┻┛"},
|
||||
// "P": {" ", " ", " ", "┏━━┓ ┏┓┏┓", "┃┏┓┃ ┃┗┛┃", "┗┛┗┛ ┗┻┻┛"},
|
||||
" ": {" ", " ", " ", " ", " ", " "},
|
||||
"A": {"", "", "", "", "", "AM"},
|
||||
"P": {"", "", "", "", "", "PM"},
|
||||
}
|
||||
|
||||
bigFont := ClockFont{fontRows: 6, fonts: fontsMap}
|
||||
return bigFont
|
||||
}
|
||||
|
||||
// getFont returns appropriate font map based on the font settings
|
||||
func getFont(widgetSettings Settings) ClockFont {
|
||||
if strings.ToLower(widgetSettings.font) == "digitalfont" {
|
||||
return getDigitalFont()
|
||||
}
|
||||
return getBigFont()
|
||||
}
|
31
modules/digitalclock/settings.go
Normal file
31
modules/digitalclock/settings.go
Normal file
@ -0,0 +1,31 @@
|
||||
package digitalclock
|
||||
|
||||
import (
|
||||
"github.com/olebedev/config"
|
||||
"github.com/wtfutil/wtf/cfg"
|
||||
)
|
||||
|
||||
const defaultTitle = "Clocks"
|
||||
|
||||
// Settings struct to define settings got digital clock
|
||||
type Settings struct {
|
||||
// hello
|
||||
common *cfg.Common
|
||||
|
||||
hourFormat string `help:"The format of the clock." values:"12 or 24"`
|
||||
color string `help:"The color of the clock."`
|
||||
font string `help:"The font of the clock." values:"bigfont or digitalfont"`
|
||||
}
|
||||
|
||||
// NewSettingsFromYAML functino to create setting instance from yaml file
|
||||
func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *config.Config) *Settings {
|
||||
|
||||
settings := Settings{
|
||||
common: cfg.NewCommonSettingsFromModule(name, defaultTitle, ymlConfig, globalConfig),
|
||||
color: ymlConfig.UString("color"),
|
||||
font: ymlConfig.UString("font"),
|
||||
hourFormat: ymlConfig.UString("hourFormat"),
|
||||
}
|
||||
|
||||
return &settings
|
||||
}
|
38
modules/digitalclock/widget.go
Normal file
38
modules/digitalclock/widget.go
Normal file
@ -0,0 +1,38 @@
|
||||
package digitalclock
|
||||
|
||||
import (
|
||||
"github.com/rivo/tview"
|
||||
"github.com/wtfutil/wtf/view"
|
||||
)
|
||||
|
||||
type Widget struct {
|
||||
view.TextWidget
|
||||
|
||||
app *tview.Application
|
||||
dateFormat string
|
||||
timeFormat string
|
||||
settings *Settings
|
||||
}
|
||||
|
||||
func NewWidget(app *tview.Application, settings *Settings) *Widget {
|
||||
|
||||
widget := Widget{
|
||||
TextWidget: view.NewTextWidget(app, settings.common, false),
|
||||
|
||||
app: app,
|
||||
settings: settings,
|
||||
}
|
||||
|
||||
return &widget
|
||||
}
|
||||
|
||||
/* -------------------- Exported Functions -------------------- */
|
||||
|
||||
// Refresh updates the onscreen contents of the widget
|
||||
func (widget *Widget) Refresh() {
|
||||
widget.app.QueueUpdateDraw(func() {
|
||||
widget.display(widget.dateFormat, widget.timeFormat)
|
||||
})
|
||||
}
|
||||
|
||||
/* -------------------- Unexported Functions -------------------- */
|
Loading…
x
Reference in New Issue
Block a user