dmvdbrugge/dynamic-components

PHP UI 扩展的动态组件

v0.3.0 2019-03-24 00:48 UTC

This package is auto-updated.

Last update: 2024-09-10 21:20:51 UTC


README

PHP UI 扩展的动态组件:使用回调而非硬编码的动作。提供扩展提供的基本控件的高级版本。

Build Status

用法/示例

最基础的示例是一个在点击时改变文本的按钮

<?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运行,当然前提是扩展已启用。还可以查看csv2qifFileSelect,它是一个更高级的文件选择器版本。(或者它的任何其他 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