summaryrefslogtreecommitdiffstats
path: root/widget
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-03-21 23:30:36 +0100
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-03-21 23:30:36 +0100
commitb972ebca8f8c23d2df1b45bb26038789766a5a65 (patch)
treedd6b0a68a7f6b0dfbf21e708f51fea93746385d0 /widget
parent3d17cf8790a18bd0dfe968739c9802833c0bb647 (diff)
downloadiced-b972ebca8f8c23d2df1b45bb26038789766a5a65.tar.gz
iced-b972ebca8f8c23d2df1b45bb26038789766a5a65.tar.bz2
iced-b972ebca8f8c23d2df1b45bb26038789766a5a65.zip
Restore `canvas::Program` API
Diffstat (limited to 'widget')
-rw-r--r--widget/src/canvas.rs17
-rw-r--r--widget/src/canvas/program.rs11
2 files changed, 19 insertions, 9 deletions
diff --git a/widget/src/canvas.rs b/widget/src/canvas.rs
index fcd91d17..81067491 100644
--- a/widget/src/canvas.rs
+++ b/widget/src/canvas.rs
@@ -26,13 +26,17 @@ use std::marker::PhantomData;
/// change or it is explicitly cleared.
pub type Cache<Renderer = crate::Renderer> = geometry::Cache<Renderer>;
+/// The geometry supported by a renderer.
+pub type Geometry<Renderer = crate::Renderer> =
+ <Renderer as geometry::Renderer>::Geometry;
+
/// A widget capable of drawing 2D graphics.
///
/// ## Drawing a simple circle
/// If you want to get a quick overview, here's how we can draw a simple circle:
///
/// ```no_run
-/// # use iced_widget::canvas::{self, frame, Canvas, Fill, Frame, Path, Program};
+/// # use iced_widget::canvas::{self, frame, Canvas, Fill, Frame, Geometry, Path, Program};
/// # use iced_widget::core::{Color, Rectangle};
/// # use iced_widget::core::mouse;
/// # use iced_widget::{Renderer, Theme};
@@ -47,7 +51,7 @@ pub type Cache<Renderer = crate::Renderer> = geometry::Cache<Renderer>;
/// impl Program<()> for Circle {
/// type State = ();
///
-/// fn draw(&self, _state: &(), renderer: &mut Renderer, _theme: &Theme, bounds: Rectangle, _cursor: mouse::Cursor) {
+/// fn draw(&self, _state: &(), renderer: &Renderer, _theme: &Theme, bounds: Rectangle, _cursor: mouse::Cursor) -> Vec<Geometry> {
/// // We prepare a new `Frame`
/// let mut frame = frame(renderer, bounds.size());
///
@@ -58,7 +62,7 @@ pub type Cache<Renderer = crate::Renderer> = geometry::Cache<Renderer>;
/// frame.fill(&circle, Color::BLACK);
///
/// // Finally, we produce the geometry
-/// renderer.draw_geometry([frame]);
+/// vec![frame.into()]
/// }
/// }
///
@@ -215,7 +219,12 @@ where
renderer.with_transformation(
Transformation::translate(bounds.x, bounds.y),
|renderer| {
- self.program.draw(state, renderer, theme, bounds, cursor);
+ let layers =
+ self.program.draw(state, renderer, theme, bounds, cursor);
+
+ for layer in layers {
+ renderer.draw_geometry(layer);
+ }
},
);
}
diff --git a/widget/src/canvas/program.rs b/widget/src/canvas/program.rs
index 307686de..3ba31474 100644
--- a/widget/src/canvas/program.rs
+++ b/widget/src/canvas/program.rs
@@ -1,5 +1,6 @@
use crate::canvas::event::{self, Event};
use crate::canvas::mouse;
+use crate::canvas::Geometry;
use crate::core::Rectangle;
use crate::graphics::geometry;
@@ -41,11 +42,11 @@ where
fn draw(
&self,
state: &Self::State,
- renderer: &mut Renderer,
+ renderer: &Renderer,
theme: &Theme,
bounds: Rectangle,
cursor: mouse::Cursor,
- );
+ ) -> Vec<Geometry<Renderer>>;
/// Returns the current mouse interaction of the [`Program`].
///
@@ -83,12 +84,12 @@ where
fn draw(
&self,
state: &Self::State,
- renderer: &mut Renderer,
+ renderer: &Renderer,
theme: &Theme,
bounds: Rectangle,
cursor: mouse::Cursor,
- ) {
- T::draw(self, state, renderer, theme, bounds, cursor);
+ ) -> Vec<Geometry<Renderer>> {
+ T::draw(self, state, renderer, theme, bounds, cursor)
}
fn mouse_interaction(