diff --git a/examples/animation.rs b/examples/animation.rs index 3d15f1f7..f6d2f74c 100644 --- a/examples/animation.rs +++ b/examples/animation.rs @@ -12,8 +12,8 @@ use lvgl::input_device::{ }; use lvgl::misc::anim::{AnimRepeatCount, Animation}; use lvgl::style::Style; -use lvgl::widgets::{Btn, Label}; -use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part, Widget}; +use lvgl::widgets::{Btn, Label, Widget}; +use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part}; use std::thread::sleep; use std::time::Duration; use std::time::Instant; @@ -46,18 +46,18 @@ fn main() -> Result<(), LvError> { let mut screen_style = Style::default(); screen_style.set_bg_color(Color::from_rgb((0, 0, 0))); - screen.add_style(Part::Main, &mut screen_style); + screen.add_style(screen_style.into_raw(), Part::Main.into()); // Create the button let mut button = Btn::create(&mut screen)?; - button.set_align(Align::LeftMid, 30, 0); + button.align(Align::LeftMid.into(), 30, 0); button.set_size(180, 80); let mut btn_lbl = Label::create(&mut button)?; - btn_lbl.set_text(CString::new("Click me!").unwrap().as_c_str())?; + btn_lbl.set_text(CString::new("Click me!").unwrap().as_c_str()); let mut btn_state = false; let mut anim = Animation::new(&mut button, Duration::from_secs(1), 0, 60, |obj, val| { - obj.set_align(Align::LeftMid, val, 0) + obj.align(Align::LeftMid.into(), val as i16, 0) })?; anim.set_repeat_count(AnimRepeatCount::Infinite); anim.start(); @@ -66,10 +66,10 @@ fn main() -> Result<(), LvError> { if let lvgl::Event::Clicked = event { if btn_state { let nt = CString::new("Click me!").unwrap(); - btn_lbl.set_text(nt.as_c_str()).unwrap(); + btn_lbl.set_text(nt.as_c_str()); } else { let nt = CString::new("Clicked!").unwrap(); - btn_lbl.set_text(nt.as_c_str()).unwrap(); + btn_lbl.set_text(nt.as_c_str()); } btn_state = !btn_state; } diff --git a/examples/arc.rs b/examples/arc.rs index 8e10b86a..cc89a607 100644 --- a/examples/arc.rs +++ b/examples/arc.rs @@ -6,8 +6,8 @@ use embedded_graphics_simulator::{ }; use lvgl; use lvgl::style::Style; -use lvgl::widgets::{Arc, Label}; -use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part, Widget}; +use lvgl::widgets::{Arc, Label, Widget}; +use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part}; use lvgl_sys; use std::thread::sleep; use std::time::Duration; @@ -52,23 +52,23 @@ fn main() -> Result<(), LvError> { let mut screen_style = Style::default(); screen_style.set_bg_color(Color::from_rgb((255, 255, 255))); screen_style.set_radius(0); - screen.add_style(Part::Main, &mut screen_style); + screen.add_style(screen_style.into_raw(), Part::Main.into()); // Create the arc object let mut arc = Arc::create(&mut screen)?; arc.set_size(150, 150); - arc.set_align(Align::Center, 0, 10); + arc.align(Align::Center.into(), 0, 10); arc.set_start_angle(135); arc.set_end_angle(135); let mut loading_lbl = Label::create(&mut screen)?; - loading_lbl.set_text(CString::new("Loading...").unwrap().as_c_str())?; - loading_lbl.set_align(Align::OutTopMid, 0, 0); + loading_lbl.set_text(CString::new("Loading...").unwrap().as_c_str()); + loading_lbl.align(Align::OutTopMid.into(), 0, 0); //loading_lbl.set_label_align(LabelAlign::Center)?; let mut loading_style = Style::default(); loading_style.set_text_color(Color::from_rgb((0, 0, 0))); - loading_lbl.add_style(Part::Main, &mut loading_style); + loading_lbl.add_style(loading_style.into_raw(), Part::Main.into()); let mut angle = 0; let mut forward = true; @@ -82,7 +82,7 @@ fn main() -> Result<(), LvError> { println!("mem info running: {:?}", mem_info()); } angle = if forward { angle + 1 } else { angle - 1 }; - arc.set_end_angle(angle + 135)?; + arc.set_end_angle(angle + 135); i += 1; lvgl::task_handler(); diff --git a/examples/bar.rs b/examples/bar.rs index 9012f599..fd20743b 100644 --- a/examples/bar.rs +++ b/examples/bar.rs @@ -6,8 +6,8 @@ use embedded_graphics_simulator::{ }; use lvgl; use lvgl::style::Style; -use lvgl::widgets::{Bar, Label}; -use lvgl::{Align, AnimationState, Color, Display, DrawBuffer, Event, LvError, Part, Widget}; +use lvgl::widgets::{Bar, Label, Widget}; +use lvgl::{Align, AnimationState, Color, Display, DrawBuffer, Event, LvError, Part}; use std::thread::sleep; use std::time::Duration; use std::time::Instant; @@ -33,13 +33,13 @@ fn main() -> Result<(), LvError> { let mut screen_style = Style::default(); screen_style.set_bg_color(Color::from_rgb((255, 255, 255))); screen_style.set_radius(0); - screen.add_style(Part::Main, &mut screen_style); + screen.add_style(screen_style.into_raw(), Part::Main.into()); // Create the bar object let mut bar = Bar::create(&mut screen)?; bar.set_size(175, 20); - bar.set_align(Align::Center, 0, 10); - bar.set_range(0, 100)?; + bar.align(Align::Center.into(), 0, 10); + bar.set_range(0, 100); bar.on_event(|_b, _e| { println!("Completed!"); })?; @@ -47,15 +47,15 @@ fn main() -> Result<(), LvError> { // Set the indicator style for the bar object let mut ind_style = Style::default(); ind_style.set_bg_color(Color::from_rgb((100, 245, 100))); - bar.add_style(Part::Any, &mut ind_style); + bar.add_style(ind_style.into_raw(), Part::Any.into()); let mut loading_lbl = Label::create(&mut screen)?; - loading_lbl.set_text(CString::new("Loading...").unwrap().as_c_str())?; - loading_lbl.set_align(Align::OutTopMid, 0, 0); + loading_lbl.set_text(CString::new("Loading...").unwrap().as_c_str()); + loading_lbl.align(Align::OutTopMid.into(), 0, 0); let mut loading_style = Style::default(); loading_style.set_text_color(Color::from_rgb((0, 0, 0))); - loading_lbl.add_style(Part::Main, &mut loading_style); + loading_lbl.add_style(loading_style.into_raw(), Part::Main.into()); let mut i = 0; 'running: loop { @@ -67,7 +67,7 @@ fn main() -> Result<(), LvError> { // - implementation of `Widget` is not general enough // lvgl::event_send(&mut bar, Event::Clicked); } - bar.set_value(i, AnimationState::ON); + bar.set_value(i, AnimationState::ON.into()); i += 1; lvgl::task_handler(); diff --git a/examples/binding_test.rs b/examples/binding_test.rs new file mode 100644 index 00000000..82358340 --- /dev/null +++ b/examples/binding_test.rs @@ -0,0 +1,323 @@ +use cstr_core::{cstr, CStr, CString}; +use embedded_graphics::pixelcolor::Rgb565; +use embedded_graphics::prelude::*; +use embedded_graphics_simulator::{ + OutputSettingsBuilder, SimulatorDisplay, SimulatorEvent, Window, +}; + +use lvgl::font::Font; +use lvgl::input_device::{ + pointer::{Pointer, PointerInputData}, + InputDriver, +}; +use lvgl::misc::anim::{AnimRepeatCount, Animation}; +use lvgl::misc::area::{pct, LV_SIZE_CONTENT}; +use lvgl::style::{Opacity, Style}; +use lvgl::widgets::{Btn, Btnmatrix, Canvas, Chart, Dropdown, Label, Widget}; +use lvgl::{self, NativeObject, Obj}; +use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part}; +use lvgl_sys::{ + lv_chart_add_series, lv_chart_type_t, lv_coord_t, lv_flex_flow_t_LV_FLEX_FLOW_COLUMN, + lv_grid_align_t_LV_GRID_ALIGN_CENTER, lv_grid_align_t_LV_GRID_ALIGN_START, + lv_grid_align_t_LV_GRID_ALIGN_STRETCH, lv_label_set_text, lv_obj_set_grid_cell, + lv_obj_set_style_opa, lv_obj_set_width, lv_opa_t, lv_palette_t_LV_PALETTE_AMBER, + lv_palette_t_LV_PALETTE_BLUE, lv_palette_t_LV_PALETTE_BLUE_GREY, lv_palette_t_LV_PALETTE_BROWN, + lv_palette_t_LV_PALETTE_DEEP_ORANGE, lv_palette_t_LV_PALETTE_DEEP_PURPLE, + lv_palette_t_LV_PALETTE_GREY, lv_palette_t_LV_PALETTE_PURPLE, lv_palette_t_LV_PALETTE_RED, + lv_palette_t_LV_PALETTE_TEAL, LV_CHART_AXIS_PRIMARY_X, LV_CHART_TYPE_BAR, LV_GRID_CONTENT, + LV_GRID_TEMPLATE_LAST, LV_OBJ_FLAG_HIDDEN, LV_OPA_50, LV_OPA_70, LV_OPA_COVER, LV_PART_MAIN, +}; +use std::thread::sleep; +use std::time::Duration; +use std::time::Instant; + +// #define LV_GRID_FR(x) (LV_COORD_MAX - 100 + x) +macro_rules! lv_grid_fr { + ($x:literal) => { + lvgl_sys::LV_COORD_MAX - 100 + $x + }; +} +macro_rules! lv_canvas_buf_size_indexed_2bit { + ($w: literal, $h:literal) => { + ((($w / 4) + 1) * $h) + }; +} + +#[allow(unused_assignments)] +fn main() -> Result<(), LvError> { + const HOR_RES: u32 = 800; + const VER_RES: u32 = 480; + + let mut sim_display: SimulatorDisplay = + SimulatorDisplay::new(Size::new(HOR_RES, VER_RES)); + + let output_settings = OutputSettingsBuilder::new().scale(1).build(); + let mut window = Window::new("Test UI", &output_settings); + + let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::default(); + + let display = Display::register(buffer, HOR_RES, VER_RES, |refresh| { + sim_display.draw_iter(refresh.as_pixels()).unwrap(); + })?; + + // Define the initial state of your input + let mut latest_touch_status = PointerInputData::Touch(Point::new(0, 0)).released().once(); + + // Register a new input device that's capable of reading the current state of the input + let _touch_screen = Pointer::register(|| latest_touch_status, &display)?; + + let c1; + let c2; + let c3; + unsafe { + c1 = lvgl_sys::lv_palette_main(lv_palette_t_LV_PALETTE_DEEP_ORANGE); + c2 = lvgl_sys::lv_palette_darken(lv_palette_t_LV_PALETTE_BLUE, 2); + c3 = lvgl_sys::lv_palette_main(lv_palette_t_LV_PALETTE_RED); + } + + let mut style_big_font = Style::default(); + //style_big_font.set_text_font(Font::new_raw(lvgl_sys::lv_font_montserrat_24)); + + let mut screen = display.get_scr_act()?; + + let grid_cols = [ + 300, + lv_grid_fr!(3) as i16, + lv_grid_fr!(2) as i16, + LV_GRID_TEMPLATE_LAST as i16, + ]; + let grid_rows = [ + 100, + lv_grid_fr!(1) as i16, + LV_GRID_CONTENT as i16, + LV_GRID_TEMPLATE_LAST as i16, + ]; + screen.set_grid_dsc_array(&grid_cols[0], &grid_rows[0]); + + //let chart_type_subject = Subject::new()?; + //lv_subject_init_int(&chart_type_subject, 0); + + let mut dropdown = Dropdown::create(&mut screen)?; + dropdown.set_options(cstr_core::cstr!("Lines\nBars")); + dropdown.set_grid_cell( + lv_grid_align_t_LV_GRID_ALIGN_CENTER, + 0, + 1, + lv_grid_align_t_LV_GRID_ALIGN_CENTER, + 0, + 1, + ); + dropdown.set_selected(1); + + /*Create a chart with an external array of points*/ + let mut chart = Chart::create(&mut screen)?; + chart.set_grid_cell( + lv_grid_align_t_LV_GRID_ALIGN_STRETCH, + 0, + 1, + lv_grid_align_t_LV_GRID_ALIGN_CENTER, + 1, + 1, + ); + unsafe { + let series = + lvgl_sys::lv_chart_add_series(chart.raw().as_ptr(), c3, LV_CHART_AXIS_PRIMARY_X as u8); + + let mut chart_y_array = [10, 25, 50, 40, 30, 35, 60, 65, 70, 75]; + chart.set_ext_y_array(series.as_mut().unwrap(), &mut chart_y_array[0]); + } + chart.set_type(LV_CHART_TYPE_BAR as lv_chart_type_t); + + /*Add custom observer callback*/ + //lv_subject_add_observer_obj(&chart_type_subject, chart_type_observer_cb, chart, NULL); + + /*Manually set the subject's value*/ + //lv_subject_set_int(&chart_type_subject, 1); + + let mut label = Label::create(&mut screen)?; + label.set_grid_cell( + lv_grid_align_t_LV_GRID_ALIGN_START, + 1, + 1, + lv_grid_align_t_LV_GRID_ALIGN_CENTER, + 0, + 1, + ); + + let mut label_style = Style::default(); + label_style.set_bg_opa(Opacity::OPA_70); + label_style.set_bg_color(Color::from_raw(c1)); + label_style.set_text_color(Color::from_raw(c2)); + label.add_style(label_style.into_raw(), Part::Main.into()); + label.add_style(style_big_font.into_raw(), Part::Main.into()); + + let mut btnmatrix_options = [ + cstr!("First").as_ptr(), + cstr!("Second").as_ptr(), + cstr!("\n").as_ptr(), + cstr!("Third").as_ptr(), + cstr!("").as_ptr(), + ]; + + let btnmatrix_ctrl = [ + lvgl_sys::LV_BTNMATRIX_CTRL_DISABLED as u16, + 2 | lvgl_sys::LV_BTNMATRIX_CTRL_CHECKED as u16, + 1, + ]; + + let mut btnmatrix = Btnmatrix::create(&mut screen)?; + btnmatrix.set_grid_cell( + lv_grid_align_t_LV_GRID_ALIGN_STRETCH, + 1, + 1, + lv_grid_align_t_LV_GRID_ALIGN_STRETCH, + 1, + 1, + ); + unsafe { + lvgl_sys::lv_btnmatrix_set_map(btnmatrix.raw().as_ptr(), btnmatrix_options.as_mut_ptr()); + } + btnmatrix.set_ctrl_map(&btnmatrix_ctrl[0]); + + let mut cont = Obj::create(&mut screen)?; + cont.set_grid_cell( + lv_grid_align_t_LV_GRID_ALIGN_STRETCH, + 2, + 1, + lv_grid_align_t_LV_GRID_ALIGN_STRETCH, + 0, + 2, + ); + cont.set_flex_flow(lv_flex_flow_t_LV_FLEX_FLOW_COLUMN); + + let mut btns: Vec = Vec::with_capacity(10); + let mut labels: Vec