Skip to main content

Mountain/RPC/CocoonService/Window/
CreateStatusBarItem.rs

1
2//! Register a status-bar entry through the `StatusBarProvider` trait so
3//! the entry lives in
4//! `ApplicationState::Feature::Markers::ActiveStatusBarItems`. Without this
5//! registration the workbench has no memory of the entry and
6//! the first `SetStatusBarText::Fn` call rebroadcasts a fresh entry
7//! (state leak). Falls back to a direct Sky emit on trait failure.
8
9use serde_json::json;
10use tauri::Emitter;
11use tonic::{Response, Status};
12use CommonLibrary::StatusBar::{DTO::StatusBarEntryDTO::StatusBarEntryDTO, StatusBarProvider::StatusBarProvider};
13
14use crate::{
15	RPC::CocoonService::CocoonServiceImpl,
16	Vine::Generated::{CreateStatusBarItemRequest, CreateStatusBarItemResponse},
17	dev_log,
18};
19
20pub async fn Fn(
21	Service:&CocoonServiceImpl,
22
23	Request:CreateStatusBarItemRequest,
24) -> Result<Response<CreateStatusBarItemResponse>, Status> {
25	dev_log!("cocoon", "[CocoonService] create_status_bar_item: {}", Request.id);
26
27	let Entry = StatusBarEntryDTO {
28		EntryIdentifier:Request.id.clone(),
29
30		ItemIdentifier:Request.id.clone(),
31
32		ExtensionIdentifier:String::new(),
33
34		Name:None,
35
36		Text:Request.text.clone(),
37
38		Tooltip:if Request.tooltip.is_empty() { None } else { Some(json!(Request.tooltip)) },
39
40		HasTooltipProvider:false,
41
42		Command:None,
43
44		Color:None,
45
46		BackgroundColor:None,
47
48		IsAlignedLeft:true,
49
50		Priority:None,
51
52		AccessibilityInformation:None,
53	};
54
55	if let Err(Error) = Service.environment.SetStatusBarEntry(Entry).await {
56		dev_log!("cocoon", "warn: [CocoonService] create_status_bar_item trait failed: {}", Error);
57
58		let _ = Service.environment.ApplicationHandle.emit(
59			"sky://statusbar/create",
60			json!({ "id": Request.id, "text": Request.text, "tooltip": Request.tooltip }),
61		);
62	}
63
64	Ok(Response::new(CreateStatusBarItemResponse { item_id:Request.id.clone() }))
65}