Completed
Push — master ( 2edd9d...d97347 )
by Aydin
21s queued 11s
created

AsciiArtItem::getStyle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
namespace PhpSchool\CliMenu\MenuItem;
4
5
use Assert\Assertion;
6
use PhpSchool\CliMenu\MenuStyle;
7
use PhpSchool\CliMenu\Style\DefaultStyle;
8
use PhpSchool\CliMenu\Style\ItemStyle;
9
10
/**
11
 * @author Michael Woodward <[email protected]>
12
 */
13
class AsciiArtItem implements MenuItemInterface
14
{
15
    /**
16
     * Possible positions of the ascii art
17
     */
18
    const POSITION_CENTER = 'center';
19
    const POSITION_LEFT   = 'left';
20
    const POSITION_RIGHT  = 'right';
21
22
    /**
23
     * @var string
24
     */
25
    private $text;
26
27
    /**
28
     * @var string
29
     */
30
    private $position;
31
32
    /**
33
     * @var string
34
     */
35
    private $alternateText;
36
37
    /**
38
     * @var int
39
     */
40
    private $artLength;
41
42
    /**
43
     * @var DefaultStyle
44
     */
45
    private $style;
46
47
    public function __construct(string $text, string $position = self::POSITION_CENTER, string $alt = '')
48
    {
49
        Assertion::inArray($position, [self::POSITION_CENTER, self::POSITION_RIGHT, self::POSITION_LEFT]);
50
51
        $this->setText($text);
52
        $this->position  = $position;
53
        $this->alternateText = $alt;
54
55
        $this->style = new DefaultStyle();
56
    }
57
58
    /**
59
     * The output text for the item
60
     */
61
    public function getRows(MenuStyle $style, bool $selected = false) : array
62
    {
63
        if ($this->artLength > $style->getContentWidth()) {
64
            $alternate = new StaticItem($this->alternateText);
65
            return $alternate->getRows($style, false);
66
        }
67
68
        $padding = $style->getContentWidth() - $this->artLength;
69
70
        return array_map(function ($row) use ($padding) {
71
            switch ($this->position) {
72
                case self::POSITION_LEFT:
73
                    break;
74
                case self::POSITION_RIGHT:
75
                    $row = sprintf('%s%s', str_repeat(' ', $padding), $row);
76
                    break;
77
                case self::POSITION_CENTER:
78
                default:
79
                    $left = (int) ceil($padding / 2);
80
                    $row = sprintf('%s%s', str_repeat(' ', $left), $row);
81
                    break;
82
            }
83
84
            return $row;
85
        }, explode("\n", $this->text));
86
    }
87
88
    /**
89
     * Can the item be selected
90
     */
91
    public function canSelect() : bool
92
    {
93
        return false;
94
    }
95
96
    /**
97
     * Execute the items callable if required
98
     */
99
    public function getSelectAction() : ?callable
100
    {
101
        return null;
102
    }
103
104
    /**
105
     * Return the raw string of text
106
     */
107
    public function getText() : string
108
    {
109
        return $this->text;
110
    }
111
112
    /**
113
     * Set the raw string of text
114
     */
115
    public function setText(string $text) : void
116
    {
117
        $this->text = implode("\n", array_map(function (string $line) {
118
            return rtrim($line, ' ');
119
        }, explode("\n", $text)));
120
121
        $this->calculateArtLength();
122
    }
123
124
    /**
125
     * Calculate the length of the art
126
     */
127
    private function calculateArtLength() : void
128
    {
129
        $this->artLength = (int) max(array_map('mb_strlen', explode("\n", $this->text)));
130
    }
131
132
    /**
133
     * Return the length of the art
134
     */
135
    public function getArtLength() : int
136
    {
137
        return $this->artLength;
138
    }
139
140
    public function getPosition() : string
141
    {
142
        return $this->position;
143
    }
144
145
    public function getAlternateText() : string
146
    {
147
        return $this->alternateText;
148
    }
149
150
    /**
151
     * Whether or not the menu item is showing the menustyle extra value
152
     */
153
    public function showsItemExtra() : bool
154
    {
155
        return false;
156
    }
157
158
    /**
159
     * Enable showing item extra
160
     */
161
    public function showItemExtra() : void
162
    {
163
        //noop
164
    }
165
166
    /**
167
     * Disable showing item extra
168
     */
169
    public function hideItemExtra() : void
170
    {
171
        //noop
172
    }
173
174
    /**
175
     * @return DefaultStyle
176
     */
177
    public function getStyle() : ItemStyle
178
    {
179
        return $this->style;
180
    }
181
182
    public function setStyle(DefaultStyle $style) : void
183
    {
184
        $this->style = $style;
185
    }
186
}
187