dear_imgui_rs/context/
settings.rs1use std::path::PathBuf;
2use std::ptr;
3
4use crate::sys;
5
6use super::Context;
7use super::binding::{CTX_MUTEX, with_bound_context};
8
9impl Context {
10 pub fn set_ini_filename<P: Into<PathBuf>>(
16 &mut self,
17 filename: Option<P>,
18 ) -> crate::error::ImGuiResult<()> {
19 use crate::error::SafeStringConversion;
20 let _guard = CTX_MUTEX.lock();
21
22 self.ini_filename = match filename {
23 Some(f) => Some(f.into().to_string_lossy().to_cstring_safe()?),
24 None => None,
25 };
26
27 unsafe {
28 let io = self.io_ptr("Context::set_ini_filename()");
29 let ptr = self
30 .ini_filename
31 .as_ref()
32 .map(|s| s.as_ptr())
33 .unwrap_or(ptr::null());
34 (*io).IniFilename = ptr;
35 }
36 Ok(())
37 }
38
39 pub fn set_log_filename<P: Into<PathBuf>>(
47 &mut self,
48 filename: Option<P>,
49 ) -> crate::error::ImGuiResult<()> {
50 use crate::error::SafeStringConversion;
51 let _guard = CTX_MUTEX.lock();
52
53 self.log_filename = match filename {
54 Some(f) => Some(f.into().to_string_lossy().to_cstring_safe()?),
55 None => None,
56 };
57
58 unsafe {
59 let io = self.io_ptr("Context::set_log_filename()");
60 let ptr = self
61 .log_filename
62 .as_ref()
63 .map(|s| s.as_ptr())
64 .unwrap_or(ptr::null());
65 (*io).LogFilename = ptr;
66 }
67 Ok(())
68 }
69
70 pub fn set_platform_name<S: Into<String>>(
78 &mut self,
79 name: Option<S>,
80 ) -> crate::error::ImGuiResult<()> {
81 use crate::error::SafeStringConversion;
82 let _guard = CTX_MUTEX.lock();
83
84 self.platform_name = match name {
85 Some(n) => Some(n.into().to_cstring_safe()?),
86 None => None,
87 };
88
89 unsafe {
90 let io = self.io_ptr("Context::set_platform_name()");
91 let ptr = self
92 .platform_name
93 .as_ref()
94 .map(|s| s.as_ptr())
95 .unwrap_or(ptr::null());
96 (*io).BackendPlatformName = ptr;
97 }
98 Ok(())
99 }
100
101 pub fn set_renderer_name<S: Into<String>>(
109 &mut self,
110 name: Option<S>,
111 ) -> crate::error::ImGuiResult<()> {
112 use crate::error::SafeStringConversion;
113 let _guard = CTX_MUTEX.lock();
114
115 self.renderer_name = match name {
116 Some(n) => Some(n.into().to_cstring_safe()?),
117 None => None,
118 };
119
120 unsafe {
121 let io = self.io_ptr("Context::set_renderer_name()");
122 let ptr = self
123 .renderer_name
124 .as_ref()
125 .map(|s| s.as_ptr())
126 .unwrap_or(ptr::null());
127 (*io).BackendRendererName = ptr;
128 }
129 Ok(())
130 }
131
132 #[doc(alias = "LoadIniSettingsFromMemory")]
136 pub fn load_ini_settings(&mut self, data: &str) {
137 let _guard = CTX_MUTEX.lock();
138 unsafe {
139 with_bound_context(self.raw, || {
140 sys::igLoadIniSettingsFromMemory(data.as_ptr() as *const _, data.len());
141 });
142 }
143 }
144
145 #[doc(alias = "SaveIniSettingsToMemory")]
147 pub fn save_ini_settings(&mut self, buf: &mut String) {
148 let _guard = CTX_MUTEX.lock();
149 unsafe {
150 with_bound_context(self.raw, || {
151 let mut out_ini_size: usize = 0;
152 let data_ptr = sys::igSaveIniSettingsToMemory(&mut out_ini_size as *mut usize);
153 if data_ptr.is_null() || out_ini_size == 0 {
154 return;
155 }
156
157 let mut bytes = std::slice::from_raw_parts(data_ptr as *const u8, out_ini_size);
158 if bytes.last() == Some(&0) {
159 bytes = &bytes[..bytes.len().saturating_sub(1)];
160 }
161 buf.push_str(&String::from_utf8_lossy(bytes));
162 });
163 }
164 }
165
166 #[cfg(not(target_arch = "wasm32"))]
172 #[doc(alias = "LoadIniSettingsFromDisk")]
173 pub fn load_ini_settings_from_disk<P: Into<PathBuf>>(
174 &mut self,
175 filename: P,
176 ) -> crate::error::ImGuiResult<()> {
177 use crate::error::SafeStringConversion;
178 let _guard = CTX_MUTEX.lock();
179 let cstr = filename.into().to_string_lossy().to_cstring_safe()?;
180 unsafe {
181 with_bound_context(self.raw, || {
182 sys::igLoadIniSettingsFromDisk(cstr.as_ptr());
183 });
184 }
185 Ok(())
186 }
187
188 #[cfg(not(target_arch = "wasm32"))]
194 #[doc(alias = "SaveIniSettingsToDisk")]
195 pub fn save_ini_settings_to_disk<P: Into<PathBuf>>(
196 &mut self,
197 filename: P,
198 ) -> crate::error::ImGuiResult<()> {
199 use crate::error::SafeStringConversion;
200 let _guard = CTX_MUTEX.lock();
201 let cstr = filename.into().to_string_lossy().to_cstring_safe()?;
202 unsafe {
203 with_bound_context(self.raw, || {
204 sys::igSaveIniSettingsToDisk(cstr.as_ptr());
205 });
206 }
207 Ok(())
208 }
209}