|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace eXpansion\Framework\Gui\Components; |
|
4
|
|
|
|
|
5
|
|
|
use FML\Controls\Frame; |
|
6
|
|
|
use FML\Controls\Quad; |
|
7
|
|
|
use FML\Elements\Format; |
|
8
|
|
|
use FML\Script\Features\ScriptFeature; |
|
9
|
|
|
use FML\Script\Script; |
|
10
|
|
|
use FML\Script\ScriptLabel; |
|
11
|
|
|
use FML\Types\Container; |
|
12
|
|
|
use FML\Types\Renderable; |
|
13
|
|
|
use FML\Types\ScriptFeatureable; |
|
14
|
|
|
|
|
15
|
|
|
class Button extends AbstractUiElement implements ScriptFeatureable, Container |
|
16
|
|
|
{ |
|
17
|
|
|
const TYPE_DECORATED = "decorated"; |
|
18
|
|
|
const TYPE_DEFAULT = "default"; |
|
19
|
|
|
const COLOR_DEFAULT = "777"; |
|
20
|
|
|
const COLOR_SUCCESS = "0d0"; |
|
21
|
|
|
const COLOR_WARNING = "d00"; |
|
22
|
|
|
const COLOR_PRIMARY = "3af"; |
|
23
|
|
|
const COLOR_SECONDARY = "000"; |
|
24
|
|
|
/** @var Label */ |
|
25
|
|
|
protected $buttonLabel; |
|
26
|
|
|
protected $type; |
|
27
|
|
|
protected $textColor = "fff"; |
|
28
|
|
|
protected $backColor = self::COLOR_DEFAULT; |
|
29
|
|
|
protected $focusColor = "aaa"; |
|
30
|
|
|
protected $borderColor = "fff"; |
|
31
|
|
|
protected $translate = false; |
|
32
|
|
|
|
|
33
|
|
|
protected $action = null; |
|
34
|
|
|
protected $text = "button"; |
|
35
|
|
|
protected $scale = 1.; |
|
36
|
|
|
|
|
37
|
|
|
public function __construct($text = "button", $type = self::TYPE_DEFAULT) |
|
38
|
|
|
{ |
|
39
|
|
|
$this->setHorizontalAlign("left"); |
|
40
|
|
|
$this->setVerticalAlign("center"); |
|
41
|
|
|
|
|
42
|
|
|
$this->text = $text; |
|
43
|
|
|
$this->type = $type; |
|
44
|
|
|
$this->setSize(18, 5); |
|
45
|
|
|
$this->buttonLabel = new Label("", Label::TYPE_TITLE); |
|
46
|
|
|
$this->buttonLabel->addClass('uiButtonElement'); |
|
47
|
|
|
} |
|
48
|
|
|
|
|
49
|
|
|
|
|
50
|
|
|
/** |
|
51
|
|
|
* Render the XML element |
|
52
|
|
|
* |
|
53
|
|
|
* @param \DOMDocument $domDocument DOMDocument for which the XML element should be rendered |
|
54
|
|
|
* @return \DOMElement |
|
55
|
|
|
* |
|
56
|
|
|
* <frame pos="64 -35" class="uiContainer UiButton"> |
|
57
|
|
|
* <label size="26 9" data-color="fff" text="Cancel" class="button noAnim" textprefix=" " opacity="1" halign="center" valign="center" focusareacolor1="0000" focusareacolor2="d00" scriptevents="1" translate="0" textsize="2"/> |
|
58
|
|
|
* <quad size="26 9" style="Bgs1" colorize="d00" substyle="BgColorContour" class="button" halign="center" valign="center" pos="0 0"/> |
|
59
|
|
|
* </frame> |
|
60
|
|
|
*/ |
|
61
|
|
|
public function render(\DOMDocument $domDocument) |
|
62
|
|
|
{ |
|
63
|
|
|
$buttonFrame = new Frame(); |
|
64
|
|
|
$buttonFrame->setAlign("center", "center") |
|
65
|
|
|
->setPosition($this->posX + ($this->width / 2), $this->posY - ($this->height / 2), $this->posZ) |
|
66
|
|
|
->addClasses(['uiContainer', 'uiButton']) |
|
67
|
|
|
->addDataAttribute("action", $this->action) |
|
68
|
|
|
->setScale($this->scale); |
|
69
|
|
|
|
|
70
|
|
|
foreach ($this->_dataAttributes as $name => $value) { |
|
71
|
|
|
$buttonFrame->addDataAttribute($name, $value); |
|
72
|
|
|
} |
|
73
|
|
|
|
|
74
|
|
|
if ($this->type == self::TYPE_DECORATED) { |
|
75
|
|
|
$quad = new Quad(); |
|
76
|
|
|
$this->backColor = 0000; |
|
77
|
|
|
$quad->setStyles("Bgs1", "BgColorContour") |
|
78
|
|
|
->setColorize($this->borderColor) |
|
79
|
|
|
->setSize($this->width, $this->height) |
|
80
|
|
|
//->setPosition(-$this->width / 2, $this->height / 2) |
|
|
|
|
|
|
81
|
|
|
->setAlign("center", "center2"); |
|
82
|
|
|
$buttonFrame->addChild($quad); |
|
83
|
|
|
} |
|
84
|
|
|
|
|
85
|
|
|
$this->buttonLabel->setSize($this->width, $this->height) |
|
86
|
|
|
->setText($this->getText()) |
|
87
|
|
|
->setTextSize(1) |
|
88
|
|
|
->setScriptEvents(true) |
|
89
|
|
|
->setAreaColor($this->backColor) |
|
90
|
|
|
->setAreaFocusColor($this->focusColor) |
|
91
|
|
|
->setTextColor($this->textColor) |
|
92
|
|
|
->setAlign("center", "center2"); |
|
93
|
|
|
|
|
94
|
|
|
if ($this->translate) { |
|
95
|
|
|
$this->buttonLabel->setTextId($this->getText()); |
|
96
|
|
|
} |
|
97
|
|
|
|
|
98
|
|
|
$this->buttonLabel->setDataAttributes($this->_dataAttributes); |
|
99
|
|
|
$this->buttonLabel->addClasses($this->_classes); |
|
100
|
|
|
|
|
101
|
|
|
$buttonFrame->addChild($this->buttonLabel); |
|
102
|
|
|
|
|
103
|
|
|
|
|
104
|
|
|
return $buttonFrame->render($domDocument); |
|
105
|
|
|
|
|
106
|
|
|
} |
|
107
|
|
|
|
|
108
|
|
|
/** |
|
109
|
|
|
* @return string |
|
110
|
|
|
*/ |
|
111
|
|
|
public function getText() |
|
112
|
|
|
{ |
|
113
|
|
|
return $this->text; |
|
114
|
|
|
} |
|
115
|
|
|
|
|
116
|
|
|
/** |
|
117
|
|
|
* @param string $text |
|
118
|
|
|
* @return Button |
|
119
|
|
|
*/ |
|
120
|
|
|
public function setText($text) |
|
121
|
|
|
{ |
|
122
|
|
|
$this->text = $text; |
|
123
|
|
|
|
|
124
|
|
|
return $this; |
|
125
|
|
|
} |
|
126
|
|
|
|
|
127
|
|
|
/** |
|
128
|
|
|
* Get the Script Features |
|
129
|
|
|
* |
|
130
|
|
|
* @return ScriptFeature[] |
|
131
|
|
|
*/ |
|
132
|
|
|
public function getScriptFeatures() |
|
133
|
|
|
{ |
|
134
|
|
|
return ScriptFeature::collect($this); |
|
135
|
|
|
} |
|
136
|
|
|
|
|
137
|
|
|
/** |
|
138
|
|
|
* Prepare the given Script for rendering by adding the needed Labels, etc. |
|
139
|
|
|
* |
|
140
|
|
|
* @param Script $script Script to prepar |
|
141
|
|
|
* @return void |
|
142
|
|
|
*/ |
|
143
|
|
|
public function prepare(Script $script) |
|
144
|
|
|
{ |
|
145
|
|
|
$script->addCustomScriptLabel(ScriptLabel::MouseClick, $this->getScriptMouseClick()); |
|
146
|
|
|
$script->addScriptFunction("", $this->getScriptFunction()); |
|
147
|
|
|
} |
|
148
|
|
|
|
|
149
|
|
|
protected function getScriptMouseClick() |
|
150
|
|
|
{ |
|
151
|
|
|
return /** @lang textmate */ |
|
152
|
|
|
<<<'EOD' |
|
153
|
|
|
if (Event.Control.HasClass("uiButtonElement") ) { |
|
154
|
|
|
TriggerButtonClick(Event.Control); |
|
155
|
|
|
} |
|
156
|
|
|
EOD; |
|
157
|
|
|
} |
|
158
|
|
|
|
|
159
|
|
|
protected function getScriptFunction() |
|
160
|
|
|
{ |
|
161
|
|
|
return |
|
162
|
|
|
/** @lang textmate */ |
|
163
|
|
|
<<<'EOD' |
|
164
|
|
|
|
|
165
|
|
|
Void TriggerButtonClick(CMlControl Control) { |
|
166
|
|
|
if (Control.Parent.HasClass("uiButton")) { |
|
167
|
|
|
Control.Parent.RelativeScale = 0.75; |
|
168
|
|
|
AnimMgr.Add(Control.Parent, "<elem scale=\"1.\" />", 200, CAnimManager::EAnimManagerEasing::QuadIn); |
|
169
|
|
|
TriggerPageAction(Control.Parent.DataAttributeGet("action")); |
|
170
|
|
|
} |
|
171
|
|
|
} |
|
172
|
|
|
|
|
173
|
|
|
Void TriggerButtonClick(Text ControlId) { |
|
174
|
|
|
declare Control <=> Page.GetFirstChild(ControlId); |
|
175
|
|
|
TriggerButtonClick(Control); |
|
176
|
|
|
} |
|
177
|
|
|
|
|
178
|
|
|
|
|
179
|
|
|
EOD; |
|
180
|
|
|
} |
|
181
|
|
|
|
|
182
|
|
|
|
|
183
|
|
|
/** |
|
184
|
|
|
* @return string |
|
185
|
|
|
*/ |
|
186
|
|
|
public function getType() |
|
187
|
|
|
{ |
|
188
|
|
|
return $this->type; |
|
189
|
|
|
} |
|
190
|
|
|
|
|
191
|
|
|
/** |
|
192
|
|
|
* @param string $type |
|
193
|
|
|
* @return Button |
|
194
|
|
|
*/ |
|
195
|
|
|
public function setType($type) |
|
196
|
|
|
{ |
|
197
|
|
|
$this->type = $type; |
|
198
|
|
|
|
|
199
|
|
|
return $this; |
|
200
|
|
|
} |
|
201
|
|
|
|
|
202
|
|
|
/** |
|
203
|
|
|
* @return string |
|
204
|
|
|
*/ |
|
205
|
|
|
public function getTextColor() |
|
206
|
|
|
{ |
|
207
|
|
|
return $this->textColor; |
|
208
|
|
|
} |
|
209
|
|
|
|
|
210
|
|
|
/** |
|
211
|
|
|
* @param string $textColor |
|
212
|
|
|
* @return Button |
|
213
|
|
|
*/ |
|
214
|
|
|
public function setTextColor($textColor) |
|
215
|
|
|
{ |
|
216
|
|
|
$this->textColor = $textColor; |
|
217
|
|
|
|
|
218
|
|
|
return $this; |
|
219
|
|
|
} |
|
220
|
|
|
|
|
221
|
|
|
/** |
|
222
|
|
|
* @return string |
|
223
|
|
|
*/ |
|
224
|
|
|
public function getBackgroundColor() |
|
225
|
|
|
{ |
|
226
|
|
|
return $this->backColor; |
|
227
|
|
|
} |
|
228
|
|
|
|
|
229
|
|
|
/** |
|
230
|
|
|
* @param string $backColor |
|
231
|
|
|
* @return Button |
|
232
|
|
|
*/ |
|
233
|
|
|
public function setBackgroundColor($backColor) |
|
234
|
|
|
{ |
|
235
|
|
|
$this->backColor = $backColor; |
|
236
|
|
|
|
|
237
|
|
|
return $this; |
|
238
|
|
|
} |
|
239
|
|
|
|
|
240
|
|
|
/** |
|
241
|
|
|
* @return string |
|
242
|
|
|
*/ |
|
243
|
|
|
public function getBorderColor() |
|
244
|
|
|
{ |
|
245
|
|
|
return $this->borderColor; |
|
246
|
|
|
} |
|
247
|
|
|
|
|
248
|
|
|
/** |
|
249
|
|
|
* @param string $borderColor |
|
250
|
|
|
* @return Button |
|
251
|
|
|
*/ |
|
252
|
|
|
public function setBorderColor($borderColor) |
|
253
|
|
|
{ |
|
254
|
|
|
$this->borderColor = $borderColor; |
|
255
|
|
|
|
|
256
|
|
|
return $this; |
|
257
|
|
|
} |
|
258
|
|
|
|
|
259
|
|
|
/** |
|
260
|
|
|
* @return null |
|
261
|
|
|
*/ |
|
262
|
|
|
public function getAction() |
|
263
|
|
|
{ |
|
264
|
|
|
return $this->action; |
|
265
|
|
|
} |
|
266
|
|
|
|
|
267
|
|
|
/** |
|
268
|
|
|
* @param null $action |
|
269
|
|
|
* @return Button |
|
270
|
|
|
*/ |
|
271
|
|
|
public function setAction($action) |
|
272
|
|
|
{ |
|
273
|
|
|
$this->action = $action; |
|
274
|
|
|
|
|
275
|
|
|
return $this; |
|
276
|
|
|
} |
|
277
|
|
|
|
|
278
|
|
|
/** |
|
279
|
|
|
* @return string |
|
280
|
|
|
*/ |
|
281
|
|
|
public function getFocusColor() |
|
282
|
|
|
{ |
|
283
|
|
|
return $this->focusColor; |
|
284
|
|
|
} |
|
285
|
|
|
|
|
286
|
|
|
/** |
|
287
|
|
|
* @param string $focusColor |
|
288
|
|
|
* @return Button |
|
289
|
|
|
*/ |
|
290
|
|
|
public function setFocusColor($focusColor) |
|
291
|
|
|
{ |
|
292
|
|
|
$this->focusColor = $focusColor; |
|
293
|
|
|
|
|
294
|
|
|
return $this; |
|
295
|
|
|
} |
|
296
|
|
|
|
|
297
|
|
|
/** |
|
298
|
|
|
* @return float |
|
299
|
|
|
*/ |
|
300
|
|
|
public function getScale() |
|
301
|
|
|
{ |
|
302
|
|
|
return $this->scale; |
|
303
|
|
|
} |
|
304
|
|
|
|
|
305
|
|
|
/** |
|
306
|
|
|
* @param float $scale |
|
307
|
|
|
* @return Button |
|
308
|
|
|
*/ |
|
309
|
|
|
public function setScale($scale) |
|
310
|
|
|
{ |
|
311
|
|
|
$this->scale = $scale; |
|
312
|
|
|
|
|
313
|
|
|
return $this; |
|
314
|
|
|
} |
|
315
|
|
|
|
|
316
|
|
|
/** |
|
317
|
|
|
* @return bool |
|
318
|
|
|
*/ |
|
319
|
|
|
public function getTranslate() |
|
320
|
|
|
{ |
|
321
|
|
|
return $this->translate; |
|
322
|
|
|
|
|
323
|
|
|
} |
|
324
|
|
|
|
|
325
|
|
|
/** |
|
326
|
|
|
* @param bool $translate |
|
327
|
|
|
* @return Button |
|
328
|
|
|
*/ |
|
329
|
|
|
public function setTranslate($translate = true) |
|
330
|
|
|
{ |
|
331
|
|
|
if ($translate) { |
|
332
|
|
|
$this->buttonLabel->setTextId($this->getText()); |
|
333
|
|
|
} else { |
|
334
|
|
|
$this->buttonLabel->setText($this->getText()); |
|
335
|
|
|
} |
|
336
|
|
|
|
|
337
|
|
|
$this->buttonLabel->setTranslate($translate); |
|
338
|
|
|
|
|
339
|
|
|
return $this; |
|
340
|
|
|
} |
|
341
|
|
|
|
|
342
|
|
|
/** |
|
343
|
|
|
* Get the children |
|
344
|
|
|
* |
|
345
|
|
|
* @api |
|
346
|
|
|
* @return Renderable[] |
|
347
|
|
|
*/ |
|
348
|
|
|
public function getChildren() |
|
349
|
|
|
{ |
|
350
|
|
|
return [$this->buttonLabel]; |
|
351
|
|
|
} |
|
352
|
|
|
|
|
353
|
|
|
/** |
|
354
|
|
|
* Add a new child |
|
355
|
|
|
* |
|
356
|
|
|
* @api |
|
357
|
|
|
* @param Renderable $child Child Control to add |
|
358
|
|
|
* @deprecated |
|
359
|
|
|
* @return void |
|
360
|
|
|
*/ |
|
361
|
|
|
public function addChild(Renderable $child) |
|
362
|
|
|
{ |
|
363
|
|
|
|
|
364
|
|
|
} |
|
365
|
|
|
|
|
366
|
|
|
/** |
|
367
|
|
|
* Add a new child |
|
368
|
|
|
* |
|
369
|
|
|
* @api |
|
370
|
|
|
* @param Renderable $child Child Control to add |
|
371
|
|
|
* @return void |
|
372
|
|
|
* @deprecated Use addChild() |
|
373
|
|
|
* @see Container::addChild() |
|
374
|
|
|
*/ |
|
375
|
|
|
public function add(Renderable $child) |
|
376
|
|
|
{ |
|
377
|
|
|
|
|
378
|
|
|
} |
|
379
|
|
|
|
|
380
|
|
|
/** |
|
381
|
|
|
* Add new children |
|
382
|
|
|
* |
|
383
|
|
|
* @api |
|
384
|
|
|
* @param Renderable[] $children Child Controls to add |
|
385
|
|
|
* @return void |
|
386
|
|
|
*/ |
|
387
|
|
|
public function addChildren(array $children) |
|
388
|
|
|
{ |
|
389
|
|
|
|
|
390
|
|
|
} |
|
391
|
|
|
|
|
392
|
|
|
/** |
|
393
|
|
|
* Remove all children |
|
394
|
|
|
* |
|
395
|
|
|
* @api |
|
396
|
|
|
* @return void |
|
397
|
|
|
*/ |
|
398
|
|
|
public function removeAllChildren() |
|
399
|
|
|
{ |
|
400
|
|
|
|
|
401
|
|
|
} |
|
402
|
|
|
|
|
403
|
|
|
/** |
|
404
|
|
|
* Remove all children |
|
405
|
|
|
* |
|
406
|
|
|
* @api |
|
407
|
|
|
* @return void |
|
408
|
|
|
* @deprecated Use removeAllChildren() |
|
409
|
|
|
* @see Container::removeAllChildren() |
|
410
|
|
|
*/ |
|
411
|
|
|
public function removeChildren() |
|
412
|
|
|
{ |
|
413
|
|
|
|
|
414
|
|
|
} |
|
415
|
|
|
|
|
416
|
|
|
/** |
|
417
|
|
|
* Get the Format |
|
418
|
|
|
* |
|
419
|
|
|
* @api |
|
420
|
|
|
* @param bool $createIfEmpty If the format should be created if it doesn't exist yet |
|
421
|
|
|
* @return void |
|
422
|
|
|
* @deprecated Use Style |
|
423
|
|
|
* @see Style |
|
424
|
|
|
*/ |
|
425
|
|
|
public function getFormat($createIfEmpty = true) |
|
426
|
|
|
{ |
|
427
|
|
|
|
|
428
|
|
|
} |
|
429
|
|
|
|
|
430
|
|
|
/** |
|
431
|
|
|
* Set the Format |
|
432
|
|
|
* |
|
433
|
|
|
* @api |
|
434
|
|
|
* @param Format $format New Format |
|
435
|
|
|
* @return void |
|
436
|
|
|
* @deprecated Use Style |
|
437
|
|
|
* @see Style |
|
438
|
|
|
*/ |
|
439
|
|
|
public function setFormat(Format $format = null) |
|
440
|
|
|
{ |
|
441
|
|
|
|
|
442
|
|
|
} |
|
443
|
|
|
|
|
444
|
|
|
/** |
|
445
|
|
|
* @return string|null |
|
446
|
|
|
*/ |
|
447
|
|
|
public function getId() |
|
448
|
|
|
{ |
|
449
|
|
|
return $this->buttonLabel->getId(); |
|
450
|
|
|
} |
|
451
|
|
|
|
|
452
|
|
|
/** |
|
453
|
|
|
* @param null $id |
|
454
|
|
|
* @return Button |
|
455
|
|
|
*/ |
|
456
|
|
|
public function setId($id) |
|
457
|
|
|
{ |
|
458
|
|
|
$this->buttonLabel->setId($id); |
|
459
|
|
|
|
|
460
|
|
|
return $this; |
|
461
|
|
|
} |
|
462
|
|
|
} |
|
463
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.