Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ ui-events = { version = "0.3.0", default-features = false, features = ["kurbo"]
ui-events-winit = { version = "0.3.0", default-features = false }
smallvec = "1.15.1"
hashbrown = { version = "0.17.0", default-features = false, features = ["default-hasher"] }
copypasta = "0.10.2"
dpi = "0.1.2"
image = { version = "0.25.10", default-features = false }
resvg = "0.47.0"
Expand Down
6 changes: 3 additions & 3 deletions masonry/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,13 @@ impl AppDriver for Driver {
debug_assert_eq!(window_id, self.window_id, "unknown window");

if action.is::<ButtonPress>() {
let render_root = ctx.render_root(window_id);
let (app_ctx, render_root) = ctx.render_root(window_id);

render_root.edit_widget_with_tag(TEXT_INPUT_TAG, |mut text_input| {
render_root.edit_widget_with_tag(app_ctx, TEXT_INPUT_TAG, |mut text_input| {
let mut text_area = TextInput::text_mut(&mut text_input);
TextArea::reset_text(&mut text_area, "");
});
render_root.edit_widget_with_tag(LIST_TAG, |mut list| {
render_root.edit_widget_with_tag(app_ctx, LIST_TAG, |mut list| {
let child = Label::new(self.next_task.clone()).prepare();
Flex::add_fixed(&mut list, child);
});
Expand Down
6 changes: 4 additions & 2 deletions masonry/examples/calc_masonry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,9 @@ impl AppDriver for CalcState {
) {
debug_assert_eq!(window_id, self.window_id, "unknown window");

let Some(source) = ctx.render_root(window_id).get_widget(widget_id) else {
let (app_ctx, render_root) = ctx.render_root(window_id);

let Some(source) = render_root.get_widget(widget_id) else {
return;
};
let Some(button) = source.downcast::<Button>() else {
Expand All @@ -171,7 +173,7 @@ impl AppDriver for CalcState {
CalcAction::None => (),
}

ctx.render_root(window_id).edit_base_layer(|mut root| {
render_root.edit_base_layer(app_ctx, |mut root| {
let mut grid = root.downcast();
let mut flex = Grid::get_mut(&mut grid, 0);
let mut flex = flex.downcast();
Expand Down
17 changes: 9 additions & 8 deletions masonry/examples/gallery/badge.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2026 the Xilem Authors
// SPDX-License-Identifier: Apache-2.0

use masonry::app::RenderRoot;
use masonry::app::{AppCtx, RenderRoot};
use masonry::core::{
ErasedAction, Handled, NewWidget, PropertySet, StyleProperty, Widget, WidgetId, WidgetTag,
};
Expand Down Expand Up @@ -56,12 +56,12 @@ impl BadgeDemo {
)
}

fn apply_count(&self, render_root: &mut RenderRoot) {
render_root.edit_widget_with_tag(self.count_label, |mut label| {
fn apply_count(&self, app_ctx: &mut AppCtx, render_root: &mut RenderRoot) {
render_root.edit_widget_with_tag(app_ctx, self.count_label, |mut label| {
Label::set_text(&mut label, format!("count: {}", self.count));
});

render_root.edit_widget_with_tag(self.inbox_badged, |mut badged| {
render_root.edit_widget_with_tag(app_ctx, self.inbox_badged, |mut badged| {
if let Some(badge) = Self::make_count_badge(self.count) {
Badged::set_badge(&mut badged, badge);
} else {
Expand Down Expand Up @@ -240,12 +240,13 @@ impl DemoPage for BadgeDemo {
wrap_in_shell(self.shell, NewWidget::new(body).erased())
}

fn on_selected(&mut self, render_root: &mut RenderRoot) {
self.apply_count(render_root);
fn on_selected(&mut self, app_ctx: &mut AppCtx, render_root: &mut RenderRoot) {
self.apply_count(app_ctx, render_root);
}

fn on_action(
&mut self,
app_ctx: &mut AppCtx,
render_root: &mut RenderRoot,
action: &ErasedAction,
widget_id: WidgetId,
Expand All @@ -265,13 +266,13 @@ impl DemoPage for BadgeDemo {

if widget_id == dec_id {
self.count = self.count.saturating_sub(1);
self.apply_count(render_root);
self.apply_count(app_ctx, render_root);
return Handled::Yes;
}

if widget_id == inc_id {
self.count = self.count.saturating_add(1);
self.apply_count(render_root);
self.apply_count(app_ctx, render_root);
return Handled::Yes;
}

Expand Down
7 changes: 4 additions & 3 deletions masonry/examples/gallery/checkbox.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2026 the Xilem Authors
// SPDX-License-Identifier: Apache-2.0

use masonry::app::RenderRoot;
use masonry::app::{AppCtx, RenderRoot};
use masonry::core::{ErasedAction, Handled, NewWidget, StyleProperty, Widget, WidgetId, WidgetTag};
use masonry::properties::types::CrossAxisAlignment;
use masonry::widgets::{Checkbox, CheckboxToggled, Flex, Label};
Expand Down Expand Up @@ -52,6 +52,7 @@ impl DemoPage for CheckboxDemo {

fn on_action(
&mut self,
app_ctx: &mut AppCtx,
render_root: &mut RenderRoot,
action: &ErasedAction,
widget_id: WidgetId,
Expand All @@ -66,10 +67,10 @@ impl DemoPage for CheckboxDemo {
return Handled::No;
}

render_root.edit_widget_with_tag(self.state_label, |mut label| {
render_root.edit_widget_with_tag(app_ctx, self.state_label, |mut label| {
Label::set_text(&mut label, format!("Checked: {checked}"));
});
render_root.edit_widget_with_tag(self.checkbox, |mut checkbox| {
render_root.edit_widget_with_tag(app_ctx, self.checkbox, |mut checkbox| {
Checkbox::set_checked(&mut checkbox, checked);
});
Handled::Yes
Expand Down
5 changes: 3 additions & 2 deletions masonry/examples/gallery/demo.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2026 the Xilem Authors
// SPDX-License-Identifier: Apache-2.0

use masonry::app::RenderRoot;
use masonry::app::{AppCtx, RenderRoot};
use masonry::core::{ErasedAction, Handled, NewWidget, Widget, WidgetId, WidgetTag};
use masonry::layout::Length;
use masonry::properties::types::CrossAxisAlignment;
Expand All @@ -21,10 +21,11 @@ pub(crate) trait DemoPage {
fn shell_tags(&self) -> ShellTags;
fn build(&self) -> NewWidget<dyn Widget>;

fn on_selected(&mut self, _render_root: &mut RenderRoot) {}
fn on_selected(&mut self, _app_ctx: &mut AppCtx, _render_root: &mut RenderRoot) {}

fn on_action(
&mut self,
app_ctx: &mut AppCtx,
render_root: &mut RenderRoot,
action: &ErasedAction,
widget_id: WidgetId,
Expand Down
26 changes: 14 additions & 12 deletions masonry/examples/gallery/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@ impl Driver {
) {
let shell = self.demos[demo_idx].shell_tags();

let render_root = ctx.render_root(window_id);
render_root.edit_widget_with_tag(shell.disabled_toggle, |mut checkbox| {
let (app_ctx, render_root) = ctx.render_root(window_id);
render_root.edit_widget_with_tag(app_ctx, shell.disabled_toggle, |mut checkbox| {
Checkbox::set_checked(&mut checkbox, disabled);
});
render_root.edit_widget_with_tag(shell.content_wrapper, |mut content| {
render_root.edit_widget_with_tag(app_ctx, shell.content_wrapper, |mut content| {
content.ctx.set_disabled(disabled);
});
}
Expand All @@ -91,11 +91,11 @@ impl Driver {

{
let name = self.demos[idx].name();
let render_root = ctx.render_root(window_id);
render_root.edit_widget_with_tag(self.title_tag, |mut label| {
let (app_ctx, render_root) = ctx.render_root(window_id);
render_root.edit_widget_with_tag(app_ctx, self.title_tag, |mut label| {
Label::set_text(&mut label, name);
});
render_root.edit_widget_with_tag(self.stack_tag, |mut stack| {
render_root.edit_widget_with_tag(app_ctx, self.stack_tag, |mut stack| {
IndexedStack::set_active_child(&mut stack, idx);
});
}
Expand All @@ -104,8 +104,8 @@ impl Driver {
self.apply_demo_disabled(ctx, window_id, idx, disabled);

{
let render_root = ctx.render_root(window_id);
self.demos[idx].on_selected(render_root);
let (app_ctx, render_root) = ctx.render_root(window_id);
self.demos[idx].on_selected(app_ctx, render_root);
}
}
}
Expand All @@ -120,11 +120,12 @@ impl AppDriver for Driver {
) {
debug_assert_eq!(window_id, self.window_id, "unknown window");

let (app_ctx, render_root) = ctx.render_root(window_id);

// Sidebar button pressed: select demo.
if action.is::<ButtonPress>() {
// Sidebar: match by tagged ids.
let selected_idx = {
let render_root = ctx.render_root(window_id);
self.sidebar_buttons
.iter()
.enumerate()
Expand All @@ -144,7 +145,6 @@ impl AppDriver for Driver {
if let Some(toggled) = action.downcast_ref::<CheckboxToggled>() {
let toggled = toggled.0;
let disabled_demo = {
let render_root = ctx.render_root(window_id);
self.demos.iter().enumerate().find_map(|(idx, demo)| {
let shell = demo.shell_tags();
let id = render_root
Expand All @@ -163,9 +163,11 @@ impl AppDriver for Driver {
}

// Forward everything else to demos.
let render_root = ctx.render_root(window_id);
for demo in &mut self.demos {
if demo.on_action(render_root, &action, widget_id).is_handled() {
if demo
.on_action(app_ctx, render_root, &action, widget_id)
.is_handled()
{
return;
}
}
Expand Down
19 changes: 10 additions & 9 deletions masonry/examples/gallery/pagination.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2026 the Xilem Authors
// SPDX-License-Identifier: Apache-2.0

use masonry::app::RenderRoot;
use masonry::app::{AppCtx, RenderRoot};
use masonry::core::{Handled, NewWidget, Widget, WidgetId, WidgetTag};
use masonry::widgets::{Flex, Label, PageChanged, Pagination, Step, StepInput};

Expand Down Expand Up @@ -53,6 +53,7 @@ impl DemoPage for PaginationDemo {

fn on_action(
&mut self,
app_ctx: &mut AppCtx,
render_root: &mut RenderRoot,
action: &masonry::core::ErasedAction,
widget_id: WidgetId,
Expand Down Expand Up @@ -86,34 +87,34 @@ impl DemoPage for PaginationDemo {
.id();

if widget_id == id_page_count {
render_root.edit_widget_with_tag(self.tag_pagination, |mut widget| {
render_root.edit_widget_with_tag(app_ctx, self.tag_pagination, |mut widget| {
Pagination::set_page_count(&mut widget, value as usize);
});
return Handled::Yes;
}
if widget_id == id_page_active {
render_root.edit_widget_with_tag(self.tag_content, |mut content| {
render_root.edit_widget_with_tag(app_ctx, self.tag_content, |mut content| {
Label::set_text(&mut content, format!("Now on page {}", value));
});
render_root.edit_widget_with_tag(self.tag_pagination, |mut widget| {
render_root.edit_widget_with_tag(app_ctx, self.tag_pagination, |mut widget| {
Pagination::set_active_page(&mut widget, (value - 1) as usize);
});
return Handled::Yes;
}
if widget_id == id_buttons_start {
render_root.edit_widget_with_tag(self.tag_pagination, |mut widget| {
render_root.edit_widget_with_tag(app_ctx, self.tag_pagination, |mut widget| {
Pagination::set_buttons_start(&mut widget, value as u8);
});
return Handled::Yes;
}
if widget_id == id_buttons_end {
render_root.edit_widget_with_tag(self.tag_pagination, |mut widget| {
render_root.edit_widget_with_tag(app_ctx, self.tag_pagination, |mut widget| {
Pagination::set_buttons_end(&mut widget, value as u8);
});
return Handled::Yes;
}
if widget_id == id_buttons_total {
render_root.edit_widget_with_tag(self.tag_pagination, |mut widget| {
render_root.edit_widget_with_tag(app_ctx, self.tag_pagination, |mut widget| {
Pagination::set_buttons_total(&mut widget, value as u8);
});
return Handled::Yes;
Expand All @@ -131,10 +132,10 @@ impl DemoPage for PaginationDemo {
return Handled::No;
}

render_root.edit_widget_with_tag(self.tag_content, |mut content| {
render_root.edit_widget_with_tag(app_ctx, self.tag_content, |mut content| {
Label::set_text(&mut content, format!("Now on page {}", page_idx + 1));
});
render_root.edit_widget_with_tag(self.tag_page_active, |mut widget| {
render_root.edit_widget_with_tag(app_ctx, self.tag_page_active, |mut widget| {
StepInput::set_base(&mut widget, (page_idx + 1).cast_signed());
});
return Handled::Yes;
Expand Down
Loading
Loading