diff --git a/decks/main.deck b/decks/main.deck index da09554..77b67d7 100644 --- a/decks/main.deck +++ b/decks/main.deck @@ -17,12 +17,18 @@ [[keys]] index = 3 [keys.widget] - id = "date" + id = "time" + [keys.widget.config] + format = "dd;mmm;yyyy" + font = "bold;regular;thin" [[keys]] index = 4 [keys.widget] - id = "clock" + id = "time" + [keys.widget.config] + format = "HH;MM;SS" + font = "bold;regular;thin" [[keys]] index = 5 diff --git a/widget.go b/widget.go index 532eccd..751a6a5 100644 --- a/widget.go +++ b/widget.go @@ -64,15 +64,13 @@ func NewWidget(index uint8, id string, action *ActionConfig, actionHold *ActionC label: config["label"], } - case "clock": - return &ClockWidget{ + case "time": + return &TimeWidget{ BaseWidget: bw, - mode: config["mode"], + format: config["format"], + font: config["font"], } - case "date": - return &DateWidget{bw} - case "recentWindow": i, err := strconv.ParseUint(config["window"], 10, 64) if err != nil { diff --git a/widget_clock.go b/widget_clock.go deleted file mode 100644 index 2046f0d..0000000 --- a/widget_clock.go +++ /dev/null @@ -1,70 +0,0 @@ -package main - -import ( - "image" - "log" - "time" - - "github.com/muesli/streamdeck" -) - -type ClockWidget struct { - BaseWidget - mode string -} - -func (w *ClockWidget) Update(dev *streamdeck.Device) { - const margin = 4 - size := int(dev.Pixels) - img := image.NewRGBA(image.Rect(0, 0, size, size)) - height := size - (margin * 2) - pt := (float64(height) / 3.0) * 72.0 / float64(dev.DPI) - ptfull := float64(height) * 72.0 / float64(dev.DPI) - - t := time.Now() - hour := t.Format("15") - min := t.Format("04") - sec := t.Format("05") - - switch w.mode { - case "hour": - drawString(img, image.Rect(0, 0, size, size), - ttfBoldFont, - hour, - ptfull, - image.Pt(-1, -1)) - case "min": - drawString(img, image.Rect(0, 0, size, size), - ttfFont, - min, - ptfull, - image.Pt(-1, -1)) - case "sec": - drawString(img, image.Rect(0, 0, size, size), - ttfThinFont, - sec, - ptfull, - image.Pt(-1, -1)) - default: - drawString(img, image.Rectangle{image.Pt(0, margin), image.Pt(size, margin+(height/3))}, - ttfBoldFont, - hour, - pt, - image.Pt(-1, -1)) - drawString(img, image.Rectangle{image.Pt(0, (height/3)+margin), image.Pt(size, margin+(height/3)*2)}, - ttfFont, - min, - pt, - image.Pt(-1, -1)) - drawString(img, image.Rectangle{image.Pt(0, (height/3)*2+margin), image.Pt(size, margin+height)}, - ttfThinFont, - sec, - pt, - image.Pt(-1, -1)) - } - - err := dev.SetImage(w.key, img) - if err != nil { - log.Fatal(err) - } -} diff --git a/widget_date.go b/widget_date.go deleted file mode 100644 index dd5f854..0000000 --- a/widget_date.go +++ /dev/null @@ -1,48 +0,0 @@ -package main - -import ( - "image" - "log" - "strconv" - "time" - - "github.com/muesli/streamdeck" -) - -type DateWidget struct { - BaseWidget -} - -func (w *DateWidget) Update(dev *streamdeck.Device) { - const margin = 4 - size := int(dev.Pixels) - img := image.NewRGBA(image.Rect(0, 0, size, size)) - height := size - (margin * 2) - pt := (float64(height) / 3.0) * 72.0 / float64(dev.DPI) - - t := time.Now() - day := t.Day() - month := t.Month().String() - year := t.Year() - - drawString(img, image.Rectangle{image.Pt(0, margin), image.Pt(size, margin+(height/3))}, - ttfBoldFont, - strconv.Itoa(day), - pt, - image.Pt(-1, -1)) - drawString(img, image.Rectangle{image.Pt(0, (height/3)+margin), image.Pt(size, margin+(height/3)*2)}, - ttfFont, - month, - pt, - image.Pt(-1, -1)) - drawString(img, image.Rectangle{image.Pt(0, (height/3)*2+margin), image.Pt(size, margin+height)}, - ttfThinFont, - strconv.Itoa(year), - pt, - image.Pt(-1, -1)) - - err := dev.SetImage(w.key, img) - if err != nil { - log.Fatal(err) - } -} diff --git a/widget_time.go b/widget_time.go new file mode 100644 index 0000000..650086a --- /dev/null +++ b/widget_time.go @@ -0,0 +1,105 @@ +package main + +import ( + "image" + "log" + "time" + "strings" + + "github.com/muesli/streamdeck" + "github.com/golang/freetype/truetype" +) + +type TimeWidget struct { + BaseWidget + format string + font string +} + +func mapToFont(font string) *truetype.Font { + switch font { + case "thin": + return ttfThinFont + case "regular": + return ttfFont + case "bold": + return ttfBoldFont + default: + return ttfFont + } +} + +func mapToTimeString(format string) string { + t := time.Now() + switch format { + case "yyyy": + return t.Format("2006") + case "yy": + return t.Format("06") + case "mmmm": + return t.Format("January") + case "mmm": + return t.Format("Jan") + case "mm": + return t.Format("01") + case "dddd": + return t.Format("Monday") + case "ddd": + return t.Format("Mon") + case "dd": + return t.Format("02") + case "HHT": + return t.Format("03") + case "HH", "hour": + return t.Format("15") + case "MM", "min": + return t.Format("04") + case "ss", "SS", "sec": + return t.Format("05") + case "tt": + return t.Format("PM") + case "Z", "ZZZ": + return t.Format("MST") + case "o": + return t.Format("Z07:00") + default: + return t.Format(format) + } +} + +func (w *TimeWidget) Update(dev *streamdeck.Device) { + const margin = 4 + size := int(dev.Pixels) + img := image.NewRGBA(image.Rect(0, 0, size, size)) + height := size - (margin * 2) + + formats := strings.Split(w.format, ";") + fonts := strings.Split(w.font, ";") + + if len(formats) == 0 { + return + } + for len(fonts) < len(formats) { + fonts = append(fonts, "regular") + } + + pt := (float64(height) / float64(len(formats))) * 72.0 / float64(dev.DPI) + + for i:=0; i