fltk_derive/
button.rs

1use crate::utils::get_fl_name;
2use proc_macro::TokenStream;
3use quote::*;
4use syn::*;
5
6pub fn impl_button_trait(ast: &DeriveInput) -> TokenStream {
7    let name = &ast.ident;
8
9    let name_str = get_fl_name(name.to_string());
10
11    let shortcut = Ident::new(format!("{}_{}", name_str, "shortcut").as_str(), name.span());
12    let set_shortcut = Ident::new(
13        format!("{}_{}", name_str, "set_shortcut").as_str(),
14        name.span(),
15    );
16    let clear = Ident::new(format!("{}_{}", name_str, "clear").as_str(), name.span());
17    let value = Ident::new(format!("{}_{}", name_str, "value").as_str(), name.span());
18    let set_value = Ident::new(
19        format!("{}_{}", name_str, "set_value").as_str(),
20        name.span(),
21    );
22    let down_box = Ident::new(format!("{}_{}", name_str, "down_box").as_str(), name.span());
23    let set_down_box = Ident::new(
24        format!("{}_{}", name_str, "set_down_box").as_str(),
25        name.span(),
26    );
27
28    let gen = quote! {
29        unsafe impl ButtonExt for #name {
30            fn shortcut(&self) -> Shortcut {
31                unsafe {
32                    assert!(!self.was_deleted());
33                    mem::transmute(#shortcut(self.inner))
34                }
35            }
36
37            fn set_shortcut(&mut self, shortcut: Shortcut) {
38                unsafe {
39                    assert!(!self.was_deleted());
40                    #set_shortcut(self.inner, shortcut.bits() as i32)
41                }
42            }
43
44            fn clear(&mut self) {
45                unsafe {
46                    assert!(!self.was_deleted());
47                    #clear(self.inner);
48                }
49            }
50
51            fn is_set(&self) -> bool {
52                unsafe {
53                    assert!(!self.was_deleted());
54                    #value(self.inner)  != 0
55                }
56            }
57
58            fn set(&mut self, flag: bool) {
59                unsafe {
60                    assert!(!self.was_deleted());
61                    #set_value(self.inner, flag as i32)
62                }
63            }
64
65            fn value(&self) -> bool {
66                unsafe {
67                    assert!(!self.was_deleted());
68                    #value(self.inner)  != 0
69                }
70            }
71
72            fn set_value(&mut self, flag: bool) {
73                unsafe {
74                    assert!(!self.was_deleted());
75                    #set_value(self.inner, flag as i32)
76                }
77            }
78
79            fn set_down_frame(&mut self, f: FrameType) {
80                assert!(!self.was_deleted());
81                unsafe {
82                    #set_down_box(self.inner, f as i32)
83                }
84            }
85
86            fn down_frame(&self) -> FrameType {
87                assert!(!self.was_deleted());
88                unsafe {
89                    mem::transmute(#down_box(self.inner))
90                }
91            }
92        }
93    };
94    gen.into()
95}