Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Desktop GUI Framework

License

NotificationsYou must be signed in to change notification settings

fschutt/azul

Repository files navigation

CICoverage StatusLICENSERust Compiler Versiondependency status

Azul is a free, functional, reactive GUI framework for Rust, C and C++,built using the WebRender rendering engine and a CSS / HTML-like documentobject model for rapid development of beautiful, native desktop applications

Features

Azul useswebrender (the rendering engine behindFirefox) to render your UI, so it supports lots of common CSS features like:

  • gradients (linear, radial, conic)
  • box shadows
  • SVG filters
  • composition operators (multiply, darken, etc.)
  • border styling
  • border-radii
  • scrolling / automatic overflow
  • CSS transforms

See thelist of supported CSS keys / values for more info.

On top of that, Azul features...

  • lots of built-in widgets (Button,TextInput,CheckBox,ColorInput,TextInput,NumberInput)
  • embedding OpenGL textures
  • simplified HTML-like relative/absolute layout system based on CSS flexbox
  • 60+ FPS animations viaAnimation API
  • cross-platform native dialogs
  • cross-platform text shaping and rendering
  • SVG parsing and rendering
  • shape tesselation for rendering large numbers of 2D lines, circles, rects, shapes, etc. in a single draw call
  • managing off-main-thread tasks for I/O
  • dynamic linking via shared library*
  • usable from Rust, C, C++ and Python via auto-generated API bindings**
  • HTML-to-Rust compilation for fast prototyping / hot reload

* static linking not yet available

** C++ bindings and Python are not yet stabilized and might not work dependingon the branch you're using. They will be stabilized before the release.

Screenshots

imageimageimageimage

Hello World

Python

fromazulimport*classDataModel:def__init__(self,counter):self.counter=counterdefrender_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())returndom.style(Css.empty())defincrement_counter(data,info):data.counter+=1;returnUpdate.RefreshDomapp=App(DataModel(5),AppConfig(LayoutSolver.Default))app.run(WindowCreateOptions(render_dom))

Rust

use azul::prelude::*;use azul::widgets::{button::Button, label::Label};structDataModel{counter:usize,}extern"C"fnrender_dom(data:&mutRefAny, _:&mutLayoutInfo) ->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"fnincrement_counter(data:&mutRefAny, _:&mutCallbackInfo) ->Update{letmut data = data.downcast_mut::<DataModel>()?;    data.counter +=1;Update::RefreshDom// call render_dom() again}fnmain(){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"typedefstruct {uint32_tcounter;}DataModel;voidDataModel_delete(DataModel* restrictA) { }AZ_REFLECT(DataModel,DataModel_delete);AzStyledDomrender_dom(AzRefAny*data,AzLayoutInfo*info) {DataModelRefd=DataModelRef_create(data);if !(DataModel_downcastRef(data,&d)) {returnAzStyledDom_empty();    }charbuffer [20];intwritten=snprintf(buffer,20,"%d",d->counter);AzStringconstlabelstring=AzString_copyFromBytes(&buffer,0,written);AzDomlabel=AzDom_text(labelstring);AzStringconstinline_css=AzString_fromConstStr("font-size: 50px;");AzDom_setInlineStyle(&label,inline_css);AzStringconstbuttontext=AzString_fromConstStr("Increment counter");AzButtonbutton=AzButton_new(buttontext,AzRefAny_clone(data));AzButton_setOnClick(&button,incrementCounter);AzDombody=Dom_body();AzDom_addChild(body,AzButton_dom(&button));AzDom_addChild(body,label);AzCssglobal_css=AzCss_empty();returnAzDom_style(body,global_css);}UpdateincrementCounter(RefAny*data,CallbackInfo*event) {DataModelRefMutd=DataModelRefMut_create(data);if !(DataModel_downcastRefMut(data,&d)) {returnUpdate_DoNothing;    }d->ptr.counter+=1;DataModelRefMut_delete(&d);returnUpdate_RefreshDom;}intmain() {DataModelmodel= { .counter=5 };AzAppapp=AzApp_new(DataModel_upcast(model),AzAppConfig_default());AzApp_run(app,AzWindowCreateOptions_new(render_dom));return0;}

License

Azul is licensed under the MPL-2.0. Which means that yes, you can buildproprietary applications using azul without having to publish your code:you only have to publish changes made tothe library itself.

Copyright 2017 - current Felix Schütt


[8]ページ先頭

©2009-2025 Movatter.jp