From 90d2fead9ce19cb53d174556797f3b3d52174d7c Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 1 Nov 2023 14:39:17 -0600 Subject: [PATCH] Add document statistics --- i18n/en/cosmic_edit.ftl | 9 ++++++++- src/main.rs | 45 +++++++++++++++++++++++++++++++++++++++++ src/menu.rs | 5 ++++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/i18n/en/cosmic_edit.ftl b/i18n/en/cosmic_edit.ftl index 70d67bd..305c13d 100644 --- a/i18n/en/cosmic_edit.ftl +++ b/i18n/en/cosmic_edit.ftl @@ -3,6 +3,13 @@ open-project = Open project # Context Pages +## Document statistics +document-statistics = Document statistics +word-count = Word count +character-count = Characters +character-count-no-spaces = Characters (without spaces) +line-count = Lines + ## Settings settings = Settings @@ -22,7 +29,7 @@ todo = TODO save = Save save-as = Save as... revert-all-changes = Revert all changes -document-statistics = Document statistics... +menu-document-statistics = Document statistics... document-type = Document type... encoding = Encoding... print = Print diff --git a/src/main.rs b/src/main.rs index bf2598c..facac57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -86,12 +86,14 @@ pub enum Message { #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum ContextPage { + DocumentStatistics, Settings, } impl ContextPage { fn title(&self) -> String { match self { + Self::DocumentStatistics => fl!("document-statistics"), Self::Settings => fl!("settings"), } } @@ -598,6 +600,49 @@ impl cosmic::Application for App { } Some(match self.context_page { + ContextPage::DocumentStatistics => { + //TODO: calculate in the background + let mut character_count = 0; + let mut character_count_no_spaces = 0; + let line_count; + match self.active_tab() { + Some(tab) => { + let editor = tab.editor.lock().unwrap(); + let buffer = editor.buffer(); + + line_count = buffer.lines.len(); + for line in buffer.lines.iter() { + //TODO: do graphemes? + for c in line.text().chars() { + character_count += 1; + if !c.is_whitespace() { + character_count_no_spaces += 1; + } + } + } + } + None => { + return None; + } + } + + widget::settings::view_column(vec![widget::settings::view_section("") + .add(widget::settings::item::builder(fl!("word-count")).control("TODO")) + .add( + widget::settings::item::builder(fl!("character-count")) + .control(widget::text(character_count.to_string())), + ) + .add( + widget::settings::item::builder(fl!("character-count-no-spaces")) + .control(widget::text(character_count_no_spaces.to_string())), + ) + .add( + widget::settings::item::builder(fl!("line-count")) + .control(widget::text(line_count.to_string())), + ) + .into()]) + .into() + } ContextPage::Settings => { widget::settings::view_column(vec![widget::settings::view_section(fl!( "keyboard-shortcuts" diff --git a/src/menu.rs b/src/menu.rs index 05cee82..7e8064e 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -110,7 +110,10 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> { MenuTree::new(horizontal_rule(1)), menu_item(fl!("revert-all-changes"), Message::Todo), MenuTree::new(horizontal_rule(1)), - menu_item(fl!("document-statistics"), Message::Todo), + menu_item( + fl!("menu-document-statistics"), + Message::ToggleContextPage(ContextPage::DocumentStatistics), + ), menu_item(fl!("document-type"), Message::Todo), menu_item(fl!("encoding"), Message::Todo), menu_item(fl!("print"), Message::Todo),