From 803ef549d0ebd2a3b5d2c3e2c1adba12b9ac36d2 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 20 Feb 2024 09:45:19 -0700 Subject: [PATCH] Implement highlight current line, fixes #133 --- Cargo.lock | 152 ++++++++++++++++++++++++------------------------ src/config.rs | 2 + src/main.rs | 22 ++++++- src/menu.rs | 6 +- src/text_box.rs | 47 +++++++++++++++ 5 files changed, 151 insertions(+), 78 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b6b519e..f5f2802 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,9 +110,9 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if 1.0.0", "getrandom", @@ -205,9 +205,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -346,7 +346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 5.0.0", + "event-listener 5.1.0", "event-listener-strategy 0.5.0", "futures-core", "pin-project-lite", @@ -410,7 +410,7 @@ dependencies = [ "futures-io", "futures-lite 2.2.0", "parking", - "polling 3.4.0", + "polling 3.5.0", "rustix 0.38.31", "slab", "tracing", @@ -462,7 +462,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -497,7 +497,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -748,7 +748,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -791,7 +791,7 @@ checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" dependencies = [ "bitflags 2.4.2", "log", - "polling 3.4.0", + "polling 3.5.0", "rustix 0.38.31", "slab", "thiserror", @@ -876,9 +876,9 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "5.1.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec832972fefb8cf9313b45a0d1945e29c9c251f1d4c6eafc5fe2124c02d2e81" +checksum = "12f9a0700e0127ba15d1d52dd742097f821cd9c65939303a44d970465040a297" dependencies = [ "error-code", ] @@ -1227,7 +1227,7 @@ dependencies = [ [[package]] name = "cosmic-syntax-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-syntax-theme#3221bb4e22c17df5d14380a600b2ffe7eb753b25" +source = "git+https://github.com/pop-os/cosmic-syntax-theme#65e6162d5649914a2accd89d226aebe9715f9fd4" dependencies = [ "handlebars", "serde", @@ -1376,9 +1376,9 @@ dependencies = [ [[package]] name = "css-color" -version = "0.2.5" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d101c65424c856131a3cb818da2ddde03500dc3656972269cdf79f018ef77eb4" +checksum = "42aaeae719fd78ce501d77c6cdf01f7e96f26bcd5617a4903a1c2b97e388543a" [[package]] name = "csscolorparser" @@ -1397,7 +1397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1467,7 +1467,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1489,7 +1489,7 @@ checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core 0.20.6", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1550,7 +1550,7 @@ dependencies = [ "darling 0.20.6", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1619,7 +1619,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1736,7 +1736,7 @@ checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1846,9 +1846,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" +checksum = "b7ad6fd685ce13acd6d9541a30f6db6567a7a24c9ffd4ba2955d29e3f22c8b27" dependencies = [ "concurrent-queue", "parking", @@ -1871,7 +1871,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" dependencies = [ - "event-listener 5.0.0", + "event-listener 5.1.0", "pin-project-lite", ] @@ -2040,9 +2040,9 @@ dependencies = [ [[package]] name = "fontdb" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3890d0893c8253d3eb98337af18b3e1a10a9b2958f2a164b53a93fb3a3049e72" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" dependencies = [ "fontconfig-parser", "log", @@ -2079,7 +2079,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2229,7 +2229,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2748,7 +2748,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.48", + "syn 2.0.50", "unic-langid", ] @@ -2762,7 +2762,7 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -3050,7 +3050,7 @@ dependencies = [ "gif 0.12.0", "jpeg-decoder 0.3.1", "num-traits", - "png 0.17.11", + "png 0.17.13", "qoi", "tiff 0.9.1", ] @@ -4027,7 +4027,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4200,7 +4200,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4242,7 +4242,7 @@ checksum = "e05d1c929301fee6830dafa764341118829b2535c216b0571e3821ecac5c885b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4365,7 +4365,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4409,7 +4409,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4484,9 +4484,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.11" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -4513,9 +4513,9 @@ dependencies = [ [[package]] name = "polling" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" dependencies = [ "cfg-if 1.0.0", "concurrent-queue", @@ -4606,9 +4606,9 @@ dependencies = [ [[package]] name = "profiling" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0f7f43585c34e4fdd7497d746bc32e14458cf11c69341cc0587b1d825dde42" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" [[package]] name = "pure-rust-locales" @@ -4834,7 +4834,7 @@ dependencies = [ "jpeg-decoder 0.3.1", "log", "pico-args", - "png 0.17.11", + "png 0.17.13", "rgb", "svgtypes", "tiny-skia", @@ -4912,7 +4912,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.48", + "syn 2.0.50", "walkdir", ] @@ -5013,9 +5013,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "safemem" @@ -5095,29 +5095,29 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -5132,7 +5132,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -5266,9 +5266,9 @@ dependencies = [ [[package]] name = "smithay-clipboard" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb62b280ce5a5cba847669933a0948d00904cf83845c944eae96a4738cea1a6" +checksum = "c091e7354ea8059d6ad99eace06dd13ddeedbb0ac72d40a9a6e7ff790525882d" dependencies = [ "libc", "smithay-client-toolkit 0.18.1", @@ -5419,9 +5419,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -5542,7 +5542,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -5618,7 +5618,7 @@ dependencies = [ "bytemuck", "cfg-if 1.0.0", "log", - "png 0.17.11", + "png 0.17.13", "tiny-skia-path", ] @@ -5705,7 +5705,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.5", + "toml_edit 0.22.6", ] [[package]] @@ -5741,15 +5741,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.5" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e68c159e8f5ba8a28c4eb7b0c0c190d77bb479047ca713270048145a9ad28a" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.1", + "winnow 0.6.2", ] [[package]] @@ -5771,7 +5771,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -5914,9 +5914,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -5929,9 +5929,9 @@ checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" [[package]] name = "unicode-script" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d817255e1bed6dfd4ca47258685d14d2bdcfbc64fdc9e3819bd5848057b8ecc" +checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" [[package]] name = "unicode-segmentation" @@ -6091,7 +6091,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "wasm-bindgen-shared", ] @@ -6125,7 +6125,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6861,9 +6861,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" +checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" dependencies = [ "memchr", ] @@ -6968,9 +6968,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "xxhash-rust" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" [[package]] name = "yaml-rust" @@ -7077,7 +7077,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] diff --git a/src/config.rs b/src/config.rs index 6fd9b91..2b20926 100644 --- a/src/config.rs +++ b/src/config.rs @@ -33,6 +33,7 @@ pub struct Config { pub auto_indent: bool, pub font_name: String, pub font_size: u16, + pub highlight_current_line: bool, pub line_numbers: bool, //TODO: move to state? pub recent_files: VecDeque, @@ -51,6 +52,7 @@ impl Default for Config { auto_indent: true, font_name: "Fira Mono".to_string(), font_size: 14, + highlight_current_line: true, line_numbers: true, recent_files: VecDeque::new(), recent_projects: VecDeque::new(), diff --git a/src/main.rs b/src/main.rs index d7154a2..fbf9ecd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -195,6 +195,7 @@ pub enum Action { ToggleAutoIndent, ToggleDocumentStatistics, ToggleGitManagement, + ToggleHighlightCurrentLine, ToggleLineNumbers, ToggleProjectSearch, ToggleSettingsPage, @@ -241,6 +242,7 @@ impl Action { Message::ToggleContextPage(ContextPage::DocumentStatistics) } Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement), + Self::ToggleHighlightCurrentLine => Message::ToggleHighlightCurrentLine, Self::ToggleLineNumbers => Message::ToggleLineNumbers, Self::ToggleProjectSearch => Message::ToggleContextPage(ContextPage::ProjectSearch), Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings), @@ -335,6 +337,7 @@ pub enum Message { Todo, ToggleAutoIndent, ToggleContextPage(ContextPage), + ToggleHighlightCurrentLine, ToggleLineNumbers, ToggleWordWrap, Undo, @@ -474,7 +477,7 @@ impl App { *open = true; *root = true; - for (project_name, project_path) in self.projects.iter() { + for (_project_name, project_path) in self.projects.iter() { if project_path == path { // Project already open return; @@ -2014,6 +2017,20 @@ impl Application for App { // Ensure focus of correct input return self.update_focus(); } + Message::ToggleHighlightCurrentLine => { + self.config.highlight_current_line = !self.config.highlight_current_line; + + // This forces a redraw of all buffers + let entities: Vec<_> = self.tab_model.iter().collect(); + for entity in entities { + if let Some(Tab::Editor(tab)) = self.tab_model.data_mut::(entity) { + let mut editor = tab.editor.lock().unwrap(); + editor.set_redraw(true); + } + } + + return self.save_config(); + } Message::ToggleLineNumbers => { self.config.line_numbers = !self.config.line_numbers; @@ -2134,6 +2151,9 @@ impl Application for App { .on_context_menu(move |position_opt| { Message::TabContextMenu(tab_id, position_opt) }); + if self.config.highlight_current_line { + text_box = text_box.highlight_current_line(); + } if self.config.line_numbers { text_box = text_box.line_numbers(); } diff --git a/src/menu.rs b/src/menu.rs index 0029da3..187db41 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -258,7 +258,11 @@ pub fn menu_bar<'a>( config.line_numbers, Action::ToggleLineNumbers, ), - menu_checkbox(fl!("highlight-current-line"), false, Action::Todo), + menu_checkbox( + fl!("highlight-current-line"), + config.highlight_current_line, + Action::ToggleHighlightCurrentLine, + ), //TODO: menu_item(fl!("syntax-highlighting"), Action::Todo), MenuTree::new(horizontal_rule(1)), menu_item(fl!("menu-settings"), Action::ToggleSettingsPage), diff --git a/src/text_box.rs b/src/text_box.rs index 228403a..bd9f40f 100644 --- a/src/text_box.rs +++ b/src/text_box.rs @@ -44,6 +44,7 @@ pub struct TextBox<'a, Message> { click_timing: Duration, has_context_menu: bool, on_context_menu: Option) -> Message + 'a>>, + highlight_current_line: bool, line_numbers: bool, } @@ -61,6 +62,7 @@ where click_timing: Duration::from_millis(500), has_context_menu: false, on_context_menu: None, + highlight_current_line: false, line_numbers: false, } } @@ -98,6 +100,11 @@ where self } + pub fn highlight_current_line(mut self) -> Self { + self.highlight_current_line = true; + self + } + pub fn line_numbers(mut self) -> Self { self.line_numbers = true; self @@ -501,6 +508,46 @@ where }); } + if self.highlight_current_line { + let line_highlight = { + let convert_color = |color: syntect::highlighting::Color| { + cosmic_text::Color::rgba(color.r, color.g, color.b, color.a) + }; + let syntax_theme = editor.theme(); + //TODO: ideal fallback for line highlight color + syntax_theme + .settings + .line_highlight + .map_or(editor.background_color(), convert_color) + }; + + let cursor = editor.cursor(); + editor.with_buffer(|buffer| { + for run in buffer.layout_runs() { + if run.line_i != cursor.line { + continue; + } + + draw_rect( + pixels, + Canvas { + w: image_w, + h: image_h, + }, + Canvas { + w: image_w - editor_offset_x, + h: metrics.line_height as i32, + }, + Offset { + x: editor_offset_x, + y: run.line_top as i32, + }, + line_highlight, + ); + } + }); + } + // Draw editor editor.draw(font_system.raw(), &mut swash_cache, |x, y, w, h, color| { draw_rect(