Skip to main content

dear_imgui_rs/context/
settings.rs

1use 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    /// Sets the INI filename for settings persistence
11    ///
12    /// # Errors
13    ///
14    /// Returns an error if the filename contains null bytes
15    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    // removed legacy set_ini_filename_or_panic (use set_ini_filename())
40
41    /// Sets the log filename
42    ///
43    /// # Errors
44    ///
45    /// Returns an error if the filename contains null bytes
46    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    // removed legacy set_log_filename_or_panic (use set_log_filename())
71
72    /// Sets the platform name
73    ///
74    /// # Errors
75    ///
76    /// Returns an error if the name contains null bytes
77    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    // removed legacy set_platform_name_or_panic (use set_platform_name())
102
103    /// Sets the renderer name
104    ///
105    /// # Errors
106    ///
107    /// Returns an error if the name contains null bytes
108    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    // removed legacy set_renderer_name_or_panic (use set_renderer_name())
133
134    /// Loads settings from a string slice containing settings in .Ini file format
135    #[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    /// Saves settings to a mutable string buffer in .Ini file format
146    #[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    /// Loads settings from a `.ini` file on disk.
167    ///
168    /// This is a convenience wrapper over `ImGui::LoadIniSettingsFromDisk`.
169    ///
170    /// Note: this is not available on `wasm32` targets.
171    #[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    /// Saves settings to a `.ini` file on disk.
189    ///
190    /// This is a convenience wrapper over `ImGui::SaveIniSettingsToDisk`.
191    ///
192    /// Note: this is not available on `wasm32` targets.
193    #[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}