d亚当的迷你gui

原文
minigui唯一依赖是arsd.simpledisplayarsd.color,simpledisplay提供低级接口,而minigui在之上构建组件窗口.
首要目标不是像GTKQt那样庞大和复杂,而是有用.并不十分关注外观,在窗口上,它只使用本地控件和原生主题,在Linux上,它保持简单.
2021年5月之后,可用类似cssWidget.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();
}
posted @   zjh6  阅读(19)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示