Move Canvas and QRCode to iced crate
Rename `canvas` modules to `geometry` in graphics subcrates
This commit is contained in:
parent
d13d19ba35
commit
6cc48b5c62
39 changed files with 140 additions and 148 deletions
|
|
@ -17,9 +17,9 @@ image = ["iced_renderer/image", "image_rs"]
|
||||||
# Enables the `Svg` widget
|
# Enables the `Svg` widget
|
||||||
svg = ["iced_renderer/svg"]
|
svg = ["iced_renderer/svg"]
|
||||||
# Enables the `Canvas` widget
|
# Enables the `Canvas` widget
|
||||||
canvas = ["iced_renderer/canvas"]
|
canvas = ["iced_renderer/geometry"]
|
||||||
# Enables the `QRCode` widget
|
# Enables the `QRCode` widget
|
||||||
qr_code = ["iced_renderer/qr_code"]
|
qr_code = ["canvas", "qrcode"]
|
||||||
# Enables a debug view in native platforms (press F12)
|
# Enables a debug view in native platforms (press F12)
|
||||||
debug = ["iced_winit/debug"]
|
debug = ["iced_winit/debug"]
|
||||||
# Enables `tokio` as the `executor::Default` on native platforms
|
# Enables `tokio` as the `executor::Default` on native platforms
|
||||||
|
|
@ -69,6 +69,11 @@ version = "0.24"
|
||||||
package = "image"
|
package = "image"
|
||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
|
[dependencies.qrcode]
|
||||||
|
version = "0.12"
|
||||||
|
optional = true
|
||||||
|
default-features = false
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
rustdoc-args = ["--cfg", "docsrs"]
|
rustdoc-args = ["--cfg", "docsrs"]
|
||||||
features = ["image", "svg", "canvas", "qr_code"]
|
features = ["image", "svg", "canvas", "qr_code"]
|
||||||
|
|
|
||||||
|
|
@ -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 = ();
|
type State = ();
|
||||||
|
|
||||||
fn draw(
|
fn draw(
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ mod bezier {
|
||||||
curves: &'a [Curve],
|
curves: &'a [Curve],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> canvas::Program<Curve, Renderer> for Bezier<'a> {
|
impl<'a> canvas::Program<Curve> for Bezier<'a> {
|
||||||
type State = Option<Pending>;
|
type State = Option<Pending>;
|
||||||
|
|
||||||
fn update(
|
fn update(
|
||||||
|
|
|
||||||
|
|
@ -237,7 +237,7 @@ impl Theme {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Message> canvas::Program<Message, Renderer> for Theme {
|
impl<Message> canvas::Program<Message> for Theme {
|
||||||
type State = ();
|
type State = ();
|
||||||
|
|
||||||
fn draw(
|
fn draw(
|
||||||
|
|
|
||||||
|
|
@ -393,7 +393,7 @@ mod grid {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl canvas::Program<Message, Renderer> for Grid {
|
impl canvas::Program<Message> for Grid {
|
||||||
type State = Interaction;
|
type State = Interaction;
|
||||||
|
|
||||||
fn update(
|
fn update(
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ struct SierpinskiGraph {
|
||||||
cache: canvas::Cache,
|
cache: canvas::Cache,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl canvas::Program<Message, Renderer> for SierpinskiGraph {
|
impl canvas::Program<Message> for SierpinskiGraph {
|
||||||
type State = ();
|
type State = ();
|
||||||
|
|
||||||
fn update(
|
fn update(
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ impl State {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Message> canvas::Program<Message, Renderer> for State {
|
impl<Message> canvas::Program<Message> for State {
|
||||||
type State = ();
|
type State = ();
|
||||||
|
|
||||||
fn draw(
|
fn draw(
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ bmp = ["image_rs/bmp"]
|
||||||
hdr = ["image_rs/hdr"]
|
hdr = ["image_rs/hdr"]
|
||||||
dds = ["image_rs/dds"]
|
dds = ["image_rs/dds"]
|
||||||
farbfeld = ["image_rs/farbfeld"]
|
farbfeld = ["image_rs/farbfeld"]
|
||||||
canvas = ["iced_native/canvas"]
|
geometry = ["lyon_path"]
|
||||||
opengl = []
|
opengl = []
|
||||||
image_rs = ["kamadak-exif"]
|
image_rs = ["kamadak-exif"]
|
||||||
|
|
||||||
|
|
@ -65,6 +65,10 @@ optional = true
|
||||||
version = "0.5"
|
version = "0.5"
|
||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
|
[dependencies.lyon_path]
|
||||||
|
version = "1"
|
||||||
|
optional = true
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
rustdoc-args = ["--cfg", "docsrs"]
|
rustdoc-args = ["--cfg", "docsrs"]
|
||||||
all-features = true
|
all-features = true
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,6 @@ use std::borrow::Cow;
|
||||||
///
|
///
|
||||||
/// [`Renderer`]: crate::Renderer
|
/// [`Renderer`]: crate::Renderer
|
||||||
pub trait Backend {
|
pub trait Backend {
|
||||||
type Geometry: Into<crate::Primitive>;
|
|
||||||
|
|
||||||
/// Trims the measurements cache.
|
/// Trims the measurements cache.
|
||||||
///
|
///
|
||||||
/// This method is currently necessary to properly trim the text cache in
|
/// This method is currently necessary to properly trim the text cache in
|
||||||
|
|
|
||||||
36
graphics/src/geometry.rs
Normal file
36
graphics/src/geometry.rs
Normal 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>);
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
//! Fill [crate::widget::canvas::Geometry] with a certain style.
|
//! Fill [crate::widget::canvas::Geometry] with a certain style.
|
||||||
use crate::widget::canvas::Gradient;
|
use crate::{Color, Gradient};
|
||||||
use crate::Color;
|
|
||||||
|
|
||||||
pub use crate::widget::canvas::Style;
|
pub use crate::geometry::Style;
|
||||||
|
|
||||||
/// The style used to fill geometry.
|
/// The style used to fill geometry.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::widget::canvas::path::{arc, Arc, Path};
|
use crate::geometry::path::{arc, Arc, Path};
|
||||||
use crate::{Point, Size};
|
use crate::{Point, Size};
|
||||||
|
|
||||||
use lyon_path::builder::{self, SvgPathBuilder};
|
use lyon_path::builder::{self, SvgPathBuilder};
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
//! Create lines from a [crate::widget::canvas::Path] and assigns them various attributes/styles.
|
//! 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;
|
use crate::Color;
|
||||||
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
use crate::widget::canvas::Gradient;
|
use crate::{Color, Gradient};
|
||||||
use crate::Color;
|
|
||||||
|
|
||||||
/// The coloring style of some drawing.
|
/// The coloring style of some drawing.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
|
|
@ -33,6 +33,9 @@ pub mod primitive;
|
||||||
pub mod renderer;
|
pub mod renderer;
|
||||||
pub mod window;
|
pub mod window;
|
||||||
|
|
||||||
|
#[cfg(feature = "geometry")]
|
||||||
|
pub mod geometry;
|
||||||
|
|
||||||
pub use antialiasing::Antialiasing;
|
pub use antialiasing::Antialiasing;
|
||||||
pub use backend::Backend;
|
pub use backend::Backend;
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
|
|
@ -41,6 +44,9 @@ pub use renderer::Renderer;
|
||||||
pub use transformation::Transformation;
|
pub use transformation::Transformation;
|
||||||
pub use viewport::Viewport;
|
pub use viewport::Viewport;
|
||||||
|
|
||||||
|
#[cfg(feature = "geometry")]
|
||||||
|
pub use geometry::Geometry;
|
||||||
|
|
||||||
pub use iced_native::alignment;
|
pub use iced_native::alignment;
|
||||||
pub use iced_native::text;
|
pub use iced_native::text;
|
||||||
pub use iced_native::{
|
pub use iced_native::{
|
||||||
|
|
|
||||||
|
|
@ -215,15 +215,15 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "canvas")]
|
#[cfg(feature = "geometry")]
|
||||||
impl<B, T> iced_native::widget::canvas::Renderer for Renderer<B, T>
|
impl<B, T> crate::geometry::Renderer for Renderer<B, T>
|
||||||
where
|
where
|
||||||
B: Backend,
|
B: Backend,
|
||||||
{
|
{
|
||||||
type Geometry = B::Geometry;
|
type Geometry = crate::Geometry;
|
||||||
|
|
||||||
fn draw(&mut self, layers: Vec<Self::Geometry>) {
|
fn draw(&mut self, layers: Vec<Self::Geometry>) {
|
||||||
self.primitives
|
self.primitives
|
||||||
.extend(layers.into_iter().map(B::Geometry::into));
|
.extend(layers.into_iter().map(crate::Geometry::into));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ license = "MIT"
|
||||||
repository = "https://github.com/iced-rs/iced"
|
repository = "https://github.com/iced-rs/iced"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
canvas = ["lyon_path"]
|
|
||||||
debug = []
|
debug = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
@ -29,7 +28,3 @@ features = ["thread-pool"]
|
||||||
[dependencies.iced_style]
|
[dependencies.iced_style]
|
||||||
version = "0.7"
|
version = "0.7"
|
||||||
path = "../style"
|
path = "../style"
|
||||||
|
|
||||||
[dependencies.lyon_path]
|
|
||||||
version = "1"
|
|
||||||
optional = true
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,7 @@ edition = "2021"
|
||||||
[features]
|
[features]
|
||||||
image = ["iced_wgpu/image", "iced_tiny_skia/image"]
|
image = ["iced_wgpu/image", "iced_tiny_skia/image"]
|
||||||
svg = ["iced_wgpu/svg", "iced_tiny_skia/svg"]
|
svg = ["iced_wgpu/svg", "iced_tiny_skia/svg"]
|
||||||
canvas = ["iced_wgpu/canvas", "iced_tiny_skia/canvas"]
|
geometry = ["iced_wgpu/geometry", "iced_tiny_skia/geometry"]
|
||||||
qr_code = ["canvas", "qrcode"]
|
|
||||||
tracing = ["iced_wgpu/tracing"]
|
tracing = ["iced_wgpu/tracing"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
@ -31,8 +30,3 @@ iced_wgpu = { version = "0.9", path = "../wgpu" }
|
||||||
|
|
||||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||||
iced_wgpu = { version = "0.9", path = "../wgpu", features = ["webgl"] }
|
iced_wgpu = { version = "0.9", path = "../wgpu", features = ["webgl"] }
|
||||||
|
|
||||||
[dependencies.qrcode]
|
|
||||||
version = "0.12"
|
|
||||||
optional = true
|
|
||||||
default-features = false
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{Font, Geometry, Point, Size};
|
use crate::{Font, Point, Size};
|
||||||
|
|
||||||
use iced_graphics::backend;
|
use iced_graphics::backend;
|
||||||
use iced_graphics::text;
|
use iced_graphics::text;
|
||||||
|
|
@ -12,8 +12,6 @@ pub enum Backend {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl iced_graphics::Backend for Backend {
|
impl iced_graphics::Backend for Backend {
|
||||||
type Geometry = Geometry;
|
|
||||||
|
|
||||||
fn trim_measurements(&mut self) {
|
fn trim_measurements(&mut self) {
|
||||||
match self {
|
match self {
|
||||||
Self::Wgpu(backend) => backend.trim_measurements(),
|
Self::Wgpu(backend) => backend.trim_measurements(),
|
||||||
|
|
|
||||||
|
|
@ -2,22 +2,13 @@ mod cache;
|
||||||
|
|
||||||
pub use cache::Cache;
|
pub use cache::Cache;
|
||||||
|
|
||||||
pub use iced_native::widget::canvas::event::{self, Event};
|
pub use iced_graphics::geometry::*;
|
||||||
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,
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::{Backend, Point, Rectangle, Size, Vector};
|
use crate::{Backend, Point, Rectangle, Size, Vector};
|
||||||
|
|
||||||
pub use crate::Geometry;
|
|
||||||
|
|
||||||
pub enum Frame {
|
pub enum Frame {
|
||||||
Wgpu(iced_wgpu::canvas::Frame),
|
Wgpu(iced_wgpu::geometry::Frame),
|
||||||
TinySkia(iced_tiny_skia::canvas::Frame),
|
TinySkia(iced_tiny_skia::geometry::Frame),
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! delegate {
|
macro_rules! delegate {
|
||||||
|
|
@ -33,10 +24,10 @@ impl Frame {
|
||||||
pub fn new<Theme>(renderer: &crate::Renderer<Theme>, size: Size) -> Self {
|
pub fn new<Theme>(renderer: &crate::Renderer<Theme>, size: Size) -> Self {
|
||||||
match renderer.backend() {
|
match renderer.backend() {
|
||||||
Backend::Wgpu(_) => {
|
Backend::Wgpu(_) => {
|
||||||
Frame::Wgpu(iced_wgpu::canvas::Frame::new(size))
|
Frame::Wgpu(iced_wgpu::geometry::Frame::new(size))
|
||||||
}
|
}
|
||||||
Backend::TinySkia(_) => {
|
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)) {
|
pub fn with_clip(&mut self, region: Rectangle, f: impl FnOnce(&mut Frame)) {
|
||||||
let mut frame = match self {
|
let mut frame = match self {
|
||||||
Self::Wgpu(_) => {
|
Self::Wgpu(_) => {
|
||||||
Self::Wgpu(iced_wgpu::canvas::Frame::new(region.size()))
|
Self::Wgpu(iced_wgpu::geometry::Frame::new(region.size()))
|
||||||
}
|
}
|
||||||
Self::TinySkia(_) => Self::TinySkia(
|
Self::TinySkia(_) => Self::TinySkia(
|
||||||
iced_tiny_skia::canvas::Frame::new(region.size()),
|
iced_tiny_skia::geometry::Frame::new(region.size()),
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::widget::canvas::{Frame, Geometry};
|
use crate::geometry::{Frame, Geometry};
|
||||||
use crate::{Primitive, Renderer, Size};
|
use crate::{Primitive, Renderer, Size};
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
pub mod widget;
|
|
||||||
pub mod window;
|
pub mod window;
|
||||||
|
|
||||||
|
#[cfg(feature = "geometry")]
|
||||||
|
pub mod geometry;
|
||||||
|
|
||||||
mod backend;
|
mod backend;
|
||||||
mod settings;
|
mod settings;
|
||||||
|
|
||||||
|
|
@ -19,12 +21,3 @@ pub use iced_graphics::{
|
||||||
/// [`iced`]: https://github.com/iced-rs/iced
|
/// [`iced`]: https://github.com/iced-rs/iced
|
||||||
pub type Renderer<Theme = iced_native::Theme> =
|
pub type Renderer<Theme = iced_native::Theme> =
|
||||||
iced_graphics::Renderer<Backend, 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -165,14 +165,14 @@ pub use vertical_slider::VerticalSlider;
|
||||||
|
|
||||||
#[cfg(feature = "canvas")]
|
#[cfg(feature = "canvas")]
|
||||||
#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))]
|
#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))]
|
||||||
pub use iced_renderer::widget::canvas;
|
pub mod canvas;
|
||||||
|
|
||||||
#[cfg(feature = "canvas")]
|
#[cfg(feature = "canvas")]
|
||||||
#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))]
|
#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))]
|
||||||
/// Creates a new [`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
|
where
|
||||||
Renderer: canvas::Renderer,
|
Renderer: iced_renderer::geometry::Renderer,
|
||||||
P: canvas::Program<Message, Renderer>,
|
P: canvas::Program<Message, Renderer>,
|
||||||
{
|
{
|
||||||
Canvas::new(program)
|
Canvas::new(program)
|
||||||
|
|
@ -193,7 +193,7 @@ pub mod image {
|
||||||
|
|
||||||
#[cfg(feature = "qr_code")]
|
#[cfg(feature = "qr_code")]
|
||||||
#[cfg_attr(docsrs, doc(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(feature = "svg")]
|
||||||
#[cfg_attr(docsrs, doc(cfg(feature = "svg")))]
|
#[cfg_attr(docsrs, doc(cfg(feature = "svg")))]
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,22 @@
|
||||||
//! Draw 2D graphics for your users.
|
//! 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 event;
|
||||||
pub mod fill;
|
|
||||||
pub mod path;
|
|
||||||
pub mod stroke;
|
|
||||||
|
|
||||||
mod cursor;
|
mod cursor;
|
||||||
mod program;
|
mod program;
|
||||||
mod style;
|
|
||||||
mod text;
|
|
||||||
|
|
||||||
pub use crate::gradient::{self, Gradient};
|
|
||||||
pub use cursor::Cursor;
|
pub use cursor::Cursor;
|
||||||
pub use event::Event;
|
pub use event::Event;
|
||||||
pub use fill::Fill;
|
|
||||||
pub use path::Path;
|
|
||||||
pub use program::Program;
|
pub use program::Program;
|
||||||
pub use stroke::{LineCap, LineDash, LineJoin, Stroke};
|
|
||||||
pub use style::Style;
|
|
||||||
pub use text::Text;
|
|
||||||
|
|
||||||
use crate::layout::{self, Layout};
|
pub use iced_renderer::geometry::*;
|
||||||
use crate::mouse;
|
|
||||||
use crate::renderer;
|
use crate::{Length, Point, Rectangle, Size, Vector};
|
||||||
use crate::widget::tree::{self, Tree};
|
|
||||||
use crate::{
|
use iced_native::layout::{self, Layout};
|
||||||
Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector, Widget,
|
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;
|
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:
|
/// If you want to get a quick overview, here's how we can draw a simple circle:
|
||||||
///
|
///
|
||||||
/// ```no_run
|
/// ```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::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
|
/// // First, we define the data we need for drawing
|
||||||
/// #[derive(Debug)]
|
/// #[derive(Debug)]
|
||||||
|
|
@ -58,9 +39,9 @@ use std::marker::PhantomData;
|
||||||
/// impl Program<()> for Circle {
|
/// impl Program<()> for Circle {
|
||||||
/// type State = ();
|
/// 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`
|
/// // 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
|
/// // We create a `Path` representing a simple circle
|
||||||
/// let circle = Path::circle(frame.center(), self.radius);
|
/// let circle = Path::circle(frame.center(), self.radius);
|
||||||
|
|
@ -77,9 +58,9 @@ use std::marker::PhantomData;
|
||||||
/// let canvas = Canvas::new(Circle { radius: 50.0 });
|
/// let canvas = Canvas::new(Circle { radius: 50.0 });
|
||||||
/// ```
|
/// ```
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Canvas<Message, Renderer, P>
|
pub struct Canvas<P, Message, Renderer = crate::Renderer>
|
||||||
where
|
where
|
||||||
Renderer: self::Renderer,
|
Renderer: iced_renderer::geometry::Renderer,
|
||||||
P: Program<Message, Renderer>,
|
P: Program<Message, Renderer>,
|
||||||
{
|
{
|
||||||
width: Length,
|
width: Length,
|
||||||
|
|
@ -89,9 +70,9 @@ where
|
||||||
theme_: PhantomData<Renderer>,
|
theme_: PhantomData<Renderer>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Message, Renderer, P> Canvas<Message, Renderer, P>
|
impl<P, Message, Renderer> Canvas<P, Message, Renderer>
|
||||||
where
|
where
|
||||||
Renderer: self::Renderer,
|
Renderer: iced_renderer::geometry::Renderer,
|
||||||
P: Program<Message, Renderer>,
|
P: Program<Message, Renderer>,
|
||||||
{
|
{
|
||||||
const DEFAULT_SIZE: f32 = 100.0;
|
const DEFAULT_SIZE: f32 = 100.0;
|
||||||
|
|
@ -120,10 +101,10 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Message, Renderer, P> Widget<Message, Renderer>
|
impl<P, Message, Renderer> Widget<Message, Renderer>
|
||||||
for Canvas<Message, Renderer, P>
|
for Canvas<P, Message, Renderer>
|
||||||
where
|
where
|
||||||
Renderer: self::Renderer,
|
Renderer: iced_renderer::geometry::Renderer,
|
||||||
P: Program<Message, Renderer>,
|
P: Program<Message, Renderer>,
|
||||||
{
|
{
|
||||||
fn tag(&self) -> tree::Tag {
|
fn tag(&self) -> tree::Tag {
|
||||||
|
|
@ -157,7 +138,7 @@ where
|
||||||
fn on_event(
|
fn on_event(
|
||||||
&mut self,
|
&mut self,
|
||||||
tree: &mut Tree,
|
tree: &mut Tree,
|
||||||
event: crate::Event,
|
event: iced_native::Event,
|
||||||
layout: Layout<'_>,
|
layout: Layout<'_>,
|
||||||
cursor_position: Point,
|
cursor_position: Point,
|
||||||
_renderer: &Renderer,
|
_renderer: &Renderer,
|
||||||
|
|
@ -167,9 +148,13 @@ where
|
||||||
let bounds = layout.bounds();
|
let bounds = layout.bounds();
|
||||||
|
|
||||||
let canvas_event = match event {
|
let canvas_event = match event {
|
||||||
crate::Event::Mouse(mouse_event) => Some(Event::Mouse(mouse_event)),
|
iced_native::Event::Mouse(mouse_event) => {
|
||||||
crate::Event::Touch(touch_event) => Some(Event::Touch(touch_event)),
|
Some(Event::Mouse(mouse_event))
|
||||||
crate::Event::Keyboard(keyboard_event) => {
|
}
|
||||||
|
iced_native::Event::Touch(touch_event) => {
|
||||||
|
Some(Event::Touch(touch_event))
|
||||||
|
}
|
||||||
|
iced_native::Event::Keyboard(keyboard_event) => {
|
||||||
Some(Event::Keyboard(keyboard_event))
|
Some(Event::Keyboard(keyboard_event))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => 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>
|
for Element<'a, Message, Renderer>
|
||||||
where
|
where
|
||||||
Message: 'a,
|
Message: 'a,
|
||||||
Renderer: 'a + self::Renderer,
|
Renderer: 'a + iced_renderer::geometry::Renderer,
|
||||||
P: Program<Message, Renderer> + 'a,
|
P: Program<Message, Renderer> + 'a,
|
||||||
{
|
{
|
||||||
fn from(
|
fn from(
|
||||||
canvas: Canvas<Message, Renderer, P>,
|
canvas: Canvas<P, Message, Renderer>,
|
||||||
) -> Element<'a, Message, Renderer> {
|
) -> Element<'a, Message, Renderer> {
|
||||||
Element::new(canvas)
|
Element::new(canvas)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Renderer: crate::Renderer {
|
|
||||||
type Geometry;
|
|
||||||
|
|
||||||
fn draw(&mut self, geometry: Vec<Self::Geometry>);
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
//! Handle events of a canvas.
|
//! Handle events of a canvas.
|
||||||
use crate::keyboard;
|
use iced_native::keyboard;
|
||||||
use crate::mouse;
|
use iced_native::mouse;
|
||||||
use crate::touch;
|
use iced_native::touch;
|
||||||
|
|
||||||
pub use crate::event::Status;
|
pub use iced_native::event::Status;
|
||||||
|
|
||||||
/// A [`Canvas`] event.
|
/// A [`Canvas`] event.
|
||||||
///
|
///
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::widget::canvas::event::{self, Event};
|
use crate::widget::canvas::event::{self, Event};
|
||||||
use crate::widget::canvas::mouse;
|
use crate::widget::canvas::mouse;
|
||||||
use crate::widget::canvas::{Cursor, Renderer};
|
use crate::widget::canvas::Cursor;
|
||||||
use crate::Rectangle;
|
use crate::Rectangle;
|
||||||
|
|
||||||
/// The state and logic of a [`Canvas`].
|
/// The state and logic of a [`Canvas`].
|
||||||
|
|
@ -9,9 +9,9 @@ use crate::Rectangle;
|
||||||
/// application.
|
/// application.
|
||||||
///
|
///
|
||||||
/// [`Canvas`]: crate::widget::Canvas
|
/// [`Canvas`]: crate::widget::Canvas
|
||||||
pub trait Program<Message, Renderer>
|
pub trait Program<Message, Renderer = crate::Renderer>
|
||||||
where
|
where
|
||||||
Renderer: self::Renderer,
|
Renderer: iced_renderer::geometry::Renderer,
|
||||||
{
|
{
|
||||||
/// The internal state mutated by the [`Program`].
|
/// The internal state mutated by the [`Program`].
|
||||||
type State: Default + 'static;
|
type State: Default + 'static;
|
||||||
|
|
@ -71,7 +71,7 @@ where
|
||||||
|
|
||||||
impl<Message, Renderer, T> Program<Message, Renderer> for &T
|
impl<Message, Renderer, T> Program<Message, Renderer> for &T
|
||||||
where
|
where
|
||||||
Renderer: self::Renderer,
|
Renderer: iced_renderer::geometry::Renderer,
|
||||||
T: Program<Message, Renderer>,
|
T: Program<Message, Renderer>,
|
||||||
{
|
{
|
||||||
type State = T::State;
|
type State = T::State;
|
||||||
|
|
@ -2,9 +2,8 @@
|
||||||
use crate::widget::canvas;
|
use crate::widget::canvas;
|
||||||
use crate::Renderer;
|
use crate::Renderer;
|
||||||
|
|
||||||
use iced_graphics::renderer;
|
|
||||||
|
|
||||||
use iced_native::layout;
|
use iced_native::layout;
|
||||||
|
use iced_native::renderer;
|
||||||
use iced_native::widget::Tree;
|
use iced_native::widget::Tree;
|
||||||
use iced_native::{
|
use iced_native::{
|
||||||
Color, Element, Layout, Length, Point, Rectangle, Size, Vector, Widget,
|
Color, Element, Layout, Length, Point, Rectangle, Size, Vector, Widget,
|
||||||
|
|
@ -6,7 +6,7 @@ edition = "2021"
|
||||||
[features]
|
[features]
|
||||||
image = []
|
image = []
|
||||||
svg = []
|
svg = []
|
||||||
canvas = ["iced_native/canvas"]
|
geometry = ["iced_graphics/geometry"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
raw-window-handle = "0.5"
|
raw-window-handle = "0.5"
|
||||||
|
|
|
||||||
|
|
@ -436,8 +436,6 @@ fn adjust_clip_mask(
|
||||||
}
|
}
|
||||||
|
|
||||||
impl iced_graphics::Backend for Backend {
|
impl iced_graphics::Backend for Backend {
|
||||||
type Geometry = ();
|
|
||||||
|
|
||||||
fn trim_measurements(&mut self) {
|
fn trim_measurements(&mut self) {
|
||||||
self.text_pipeline.trim_measurement_cache();
|
self.text_pipeline.trim_measurement_cache();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
use crate::{Point, Primitive, Rectangle, Size, Vector};
|
use crate::{Point, Primitive, Rectangle, Size, Vector};
|
||||||
|
|
||||||
use iced_native::widget::canvas::fill::{self, Fill};
|
use iced_graphics::geometry::fill::{self, Fill};
|
||||||
use iced_native::widget::canvas::stroke::{self, Stroke};
|
use iced_graphics::geometry::stroke::{self, Stroke};
|
||||||
use iced_native::widget::canvas::{Path, Style, Text};
|
use iced_graphics::geometry::{Path, Style, Text};
|
||||||
use iced_native::Gradient;
|
use iced_graphics::Gradient;
|
||||||
|
|
||||||
pub struct Frame {
|
pub struct Frame {
|
||||||
size: Size,
|
size: Size,
|
||||||
|
|
@ -152,7 +152,7 @@ impl Frame {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn convert_path(path: &Path) -> tiny_skia::Path {
|
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 builder = tiny_skia::PathBuilder::new();
|
||||||
let mut last_point = Default::default();
|
let mut last_point = Default::default();
|
||||||
|
|
@ -4,8 +4,8 @@ mod backend;
|
||||||
mod settings;
|
mod settings;
|
||||||
mod text;
|
mod text;
|
||||||
|
|
||||||
#[cfg(feature = "canvas")]
|
#[cfg(feature = "geometry")]
|
||||||
pub mod canvas;
|
pub mod geometry;
|
||||||
|
|
||||||
pub use iced_graphics::primitive;
|
pub use iced_graphics::primitive;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ bmp = ["iced_graphics/bmp"]
|
||||||
hdr = ["iced_graphics/hdr"]
|
hdr = ["iced_graphics/hdr"]
|
||||||
dds = ["iced_graphics/dds"]
|
dds = ["iced_graphics/dds"]
|
||||||
farbfeld = ["iced_graphics/farbfeld"]
|
farbfeld = ["iced_graphics/farbfeld"]
|
||||||
canvas = ["iced_graphics/canvas", "lyon"]
|
geometry = ["iced_graphics/geometry", "lyon"]
|
||||||
spirv = ["wgpu/spirv"]
|
spirv = ["wgpu/spirv"]
|
||||||
webgl = ["wgpu/webgl"]
|
webgl = ["wgpu/webgl"]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -329,8 +329,6 @@ impl Backend {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl iced_graphics::Backend for Backend {
|
impl iced_graphics::Backend for Backend {
|
||||||
type Geometry = ();
|
|
||||||
|
|
||||||
fn trim_measurements(&mut self) {
|
fn trim_measurements(&mut self) {
|
||||||
self.text_pipeline.trim_measurement_cache()
|
self.text_pipeline.trim_measurement_cache()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
use iced_graphics::primitive::{self, Primitive};
|
use iced_graphics::geometry::fill::{self, Fill};
|
||||||
use iced_native::widget::canvas::fill::{self, Fill};
|
use iced_graphics::geometry::{
|
||||||
use iced_native::widget::canvas::{
|
|
||||||
LineCap, LineDash, LineJoin, Path, Stroke, Style, Text,
|
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::geom::euclid;
|
||||||
use lyon::tessellation;
|
use lyon::tessellation;
|
||||||
|
|
@ -41,8 +41,8 @@ pub mod layer;
|
||||||
pub mod settings;
|
pub mod settings;
|
||||||
pub mod window;
|
pub mod window;
|
||||||
|
|
||||||
#[cfg(feature = "canvas")]
|
#[cfg(feature = "geometry")]
|
||||||
pub mod canvas;
|
pub mod geometry;
|
||||||
|
|
||||||
mod backend;
|
mod backend;
|
||||||
mod buffer;
|
mod buffer;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue