summaryrefslogtreecommitdiffstats
path: root/library/Icinga/Chart/Primitive/Styleable.php
blob: 15025bfd8a58e303ba4c11eb7498fe73436d93e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php
/* Icinga Web 2 | (c) 2013 Icinga Development Team | GPLv2+ */


namespace Icinga\Chart\Primitive;

use DOMElement;
use Icinga\Util\Csp;
use ipl\Web\Style;

/**
 * Base class for stylable drawables
 */
class Styleable
{

    /**
     * The stroke width to use
     *
     * @var int|float
     */
    public $strokeWidth = 0;

    /**
     * The stroke color to use
     *
     * @var string
     */
    public $strokeColor = '#000';

    /**
     * The fill color to use
     *
     * @var string
     */
    public $fill = 'none';

    /**
     * Additional styles to be appended to the style attribute
     *
     * @var array<string, string>
     */
    public $additionalStyle = [];

    /**
     * The id of this element
     *
     * @var ?string
     */
    public $id = null;

    /**
     * Additional attributes to be set
     *
     * @var array
     */
    public $attributes = array();

    /**
     * Set the stroke width for this drawable
     *
     * @param   int|float $width   The stroke with unit
     *
     * @return  $this            Fluid interface
     */
    public function setStrokeWidth($width)
    {
        $this->strokeWidth = $width;
        return $this;
    }

    /**
     * Set the color for the stroke or none for no stroke
     *
     * @param   string $color   The color to set for the stroke
     *
     * @return  $this            Fluid interface
     */
    public function setStrokeColor($color)
    {
        $this->strokeColor = $color ? $color : 'none';
        return $this;
    }

    /**
     * Set additional styles for this drawable
     *
     * @param   array<string, string> $styles  The styles to set additionally
     *
     * @return  $this            Fluid interface
     */
    public function setAdditionalStyle($styles)
    {
        $this->additionalStyle = $styles;
        return $this;
    }

    /**
     * Set the fill for this styleable
     *
     * @param   string $color   The color to use for filling or null to use no fill
     *
     * @return  $this            Fluid interface
     */
    public function setFill($color = null)
    {
        $this->fill = $color ? $color : 'none';
        return $this;
    }

    /**
     * Set the id for this element
     *
     * @param   string $id  The id to set for this element
     *
     * @return  $this        Fluid interface
     */
    public function setId($id)
    {
        $this->id = $id;

        return $this;
    }

    /**
     * Return the ruleset used for styling the DOMNode
     *
     * @return Style A ruleset containing styles
     */
    public function getStyle()
    {
        $styles = $this->additionalStyle;
        $styles['fill'] = $this->fill;
        $styles['stroke'] = $this->strokeColor;
        $styles['stroke-width'] = (string) $this->strokeWidth;

        return (new Style())
            ->setNonce(Csp::getStyleNonce())
            ->add("#$this->id", $styles);
    }

    /**
     *  Add an additional attribute to this element
     */
    public function setAttribute($key, $value)
    {
        $this->attributes[$key] = $value;
    }

    /**
     * Apply attribute to a DOMElement
     *
     * @param DOMElement $el Element to apply attributes
     */
    protected function applyAttributes(DOMElement $el)
    {
        foreach ($this->attributes as $name => $value) {
            $el->setAttribute($name, $value);
        }
    }
}