Implement highlight current line, fixes #133

This commit is contained in:
Jeremy Soller 2024-02-20 09:45:19 -07:00
parent 22ec51b7e7
commit 803ef549d0
No known key found for this signature in database
GPG key ID: D02FD439211AF56F
5 changed files with 151 additions and 78 deletions

152
Cargo.lock generated
View file

@ -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]]

View file

@ -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<PathBuf>,
@ -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(),

View file

@ -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::<Tab>(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();
}

View file

@ -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),

View file

@ -44,6 +44,7 @@ pub struct TextBox<'a, Message> {
click_timing: Duration,
has_context_menu: bool,
on_context_menu: Option<Box<dyn Fn(Option<Point>) -> 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(