glib/gobject/
dynamic_object.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use crate::{
4    enums::{EnumValues, FlagsValues},
5    prelude::*,
6    subclass::prelude::*,
7    InterfaceInfo, Object, TypeFlags, TypeInfo, TypeModule, TypePlugin,
8};
9
10pub trait DynamicObjectRegisterExt: AsRef<TypePlugin> + 'static {
11    fn add_dynamic_interface(
12        &self,
13        instance_type: crate::types::Type,
14        interface_type: crate::types::Type,
15        interface_info: &InterfaceInfo,
16    );
17
18    fn register_dynamic_enum(
19        &self,
20        name: &str,
21        const_static_values: &'static EnumValues,
22    ) -> crate::types::Type;
23
24    fn register_dynamic_flags(
25        &self,
26        name: &str,
27        const_static_values: &'static FlagsValues,
28    ) -> crate::types::Type;
29
30    fn register_dynamic_type(
31        &self,
32        parent_type: crate::types::Type,
33        type_name: &str,
34        type_info: &TypeInfo,
35        flags: TypeFlags,
36    ) -> crate::types::Type;
37}
38
39impl<O: IsA<Object> + IsA<TypePlugin> + ObjectSubclassIsExt> DynamicObjectRegisterExt for O
40where
41    O::Subclass: TypePluginRegisterImpl,
42{
43    fn add_dynamic_interface(
44        &self,
45        instance_type: crate::types::Type,
46        interface_type: crate::types::Type,
47        interface_info: &InterfaceInfo,
48    ) {
49        self.imp()
50            .add_dynamic_interface(instance_type, interface_type, interface_info);
51    }
52
53    fn register_dynamic_enum(
54        &self,
55        name: &str,
56        const_static_values: &'static EnumValues,
57    ) -> crate::types::Type {
58        self.imp().register_dynamic_enum(name, const_static_values)
59    }
60
61    fn register_dynamic_flags(
62        &self,
63        name: &str,
64        const_static_values: &'static FlagsValues,
65    ) -> crate::types::Type {
66        self.imp().register_dynamic_flags(name, const_static_values)
67    }
68
69    fn register_dynamic_type(
70        &self,
71        parent_type: crate::types::Type,
72        type_name: &str,
73        type_info: &TypeInfo,
74        flags: TypeFlags,
75    ) -> crate::types::Type {
76        self.imp()
77            .register_dynamic_type(parent_type, type_name, type_info, flags)
78    }
79}
80
81impl DynamicObjectRegisterExt for TypeModule {
82    fn add_dynamic_interface(
83        &self,
84        instance_type: crate::types::Type,
85        interface_type: crate::types::Type,
86        interface_info: &InterfaceInfo,
87    ) {
88        <Self as TypeModuleExt>::add_interface(self, instance_type, interface_type, interface_info);
89    }
90
91    fn register_dynamic_enum(
92        &self,
93        name: &str,
94        const_static_values: &'static EnumValues,
95    ) -> crate::types::Type {
96        <Self as TypeModuleExt>::register_enum(self, name, const_static_values)
97    }
98
99    fn register_dynamic_flags(
100        &self,
101        name: &str,
102        const_static_values: &'static FlagsValues,
103    ) -> crate::types::Type {
104        <Self as TypeModuleExt>::register_flags(self, name, const_static_values)
105    }
106
107    fn register_dynamic_type(
108        &self,
109        parent_type: crate::types::Type,
110        type_name: &str,
111        type_info: &TypeInfo,
112        flags: TypeFlags,
113    ) -> crate::types::Type {
114        <Self as TypeModuleExt>::register_type(self, parent_type, type_name, type_info, flags)
115    }
116}