I’m simply trying to render a basic shape. Please ignore the name (DateElement or any other name). The program builds successfully, but the screen is just white.
Here’s the entire code:
main.rs
use iced::{widget::container, Color};
mod components;
mod core;
pub mod styles;
#[derive(Default)]
struct Sth {}
#[derive(Debug)]
enum Message {}
impl Sth
{
fn view(&self) -> iced::Element<Message>
{
container(styles::calendar::DateElement {
date: 30,
status: styles::calendar::Status::Selected,
accent: Color {
r: 0.0,
g: 0.0,
b: 0.0,
a: 0.0,
},
})
.into()
}
fn update(&mut self, message: Message) {}
}
fn main()
{
iced::run("Hi", Sth::update, Sth::view);
}
styles.rs
pub mod calendar;
calendar.rs
use iced::{
advanced::{self, layout, renderer::Quad},
border::Radius,
Background, Border, Color, Element, Length, Rectangle, Shadow, Size, Theme,
};
pub struct Style
{
pub background: Background,
pub accent_colour: Color,
}
pub enum Status
{
Selected,
Hovered,
}
pub struct DateElement
{
pub date: usize,
pub status: Status,
pub accent: Color,
}
impl<Message, Theme, Renderer> advanced::Widget<Message, Theme, Renderer> for DateElement
where
Renderer: advanced::Renderer,
{
fn size(&self) -> Size<Length>
{
Size::new(Length::Fixed(100.0), Length::Fixed(100.0))
}
fn layout(
&self,
tree: &mut advanced::widget::Tree,
renderer: &Renderer,
limits: &advanced::layout::Limits,
) -> advanced::layout::Node
{
layout::Node::new(Size {
width: 100.0,
height: 100.0,
})
}
fn draw(
&self,
tree: &advanced::widget::Tree,
renderer: &mut Renderer,
theme: &Theme,
style: &advanced::renderer::Style,
layout: advanced::Layout<'_>,
cursor: advanced::mouse::Cursor,
viewport: &iced::Rectangle,
)
{
renderer.fill_quad(
Quad {
bounds: layout.bounds(),
border: Border {
color: Color {
r: 0.4,
g: 0.9,
b: 0.762,
a: 0.1267,
},
width: 1.0,
radius: Radius {
top_left: 100.0,
top_right: 100.0,
bottom_right: 100.0,
bottom_left: 100.0,
},
},
shadow: Shadow::default(),
},
self.accent,
);
println!("Drawing DateElement at {:?}", layout.bounds());
}
}
impl<'a, Message, Renderer> From<DateElement> for Element<'a, Message, Theme, Renderer>
where
Renderer: advanced::Renderer,
{
fn from(value: DateElement) -> Self
{
Self::new(value)
}
}
I followed a tutorial on GitHub to build custom widgets: Click Here