mirror of
				https://codeberg.org/waydeer/layer-shika.git
				synced 2025-11-04 12:54:23 +00:00 
			
		
		
		
	refactor: minor refactor on popup creation
This commit is contained in:
		
							parent
							
								
									9808eeb819
								
							
						
					
					
						commit
						f604a49268
					
				
					 1 changed files with 96 additions and 55 deletions
				
			
		| 
						 | 
					@ -9,8 +9,9 @@ use layer_shika_adapters::platform::slint_interpreter::{
 | 
				
			||||||
    CompilationResult, ComponentDefinition, ComponentInstance, Value,
 | 
					    CompilationResult, ComponentDefinition, ComponentInstance, Value,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use layer_shika_adapters::wayland::{
 | 
					use layer_shika_adapters::wayland::{
 | 
				
			||||||
    config::WaylandWindowConfig, shell_adapter::WaylandWindowingSystem,
 | 
					    config::WaylandWindowConfig,
 | 
				
			||||||
    surfaces::surface_state::WindowState,
 | 
					    shell_adapter::WaylandWindowingSystem,
 | 
				
			||||||
 | 
					    surfaces::{popup_manager::PopupManager, surface_state::WindowState},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use layer_shika_domain::config::WindowConfig;
 | 
					use layer_shika_domain::config::WindowConfig;
 | 
				
			||||||
use layer_shika_domain::errors::DomainError;
 | 
					use layer_shika_domain::errors::DomainError;
 | 
				
			||||||
| 
						 | 
					@ -135,6 +136,79 @@ impl RuntimeState<'_> {
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn measure_popup_dimensions(&mut self, definition: &ComponentDefinition) -> Result<(f32, f32)> {
 | 
				
			||||||
 | 
					        log::debug!(
 | 
				
			||||||
 | 
					            "Creating temporary popup instance to read dimensions from component properties"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let temp_instance = definition.create().map_err(|e| {
 | 
				
			||||||
 | 
					            Error::Domain(DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!("Failed to create temporary popup instance: {}", e),
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        temp_instance.show().map_err(|e| {
 | 
				
			||||||
 | 
					            Error::Domain(DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!("Failed to show temporary popup instance: {}", e),
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let width: f32 = temp_instance
 | 
				
			||||||
 | 
					            .get_property("popup-width")
 | 
				
			||||||
 | 
					            .ok()
 | 
				
			||||||
 | 
					            .and_then(|v| v.try_into().ok())
 | 
				
			||||||
 | 
					            .unwrap_or(120.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let height: f32 = temp_instance
 | 
				
			||||||
 | 
					            .get_property("popup-height")
 | 
				
			||||||
 | 
					            .ok()
 | 
				
			||||||
 | 
					            .and_then(|v| v.try_into().ok())
 | 
				
			||||||
 | 
					            .unwrap_or(120.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log::debug!(
 | 
				
			||||||
 | 
					            "Read popup dimensions from component properties: {}x{} (popup-width, popup-height)",
 | 
				
			||||||
 | 
					            width,
 | 
				
			||||||
 | 
					            height
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        drop(temp_instance);
 | 
				
			||||||
 | 
					        self.close_current_popup()?;
 | 
				
			||||||
 | 
					        log::debug!("Destroyed temporary popup instance");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok((width, height))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn create_popup_instance(
 | 
				
			||||||
 | 
					        definition: &ComponentDefinition,
 | 
				
			||||||
 | 
					        popup_manager: &Rc<PopupManager>,
 | 
				
			||||||
 | 
					    ) -> Result<ComponentInstance> {
 | 
				
			||||||
 | 
					        let instance = definition.create().map_err(|e| {
 | 
				
			||||||
 | 
					            Error::Domain(DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!("Failed to create popup instance: {}", e),
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let popup_manager_for_callback = Rc::clone(popup_manager);
 | 
				
			||||||
 | 
					        instance
 | 
				
			||||||
 | 
					            .set_callback("closed", move |_| {
 | 
				
			||||||
 | 
					                popup_manager_for_callback.close_current_popup();
 | 
				
			||||||
 | 
					                Value::Void
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .map_err(|e| {
 | 
				
			||||||
 | 
					                Error::Domain(DomainError::Configuration {
 | 
				
			||||||
 | 
					                    message: format!("Failed to set popup closed callback: {}", e),
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        instance.show().map_err(|e| {
 | 
				
			||||||
 | 
					            Error::Domain(DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!("Failed to show popup instance: {}", e),
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(instance)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn show_popup_component(
 | 
					    pub fn show_popup_component(
 | 
				
			||||||
        &mut self,
 | 
					        &mut self,
 | 
				
			||||||
        component_name: &str,
 | 
					        component_name: &str,
 | 
				
			||||||
| 
						 | 
					@ -162,45 +236,25 @@ impl RuntimeState<'_> {
 | 
				
			||||||
        self.close_current_popup()?;
 | 
					        self.close_current_popup()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let (width, height) = if let Some(explicit_size) = size {
 | 
					        let (width, height) = if let Some(explicit_size) = size {
 | 
				
			||||||
 | 
					            log::debug!(
 | 
				
			||||||
 | 
					                "Using explicit popup size: {}x{}",
 | 
				
			||||||
 | 
					                explicit_size.0,
 | 
				
			||||||
 | 
					                explicit_size.1
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
            explicit_size
 | 
					            explicit_size
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            let temp_instance = definition.create().map_err(|e| {
 | 
					            self.measure_popup_dimensions(&definition)?
 | 
				
			||||||
                Error::Domain(DomainError::Configuration {
 | 
					 | 
				
			||||||
                    message: format!("Failed to create temporary popup instance: {}", e),
 | 
					 | 
				
			||||||
                })
 | 
					 | 
				
			||||||
            })?;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            temp_instance.show().map_err(|e| {
 | 
					 | 
				
			||||||
                Error::Domain(DomainError::Configuration {
 | 
					 | 
				
			||||||
                    message: format!("Failed to show temporary popup instance: {}", e),
 | 
					 | 
				
			||||||
                })
 | 
					 | 
				
			||||||
            })?;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            let width: f32 = temp_instance
 | 
					 | 
				
			||||||
                .get_property("popup-width")
 | 
					 | 
				
			||||||
                .ok()
 | 
					 | 
				
			||||||
                .and_then(|v| v.try_into().ok())
 | 
					 | 
				
			||||||
                .unwrap_or(120.0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            let height: f32 = temp_instance
 | 
					 | 
				
			||||||
                .get_property("popup-height")
 | 
					 | 
				
			||||||
                .ok()
 | 
					 | 
				
			||||||
                .and_then(|v| v.try_into().ok())
 | 
					 | 
				
			||||||
                .unwrap_or(120.0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            drop(temp_instance);
 | 
					 | 
				
			||||||
            self.close_current_popup()?;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            (width, height)
 | 
					 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let popup_manager = self
 | 
					        let popup_manager = self
 | 
				
			||||||
            .window_state
 | 
					            .window_state
 | 
				
			||||||
            .popup_manager()
 | 
					            .popup_manager()
 | 
				
			||||||
            .as_ref()
 | 
					            .as_ref()
 | 
				
			||||||
            .ok_or_else(|| Error::Domain(DomainError::Configuration {
 | 
					            .ok_or_else(|| {
 | 
				
			||||||
                message: "No popup manager available".to_string(),
 | 
					                Error::Domain(DomainError::Configuration {
 | 
				
			||||||
            }))
 | 
					                    message: "No popup manager available".to_string(),
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
            .map(Rc::clone)?;
 | 
					            .map(Rc::clone)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let (reference_x, reference_y) = position.unwrap_or((0.0, 0.0));
 | 
					        let (reference_x, reference_y) = position.unwrap_or((0.0, 0.0));
 | 
				
			||||||
| 
						 | 
					@ -213,29 +267,16 @@ impl RuntimeState<'_> {
 | 
				
			||||||
            positioning_mode,
 | 
					            positioning_mode,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let instance = definition.create().map_err(|e| {
 | 
					        log::debug!(
 | 
				
			||||||
            Error::Domain(DomainError::Configuration {
 | 
					            "Creating final popup instance with dimensions {}x{} at position ({}, {}), mode: {:?}",
 | 
				
			||||||
                message: format!("Failed to create popup instance: {}", e),
 | 
					            width,
 | 
				
			||||||
            })
 | 
					            height,
 | 
				
			||||||
        })?;
 | 
					            reference_x,
 | 
				
			||||||
 | 
					            reference_y,
 | 
				
			||||||
 | 
					            positioning_mode
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let popup_manager_for_callback = Rc::clone(&popup_manager);
 | 
					        Self::create_popup_instance(&definition, &popup_manager)?;
 | 
				
			||||||
        instance
 | 
					 | 
				
			||||||
            .set_callback("closed", move |_| {
 | 
					 | 
				
			||||||
                popup_manager_for_callback.close_current_popup();
 | 
					 | 
				
			||||||
                Value::Void
 | 
					 | 
				
			||||||
            })
 | 
					 | 
				
			||||||
            .map_err(|e| {
 | 
					 | 
				
			||||||
                Error::Domain(DomainError::Configuration {
 | 
					 | 
				
			||||||
                    message: format!("Failed to set popup closed callback: {}", e),
 | 
					 | 
				
			||||||
                })
 | 
					 | 
				
			||||||
            })?;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        instance.show().map_err(|e| {
 | 
					 | 
				
			||||||
            Error::Domain(DomainError::Configuration {
 | 
					 | 
				
			||||||
                message: format!("Failed to show popup instance: {}", e),
 | 
					 | 
				
			||||||
            })
 | 
					 | 
				
			||||||
        })?;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue