File tree 5 files changed +525
-8
lines changed
5 files changed +525
-8
lines changed Original file line number Diff line number Diff line change 4
4
use glib:: prelude:: * ;
5
5
use glib:: subclass:: prelude:: * ;
6
6
use glib:: subclass:: Signal ;
7
- use glib:: Properties ;
7
+ use glib:: subclass :: object :: DerivedObjectSignals ;
8
8
use std:: cell:: RefCell ;
9
- use std:: sync:: OnceLock ;
10
9
11
10
mod imp {
12
11
use super :: * ;
13
12
14
- #[ derive( Properties , Default ) ]
13
+ #[ derive( glib :: Properties , Default ) ]
15
14
#[ properties( wrapper_type = super :: Author ) ]
16
15
pub struct Author {
17
16
#[ property( get, set) ]
@@ -20,11 +19,17 @@ mod imp {
20
19
surname : RefCell < String > ,
21
20
}
22
21
22
+ #[ glib:: signals( wrapper_type = super :: Author ) ]
23
+ impl Author {
24
+
25
+ #[ signal]
26
+ fn awarded ( & self ) { }
27
+ }
28
+
23
29
#[ glib:: derived_properties]
24
30
impl ObjectImpl for Author {
25
31
fn signals ( ) -> & ' static [ Signal ] {
26
- static SIGNALS : OnceLock < Vec < Signal > > = OnceLock :: new ( ) ;
27
- SIGNALS . get_or_init ( || vec ! [ Signal :: builder( "awarded" ) . build( ) ] )
32
+ Self :: derived_signals ( )
28
33
}
29
34
}
30
35
@@ -38,6 +43,7 @@ mod imp {
38
43
glib:: wrapper! {
39
44
pub struct Author ( ObjectSubclass <imp:: Author >) ;
40
45
}
46
+
41
47
impl Author {
42
48
pub fn new ( name : & str , surname : & str ) -> Self {
43
49
glib:: Object :: builder ( )
Original file line number Diff line number Diff line change @@ -14,13 +14,14 @@ mod properties;
14
14
mod shared_boxed_derive;
15
15
mod value_delegate_derive;
16
16
mod variant_derive;
17
+ mod signals;
17
18
18
19
mod utils;
19
20
20
21
use flags_attribute:: AttrInput ;
21
22
use proc_macro:: TokenStream ;
22
23
use proc_macro2:: Span ;
23
- use syn:: { parse_macro_input, DeriveInput } ;
24
+ use syn:: { parse_macro_input, DeriveInput , Error } ;
24
25
use utils:: { parse_nested_meta_items_from_stream, NestedMetaItem } ;
25
26
26
27
/// Macro for passing variables as strong or weak references into a closure.
@@ -1587,3 +1588,19 @@ pub fn derive_value_delegate(input: TokenStream) -> TokenStream {
1587
1588
pub fn async_test ( args : TokenStream , item : TokenStream ) -> TokenStream {
1588
1589
async_test:: async_test ( args, item)
1589
1590
}
1591
+
1592
+ #[ proc_macro_attribute]
1593
+ pub fn signals ( attr : TokenStream , item : TokenStream ) -> TokenStream {
1594
+ let args = parse_macro_input ! ( attr as signals:: SignalsArgs ) ;
1595
+ match syn:: parse :: < syn:: ItemImpl > ( item) {
1596
+ Ok ( input) => signals:: impl_signals ( input, args)
1597
+ . unwrap_or_else ( syn:: Error :: into_compile_error)
1598
+ . into ( ) ,
1599
+ Err ( _) => Error :: new (
1600
+ Span :: call_site ( ) ,
1601
+ signals:: WRONG_PLACE_MSG ,
1602
+ )
1603
+ . into_compile_error ( )
1604
+ . into ( ) ,
1605
+ }
1606
+ }
You can’t perform that action at this time.
0 commit comments