This commit is contained in:
2026-10-30 23:11:51 +03:00
parent 55c3955897
commit 27385a3edb
11 changed files with 1898 additions and 63 deletions
+43
View File
@@ -147,6 +147,11 @@ pub struct Document {
pub id: u64,
pub name: String,
pub content: String,
/// Имя иконки вкладки из каталога Lucide (см. `crate::icons`).
///
/// `None` — показывается иконка по умолчанию. Назначается через
/// `AppApi::set_tab_icon`.
pub icon: Option<String>,
/// Язык подсветки синтаксиса.
///
/// `None` — подсветка выключена (поведение по умолчанию). Включается
@@ -166,6 +171,7 @@ impl Document {
name: name.into(),
saved_content: content.clone(),
content,
icon: None,
language: None,
cursor: 0,
}
@@ -380,6 +386,43 @@ impl Workspace {
self.active_mut().mark_saved();
self.bump();
}
/// Назначает вкладке иконку из каталога; возвращает `false`, если вкладки нет.
pub fn set_tab_icon(&mut self, index: usize, icon: impl Into<String>) -> bool {
let icon = icon.into();
let changed = match self.documents.get_mut(index) {
Some(document) => {
let changed = document.icon.as_deref() != Some(icon.as_str());
if changed {
document.icon = Some(icon);
}
changed
}
None => return false,
};
if changed {
self.bump();
}
true
}
/// Возвращает вкладке иконку по умолчанию; `false`, если вкладки нет.
pub fn clear_tab_icon(&mut self, index: usize) -> bool {
let changed = match self.documents.get_mut(index) {
Some(document) => document.icon.take().is_some(),
None => return false,
};
if changed {
self.bump();
}
true
}
/// Имя иконки вкладки, если оно назначено.
pub fn tab_icon(&self, index: usize) -> Option<&str> {
self.document(index)
.and_then(|document| document.icon.as_deref())
}
}
const SAMPLE_RUST: &str = r#"//! Демонстрационный файл.