Skip to content

Commit

Permalink
Add getters to masonry widget contexts (#735)
Browse files Browse the repository at this point in the history
This fixes #728.

And update `flex` and `grid` examples to use them.
This allows external crates to access these fields for custom widgets.
  • Loading branch information
viktorstrate authored Nov 11, 2024
1 parent 6db696d commit 72530b2
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 8 deletions.
30 changes: 30 additions & 0 deletions masonry/src/contexts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ use dpi::LogicalPosition;
use parley::{FontContext, LayoutContext};
use tracing::{trace, warn};
use vello::kurbo::Vec2;
use vello::peniko::Color;
use winit::window::ResizeDirection;

use crate::action::Action;
use crate::passes::layout::run_layout_on;
use crate::render_root::{MutateCallback, RenderRootSignal, RenderRootState};
use crate::text::TextBrush;
use crate::theme::get_debug_color;
use crate::tree_arena::{ArenaMutChildren, ArenaRefChildren};
use crate::widget::{WidgetMut, WidgetRef, WidgetState};
use crate::{AllowRawMut, BoxConstraints, Insets, Point, Rect, Size, Widget, WidgetId, WidgetPod};
Expand Down Expand Up @@ -226,6 +228,11 @@ impl_context_method!(
self.widget_state.layout_rect()
}

/// The offset of the baseline relative to the bottom of the widget.
pub fn baseline_offset(&self) -> f64 {
self.widget_state.baseline_offset
}

/// The origin of the widget in window coordinates, relative to the top left corner of the
/// content area.
pub fn window_origin(&self) -> Point {
Expand Down Expand Up @@ -1123,6 +1130,29 @@ impl_context_method!(LayoutCtx<'_>, PaintCtx<'_>, {
}
});

impl PaintCtx<'_> {
/// Whether debug paint is enabled.
///
/// If this property is set, your widget may draw additional debug information
/// (such as the position of the text baseline).
/// These should normally use the [debug color][Self::debug_color] for this widget.
/// Please note that when debug painting is enabled, each widget's layout boundaries are
/// outlined by Masonry, so you should avoid duplicating that.
///
/// Debug paint can be enabled by setting the environment variable `MASONRY_DEBUG_PAINT`.
pub fn debug_paint_enabled(&self) -> bool {
self.debug_paint
}

/// A color used for debug painting in this widget.
///
/// This is normally used to paint additional debugging information
/// when debug paint is enabled, see [`Self::debug_paint_enabled`].
pub fn debug_color(&self) -> Color {
get_debug_color(self.widget_id().to_raw())
}
}

// --- MARK: RAW WRAPPERS ---
macro_rules! impl_get_raw {
($SomeCtx:tt) => {
Expand Down
4 changes: 4 additions & 0 deletions masonry/src/theme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ static DEBUG_COLOR: &[Color] = &[
Color::rgb8(0, 0, 0),
];

/// A color used for debug painting.
///
/// The same color is always returned given the same id, usually the id of a widget.
/// When painting a widget, [`PaintCtx::debug_color`][crate::contexts::PaintCtx::debug_color] is typically used instead.
pub fn get_debug_color(id: u64) -> Color {
let color_num = id as usize % DEBUG_COLOR.len();
DEBUG_COLOR[color_num]
Expand Down
7 changes: 3 additions & 4 deletions masonry/src/widget/flex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ use vello::kurbo::common::FloatExt;
use vello::kurbo::{Affine, Line, Stroke, Vec2};
use vello::Scene;

use crate::theme::get_debug_color;
use crate::widget::WidgetMut;
use crate::{
AccessCtx, AccessEvent, BoxConstraints, EventCtx, LayoutCtx, PaintCtx, Point, PointerEvent,
Expand Down Expand Up @@ -1178,9 +1177,9 @@ impl Widget for Flex {

fn paint(&mut self, ctx: &mut PaintCtx, scene: &mut Scene) {
// paint the baseline if we're debugging layout
if ctx.debug_paint && ctx.widget_state.baseline_offset != 0.0 {
let color = get_debug_color(ctx.widget_id().to_raw());
let my_baseline = ctx.size().height - ctx.widget_state.baseline_offset;
if ctx.debug_paint_enabled() && ctx.baseline_offset() != 0.0 {
let color = ctx.debug_color();
let my_baseline = ctx.size().height - ctx.baseline_offset();
let line = Line::new((0.0, my_baseline), (ctx.size().width, my_baseline));

let stroke_style = Stroke::new(1.0).with_dashes(0., [4.0, 4.0]);
Expand Down
7 changes: 3 additions & 4 deletions masonry/src/widget/grid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ use tracing::{trace_span, Span};
use vello::kurbo::{Affine, Line, Stroke};
use vello::Scene;

use crate::theme::get_debug_color;
use crate::widget::WidgetMut;
use crate::{
AccessCtx, AccessEvent, BoxConstraints, EventCtx, LayoutCtx, PaintCtx, Point, PointerEvent,
Expand Down Expand Up @@ -287,9 +286,9 @@ impl Widget for Grid {

fn paint(&mut self, ctx: &mut PaintCtx, scene: &mut Scene) {
// paint the baseline if we're debugging layout
if ctx.debug_paint && ctx.widget_state.baseline_offset != 0.0 {
let color = get_debug_color(ctx.widget_id().to_raw());
let my_baseline = ctx.size().height - ctx.widget_state.baseline_offset;
if ctx.debug_paint_enabled() && ctx.baseline_offset() != 0.0 {
let color = ctx.debug_color();
let my_baseline = ctx.size().height - ctx.baseline_offset();
let line = Line::new((0.0, my_baseline), (ctx.size().width, my_baseline));

let stroke_style = Stroke::new(1.0).with_dashes(0., [4.0, 4.0]);
Expand Down

0 comments on commit 72530b2

Please sign in to comment.