mirror of
https://github.com/Luzifer/streamdeck.git
synced 2024-12-20 17:51:21 +00:00
Allow scripts to overwrite attributes
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
a2f524a6b2
commit
dce5f619f5
1 changed files with 57 additions and 30 deletions
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"image/draw"
|
"image/draw"
|
||||||
|
@ -38,6 +39,7 @@ func (d displayElementExec) Display(idx int, attributes map[string]interface{})
|
||||||
// Initialize black image
|
// Initialize black image
|
||||||
draw.Draw(img, img.Bounds(), image.NewUniform(color.RGBA{0x0, 0x0, 0x0, 0xff}), image.ZP, draw.Src)
|
draw.Draw(img, img.Bounds(), image.NewUniform(color.RGBA{0x0, 0x0, 0x0, 0xff}), image.ZP, draw.Src)
|
||||||
|
|
||||||
|
// Initialize command
|
||||||
cmd, ok := attributes["command"].([]interface{})
|
cmd, ok := attributes["command"].([]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("No command supplied")
|
return errors.New("No command supplied")
|
||||||
|
@ -52,34 +54,7 @@ func (d displayElementExec) Display(idx int, attributes map[string]interface{})
|
||||||
return errors.New("Command conatins non-string argument")
|
return errors.New("Command conatins non-string argument")
|
||||||
}
|
}
|
||||||
|
|
||||||
if filename, ok := attributes["image"].(string); ok {
|
// Execute command and parse it
|
||||||
bgi, err := d.getImageFromDisk(filename)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "Unable to get image from disk")
|
|
||||||
}
|
|
||||||
|
|
||||||
draw.Draw(img, img.Bounds(), bgi, image.ZP, draw.Src)
|
|
||||||
}
|
|
||||||
|
|
||||||
var textColor color.Color = color.RGBA{0xff, 0xff, 0xff, 0xff}
|
|
||||||
if rgba, ok := attributes["color"].([]interface{}); ok {
|
|
||||||
if len(rgba) != 4 {
|
|
||||||
return errors.New("RGBA color definition needs 4 hex values")
|
|
||||||
}
|
|
||||||
|
|
||||||
textColor = color.RGBA{uint8(rgba[0].(int)), uint8(rgba[1].(int)), uint8(rgba[2].(int)), uint8(rgba[3].(int))}
|
|
||||||
}
|
|
||||||
|
|
||||||
var fontsize float64 = 120
|
|
||||||
if v, ok := attributes["font_size"].(float64); ok {
|
|
||||||
fontsize = v
|
|
||||||
}
|
|
||||||
|
|
||||||
var border = 10
|
|
||||||
if v, ok := attributes["border"].(int); ok {
|
|
||||||
border = v
|
|
||||||
}
|
|
||||||
|
|
||||||
var buf = new(bytes.Buffer)
|
var buf = new(bytes.Buffer)
|
||||||
|
|
||||||
command := exec.Command(args[0], args[1:]...)
|
command := exec.Command(args[0], args[1:]...)
|
||||||
|
@ -90,6 +65,58 @@ func (d displayElementExec) Display(idx int, attributes map[string]interface{})
|
||||||
return errors.Wrap(err, "Command has exit != 0")
|
return errors.Wrap(err, "Command has exit != 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
attributes["text"] = strings.TrimSpace(buf.String())
|
||||||
|
|
||||||
|
tmpAttrs := map[string]interface{}{}
|
||||||
|
if err = json.Unmarshal(buf.Bytes(), &tmpAttrs); err == nil {
|
||||||
|
for k, v := range tmpAttrs {
|
||||||
|
attributes[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize background
|
||||||
|
if filename, ok := attributes["image"].(string); ok {
|
||||||
|
bgi, err := d.getImageFromDisk(filename)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Unable to get image from disk")
|
||||||
|
}
|
||||||
|
|
||||||
|
draw.Draw(img, img.Bounds(), bgi, image.ZP, draw.Src)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize color
|
||||||
|
var textColor color.Color = color.RGBA{0xff, 0xff, 0xff, 0xff}
|
||||||
|
if rgba, ok := attributes["color"].([]interface{}); ok {
|
||||||
|
if len(rgba) != 4 {
|
||||||
|
return errors.New("RGBA color definition needs 4 hex values")
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpCol := color.RGBA{}
|
||||||
|
|
||||||
|
for idx, vp := range []*uint8{&tmpCol.R, &tmpCol.G, &tmpCol.B, &tmpCol.A} {
|
||||||
|
switch rgba[idx].(type) {
|
||||||
|
case int:
|
||||||
|
*vp = uint8(rgba[idx].(int))
|
||||||
|
case float64:
|
||||||
|
*vp = uint8(rgba[idx].(float64))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
textColor = tmpCol
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize fontsize
|
||||||
|
var fontsize float64 = 120
|
||||||
|
if v, ok := attributes["font_size"].(float64); ok {
|
||||||
|
fontsize = v
|
||||||
|
}
|
||||||
|
|
||||||
|
var border = 10
|
||||||
|
if v, ok := attributes["border"].(int); ok {
|
||||||
|
border = v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render text
|
||||||
f, err := d.loadFont()
|
f, err := d.loadFont()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Unable to load font")
|
return errors.Wrap(err, "Unable to load font")
|
||||||
|
@ -102,8 +129,8 @@ func (d displayElementExec) Display(idx int, attributes map[string]interface{})
|
||||||
c.SetFont(f)
|
c.SetFont(f)
|
||||||
c.SetHinting(font.HintingNone)
|
c.SetHinting(font.HintingNone)
|
||||||
|
|
||||||
if strings.TrimSpace(buf.String()) != "" {
|
if strings.TrimSpace(attributes["text"].(string)) != "" {
|
||||||
if err = d.drawText(c, strings.TrimSpace(buf.String()), textColor, fontsize, border); err != nil {
|
if err = d.drawText(c, strings.TrimSpace(attributes["text"].(string)), textColor, fontsize, border); err != nil {
|
||||||
return errors.Wrap(err, "Unable to render text")
|
return errors.Wrap(err, "Unable to render text")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue