-
Notifications
You must be signed in to change notification settings - Fork 335
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow TextLog body to display as immutable TextEdit rather than Label #4716
Conversation
Web testing to come... Appreciate a first look at the text color setting logic since I'm clearly missing something to make it render same as RichText Label does. |
This allows selecting and copying text from the log body.
0912f9a
to
937db0e
Compare
Thanks for the PR! We need to support easily copying text from the Rerun UI, but I'm not sure this is the best approach. A different approach is to use a 📋-button for copying the entire text, like we already do for code-blocks in markdown. I'm gonna talk it through with our designer next week and get back to you! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After some discussion, we've decided that the drag-to-select approach is indeed the way to go.
We're planning on implementing this wide in egui at some point (emilk/egui#3804), but in the meantime this PR is a good bandaid.
I don't think we should have a "selectable" option - let's just make selectable the default, and make it a good default.
Right now turning on "selectable" also turns on text elision (shortening with "…") which is the opposite of what.
It would also be nice to encapsulate the added code in a fn selectable_label(ui: &mut egui::Ui, text: egui::RichText)
Thanks @emilk! I should have some time this weekend to take a second look at this and make selectable the default. There's some aspects I'm missing related to the difference between the RichText label and the immutable TextEdit (masquerading as a Label):
Any pointers you might have for where to look to understand the differences are appreciated, otherwise I'll see what I can put together based on the |
// TODO(lupickup): Understand why TextEdit text color is white instead of gray like the RichText version. | ||
ui.visuals() | ||
.override_text_color | ||
.unwrap_or_else(|| ui.visuals().widgets.inactive.text_color()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
inactive.text_color
is the text color of an interactive widget (that is not currently being interacted with). That's why you get white text: https://docs.rs/egui/latest/egui/style/struct.Widgets.html#structfield.inactive
Use noninteractive
instead (we don't count text selection as interaction)
let mut layout_job = egui::text::LayoutJob::simple( | ||
string.to_owned(), | ||
font_id.clone(), | ||
text_color, | ||
wrap_width, | ||
); | ||
layout_job.wrap.max_rows = entry_text_rows; | ||
// Fill to end of body column instead of choosing a full "word" to ellide | ||
layout_job.wrap.break_anywhere = true; | ||
ui.fonts(|f| f.layout_job(layout_job)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suggest you compute this Galley
once and copy into this layouter
. The string
you know (and is fixed), and wrap_width
should be f32::INFINITY
(no wrapping).
By computing the galley up-front you can pass the size of it to TextEdit::min_size
.
Text selection of all labels will be coming in the next egui release (1-3 weeks away): emilk/egui#3814 |
### What This is so we can test things out before the next release, and also get in some new egui features for the plot aggregator and drag-and-drop. * Closes #4716 * Closes #4794 ### TODO * [x] Fix hovering ListItems in blueprint panel ### wgpu changelog https://github.com/gfx-rs/wgpu/blob/trunk/CHANGELOG.md#v0190-2024-01-17 ### relevant egui changelog (so far) #### eframe * Keep `ViewportInfo::maximized` and `minimized` up-to-date on Windows [#3831](emilk/egui#3831) (thanks [@rustbasic](https://github.com/rustbasic)!) * Update wgpu to 0.19 [#3824](emilk/egui#3824) * Fix: handle `IconData::default()` without crashing [#3842](emilk/egui#3842) #### egui_extras * Fix unwraps in SVG scaling [#3826](emilk/egui#3826) (thanks [@amPerl](https://github.com/amPerl)!) * Update to ehttp 0.4 [#3834](emilk/egui#3834) #### egui_plot * Make `egui_plot::PlotMemory` public [#3871](emilk/egui#3871) #### egui * Selectable text in Labels [#3814](emilk/egui#3814) * `ComboBox`: add builder method for height [#3001](emilk/egui#3001) (thanks [@hinto-janai](https://github.com/hinto-janai)!) * Add keys `?`, `/`, `|` [#3820](emilk/egui#3820) * Fix clickable widgets blocking scrolling on touch screens [#3815](emilk/egui#3815) (thanks [@lucasmerlin](https://github.com/lucasmerlin)!) * Fix `stable_dt` [#3832](emilk/egui#3832) * Bug Fix : `Response::is_pointer_button_down_on` is now false the frame the button is released [#3833](emilk/egui#3833) (thanks [@rustbasic](https://github.com/rustbasic)!) * Use runtime knowledge of OS for OS-specific text editing [#3840](emilk/egui#3840) * Refactor: move text selection logic to own module [#3843](emilk/egui#3843) * Fix: dragging to above/below a `TextEdit` or `Label` will select text to begin/end [#3858](emilk/egui#3858) * Add `Response::contains_pointer` [#3859](emilk/egui#3859) * Always set `response.hovered` to false when dragging another widget [#3860](emilk/egui#3860) * Add `Align2::anchor_size` [#3863](emilk/egui#3863) * Add `Context::debug_text` [#3864](emilk/egui#3864) #### epaint * Add `Align2::anchor_size` [#3863](emilk/egui#3863) ### Checklist * [x] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md) * [x] I've included a screenshot or gif (if applicable) * [x] I have tested the web demo (if applicable): * Using newly built examples: [app.rerun.io](https://app.rerun.io/pr/4885/index.html) * Using examples from latest `main` build: [app.rerun.io](https://app.rerun.io/pr/4885/index.html?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) * Using full set of examples from `nightly` build: [app.rerun.io](https://app.rerun.io/pr/4885/index.html?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) * [x] The PR title and labels are set such as to maximize their usefulness for the next release's CHANGELOG - [PR Build Summary](https://build.rerun.io/pr/4885) - [Docs preview](https://rerun.io/preview/eb1bce846c3adb29b99d04018b002475994ad213/docs) <!--DOCS-PREVIEW--> - [Examples preview](https://rerun.io/preview/eb1bce846c3adb29b99d04018b002475994ad213/examples) <!--EXAMPLES-PREVIEW--> - [Recent benchmark results](https://build.rerun.io/graphs/crates.html) - [Wasm size tracking](https://build.rerun.io/graphs/sizes.html) --------- Co-authored-by: Andreas Reich <[email protected]>
What
Convert TextLog body to display as immutable TextEdit rather than Label.
This allows selecting and copying text from the log body.
Used discussion in emilk/egui#353 (comment) as inspiration.
selectable == false
(default):selectable == true
:Checklist
main
build: app.rerun.ionightly
build: app.rerun.io