mirror of
				https://codeberg.org/waydeer/layer-shika.git
				synced 2025-11-04 06:14:23 +00:00 
			
		
		
		
	feat: add component loading convenience methods
This commit is contained in:
		
							parent
							
								
									7e2aa6dd3e
								
							
						
					
					
						commit
						0b43e5e7b6
					
				
					 4 changed files with 90 additions and 1 deletions
				
			
		
							
								
								
									
										1
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -1857,6 +1857,7 @@ version = "0.1.0"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "layer-shika-adapters",
 | 
					 "layer-shika-adapters",
 | 
				
			||||||
 "layer-shika-domain",
 | 
					 "layer-shika-domain",
 | 
				
			||||||
 | 
					 "spin_on",
 | 
				
			||||||
 "thiserror 2.0.17",
 | 
					 "thiserror 2.0.17",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,7 @@ categories = ["gui"]
 | 
				
			||||||
glutin = { version = "0.32.3", default-features = false, features = [
 | 
					glutin = { version = "0.32.3", default-features = false, features = [
 | 
				
			||||||
    "wayland",
 | 
					    "wayland",
 | 
				
			||||||
] }
 | 
					] }
 | 
				
			||||||
 | 
					spin_on = "0.1"
 | 
				
			||||||
log = "0.4.28"
 | 
					log = "0.4.28"
 | 
				
			||||||
raw-window-handle = "0.6.2"
 | 
					raw-window-handle = "0.6.2"
 | 
				
			||||||
slab = "0.4"
 | 
					slab = "0.4"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,4 +16,5 @@ workspace = true
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
layer-shika-adapters.workspace = true
 | 
					layer-shika-adapters.workspace = true
 | 
				
			||||||
layer-shika-domain.workspace = true
 | 
					layer-shika-domain.workspace = true
 | 
				
			||||||
 | 
					spin_on.workspace = true
 | 
				
			||||||
thiserror.workspace = true
 | 
					thiserror.workspace = true
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,12 @@
 | 
				
			||||||
use crate::Result;
 | 
					use crate::Result;
 | 
				
			||||||
use crate::system::WindowingSystem;
 | 
					use crate::system::WindowingSystem;
 | 
				
			||||||
use layer_shika_adapters::platform::slint_interpreter::ComponentDefinition;
 | 
					use layer_shika_adapters::platform::slint_interpreter::{Compiler, ComponentDefinition};
 | 
				
			||||||
 | 
					use layer_shika_domain::errors::DomainError;
 | 
				
			||||||
use layer_shika_domain::prelude::{
 | 
					use layer_shika_domain::prelude::{
 | 
				
			||||||
    AnchorEdges, KeyboardInteractivity, Layer, Margins, WindowConfig,
 | 
					    AnchorEdges, KeyboardInteractivity, Layer, Margins, WindowConfig,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					use spin_on::spin_on;
 | 
				
			||||||
 | 
					use std::path::{Path, PathBuf};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct NeedsComponent;
 | 
					pub struct NeedsComponent;
 | 
				
			||||||
pub struct HasComponent {
 | 
					pub struct HasComponent {
 | 
				
			||||||
| 
						 | 
					@ -25,6 +28,89 @@ impl LayerShika<NeedsComponent> {
 | 
				
			||||||
            config: WindowConfig::default(),
 | 
					            config: WindowConfig::default(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn from_file(
 | 
				
			||||||
 | 
					        path: impl AsRef<Path>,
 | 
				
			||||||
 | 
					        component_name: Option<&str>,
 | 
				
			||||||
 | 
					    ) -> Result<LayerShika<HasComponent>> {
 | 
				
			||||||
 | 
					        Self::from_file_with_compiler(
 | 
				
			||||||
 | 
					            path,
 | 
				
			||||||
 | 
					            &mut Compiler::default(),
 | 
				
			||||||
 | 
					            component_name.unwrap_or("Main"),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn from_file_with_compiler(
 | 
				
			||||||
 | 
					        path: impl AsRef<Path>,
 | 
				
			||||||
 | 
					        compiler: &mut Compiler,
 | 
				
			||||||
 | 
					        component_name: &str,
 | 
				
			||||||
 | 
					    ) -> Result<LayerShika<HasComponent>> {
 | 
				
			||||||
 | 
					        let compilation_result = spin_on(compiler.build_from_path(path.as_ref()));
 | 
				
			||||||
 | 
					        let diagnostics: Vec<_> = compilation_result.diagnostics().collect();
 | 
				
			||||||
 | 
					        if !diagnostics.is_empty() {
 | 
				
			||||||
 | 
					            let messages: Vec<String> = diagnostics.iter().map(ToString::to_string).collect();
 | 
				
			||||||
 | 
					            return Err(DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!(
 | 
				
			||||||
 | 
					                    "Failed to compile Slint file '{}':\n{}",
 | 
				
			||||||
 | 
					                    path.as_ref().display(),
 | 
				
			||||||
 | 
					                    messages.join("\n")
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .into());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let definition = compilation_result.component(component_name).ok_or_else(|| {
 | 
				
			||||||
 | 
					            DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!(
 | 
				
			||||||
 | 
					                    "Component '{}' not found in Slint file '{}'",
 | 
				
			||||||
 | 
					                    component_name,
 | 
				
			||||||
 | 
					                    path.as_ref().display()
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(Self::new(definition))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn from_source(
 | 
				
			||||||
 | 
					        source: impl AsRef<str>,
 | 
				
			||||||
 | 
					        component_name: Option<&str>,
 | 
				
			||||||
 | 
					    ) -> Result<LayerShika<HasComponent>> {
 | 
				
			||||||
 | 
					        Self::from_source_with_compiler(
 | 
				
			||||||
 | 
					            source,
 | 
				
			||||||
 | 
					            &mut Compiler::default(),
 | 
				
			||||||
 | 
					            component_name.unwrap_or("Main"),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn from_source_with_compiler(
 | 
				
			||||||
 | 
					        source: impl AsRef<str>,
 | 
				
			||||||
 | 
					        compiler: &mut Compiler,
 | 
				
			||||||
 | 
					        component_name: &str,
 | 
				
			||||||
 | 
					    ) -> Result<LayerShika<HasComponent>> {
 | 
				
			||||||
 | 
					        let compilation_result =
 | 
				
			||||||
 | 
					            spin_on(compiler.build_from_source(source.as_ref().to_string(), PathBuf::default()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let diagnostics: Vec<_> = compilation_result.diagnostics().collect();
 | 
				
			||||||
 | 
					        if !diagnostics.is_empty() {
 | 
				
			||||||
 | 
					            let messages: Vec<String> = diagnostics.iter().map(ToString::to_string).collect();
 | 
				
			||||||
 | 
					            return Err(DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!(
 | 
				
			||||||
 | 
					                    "Failed to compile Slint source code:\n{}",
 | 
				
			||||||
 | 
					                    messages.join("\n")
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .into());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let definition = compilation_result.component(component_name).ok_or_else(|| {
 | 
				
			||||||
 | 
					            DomainError::Configuration {
 | 
				
			||||||
 | 
					                message: format!("Component '{}' not found in Slint source code", component_name),
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(Self::new(definition))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl LayerShika<HasComponent> {
 | 
					impl LayerShika<HasComponent> {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue