forked from 1b-agent/opencadstudio-upstream
feat(ui): elide overflowing text, tooltip full layer name
iced has no built-in ellipsis, so long user content (file names, layer names, paths, property values) wrapped or spilled past fixed-width panels. Add an `elide` helper (char-budget truncation with a trailing ellipsis) and apply it to the layer manager, properties panel, document tabs, recent-files list and the save dialog. In the layer manager a truncated name reveals its full text in a cursor-following tooltip on hover, so the column need not be widened. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
b3aadf569e
commit
ff10f8a89a
5 files changed
+111
-32
No files matched your search
@@ -0,0 +1,45 @@
|
||||
//! Shared helpers for fitting text into width-constrained widgets.
|
||||
//!
|
||||
//! iced has no built-in ellipsis, so long user content (file names, layer
|
||||
//! names, paths, property values) would otherwise wrap and break row
|
||||
//! heights or spill past fixed-width panels. `elide` trims to a character
|
||||
//! budget and marks the cut with a single ellipsis.
|
||||
|
||||
/// Truncate `s` to at most `max` characters, replacing the overflow with a
|
||||
/// trailing ellipsis. `max` includes the ellipsis character; `max == 0`
|
||||
/// yields an empty string. Counts by `char` so multi-byte text is safe.
|
||||
pub fn elide(s: &str, max: usize) -> String {
|
||||
if s.chars().count() <= max {
|
||||
return s.to_string();
|
||||
}
|
||||
if max == 0 {
|
||||
return String::new();
|
||||
}
|
||||
let mut out: String = s.chars().take(max - 1).collect();
|
||||
out.push('…');
|
||||
out
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::elide;
|
||||
|
||||
#[test]
|
||||
fn short_unchanged() {
|
||||
assert_eq!(elide("abc", 8), "abc");
|
||||
assert_eq!(elide("abc", 3), "abc");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn long_truncated() {
|
||||
assert_eq!(elide("abcdef", 4), "abc…");
|
||||
assert_eq!(elide("abcdef", 1), "…");
|
||||
assert_eq!(elide("abcdef", 0), "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multibyte_safe() {
|
||||
// No panic on a char boundary and the budget counts chars.
|
||||
assert_eq!(elide("çağrışım", 4), "çağ…");
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user