dmvdbrugge / dynamic-components
PHP UI 扩展的动态组件
Requires
- php: >= 7.1
- ext-ui: *
- webmozart/assert: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.13
- phpunit/phpunit: ^7
This package is auto-updated.
Last update: 2024-09-10 21:20:51 UTC
README
PHP UI 扩展的动态组件:使用回调而非硬编码的动作。提供扩展提供的基本控件的高级版本。
用法/示例
最基础的示例是一个在点击时改变文本的按钮
<?php use DynamicComponents\Controls\Button; $button = new Button('Click me!', function (Button $button) { $button->setText('You clicked :D'); });
这与必须创建硬编码或匿名类形成对比
<?php use UI\Controls\Button; $button = new class('Click me!') extends Button { protected function onClicked(): void { $this->setText('You clicked :D'); } };
当我们进一步扩展第一个示例,比如说我们现在想要3个按钮
<?php use DynamicComponents\Controls\Button; $onClick = function (Button $button) { $button->setText('You clicked :D'); }; $button1 = new Button('Click me!', $onClick); $button2 = new Button('Click me!', $onClick); $button3 = new Button('Click me!', $onClick);
而在 extends
形式中,你可能需要多次复制匿名类(复制逻辑),或者创建一个实际的类(这给你一些额外的选项,但也带来更多麻烦)。
每个回调都将接收触发动作的组件作为最后一个参数。最后通常意味着只有(因此也是第一个),但对于 Area
的动作来说很重要,因为它们已经接收了多个参数。
请参阅示例,其中包含以不同方式和编码风格使用的多个控件。每个示例都是一个完整的程序,可以直接使用php运行,当然前提是扩展已启用。还可以查看csv2qif的FileSelect,它是一个更高级的文件选择器版本。(或者它的任何其他 UiComponents
。它是在 src/Command/Ui.php
中启动的,但这部分很无聊。)
API
所有组件都扩展了一个类,通常是扩展提供的那个类。继承的方法未列出,但显然仍然可用。本节中所有组件的描述都采用相同的格式
可点击全名(是链接到源代码)
extends
可点击全名(是链接到其API文档)
// Constructor // Relevant overridden methods, if any // Additional methods
如有任何额外信息。
控件
按钮
DynamicComponents\Controls\Button
extends
UI\Controls\Button
// Constructor public function __construct(string $text, ?callable $onClick = null) // Additional methods public function setOnClick(callable $onClick): void
复选框
DynamicComponents\Controls\Check
extends
UI\Controls\Check
// Constructor public function __construct(string $text, ?callable $onToggle = null, bool $checked = false) // Additional methods public function setOnToggle(callable $onToggle): void
颜色按钮
DynamicComponents\Controls\ColorButton
extends
UI\Controls\ColorButton
// Constructor public function __construct(?callable $onChange = null, ?Color $color = null) // Additional methods public function setOnChange(callable $onChange): void
组合框
DynamicComponents\Controls\Combo
extends
UI\Controls\Combo
// Constructor public function __construct(?callable $onSelected = null) // Additional methods public function setOnSelected(callable $onSelected): void
可编辑的组合框
DynamicComponents\Controls\EditableCombo
extends
UI\Controls\EditableCombo
// Constructor public function __construct(?callable $onChange = null, string $text = '') // Additional methods public function setOnChange(callable $onChange): void
输入框
DynamicComponents\Controls\Entry
继承自
UI\Controls\Entry
// Constructor public function __construct(int $type = Entry::Normal, ?callable $onChange = null, string $text = '', bool $readOnly = false) // Additional methods public function getType(): int public function setOnChange(callable $onChange): void
多行输入
DynamicComponents\Controls\MultilineEntry
继承自
UI\Controls\MultilineEntry
// Constructor public function __construct(int $type = MultilineEntry::Wrap, ?callable $onChange = null, string $text = '', bool $readOnly = false) // Additional methods public function getType(): int public function setOnChange(callable $onChange): void
单选框
DynamicComponents\Controls\Radio
继承自
UI\Controls\Radio
// Constructor public function __construct(?callable $onSelected = null) // Additional methods public function setOnSelected(callable $onSelected): void
滑动条
DynamicComponents\Controls\Slider
继承自
UI\Controls\Slider
// Constructor public function __construct(int $min, int $max, ?callable $onChange = null, ?int $value = null) // Additional methods public function getMax(): int public function getMin(): int public function setOnChange(callable $onChange): void
因为 UI\Controls\Slider
接受 $min > $max
并将它们反转,所以 DynamicComponents\Controls\Slider
也是如此。然而,为了清晰起见,你应该以正确的方式传递它们,因为获取器返回实际的 min 和 max。
旋转
DynamicComponents\Controls\Spin
继承自
UI\Controls\Spin
// Constructor public function __construct(int $min, int $max, ?callable $onChange = null, ?int $value = null) // Additional methods public function getMax(): int public function getMin(): int public function setOnChange(callable $onChange): void
因为 UI\Controls\Spin
接受 $min > $max
并将它们反转,所以 DynamicComponents\Controls\Spin
也是如此。然而,为了清晰起见,你应该以正确的方式传递它们,因为获取器返回实际的 min 和 max。
高级控件
组合框
DynamicComponents\AdvancedControls\Combo
继承自
DynamicComponents\Controls\Combo
// Constructor public function __construct(string[] $options, ?callable $onSelected = null, int|string $selected = 0) // Additional methods public function appendAll(string[] $options): void public function getOptions(): string[] public function getSelectedText(): string public function setSelectedText(string $text): void
单选框
DynamicComponents\AdvancedControls\Radio
继承自
DynamicComponents\Controls\Radio
// Constructor public function __construct(string[] $options, ?callable $onSelected = null, int|string $selected = -1) // Additional methods public function appendAll(string[] $options): void public function getOptions(): string[] public function getSelectedText(): string public function setSelectedText(string $text): void
其他
区域
DynamicComponents\Area
继承自
UI\Area
// Constructor public function __construct(?callable $onDraw = null, ?callable $onKey = null, ?callable $onMouse = null) // Additional methods public function setOnDraw(callable $onDraw): void public function setOnKey(callable $onKey): void public function setOnMouse(callable $onMouse): void
执行器
DynamicComponents\Executor
继承自
UI\Executor
// Constructor public function __construct(int $seconds = 0, ?int $microseconds = null, ?callable $onExecute = null) // Additional methods public function getInterval(): int[] public function setOnExecute(callable $onExecute): void
菜单
DynamicComponents\Menu
继承自
UI\Menu
// Constructor public function __construct(string $name) // Relevant override (default param changes) public function append(string $name, string $type = \DynamicComponents\MenuItem::class): \UI\MenuItem // Additional methods public function add(string $name): \DynamicComponents\MenuItem public function addAs(string $type, string $name): \UI\MenuItem public function getName(): string public function getMenuItemName(\UI\MenuItem $menuItem): string public function hasMenuItem(\UI\MenuItem $menuItem): bool
Menu
本身没有动作,但用于创建 MenuItem
。虽然 DynamicComponents\MenuItem
可以与 UI\Menu
一起使用,但使用 DynamicComponents\Menu
有以下优点:它将自己作为父级,设置 MenuItem
的名称,并且在 append()
中默认使用 DynamicComponents\MenuItem
。尽管如此,它完全向后兼容,因此您仍然可以使用它创建 UI\MenuItem
。
为了既支持严格的类型检查,又支持 PhpStorm 的高级元数据,添加了 add()
作为正确类型的快捷方式,以及与 append()
相比参数顺序颠倒的 addAs()
,用于类型检测(这仅适用于第一个参数)。
菜单项
DynamicComponents\MenuItem
继承自
UI\MenuItem
// No constructor, MenuItems are created by a Menu via append() // Additional methods public function getName(): ?string public function getParent(): \DynamicComponents\Menu public function isEnabled(): bool public function setOnClick(callable $onClick): void
名称和父级仅在由 DynamicComponents\Menu
创建时可用。理论上,名称可以手动设置,但没有保证它实际上是正确的。
窗口
DynamicComponents\Window
继承自
UI\Window
// Constructor public function __construct(string $title, \UI\Size $size, bool $menu = false, ?callable $onClosing = null) // Additional methods public function hasMenu(): bool public function setOnClosing(callable $onClosing): void
在没有 onClosing
的情况下,对 UI\Window
的默认操作是调用 destroy()
并调用 UI\quit()
。为了以灵活的方式提供相同的功能,DynamicComponents\Window
也这样做,但你可以通过从回调函数中返回 false
来阻止它。
安装
Dynamic Components 只需一个 composer 调用即可安装
composer require dmvdbrugge/dynamic-components
背景
csv2qif 是一个小巧的命令行工具,直到我发现了 PHP UI 扩展 (源码)。由于我来自 Web 背景,回调函数可以自由流动,硬编码每个按钮、下拉菜单和单选按钮的想法并不令人愉快。因此诞生了动态按钮,随后是高级控件组合和单选按钮。
意识到这与工具本身无关,我产生了将这些功能移动到它们自己的库中的想法,为它们的可操作控制朋友(复选框、条目等)加入派对找到了一个理由。所以,我们就在这里。
许可证
MIT 许可证
版权所有 (c) 2018-2019 Dave van der Brugge