d亚当的迷你gui
原文
minigui唯一依赖是arsd.simpledisplay和arsd.color,simpledisplay提供低级接口,而minigui在之上构建组件窗口.
首要目标不是像GTK和Qt那样庞大和复杂,而是有用.并不十分关注外观,在窗口上,它只使用本地控件和原生主题,在Linux上,它保持简单.
在2021年5月之后,可用类似css的Widget.Style,(在窗口上,如果用-version=custom_widgets编译,也可自定义实现,但是最好不要这样.)
事件模型类似浏览器中的js,而布局引擎类似cssflexbox自动适应.
为了最佳效果:确保-L/SUBSYSTEM:WINDOWS:5.0这样链接,否则有缺陷.
HTML转类
HTML代码 | Minigui类 |
|---|---|
<input type="text"> | 行编辑 |
<textarea> | 文字编辑 |
<select> | 下拉选择 |
<input type="checkbox"> | 可选框 |
<input type="radio"> | 单选框 |
<button> | 按钮 |
拉伸:默认值4.可用更大数字来,表示会占用大量空间.
折叠输入
即推出:minigui将包括一些同事件循环工作的I/O功能,如果想玩花样,建议用另一个线程,并来回提交事件.
插件
请见arsd仓库中的minigui_addons来找可单独导入的插件.
XML定义
用arsd.minigui_xml,可从xml创建组件树.
可脚本
minigui兼容arsd.script.如果看到文档中@可脚本(@scriptable)方法,表示可从脚本语言调用它.
提示:要从脚本轻松创建组件树,请导入arsd.minigui_xml,并使arsd.minigui_xml.makeWidgetFromString可用.
import arsd.minigui_xml;
import arsd.script;
var globals = var.emptyObject;
globals.makeWidgetFromString = &makeWidgetFromString;
// 现在工作
interpret(`var window = makeWidgetFromString("<MainWindow />");`, globals);
请等待更多.
示例
你好示例有个超大按钮,这是你的第一个窗口!
import arsd.minigui;
void main() {
auto window = new MainWindow();
auto hello = new TextLabel("你好啊,", TextAlignment.Center, window);
auto button = new Button("关闭", window);
button.addWhenTriggered({
window.close();
});
window.loop();
}
示例展示了分割窗口为标题和边栏方法.在此,页眉和边栏具有固定宽度,而其余内容与窗口一致.
也许网格布局(GridLayout)更符合思维,但这里概念是划分窗口为具有特定大小,然后再子划分.
因此,要制作标题,要从有最大高度的子布局开始.它从顶部使用该空间,然后剩余子划分剩下区域,一块一块的切.
import arsd.minigui;
// 使布局盒可见
class ColorWidget : Widget {
this(Color color, Widget parent) {
this.color = color;
super(parent);
}
Color color;
class Style : Widget.Style {
override WidgetBackground background() { return WidgetBackground(color); }
}
mixin OverrideStyle!Style;
}
void main() {
auto window = new Window;
// 给它最大高
auto header = new class HorizontalLayout {
this() { super(window); }
override int maxHeight() { return 50; }
};
// 下行为快捷方式,但只适用HorizontalLayout和VerticalLayout且不明显,要了解如何创建新类
// auto header = new HorizontalLayout(50, window);
auto bar = new HorizontalLayout(window);
//或由于很常见,VerticalLayout和HorizontalLayout都只能在构造函数中分别接受`最大宽度/高度`
auto left = new VerticalLayout(100, bar);
// 主节容器.普通`Widget`实例就够了
auto container = new Widget(bar);
// 在上面为屏幕截图制作的容器添加颜色
// 应用中,可只添加实际控件
auto headerColorBox = new ColorWidget(Color.teal, header);
auto leftColorBox = new ColorWidget(Color.green, left);
auto rightColorBox = new ColorWidget(Color.purple, container);
window.loop();
}
浙公网安备 33010602011771号