use galaxyui::{ elements::{Flex, MouseStateHandle, ParentElement}, fonts::Weight, ui_components::components::{UiComponent, UiComponentStyles}, AppContext, Element, }; use crate::{ appearance::Appearance, cloud_object::CloudObjectMetadata, drive::{index::DriveIndexAction, CloudObjectTypeAndId, DriveObjectType}, notebooks::CloudNotebook, themes::theme::Fill, }; use super::{WarpDriveItem, WarpDriveItemId}; #[derive(Clone)] pub struct WarpDriveNotebook { id: CloudObjectTypeAndId, notebook: CloudNotebook, is_ai_document: bool, } impl WarpDriveNotebook { pub fn new(id: CloudObjectTypeAndId, notebook: CloudNotebook, is_ai_document: bool) -> Self { Self { id, notebook, is_ai_document, } } } impl WarpDriveItem for WarpDriveNotebook { fn display_name(&self) -> Option { if self.notebook.model().title.is_empty() { None } else { Some(self.notebook.model().title.clone()) } } fn metadata(&self) -> Option<&CloudObjectMetadata> { Some(&self.notebook.metadata) } fn object_type(&self) -> Option { Some(DriveObjectType::Notebook { is_ai_document: self.is_ai_document, }) } fn secondary_icon(&self, _color: Option) -> Option> { None } fn click_action(&self) -> Option { Some(DriveIndexAction::OpenObject(self.id)) } fn preview(&self, appearance: &Appearance) -> Option> { let title_text = self.notebook.model().title.clone(); let title_to_render = if title_text.is_empty() { "Untitled".to_string() } else { title_text }; let title = appearance .ui_builder() .wrappable_text(title_to_render, true) .with_style(UiComponentStyles { font_color: Some( appearance .theme() .main_text_color(appearance.theme().background()) .into(), ), font_size: Some(14.), font_weight: Some(Weight::Bold), ..Default::default() }) .build() .finish(); Some(Flex::column().with_child(title).finish()) } fn warp_drive_id(&self) -> WarpDriveItemId { WarpDriveItemId::Object(self.id) } fn sync_status_icon( &self, sync_queue_is_dequeueing: bool, hover_state: MouseStateHandle, appearance: &Appearance, ) -> Option> { self.notebook.metadata.pending_changes_statuses.render_icon( sync_queue_is_dequeueing, hover_state, appearance, ) } fn action_summary(&self, _app: &AppContext) -> Option { None } fn clone_box(&self) -> Box { Box::new(self.clone()) } }