|
1 | 1 | // Copyright © SixtyFPS GmbH <info@slint.dev>
|
2 | 2 | // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
|
3 | 3 |
|
4 |
| -// cSpell: ignore condvar |
5 |
| - |
6 | 4 | use crate::{common, preview};
|
7 | 5 |
|
8 | 6 | use std::cell::RefCell;
|
@@ -182,10 +180,10 @@ impl Default for RemoteControlledPreviewToLsp {
|
182 | 180 | }
|
183 | 181 |
|
184 | 182 | impl RemoteControlledPreviewToLsp {
|
185 |
| - /// Cretaes a RemoteConfrolledPreviewToLsp connector. |
| 183 | + /// Creates a RemoteConfrolledPreviewToLsp connector. |
186 | 184 | ///
|
187 | 185 | /// This means the applications lifetime is bound to the lifetime of the
|
188 |
| - /// applications's STDIN: We quit as soon as that gets fishy or closed. |
| 186 | + /// application's STDIN: We quit as soon as that gets fishy or closed. |
189 | 187 | ///
|
190 | 188 | /// It also means we do not need to join the reader thread: The OS will clean
|
191 | 189 | /// that one up for us anyway.
|
@@ -223,79 +221,78 @@ impl common::PreviewToLsp for RemoteControlledPreviewToLsp {
|
223 | 221 | }
|
224 | 222 | }
|
225 | 223 |
|
226 |
| -// TODO: Re-enable this |
227 |
| -// #[cfg(target_vendor = "apple")] |
228 |
| -// fn toggle_always_on_top() { |
229 |
| -// use slint::ComponentHandle; |
230 |
| -// preview::PREVIEW_STATE.with_borrow_mut(move |preview_state| { |
231 |
| -// let Some(ui) = preview_state.ui.as_ref() else { return }; |
232 |
| -// let api = ui.global::<crate::preview::ui::Api>(); |
233 |
| -// api.set_always_on_top(!api.get_always_on_top()); |
234 |
| -// }); |
235 |
| -// } |
236 |
| - |
237 |
| -// // This function overrides the default app menu and makes the "Quit" item merely hide the UI, |
238 |
| -// // as the life-cycle of this process is determined by the editor. The returned menuitem must |
239 |
| -// // be kept alive for the duration of the event loop, as otherwise muda crashes. |
240 |
| -// #[cfg(target_vendor = "apple")] |
241 |
| -// fn init_apple_platform( |
242 |
| -// ) -> Result<(muda::MenuItem, muda::CheckMenuItem), i_slint_core::api::PlatformError> { |
243 |
| -// use muda::{accelerator, CheckMenuItem, Menu, MenuItem, PredefinedMenuItem, Submenu}; |
244 |
| - |
245 |
| -// let backend = i_slint_backend_winit::Backend::builder().with_default_menu_bar(false).build()?; |
246 |
| - |
247 |
| -// slint::platform::set_platform(Box::new(backend)).map_err(|set_platform_err| { |
248 |
| -// i_slint_core::api::PlatformError::from(set_platform_err.to_string()) |
249 |
| -// })?; |
250 |
| - |
251 |
| -// let process_name = objc2_foundation::NSProcessInfo::processInfo().processName().to_string(); |
252 |
| -// let reload_menu_item = MenuItem::new( |
253 |
| -// format!("Reload"), |
254 |
| -// true, |
255 |
| -// Some(accelerator::Accelerator::new( |
256 |
| -// Some(accelerator::Modifiers::META), |
257 |
| -// accelerator::Code::KeyR, |
258 |
| -// )), |
259 |
| -// ); |
260 |
| -// let keep_on_top_menu_item = CheckMenuItem::new(format!("Keep on Top"), true, false, None); |
261 |
| - |
262 |
| -// let menu_bar = Menu::new(); |
263 |
| -// menu_bar.init_for_nsapp(); |
264 |
| -// let app_m = Submenu::new("App", true); |
265 |
| -// let window_m = Submenu::new("&Window", true); |
266 |
| -// menu_bar |
267 |
| -// .append(&app_m) |
268 |
| -// .and_then(|_| menu_bar.append(&window_m)) |
269 |
| -// .and_then(|_| { |
270 |
| -// app_m.append_items(&[ |
271 |
| -// &PredefinedMenuItem::services(None), |
272 |
| -// &PredefinedMenuItem::separator(), |
273 |
| -// &PredefinedMenuItem::hide(None), |
274 |
| -// &PredefinedMenuItem::hide_others(None), |
275 |
| -// &PredefinedMenuItem::show_all(None), |
276 |
| -// &reload_menu_item, |
277 |
| -// ]) |
278 |
| -// }) |
279 |
| -// .and_then(|_| window_m.append_items(&[&keep_on_top_menu_item])) |
280 |
| -// .map_err(|menu_bar_err| { |
281 |
| -// i_slint_core::api::PlatformError::Other(menu_bar_err.to_string()) |
282 |
| -// })?; |
283 |
| - |
284 |
| -// let reload_id = reload_menu_item.id().clone(); |
285 |
| -// let keep_on_top_id = keep_on_top_menu_item.id().clone(); |
286 |
| - |
287 |
| -// muda::MenuEvent::set_event_handler(Some(move |menu_event: muda::MenuEvent| { |
288 |
| -// let reload_id = reload_id.clone(); |
289 |
| -// let keep_on_top_id = keep_on_top_id.clone(); |
290 |
| - |
291 |
| -// let _ = slint::invoke_from_event_loop(move || { |
292 |
| -// if menu_event.id == reload_id { |
293 |
| -// preview::reload_preview(); |
294 |
| -// } else if menu_event.id == keep_on_top_id { |
295 |
| -// toggle_always_on_top(); |
296 |
| -// } |
297 |
| -// }); |
298 |
| -// })); |
299 |
| - |
300 |
| -// Ok((reload_menu_item, keep_on_top_menu_item)) |
301 |
| -// } |
| 224 | +#[cfg(target_vendor = "apple")] |
| 225 | +fn toggle_always_on_top() { |
| 226 | + use slint::ComponentHandle; |
| 227 | + preview::PREVIEW_STATE.with_borrow_mut(move |preview_state| { |
| 228 | + let Some(ui) = preview_state.ui.as_ref() else { return }; |
| 229 | + let api = ui.global::<crate::preview::ui::Api>(); |
| 230 | + api.set_always_on_top(!api.get_always_on_top()); |
| 231 | + }); |
| 232 | +} |
| 233 | + |
| 234 | +// This function overrides the default app menu and makes the "Quit" item merely hide the UI, |
| 235 | +// as the life-cycle of this process is determined by the editor. The returned menuitem must |
| 236 | +// be kept alive for the duration of the event loop, as otherwise muda crashes. |
| 237 | +#[cfg(target_vendor = "apple")] |
| 238 | +fn init_apple_platform( |
| 239 | +) -> Result<(muda::MenuItem, muda::CheckMenuItem), i_slint_core::api::PlatformError> { |
| 240 | + use muda::{accelerator, CheckMenuItem, Menu, MenuItem, PredefinedMenuItem, Submenu}; |
| 241 | + |
| 242 | + let backend = i_slint_backend_winit::Backend::builder().with_default_menu_bar(false).build()?; |
| 243 | + |
| 244 | + slint::platform::set_platform(Box::new(backend)).map_err(|set_platform_err| { |
| 245 | + i_slint_core::api::PlatformError::from(set_platform_err.to_string()) |
| 246 | + })?; |
| 247 | + |
| 248 | + let process_name = objc2_foundation::NSProcessInfo::processInfo().processName().to_string(); |
| 249 | + let reload_menu_item = MenuItem::new( |
| 250 | + format!("Reload"), |
| 251 | + true, |
| 252 | + Some(accelerator::Accelerator::new( |
| 253 | + Some(accelerator::Modifiers::META), |
| 254 | + accelerator::Code::KeyR, |
| 255 | + )), |
| 256 | + ); |
| 257 | + let keep_on_top_menu_item = CheckMenuItem::new(format!("Keep on Top"), true, false, None); |
| 258 | + |
| 259 | + let menu_bar = Menu::new(); |
| 260 | + menu_bar.init_for_nsapp(); |
| 261 | + let app_m = Submenu::new("App", true); |
| 262 | + let window_m = Submenu::new("&Window", true); |
| 263 | + menu_bar |
| 264 | + .append(&app_m) |
| 265 | + .and_then(|_| menu_bar.append(&window_m)) |
| 266 | + .and_then(|_| { |
| 267 | + app_m.append_items(&[ |
| 268 | + &PredefinedMenuItem::services(None), |
| 269 | + &PredefinedMenuItem::separator(), |
| 270 | + &PredefinedMenuItem::hide(None), |
| 271 | + &PredefinedMenuItem::hide_others(None), |
| 272 | + &PredefinedMenuItem::show_all(None), |
| 273 | + &reload_menu_item, |
| 274 | + ]) |
| 275 | + }) |
| 276 | + .and_then(|_| window_m.append_items(&[&keep_on_top_menu_item])) |
| 277 | + .map_err(|menu_bar_err| { |
| 278 | + i_slint_core::api::PlatformError::Other(menu_bar_err.to_string()) |
| 279 | + })?; |
| 280 | + |
| 281 | + let reload_id = reload_menu_item.id().clone(); |
| 282 | + let keep_on_top_id = keep_on_top_menu_item.id().clone(); |
| 283 | + |
| 284 | + muda::MenuEvent::set_event_handler(Some(move |menu_event: muda::MenuEvent| { |
| 285 | + let reload_id = reload_id.clone(); |
| 286 | + let keep_on_top_id = keep_on_top_id.clone(); |
| 287 | + |
| 288 | + let _ = slint::invoke_from_event_loop(move || { |
| 289 | + if menu_event.id == reload_id { |
| 290 | + preview::reload_preview(); |
| 291 | + } else if menu_event.id == keep_on_top_id { |
| 292 | + toggle_always_on_top(); |
| 293 | + } |
| 294 | + }); |
| 295 | + })); |
| 296 | + |
| 297 | + Ok((reload_menu_item, keep_on_top_menu_item)) |
| 298 | +} |
0 commit comments