azul桌面GUI框架
azul是使用Webrender渲染引擎和A CSS / HTML类似于Rust的Rust,C和C ++的免费,功能性,反应性GUI框架,用于快速开发美丽的本机桌面应用程序
网站|发行|用户指南| API文档|视频演示|矩阵聊天
特征
azul使用Webrender(Firefox背后的渲染引擎)渲染您的UI,因此它支持许多常见的CSS功能,例如:
-
梯度(线性,径向,圆锥)
-
盒子阴影
-
SVG过滤器
-
组成操作员(乘,变暗等)
-
边境风格
-
边界拉迪
-
滚动 /自动溢出
-
CSS转换
有关更多信息,请参见支持的CSS密钥 /值列表。
最重要的是, azul功能…
-
许多内置的小部件(按钮,文本输入,复选框,colorInput,textInput,numbernput)
-
嵌入OpenGL纹理
-
基于CSS Flexbox的简化类似于HTML的相对/绝对布局系统
-
通过动画API进行60+ FPS动画
-
跨平台本地对话
-
跨平台文本构图和渲染
-
SVG解析和渲染
-
用于渲染大量2D线,圆,矩,形状等的形状缝线。
-
管理I/O的主线程任务
-
通过共享库*动态链接*
-
可通过自动生成的API绑定提供Rust,C,C ++和Python **
-
快速原型制作 /热重新加载的html-to-lust汇编
*静态链接尚未可用
** C ++绑定和Python尚未稳定,并且可能取决于您使用的分支。他们将在发布前稳定。
你好世界
Python
from azul import *class DataModel :def __init__ ( self , counter ):self . counter = counterdef render_dom ( data , info ): label = Dom . text ( "{}" . format ( data . counter ))label . set_inline_style ( "font-size: 50px;" ) button = Button ( "Increment counter" )button . set_on_click ( data , increment_counter )dom = Dom . body ()dom . add_child ( label )dom . add_child ( button . dom ())return dom . style ( Css . empty ())def increment_counter ( data , info ):data . counter += 1 ;return Update . RefreshDomapp = App ( DataModel ( 5 ), AppConfig ( LayoutSolver . Default ))app . run ( WindowCreateOptions ( render_dom ))
锈
use azul :: prelude :: * ;use azul :: widgets :: { button :: Button , label :: Label } ;struct DataModel {counter : usize ,}extern "C" fn render_dom ( data : & mut RefAny , _ : & mut LayoutInfo ) -> StyledDom {let data = data . downcast_ref :: < DataModel > ( ) ? ;let label = Dom :: text ( format ! ( "{}" , data . counter ) ). with_inline_style ( "font-size: 50px;" ) ;let button = Button :: new ( "Increment counter" ). onmouseup ( increment_counter , data . clone ( ) ) ;Dom :: body ( ). with_child ( label ). with_child ( button . dom ( ) ). style ( Css :: empty ( ) )}extern "C" fn increment_counter ( data : & mut RefAny , _ : & mut CallbackInfo ) -> Update {let mut data = data . downcast_mut :: < DataModel > ( ) ? ;data . counter += 1 ;Update :: RefreshDom // call render_dom() again}fn main ( ) {let initial_data = RefAny :: new ( DataModel { counter : 0 } ) ;let app = App :: new ( initial_data , AppConfig :: default ( ) ) ;app . run ( WindowCreateOptions :: new ( render_dom ) ) ;}
c
#include " azul .h"typedef struct {uint32_t counter ;
} DataModel ;void DataModel_delete ( DataModel * restrict A ) { }AZ_REFLECT ( DataModel , DataModel_delete );AzStyledDom render_dom ( AzRefAny * data , AzLayoutInfo * info ) {DataModelRef d = DataModelRef_create ( data );if !( DataModel_downcastRef ( data , & d )) {return AzStyledDom_empty ();
} char buffer [ 20 ];int written = snprintf ( buffer , 20 , "%d" , d -> counter );AzString const labelstring = AzString_copyFromBytes ( & buffer , 0 , written );AzDom label = AzDom_text ( labelstring );AzString const inline_css = AzString_fromConstStr ( "font-size: 50px;" );AzDom_setInlineStyle ( & label , inline_css ); AzString const buttontext = AzString_fromConstStr ( "Increment counter" );AzButton button = AzButton_new ( buttontext , AzRefAny_clone ( data ));AzButton_setOnClick ( & button , incrementCounter );AzDom body = Dom_body ();AzDom_addChild ( body , AzButton_dom ( & button ));AzDom_addChild ( body , label ); AzCss global_css = AzCss_empty ();return AzDom_style ( body , global_css );
}Update incrementCounter ( RefAny * data , CallbackInfo * event ) {DataModelRefMut d = DataModelRefMut_create ( data );if !( DataModel_downcastRefMut ( data , & d )) {return Update_DoNothing ;
}d -> ptr . counter += 1 ;DataModelRefMut_delete ( & d );return Update_RefreshDom ;
}int main () {DataModel model = { . counter = 5 };AzApp app = AzApp_new ( DataModel_upcast ( model ), AzAppConfig_default ());AzApp_run ( app , AzWindowCreateOptions_new ( render_dom ));return 0 ;
}
执照
azul获得了MPL-2.0的许可。这意味着是的,您可以使用azul构建专有应用程序而无需发布您的代码:您只需要发布对库本身进行的更改。
版权所有2017年 – 当前FelixSchütt
