Skip to content

Commit fedc960

Browse files
committed
implement lv_obj... functions
1 parent bd5a268 commit fedc960

File tree

7 files changed

+67
-36
lines changed

7 files changed

+67
-36
lines changed

lvgl-codegen/src/lib.rs

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,28 @@ impl Rusty for LvWidget {
5858
type Parent = ();
5959

6060
fn code(&self, _parent: &Self::Parent) -> WrapperResult<TokenStream> {
61-
// We don't generate for the generic Obj
62-
if self.name.as_str().eq("obj") {
63-
return Err(WrapperError::Skip);
64-
}
65-
6661
let widget_name = format_ident!("{}", self.pascal_name());
6762
let methods: Vec<TokenStream> = self.methods.iter().flat_map(|m| m.code(self)).collect();
68-
Ok(quote! {
69-
define_object!(#widget_name);
63+
if self.name.as_str().eq("obj") {
64+
Ok(quote! {
65+
pub trait Widget<'a>: NativeObject + Sized + 'a {
66+
type SpecialEvent;
67+
type Part: Into<lvgl_sys::lv_part_t>;
7068

71-
impl<'a> #widget_name<'a> {
72-
#(#methods)*
73-
}
74-
})
69+
unsafe fn from_raw(raw_pointer: core::ptr::NonNull<lvgl_sys::lv_obj_t>) -> Option<Self>;
70+
71+
#(#methods)*
72+
}
73+
})
74+
} else {
75+
Ok(quote! {
76+
define_object!(#widget_name);
77+
78+
impl<'a> #widget_name<'a> {
79+
#(#methods)*
80+
}
81+
})
82+
}
7583
}
7684
}
7785

@@ -106,7 +114,7 @@ impl Rusty for LvFunc {
106114
let original_func_name = format_ident!("{}", self.name.as_str());
107115

108116
// generate constructor
109-
if new_name.as_str().eq("create") {
117+
if new_name.as_str().eq("create") && parent.name != "obj" {
110118
return Ok(quote! {
111119

112120
pub fn create(parent: &mut impl crate::NativeObject) -> crate::LvResult<Self> {
@@ -115,7 +123,7 @@ impl Rusty for LvFunc {
115123
parent.raw().as_mut(),
116124
);
117125
if let Some(raw) = core::ptr::NonNull::new(ptr) {
118-
let core = <crate::Obj as crate::Widget>::from_raw(raw).unwrap();
126+
let core = <crate::Obj as Widget>::from_raw(raw).unwrap();
119127
Ok(Self { core })
120128
} else {
121129
Err(crate::LvError::InvalidReference)
@@ -243,7 +251,11 @@ impl Rusty for LvFunc {
243251
.enumerate()
244252
.fold(quote!(), |args_accumulator, (arg_idx, arg)| {
245253
let next_arg = if arg_idx == 0 {
246-
quote!(self.core.raw().as_mut())
254+
if parent.name == "obj" {
255+
quote!(self.raw().as_mut())
256+
} else {
257+
quote!(self.core.raw().as_mut())
258+
}
247259
} else if arg.typ.is_mut_native_object() {
248260
let var = arg.get_value_usage();
249261
quote! {#var.raw().as_mut()}
@@ -275,17 +287,30 @@ impl Rusty for LvFunc {
275287
None => quote!(;),
276288
_ => quote!(),
277289
};
278-
279-
Ok(quote! {
280-
pub fn #func_name(#args_decl) -> #return_type {
281-
unsafe {
282-
#args_preprocessing
283-
lvgl_sys::#original_func_name(#ffi_args)#optional_semicolon
284-
#args_postprocessing
285-
#explicit_ok
290+
if parent.name == "obj" {
291+
// pub keyword cannot be used in traits
292+
Ok(quote! {
293+
fn #func_name(#args_decl) -> #return_type {
294+
unsafe {
295+
#args_preprocessing
296+
lvgl_sys::#original_func_name(#ffi_args)#optional_semicolon
297+
#args_postprocessing
298+
#explicit_ok
299+
}
286300
}
287-
}
288-
})
301+
})
302+
} else {
303+
Ok(quote! {
304+
pub fn #func_name(#args_decl) -> #return_type {
305+
unsafe {
306+
#args_preprocessing
307+
lvgl_sys::#original_func_name(#ffi_args)#optional_semicolon
308+
#args_postprocessing
309+
#explicit_ok
310+
}
311+
}
312+
})
313+
}
289314
}
290315
}
291316

@@ -927,7 +952,7 @@ mod test {
927952
parent.raw().as_mut(),
928953
);
929954
if let Some(raw) = core::ptr::NonNull::new(ptr) {
930-
let core = <crate::Obj as crate::Widget>::from_raw(raw).unwrap();
955+
let core = <crate::Obj as Widget>::from_raw(raw).unwrap();
931956
Ok(Self { core })
932957
} else {
933958
Err(crate::LvError::InvalidReference)

lvgl/src/functions.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::display::{Display, DisplayDriver};
22
use crate::input_device::InputDriver;
3-
use crate::{Event, LvError, LvResult, Obj, Widget};
3+
use crate::widgets::Widget;
4+
use crate::{Event, LvError, LvResult, Obj};
45
use core::ptr::NonNull;
56
#[cfg(not(feature = "rust_timer"))]
67
use core::time::Duration;

lvgl/src/lv_core/obj.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
//! are special in that they do not have a parent object but do still implement
66
//! `NativeObject`.
77
8-
use crate::lv_core::style::Style;
9-
use crate::{Align, LvError, LvResult};
8+
use crate::widgets::Widget;
9+
use crate::{LvError, LvResult};
1010
use core::fmt::{self, Debug};
1111
use core::marker::PhantomData;
1212
use core::ptr::{self, NonNull};
@@ -78,7 +78,7 @@ impl NativeObject for Obj<'_> {
7878
}
7979

8080
/// A wrapper for all LVGL common operations on generic objects.
81-
pub trait Widget<'a>: NativeObject + Sized + 'a {
81+
/*pub trait Widget<'a>: NativeObject + Sized + 'a {
8282
type SpecialEvent;
8383
type Part: Into<lvgl_sys::lv_part_t>;
8484
@@ -149,7 +149,7 @@ pub trait Widget<'a>: NativeObject + Sized + 'a {
149149
);
150150
}
151151
}
152-
}
152+
}*/
153153

154154
impl<'a> Widget<'a> for Obj<'a> {
155155
type SpecialEvent = u32;
@@ -185,7 +185,7 @@ macro_rules! define_object {
185185
impl<'a> $item<'a> {
186186
pub fn on_event<F>(&mut self, f: F) -> $crate::LvResult<()>
187187
where
188-
F: FnMut(Self, $crate::support::Event<<Self as $crate::Widget<'a>>::SpecialEvent>),
188+
F: FnMut(Self, $crate::support::Event<<Self as Widget<'a>>::SpecialEvent>),
189189
{
190190
use $crate::NativeObject;
191191
unsafe {
@@ -210,7 +210,7 @@ macro_rules! define_object {
210210
}
211211
}
212212

213-
impl<'a> $crate::Widget<'a> for $item<'a> {
213+
impl<'a> Widget<'a> for $item<'a> {
214214
type SpecialEvent = $event_type;
215215
type Part = $part_type;
216216

lvgl/src/lv_core/screen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{LvError, LvResult, NativeObject, Obj, Part, Widget};
1+
use crate::{widgets::Widget, LvError, LvResult, NativeObject, Obj, Part};
22

33
/// An LVGL screen.
44
#[derive(Debug)]

lvgl/src/lv_core/style.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ pub struct Style {
3333
pub(crate) raw: Box<lvgl_sys::lv_style_t>,
3434
}
3535

36+
impl Style {
37+
pub fn into_raw(self) -> &'static mut lvgl_sys::lv_style_t {
38+
unsafe { self.raw.into_raw().as_mut().unwrap() }
39+
}
40+
}
41+
3642
impl Debug for Style {
3743
// TODO: Decode and dump style values
3844
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {

lvgl/src/misc/anim.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{Box, LvResult, Obj, Widget};
1+
use crate::{widgets::Widget, Box, LvResult, Obj};
22
use core::{
33
mem::{self, MaybeUninit},
44
num::TryFromIntError,

lvgl/src/support.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
use crate::display::DisplayError;
2-
use crate::Widget;
1+
use crate::{display::DisplayError, widgets::Widget};
32
use core::convert::{TryFrom, TryInto};
43
#[cfg(feature = "nightly")]
54
use core::error::Error;

0 commit comments

Comments
 (0)