Move Canvas and QRCode to iced crate

Rename `canvas` modules to `geometry` in graphics subcrates
This commit is contained in:
Héctor Ramón Jiménez 2023-03-03 04:57:55 +01:00
parent d13d19ba35
commit 6cc48b5c62
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
39 changed files with 140 additions and 148 deletions

View file

@ -17,9 +17,9 @@ image = ["iced_renderer/image", "image_rs"]
# Enables the `Svg` widget
svg = ["iced_renderer/svg"]
# Enables the `Canvas` widget
canvas = ["iced_renderer/canvas"]
canvas = ["iced_renderer/geometry"]
# Enables the `QRCode` widget
qr_code = ["iced_renderer/qr_code"]
qr_code = ["canvas", "qrcode"]
# Enables a debug view in native platforms (press F12)
debug = ["iced_winit/debug"]
# Enables `tokio` as the `executor::Default` on native platforms
@ -69,6 +69,11 @@ version = "0.24"
package = "image"
optional = true
[dependencies.qrcode]
version = "0.12"
optional = true
default-features = false
[package.metadata.docs.rs]
rustdoc-args = ["--cfg", "docsrs"]
features = ["image", "svg", "canvas", "qr_code"]

View file

@ -69,7 +69,7 @@ impl Application for Arc {
}
}
impl<Message> canvas::Program<Message, Renderer> for Arc {
impl<Message> canvas::Program<Message> for Arc {
type State = ();
fn draw(

View file

@ -92,7 +92,7 @@ mod bezier {
curves: &'a [Curve],
}
impl<'a> canvas::Program<Curve, Renderer> for Bezier<'a> {
impl<'a> canvas::Program<Curve> for Bezier<'a> {
type State = Option<Pending>;
fn update(

View file

@ -237,7 +237,7 @@ impl Theme {
}
}
impl<Message> canvas::Program<Message, Renderer> for Theme {
impl<Message> canvas::Program<Message> for Theme {
type State = ();
fn draw(

View file

@ -393,7 +393,7 @@ mod grid {
}
}
impl canvas::Program<Message, Renderer> for Grid {
impl canvas::Program<Message> for Grid {
type State = Interaction;
fn update(

View file

@ -97,7 +97,7 @@ struct SierpinskiGraph {
cache: canvas::Cache,
}
impl canvas::Program<Message, Renderer> for SierpinskiGraph {
impl canvas::Program<Message> for SierpinskiGraph {
type State = ();
fn update(

View file

@ -150,7 +150,7 @@ impl State {
}
}
impl<Message> canvas::Program<Message, Renderer> for State {
impl<Message> canvas::Program<Message> for State {
type State = ();
fn draw(

View file

@ -24,7 +24,7 @@ bmp = ["image_rs/bmp"]
hdr = ["image_rs/hdr"]
dds = ["image_rs/dds"]
farbfeld = ["image_rs/farbfeld"]
canvas = ["iced_native/canvas"]
geometry = ["lyon_path"]
opengl = []
image_rs = ["kamadak-exif"]
@ -65,6 +65,10 @@ optional = true
version = "0.5"
optional = true
[dependencies.lyon_path]
version = "1"
optional = true
[package.metadata.docs.rs]
rustdoc-args = ["--cfg", "docsrs"]
all-features = true

View file

@ -10,8 +10,6 @@ use std::borrow::Cow;
///
/// [`Renderer`]: crate::Renderer
pub trait Backend {
type Geometry: Into<crate::Primitive>;
/// Trims the measurements cache.
///
/// This method is currently necessary to properly trim the text cache in

36
graphics/src/geometry.rs Normal file
View file

@ -0,0 +1,36 @@
//! Draw 2D graphics for your users.
//!
//! A [`Canvas`] widget can be used to draw different kinds of 2D shapes in a
//! [`Frame`]. It can be used for animation, data visualization, game graphics,
//! and more!
pub mod fill;
pub mod path;
pub mod stroke;
mod style;
mod text;
pub use fill::Fill;
pub use path::Path;
pub use stroke::{LineCap, LineDash, LineJoin, Stroke};
pub use style::Style;
pub use text::Text;
pub use iced_native::gradient::{self, Gradient};
use crate::Primitive;
#[derive(Debug, Clone)]
pub struct Geometry(pub Primitive);
impl From<Geometry> for Primitive {
fn from(geometry: Geometry) -> Self {
geometry.0
}
}
pub trait Renderer: iced_native::Renderer {
type Geometry;
fn draw(&mut self, geometry: Vec<Self::Geometry>);
}

View file

@ -1,8 +1,7 @@
//! Fill [crate::widget::canvas::Geometry] with a certain style.
use crate::widget::canvas::Gradient;
use crate::Color;
use crate::{Color, Gradient};
pub use crate::widget::canvas::Style;
pub use crate::geometry::Style;
/// The style used to fill geometry.
#[derive(Debug, Clone)]

View file

@ -1,4 +1,4 @@
use crate::widget::canvas::path::{arc, Arc, Path};
use crate::geometry::path::{arc, Arc, Path};
use crate::{Point, Size};
use lyon_path::builder::{self, SvgPathBuilder};

View file

@ -1,5 +1,5 @@
//! Create lines from a [crate::widget::canvas::Path] and assigns them various attributes/styles.
pub use crate::widget::canvas::Style;
pub use crate::geometry::Style;
use crate::Color;

View file

@ -1,5 +1,4 @@
use crate::widget::canvas::Gradient;
use crate::Color;
use crate::{Color, Gradient};
/// The coloring style of some drawing.
#[derive(Debug, Clone, PartialEq)]

View file

@ -33,6 +33,9 @@ pub mod primitive;
pub mod renderer;
pub mod window;
#[cfg(feature = "geometry")]
pub mod geometry;
pub use antialiasing::Antialiasing;
pub use backend::Backend;
pub use error::Error;
@ -41,6 +44,9 @@ pub use renderer::Renderer;
pub use transformation::Transformation;
pub use viewport::Viewport;
#[cfg(feature = "geometry")]
pub use geometry::Geometry;
pub use iced_native::alignment;
pub use iced_native::text;
pub use iced_native::{

View file

@ -215,15 +215,15 @@ where
}
}
#[cfg(feature = "canvas")]
impl<B, T> iced_native::widget::canvas::Renderer for Renderer<B, T>
#[cfg(feature = "geometry")]
impl<B, T> crate::geometry::Renderer for Renderer<B, T>
where
B: Backend,
{
type Geometry = B::Geometry;
type Geometry = crate::Geometry;
fn draw(&mut self, layers: Vec<Self::Geometry>) {
self.primitives
.extend(layers.into_iter().map(B::Geometry::into));
.extend(layers.into_iter().map(crate::Geometry::into));
}
}

View file

@ -8,7 +8,6 @@ license = "MIT"
repository = "https://github.com/iced-rs/iced"
[features]
canvas = ["lyon_path"]
debug = []
[dependencies]
@ -29,7 +28,3 @@ features = ["thread-pool"]
[dependencies.iced_style]
version = "0.7"
path = "../style"
[dependencies.lyon_path]
version = "1"
optional = true

View file

@ -6,8 +6,7 @@ edition = "2021"
[features]
image = ["iced_wgpu/image", "iced_tiny_skia/image"]
svg = ["iced_wgpu/svg", "iced_tiny_skia/svg"]
canvas = ["iced_wgpu/canvas", "iced_tiny_skia/canvas"]
qr_code = ["canvas", "qrcode"]
geometry = ["iced_wgpu/geometry", "iced_tiny_skia/geometry"]
tracing = ["iced_wgpu/tracing"]
[dependencies]
@ -31,8 +30,3 @@ iced_wgpu = { version = "0.9", path = "../wgpu" }
[target.'cfg(target_arch = "wasm32")'.dependencies]
iced_wgpu = { version = "0.9", path = "../wgpu", features = ["webgl"] }
[dependencies.qrcode]
version = "0.12"
optional = true
default-features = false

View file

@ -1,4 +1,4 @@
use crate::{Font, Geometry, Point, Size};
use crate::{Font, Point, Size};
use iced_graphics::backend;
use iced_graphics::text;
@ -12,8 +12,6 @@ pub enum Backend {
}
impl iced_graphics::Backend for Backend {
type Geometry = Geometry;
fn trim_measurements(&mut self) {
match self {
Self::Wgpu(backend) => backend.trim_measurements(),

View file

@ -2,22 +2,13 @@ mod cache;
pub use cache::Cache;
pub use iced_native::widget::canvas::event::{self, Event};
pub use iced_native::widget::canvas::fill::{self, Fill};
pub use iced_native::widget::canvas::gradient::{self, Gradient};
pub use iced_native::widget::canvas::path::{self, Path};
pub use iced_native::widget::canvas::stroke::{self, Stroke};
pub use iced_native::widget::canvas::{
Canvas, Cursor, LineCap, LineDash, LineJoin, Program, Renderer, Style, Text,
};
pub use iced_graphics::geometry::*;
use crate::{Backend, Point, Rectangle, Size, Vector};
pub use crate::Geometry;
pub enum Frame {
Wgpu(iced_wgpu::canvas::Frame),
TinySkia(iced_tiny_skia::canvas::Frame),
Wgpu(iced_wgpu::geometry::Frame),
TinySkia(iced_tiny_skia::geometry::Frame),
}
macro_rules! delegate {
@ -33,10 +24,10 @@ impl Frame {
pub fn new<Theme>(renderer: &crate::Renderer<Theme>, size: Size) -> Self {
match renderer.backend() {
Backend::Wgpu(_) => {
Frame::Wgpu(iced_wgpu::canvas::Frame::new(size))
Frame::Wgpu(iced_wgpu::geometry::Frame::new(size))
}
Backend::TinySkia(_) => {
Frame::TinySkia(iced_tiny_skia::canvas::Frame::new(size))
Frame::TinySkia(iced_tiny_skia::geometry::Frame::new(size))
}
}
}
@ -131,10 +122,10 @@ impl Frame {
pub fn with_clip(&mut self, region: Rectangle, f: impl FnOnce(&mut Frame)) {
let mut frame = match self {
Self::Wgpu(_) => {
Self::Wgpu(iced_wgpu::canvas::Frame::new(region.size()))
Self::Wgpu(iced_wgpu::geometry::Frame::new(region.size()))
}
Self::TinySkia(_) => Self::TinySkia(
iced_tiny_skia::canvas::Frame::new(region.size()),
iced_tiny_skia::geometry::Frame::new(region.size()),
),
};

View file

@ -1,4 +1,4 @@
use crate::widget::canvas::{Frame, Geometry};
use crate::geometry::{Frame, Geometry};
use crate::{Primitive, Renderer, Size};
use std::cell::RefCell;

View file

@ -1,6 +1,8 @@
pub mod widget;
pub mod window;
#[cfg(feature = "geometry")]
pub mod geometry;
mod backend;
mod settings;
@ -19,12 +21,3 @@ pub use iced_graphics::{
/// [`iced`]: https://github.com/iced-rs/iced
pub type Renderer<Theme = iced_native::Theme> =
iced_graphics::Renderer<Backend, Theme>;
#[derive(Debug, Clone)]
pub struct Geometry(pub(crate) Primitive);
impl From<Geometry> for Primitive {
fn from(geometry: Geometry) -> Self {
geometry.0
}
}

View file

@ -165,14 +165,14 @@ pub use vertical_slider::VerticalSlider;
#[cfg(feature = "canvas")]
#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))]
pub use iced_renderer::widget::canvas;
pub mod canvas;
#[cfg(feature = "canvas")]
#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))]
/// Creates a new [`Canvas`].
pub fn canvas<P, Message, Renderer>(program: P) -> Canvas<Message, Renderer, P>
pub fn canvas<P, Message, Renderer>(program: P) -> Canvas<P, Message, Renderer>
where
Renderer: canvas::Renderer,
Renderer: iced_renderer::geometry::Renderer,
P: canvas::Program<Message, Renderer>,
{
Canvas::new(program)
@ -193,7 +193,7 @@ pub mod image {
#[cfg(feature = "qr_code")]
#[cfg_attr(docsrs, doc(cfg(feature = "qr_code")))]
pub use iced_renderer::widget::qr_code;
pub mod qr_code;
#[cfg(feature = "svg")]
#[cfg_attr(docsrs, doc(cfg(feature = "svg")))]

View file

@ -1,35 +1,22 @@
//! Draw 2D graphics for your users.
//!
//! A [`Canvas`] widget can be used to draw different kinds of 2D shapes in a
//! [`Frame`]. It can be used for animation, data visualization, game graphics,
//! and more!
pub mod event;
pub mod fill;
pub mod path;
pub mod stroke;
mod cursor;
mod program;
mod style;
mod text;
pub use crate::gradient::{self, Gradient};
pub use cursor::Cursor;
pub use event::Event;
pub use fill::Fill;
pub use path::Path;
pub use program::Program;
pub use stroke::{LineCap, LineDash, LineJoin, Stroke};
pub use style::Style;
pub use text::Text;
use crate::layout::{self, Layout};
use crate::mouse;
use crate::renderer;
use crate::widget::tree::{self, Tree};
use crate::{
Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector, Widget,
};
pub use iced_renderer::geometry::*;
use crate::{Length, Point, Rectangle, Size, Vector};
use iced_native::layout::{self, Layout};
use iced_native::mouse;
use iced_native::renderer;
use iced_native::widget::tree::{self, Tree};
use iced_native::{Clipboard, Element, Shell, Widget};
use std::marker::PhantomData;
@ -39,14 +26,8 @@ use std::marker::PhantomData;
/// If you want to get a quick overview, here's how we can draw a simple circle:
///
/// ```no_run
/// # mod iced {
/// # pub mod widget {
/// # pub use iced_graphics::widget::canvas;
/// # }
/// # pub use iced_native::{Color, Rectangle, Theme};
/// # }
/// use iced::widget::canvas::{self, Canvas, Cursor, Fill, Frame, Geometry, Path, Program};
/// use iced::{Color, Rectangle, Theme};
/// use iced::{Color, Rectangle, Theme, Renderer};
///
/// // First, we define the data we need for drawing
/// #[derive(Debug)]
@ -58,9 +39,9 @@ use std::marker::PhantomData;
/// impl Program<()> for Circle {
/// type State = ();
///
/// fn draw(&self, _state: &(), _theme: &Theme, bounds: Rectangle, _cursor: Cursor) -> Vec<Geometry>{
/// fn draw(&self, _state: &(), renderer: &Renderer, _theme: &Theme, bounds: Rectangle, _cursor: Cursor) -> Vec<Geometry>{
/// // We prepare a new `Frame`
/// let mut frame = Frame::new(bounds.size());
/// let mut frame = Frame::new(renderer, bounds.size());
///
/// // We create a `Path` representing a simple circle
/// let circle = Path::circle(frame.center(), self.radius);
@ -77,9 +58,9 @@ use std::marker::PhantomData;
/// let canvas = Canvas::new(Circle { radius: 50.0 });
/// ```
#[derive(Debug)]
pub struct Canvas<Message, Renderer, P>
pub struct Canvas<P, Message, Renderer = crate::Renderer>
where
Renderer: self::Renderer,
Renderer: iced_renderer::geometry::Renderer,
P: Program<Message, Renderer>,
{
width: Length,
@ -89,9 +70,9 @@ where
theme_: PhantomData<Renderer>,
}
impl<Message, Renderer, P> Canvas<Message, Renderer, P>
impl<P, Message, Renderer> Canvas<P, Message, Renderer>
where
Renderer: self::Renderer,
Renderer: iced_renderer::geometry::Renderer,
P: Program<Message, Renderer>,
{
const DEFAULT_SIZE: f32 = 100.0;
@ -120,10 +101,10 @@ where
}
}
impl<Message, Renderer, P> Widget<Message, Renderer>
for Canvas<Message, Renderer, P>
impl<P, Message, Renderer> Widget<Message, Renderer>
for Canvas<P, Message, Renderer>
where
Renderer: self::Renderer,
Renderer: iced_renderer::geometry::Renderer,
P: Program<Message, Renderer>,
{
fn tag(&self) -> tree::Tag {
@ -157,7 +138,7 @@ where
fn on_event(
&mut self,
tree: &mut Tree,
event: crate::Event,
event: iced_native::Event,
layout: Layout<'_>,
cursor_position: Point,
_renderer: &Renderer,
@ -167,9 +148,13 @@ where
let bounds = layout.bounds();
let canvas_event = match event {
crate::Event::Mouse(mouse_event) => Some(Event::Mouse(mouse_event)),
crate::Event::Touch(touch_event) => Some(Event::Touch(touch_event)),
crate::Event::Keyboard(keyboard_event) => {
iced_native::Event::Mouse(mouse_event) => {
Some(Event::Mouse(mouse_event))
}
iced_native::Event::Touch(touch_event) => {
Some(Event::Touch(touch_event))
}
iced_native::Event::Keyboard(keyboard_event) => {
Some(Event::Keyboard(keyboard_event))
}
_ => None,
@ -238,22 +223,16 @@ where
}
}
impl<'a, Message, Renderer, P> From<Canvas<Message, Renderer, P>>
impl<'a, P, Message, Renderer> From<Canvas<P, Message, Renderer>>
for Element<'a, Message, Renderer>
where
Message: 'a,
Renderer: 'a + self::Renderer,
Renderer: 'a + iced_renderer::geometry::Renderer,
P: Program<Message, Renderer> + 'a,
{
fn from(
canvas: Canvas<Message, Renderer, P>,
canvas: Canvas<P, Message, Renderer>,
) -> Element<'a, Message, Renderer> {
Element::new(canvas)
}
}
pub trait Renderer: crate::Renderer {
type Geometry;
fn draw(&mut self, geometry: Vec<Self::Geometry>);
}

View file

@ -1,9 +1,9 @@
//! Handle events of a canvas.
use crate::keyboard;
use crate::mouse;
use crate::touch;
use iced_native::keyboard;
use iced_native::mouse;
use iced_native::touch;
pub use crate::event::Status;
pub use iced_native::event::Status;
/// A [`Canvas`] event.
///

View file

@ -1,6 +1,6 @@
use crate::widget::canvas::event::{self, Event};
use crate::widget::canvas::mouse;
use crate::widget::canvas::{Cursor, Renderer};
use crate::widget::canvas::Cursor;
use crate::Rectangle;
/// The state and logic of a [`Canvas`].
@ -9,9 +9,9 @@ use crate::Rectangle;
/// application.
///
/// [`Canvas`]: crate::widget::Canvas
pub trait Program<Message, Renderer>
pub trait Program<Message, Renderer = crate::Renderer>
where
Renderer: self::Renderer,
Renderer: iced_renderer::geometry::Renderer,
{
/// The internal state mutated by the [`Program`].
type State: Default + 'static;
@ -71,7 +71,7 @@ where
impl<Message, Renderer, T> Program<Message, Renderer> for &T
where
Renderer: self::Renderer,
Renderer: iced_renderer::geometry::Renderer,
T: Program<Message, Renderer>,
{
type State = T::State;

View file

@ -2,9 +2,8 @@
use crate::widget::canvas;
use crate::Renderer;
use iced_graphics::renderer;
use iced_native::layout;
use iced_native::renderer;
use iced_native::widget::Tree;
use iced_native::{
Color, Element, Layout, Length, Point, Rectangle, Size, Vector, Widget,

View file

@ -6,7 +6,7 @@ edition = "2021"
[features]
image = []
svg = []
canvas = ["iced_native/canvas"]
geometry = ["iced_graphics/geometry"]
[dependencies]
raw-window-handle = "0.5"

View file

@ -436,8 +436,6 @@ fn adjust_clip_mask(
}
impl iced_graphics::Backend for Backend {
type Geometry = ();
fn trim_measurements(&mut self) {
self.text_pipeline.trim_measurement_cache();
}

View file

@ -1,9 +1,9 @@
use crate::{Point, Primitive, Rectangle, Size, Vector};
use iced_native::widget::canvas::fill::{self, Fill};
use iced_native::widget::canvas::stroke::{self, Stroke};
use iced_native::widget::canvas::{Path, Style, Text};
use iced_native::Gradient;
use iced_graphics::geometry::fill::{self, Fill};
use iced_graphics::geometry::stroke::{self, Stroke};
use iced_graphics::geometry::{Path, Style, Text};
use iced_graphics::Gradient;
pub struct Frame {
size: Size,
@ -152,7 +152,7 @@ impl Frame {
}
fn convert_path(path: &Path) -> tiny_skia::Path {
use iced_native::widget::canvas::path::lyon_path;
use iced_graphics::geometry::path::lyon_path;
let mut builder = tiny_skia::PathBuilder::new();
let mut last_point = Default::default();

View file

@ -4,8 +4,8 @@ mod backend;
mod settings;
mod text;
#[cfg(feature = "canvas")]
pub mod canvas;
#[cfg(feature = "geometry")]
pub mod geometry;
pub use iced_graphics::primitive;

View file

@ -21,7 +21,7 @@ bmp = ["iced_graphics/bmp"]
hdr = ["iced_graphics/hdr"]
dds = ["iced_graphics/dds"]
farbfeld = ["iced_graphics/farbfeld"]
canvas = ["iced_graphics/canvas", "lyon"]
geometry = ["iced_graphics/geometry", "lyon"]
spirv = ["wgpu/spirv"]
webgl = ["wgpu/webgl"]

View file

@ -329,8 +329,6 @@ impl Backend {
}
impl iced_graphics::Backend for Backend {
type Geometry = ();
fn trim_measurements(&mut self) {
self.text_pipeline.trim_measurement_cache()
}

View file

@ -1,9 +1,9 @@
use iced_graphics::primitive::{self, Primitive};
use iced_native::widget::canvas::fill::{self, Fill};
use iced_native::widget::canvas::{
use iced_graphics::geometry::fill::{self, Fill};
use iced_graphics::geometry::{
LineCap, LineDash, LineJoin, Path, Stroke, Style, Text,
};
use iced_native::{Gradient, Point, Rectangle, Size, Vector};
use iced_graphics::primitive::{self, Primitive};
use iced_graphics::{Gradient, Point, Rectangle, Size, Vector};
use lyon::geom::euclid;
use lyon::tessellation;

View file

@ -41,8 +41,8 @@ pub mod layer;
pub mod settings;
pub mod window;
#[cfg(feature = "canvas")]
pub mod canvas;
#[cfg(feature = "geometry")]
pub mod geometry;
mod backend;
mod buffer;