libobs_wrapper\scenes\scene_item/
traits.rs1use crate::scenes::{ObsSceneItemRef, ObsSceneRef, SceneItemTrait};
2use crate::sources::{ObsSourceRef, ObsSourceTrait};
3use crate::utils::{ObsError, SourceInfo};
4use std::sync::Arc;
5
6pub trait SceneItemExtSceneTrait {
7 fn add_source<T: ObsSourceTrait + Clone + 'static>(
10 &mut self,
11 source: T,
12 ) -> Result<ObsSceneItemRef<T>, ObsError>;
13
14 fn add_and_create_source(
17 &mut self,
18 info: SourceInfo,
19 ) -> Result<ObsSceneItemRef<ObsSourceRef>, ObsError>;
20
21 fn get_source_mut(&self, name: &str) -> Result<Option<Arc<Box<dyn ObsSourceTrait>>>, ObsError>;
23
24 fn remove_every_item_of_source<T: ObsSourceTrait>(&mut self, source: T)
26 -> Result<(), ObsError>;
27
28 fn remove_scene_item<K: SceneItemTrait>(&mut self, scene_item: K) -> Result<(), ObsError>;
30
31 fn remove_all_sources(&mut self) -> Result<(), ObsError>;
33
34 fn get_scene_item_ptr<T: ObsSourceTrait + Clone>(
38 &self,
39 source: &T,
40 ) -> Result<Vec<Arc<Box<dyn SceneItemTrait>>>, ObsError>;
41}
42
43impl SceneItemExtSceneTrait for ObsSceneRef {
44 fn add_source<T: ObsSourceTrait + Clone + 'static>(
45 &mut self,
46 source: T,
47 ) -> Result<ObsSceneItemRef<T>, ObsError> {
48 let scene_item = ObsSceneItemRef::new(self, source.clone(), self.runtime.clone())?;
49
50 let scene_clone = scene_item.clone();
51 self.attached_scene_items
52 .write()
53 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?
54 .entry(Arc::new(Box::new(source)))
55 .or_insert_with(Vec::new)
56 .push(Arc::new(Box::new(scene_clone)));
57
58 Ok(scene_item)
59 }
60
61 fn add_and_create_source(
62 &mut self,
63 info: SourceInfo,
64 ) -> Result<ObsSceneItemRef<ObsSourceRef>, ObsError> {
65 let source = crate::sources::ObsSourceRef::new(
66 info.id,
67 info.name,
68 info.settings,
69 info.hotkey_data,
70 self.runtime.clone(),
71 )?;
72
73 let scene_item = self.add_source(source.clone())?;
74 Ok(scene_item)
75 }
76
77 fn get_source_mut(&self, name: &str) -> Result<Option<Arc<Box<dyn ObsSourceTrait>>>, ObsError> {
78 let r = self
79 .attached_scene_items
80 .read()
81 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?
82 .keys()
83 .find(|s| s.name() == name)
84 .cloned();
85
86 Ok(r)
87 }
88
89 fn remove_every_item_of_source<T: ObsSourceTrait>(
90 &mut self,
91 source: T,
92 ) -> Result<(), ObsError> {
93 let source_ptr = source.as_ptr().get_ptr();
94
95 self.attached_scene_items
96 .write()
97 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?
98 .retain(|s, _| {
99 s.as_ptr().get_ptr() != source_ptr
101 });
102
103 Ok(())
104 }
105
106 fn remove_scene_item<K: SceneItemTrait>(&mut self, scene_item: K) -> Result<(), ObsError> {
107 let mut guard = self
108 .attached_scene_items
109 .write()
110 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
111
112 guard.retain(|_, items| {
113 items.retain(|item| {
114 item.as_ptr().get_ptr() != scene_item.as_ptr().get_ptr()
116 });
117 !items.is_empty()
119 });
120 Ok(())
121 }
122
123 fn remove_all_sources(&mut self) -> Result<(), ObsError> {
124 self.attached_scene_items
126 .write()
127 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?
128 .clear();
129
130 Ok(())
131 }
132
133 fn get_scene_item_ptr<T: ObsSourceTrait + Clone>(
134 &self,
135 source: &T,
136 ) -> Result<Vec<Arc<Box<dyn SceneItemTrait>>>, ObsError> {
137 let guard = self
138 .attached_scene_items
139 .read()
140 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
141
142 let res = guard
143 .iter()
144 .find_map(|(s, scene_item_pointers)| {
145 if s.as_ptr().get_ptr() == source.as_ptr().get_ptr() {
146 Some(scene_item_pointers.clone())
147 } else {
148 None
149 }
150 })
151 .unwrap_or_else(Vec::new);
152
153 Ok(res)
154 }
155}