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\ButtonextendsUI\Controls\Button
// Constructor public function __construct(string $text, ?callable $onClick = null) // Additional methods public function setOnClick(callable $onClick): void
复选框
DynamicComponents\Controls\CheckextendsUI\Controls\Check
// Constructor public function __construct(string $text, ?callable $onToggle = null, bool $checked = false) // Additional methods public function setOnToggle(callable $onToggle): void
颜色按钮
DynamicComponents\Controls\ColorButtonextendsUI\Controls\ColorButton
// Constructor public function __construct(?callable $onChange = null, ?Color $color = null) // Additional methods public function setOnChange(callable $onChange): void
组合框
DynamicComponents\Controls\ComboextendsUI\Controls\Combo
// Constructor public function __construct(?callable $onSelected = null) // Additional methods public function setOnSelected(callable $onSelected): void
可编辑的组合框
DynamicComponents\Controls\EditableComboextendsUI\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