1
0
mirror of https://github.com/emilk/egui.git synced 2026-06-27 15:13:12 -04:00
Commit Graph

289 Commits

Author SHA1 Message Date
Hubert Głuchowski
48e4e8ca92 Don't round row sizes again in Galley::concat 2025-04-01 16:32:42 +02:00
Emil Ernerfeldt
00ed9c1547 Be more forgiving in our comparison 2025-03-30 20:29:52 +02:00
Emil Ernerfeldt
a72e10ab23 Remove outdated TODO 2025-03-30 20:18:06 +02:00
Emil Ernerfeldt
8a33a6a6ce Make the section index private so we don't need to calculate it corectly 2025-03-30 20:03:47 +02:00
Emil Ernerfeldt
22ea9e91bd Optimize concat 2025-03-30 19:48:10 +02:00
Emil Ernerfeldt
d74bee536f Fix first performance performance problem 2025-03-30 18:54:15 +02:00
Emil Ernerfeldt
f4fca5a117 Better handling of invisible underlines/strikethrough 2025-03-30 17:52:48 +02:00
Emil Ernerfeldt
5f01b0dc9d Round glyph to closes pixel 2025-03-30 17:52:29 +02:00
Emil Ernerfeldt
20667a0592 put PlacedRow::pos first in struct 2025-03-30 17:52:13 +02:00
Emil Ernerfeldt
1b1f0726ce Simplify Galley bounding rect calulcation 2025-03-30 17:23:21 +02:00
Emil Ernerfeldt
9e44490b31 Refactor galley size rounding 2025-03-30 17:13:39 +02:00
Emil Ernerfeldt
b0d0d2f279 Test that halign & justify works the same 2025-03-30 16:58:19 +02:00
Emil Ernerfeldt
4ee4572f02 Fix bug in code transforming TextShape 2025-03-30 16:50:05 +02:00
Emil Ernerfeldt
7824e2ac18 Implement MulAssign for Pos2 2025-03-30 16:41:20 +02:00
Emil Ernerfeldt
3d70f7289a Small code cleanup 2025-03-30 16:37:43 +02:00
Emil Ernerfeldt
88340eee76 Merge branch 'master' into cache_galley_lines 2025-03-30 16:36:54 +02:00
Emil Ernerfeldt
e275409eb1 Fix: transform TextShape underline width (#5865)
Minor bug fix when transforming a `TextShape` with a `underline` (used
for e.g. hyperlinks). Before the underline width would not scale
properly; now it will.
2025-03-30 16:36:03 +02:00
Emil Ernerfeldt
072c8fc8ed Merge branch 'master' into cache_galley_lines 2025-03-30 16:22:59 +02:00
Emil Ernerfeldt
e3acd71090 Make text background rects pixel-sharp (#5864)
Small visual teak: make sure the background text color is pixel-aligned.
2025-03-30 16:21:00 +02:00
Hank Jordan
943e3618fc Improve drag-to-select text (add margins) (#5797)
Might want to draw from `interaction.interact_radius` style instead of
hard-coding the margin, but I didn't want to create a breaking change.
If desired, I can follow up with a separate PR to address that concern.

* Closes <https://github.com/emilk/egui/issues/5796>
* [x] I have followed the instructions in the PR template
2025-03-30 14:03:19 +02:00
Emil Ernerfeldt
83254718a3 Clean up strikethrough/underline code in epaint 2025-03-30 13:15:41 +02:00
Emil Ernerfeldt
7ea3f762b8 Make text underline and strikethrough pixel perfect crisp (#5857)
Small visual fix: pixel-align any text underline or strikethrough.
Before they could be often be blurry.
2025-03-28 20:37:38 +01:00
Emil Ernerfeldt
5ecc31885c Pre-existing bug fix: round strikethrough and underline to pixel coord 2025-03-28 20:24:33 +01:00
Emil Ernerfeldt
ed847f1a55 Refactor: create Stroke::round_center_to_pixel 2025-03-28 20:22:10 +01:00
Emil Ernerfeldt
25f647322e Make test a bit more forgiving 2025-03-28 20:08:47 +01:00
Emil Ernerfeldt
cbc3c33051 Don't round row positions to ui 2025-03-28 20:05:03 +01:00
Emil Ernerfeldt
1cdf525797 Remove dbg! 2025-03-28 16:10:49 +01:00
Emil Ernerfeldt
33ff4bd7da Simplify 2025-03-28 16:09:40 +01:00
Emil Ernerfeldt
2fb0764a24 Fix section_index 2025-03-28 16:08:46 +01:00
Emil Ernerfeldt
b060fd25b0 Remove unwraps 2025-03-28 16:08:35 +01:00
Emil Ernerfeldt
46ef7a1159 code cleanup 2025-03-28 15:55:23 +01:00
Emil Ernerfeldt
47f916ca80 Fix wrong mesh_bounds 2025-03-28 15:34:00 +01:00
Emil Ernerfeldt
947945f0ba Remove done TODO 2025-03-28 15:13:57 +01:00
Emil Ernerfeldt
79d114dfb0 Use similar-asserts for better test output 2025-03-28 15:11:30 +01:00
Emil Ernerfeldt
2ac4c93cc3 Move Galley::concat 2025-03-28 12:54:53 +01:00
Emil Ernerfeldt
29d47c1641 Clean up code slightly 2025-03-28 12:52:07 +01:00
Emil Ernerfeldt
6f4732b068 Simplify the code slightly 2025-03-28 12:38:55 +01:00
Emil Ernerfeldt
3e89613dc1 Add messages to asserts 2025-03-28 12:29:12 +01:00
Emil Ernerfeldt
8a45db62f1 Create should_cache_each_paragraph_individually and heed max_rows 2025-03-28 11:33:56 +01:00
Hubert Głuchowski
085d9b56e9 Merge branch 'master' into cache_galley_lines 2025-03-26 19:08:40 +01:00
Nicolas
58b2ac88c0 Add assert messages and print bad argument values in asserts (#5216)
Enabled the `missing_assert_message` lint

* [x] I have followed the instructions in the PR template

---------

Co-authored-by: Lucas Meurer <lucasmeurer96@gmail.com>
2025-03-25 09:20:29 +01:00
GiGaGon
668abc2838 Add expand_bg to customize size of text background (#5365)
This removes the `expand(1.0)` on text background colors, since it makes
translucent background colors have bad looking bleeding.

There is probably a smarter solution than disabling the highlighting
entirely, but I don't see a way to do that while keeping the area
consumed consistent between translucent/solid colors, or adding a decent
step up in complexity.

Since this makes it impossible to tell if selected text is highlighted,
this also adds a blanket `0.5` gamma multiply to the text selection
background color. If that is undesirable because it's a bad arbitrary
number choice, or if it's too much of an unexpected change and just the
default values should be changed, please let me know.

These changes cause the tests that use screenshots with highlighted text
to fail, though I am not sure how to update those tests to match the
changes.

<details>
<summary>Comparison Images</summary>

Current:


![image](https://github.com/user-attachments/assets/6dc85492-4f8e-4e7a-84b4-3ee10a48b8b3)

After changes:


![image](https://github.com/user-attachments/assets/9b35bbd3-159d-42a9-b22f-80febb707cfa)
 

</details>

<details>
<summary>Code used to make comparison images</summary>

```rs
fn color_text_format(ui: &Ui, color: Color32) -> TextFormat {
    TextFormat { font_id: FontId::monospace(ui.text_style_height(&egui::TextStyle::Monospace)), background: color, ..Default::default() }
}

fn color_sequence_galley(ui: &Ui, text: &str, colors: [Color32; 3]) -> Arc<Galley> {
    let mut layout_job = LayoutJob::default();
    for color in colors {
        layout_job.append(text, 0.0, color_text_format(ui, color));
    }
    ui.fonts(|f| f.layout_job(layout_job))
}

fn color_sequence_row(ui: &mut Ui, label_text: &str, text: &str, colors: [Color32; 3]) {
    ui.label(label_text);
    ui.label(color_sequence_galley(ui, text, colors));
    ui.end_row();
}

egui::Grid::new("comparison display").show(ui, |ui| {
    ui.ctx().set_pixels_per_point(2.0);
    let transparent = Color32::TRANSPARENT;
    let solid = Color32::RED;
    let solid_2 = Color32::GREEN;
    let translucent_1 = Color32::GRAY.gamma_multiply(0.5);
    let translucent_2 = Color32::GREEN.gamma_multiply(0.5);
    color_sequence_row(ui, "Transparent to Solid:", " ", [transparent, solid, transparent]);
    color_sequence_row(ui, "Translucent to Transparent:", " ", [transparent, translucent_1, transparent]);
    color_sequence_row(ui, "Solid to Transparent:", " ", [solid, solid_2, solid]);
    color_sequence_row(ui, "Solid to Solid:", " ", [solid, transparent, solid]);
    color_sequence_row(ui, "Solid to Translucent:", " ", [solid, translucent_1, solid]);
    color_sequence_row(ui, "Translucent to Translucent:", " ", [translucent_1, translucent_2, translucent_1]);
    
    color_sequence_row(ui, "Transparent to Solid:", "a", [transparent, solid, transparent]);
    color_sequence_row(ui, "Translucent to Transparent:", "a", [transparent, translucent_1, transparent]);
    color_sequence_row(ui, "Solid to Transparent:", "a", [solid, solid_2, solid]);
    color_sequence_row(ui, "Solid to Solid:", "a", [solid, transparent, solid]);
    color_sequence_row(ui, "Solid to Translucent:", "a", [solid, translucent_1, solid]);
    color_sequence_row(ui, "Translucent to Translucent:", "a", [translucent_1, translucent_2, translucent_1]);
})
```
</details>

* [x] I have followed the instructions in the PR template

---------

Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
2025-03-21 13:45:34 +01:00
Emil Ernerfeldt
2058dcb881 Improve text sharpness (#5838)
This improves the sharpness of text slightly, thanks to
<https://hikogui.org/2022/10/24/the-trouble-with-anti-aliasing.html> by
@hikogui (🙏 ).

The difference is very small, but in dark mode (bright text on dark
background) text is sometimes significantly sharper, and also slightly
brighter.

The difference in light mode (dark text on light background) is much
smaller (barely perceptable).

To compare the before/after I suggest you open both in new tabs, then
quickly change between them.

### Low-DPI
#### Before
![Code Editor
old](https://github.com/user-attachments/assets/e10a3cad-932f-48cd-b7d6-5bfe70954c5e)

#### After
![Code
Editor](https://github.com/user-attachments/assets/2e7383fe-8023-4425-91c8-93df3c22c0fe)

#### Before

![old-white](https://github.com/user-attachments/assets/51c41c59-e897-4831-857a-f3ffe17ce7d4)

#### After

![new-white](https://github.com/user-attachments/assets/4ac6f951-8c57-4bcc-a5d5-788cf52ea7d8)

### High-DPI
The difference is starkest on low-DPI screens (like the above
screenshots). On high-DPI screens, the difference is much smaller

#### Before
![widget_gallery
old](https://github.com/user-attachments/assets/f2149a30-aef8-4383-b48c-73d33a03ca02)

#### After

![widget_gallery](https://github.com/user-attachments/assets/c9ceb8be-8a32-490c-9364-2c6562b741f6)
2025-03-21 12:56:47 +01:00
StratusFearMe21
52732b23a6 impl AsRef<[u8]> for FontData (#5757)
* [x] I have followed the instructions in the PR template

This PR implements `AsRef<[u8]>` for `FontData`, allowing it to be
passed into `fontdb`'s
[`Source`](https://docs.rs/fontdb/0.16.2/fontdb/enum.Source.html) type.
This would allow `egui` and `cosmic_text` to share font data with
eachother
2025-03-20 11:03:17 +01:00
valadaptive
267485976b Simplify the text cursor API (#5785)
<!--
Please read the "Making a PR" section of
[`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/master/CONTRIBUTING.md)
before opening a Pull Request!

* Keep your PR:s small and focused.
* The PR title is what ends up in the changelog, so make it descriptive!
* If applicable, add a screenshot or gif.
* If it is a non-trivial addition, consider adding a demo for it to
`egui_demo_lib`, or a new example.
* Do NOT open PR:s from your `master` branch, as that makes it hard for
maintainers to test and add commits to your PR.
* Remember to run `cargo fmt` and `cargo clippy`.
* Open the PR as a draft until you have self-reviewed it and run
`./scripts/check.sh`.
* When you have addressed a PR comment, mark it as resolved.

Please be patient! I will review your PR, but my time is limited!
-->

* Closes N/A, but this is part of
https://github.com/emilk/egui/issues/3378
* [x] I have followed the instructions in the PR template

Other text layout libraries in Rust--namely, Parley and Cosmic
Text--have one canonical text cursor type (Parley's is a byte index,
Cosmic Text's also stores the line index). To prepare for migrating egui
to one of those libraries, it should also have only one text cursor
type. I also think simplifying the API is a good idea in and of
itself--having three different cursor types that you have to convert
between (and a `Cursor` struct which contains all three at once) is
confusing.

After a bit of experimentation, I found that the best cursor type to
coalesce around is `CCursor`. In the few places where we need a
paragraph index or row/column position, we can calculate them as
necessary.

I've removed `CursorRange` and `PCursorRange` (the latter appears to
have never been used), merging the functionality with `CCursorRange`. To
preserve the cursor position when navigating row-by-row, `CCursorRange`
now stores the previous horizontal position of the cursor.

I've also removed `PCursor`, and renamed `RowCursor` to `LayoutCursor`
(since it includes not only the row but the column). I have not renamed
either `CCursorRange` or `CCursor` as those names are used in a lot of
places, and I don't want to clutter this PR with a bunch of renames.
I'll leave it for a later PR.

Finally, I've removed the deprecated methods from `TextEditState`--it
made the refactoring easier, and it should be pretty easy to migrate to
the equivalent `TextCursorState` methods.

I'm not sure how many breaking changes people will actually encounter. A
lot of these APIs were technically public, but I don't think many were
useful. The `TextBuffer` trait now takes `&CCursorRange` instead of
`&CursorRange` in a couple of methods, and I renamed
`CCursorRange::sorted` to `CCursorRange::sorted_cursors` to match
`CursorRange`.

I did encounter a couple of apparent minor bugs when testing out text
cursor behavior, but I checked them against the current version of egui
and they're all pre-existing.
2025-03-20 10:49:38 +01:00
Lucas Meurer
159ccb2fef Release 0.31.1 - text_edit and kittest fixes 2025-03-05 08:37:34 +01:00
lucasmerlin
510b3cdf48 Rename Marginf to MarginF32 for consistency with CornerRadiusF32 (#5677)
* [x] I have followed the instructions in the PR template
2025-02-11 11:23:59 +01:00
Pēteris Pakalns
54d00d7d69 Fix panic when rendering thin textured rectangles (#5692)
* Closes https://github.com/emilk/egui/issues/5664
* [x] I have followed the instructions in the PR template
2025-02-06 21:37:32 +01:00
Lucas Meurer
5c372a7b36 Release 0.31.0 - Scene container, improved rendering quality 2025-02-04 16:47:56 +01:00
Emil Ernerfeldt
c6bda9a38c Make the ends of vline/hline sharper (#5676)
TL;DR: line caps are annoying in two ways:

A) we only add them for lines wider than a pixel
B) they always make the line longer (if added)
2025-02-04 15:31:51 +01:00