* Rename `CursorPair` to `CursorRange`
* Easymark editor: add keyboard shortcuts to toggle bold, italics etc
* Split up TextEdit into separate files
* Add TextEdit::show that returns a rich TextEditOutput object with response, galley and cursor
* Rename text_edit::State to TextEditState
This refactors the widget state storage introduced by @optozorax in https://github.com/emilk/egui/pull/257
* Unify the four buckets (`data`, `data_temp`, `id_data` and `id_data_temp`) into a single `data`.
* Less complexity, and also less chance of error (storing in one bucket, reading from another).
* Store data by `Id` and `TypeId`.
* Users can thus reuse the same `Id` to store many types.
* Uses a simple xor of id and typeid, which is fast and good since both id and typeid are already high-entropy hashes.
* Use different suffixes on the functions to pick if you want the data persisted or not (`get_temp`, `insert_persisted`, etc).
* Writing with one suffix and reading with the other works.
* To store state not bound to a specific `Id` (i.e. only based on type), use the new `Id::null` as the key.
* Move window building to egui-winit
* Move icon loading to egui-winit
* `use glow::HasContext;` -> `use glow::HasContext as _;`
* Move FileStorage into epi behind a feature flag
* De-duplicate screen_size_in_pixels and native_pixels_per_point
* Move creation of FileStorage to epi
* Handle epi app output (window size changes etc) in egui-winit
* Move app and memory persistence and autosave logic to egui-winit
* fix check.sh
* Make the epi backend opt-in for egui_glium and egui_glow
* Fix persistence
* Add integration name to epi::IntegrationInfo and the demo
* Clean up Cargo.toml files and fix making egui_glium optional
* fix typo
* Make egui_glium compile without the `epi` feature
* Make egui_glow and opt-in backend for eframe
* Add egui_glow to Cargo.toml and to CI
* Reference egui_glow where egui_glium is mentioned
* Remove path-patches from root Cargo.toml
* Add instructions on how to enable the glow backend of eframe
* implement stick-to-end scroll
* improve comment grammar
* accept emilk suggestion for demo text tweak
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* request repaint on each frame to show incoming scroll demo rows
* simplify pub api + doc strings
* disable scroll_stuck_to_end when wheel-scrolling or dragging
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Rename epaint feature "persistence" to "serialize"
* Add separate "serialize" feature to egui
* egui_demo_lib: separate serialize and persistence features
* Add App::persist_native_window and App::persist_egui_memory
Controls what gets persisted
Label text will now be centered, right-aligned and/or
justified based on the layout.
Galleys are no longer always pivoted in the left top corner,
so now have a Rect rather than just a size.
* Speed up galley cache by only using the hash as key
This hashes the job but doesn't compare them with Eq,
which speeds up demo_with_tessellate__realistic by 5-6%,
winning back all the performance lost in
https://github.com/emilk/egui/pull/682
* Remove custom Eq/PartialEq code for LayoutJob and friends
* Silence clippy
* Unrelated clippy fixes
I've extracted all the http request code and turned it
into its own crate at <https://github.com/emilk/ehttp>.
There was never a reason for the HTTP request library to be part of
`eframe`. Much better to have it as its own crate!
This PR introduces a completely rewritten text layout engine which is simpler and more powerful. It allows mixing different text styles (heading, body, etc) and formats (color, underlining, strikethrough, …) in the same layout pass, and baked into the same `Galley`.
This opens up the door to having a syntax-highlighed code editor, or a WYSIWYG markdown editor.
One major change is the color is now baked in at layout time. However, many widgets changes text color on hovered. But we need to do the text layout before we know if it is hovered. Therefor the painter has an option to override the text color of a galley.
## Performance
Text layout alone is about 20% slower, but a lot of that is because more tessellation is done upfront. Text tessellation is now a lot faster, but text layout + tessellation still lands at a net loss of 5-10% in performance. There are however a few tricks to speed it up (like using `smallvec`) which I am saving for later. Text layout is also cached, meaning that in most cases (when all text isn't changing each frame) text tessellation is actually more important (and that's more than 2x faster!).
Sadly, the actual text cache lookup is significantly slower (300ns -> 600ns). That's because the `TextLayoutJob` is a lot bigger (it has more options, like underlining, fonts etc), so it is slower to hash and compare. I have an idea how to speed this up, but I need to do some other work before I can implement that.
All in all, the performance impact on `demo_with_tesselate__realistic` is about 5-6% in the red. Not great; not terrible. The benefits are worth it, but I also think with some work I can get that down significantly, hopefully down to the old levels.
* First pass (missing rendering the bar)
* Render horizontal bars, and change Window scroll API
* emath: add impl Index + IndexMut for Align2
* Scrolling: fix subtle sizing bugs
* Add horizontal scrolling to color test
* try to wrap content before showing scrollbars, + add auto-shrink option
* Add hscroll to the misc demo window
* Fix for putting wrapping labels in an infinitely wide layout
* Add a egui_asserts to protect against nans in the layout engine
* Add line about horizontal scrolling to changelog
* Add example to docs of ScrollArea
* code cleanup
* Fix incorrect max_width/height of panels
* Fix set_width/set_min_width/set_height/set_min_height
Closes https://github.com/emilk/egui/issues/647
Broke in https://github.com/emilk/egui/pull/629
* Fix expand_to_include_x/expand_to_include_y
* Make minimum grid column width propagate properly
* Expand cursor when max_rect expands
* Add ui.expand_to_include_y
* Only expand cursor in advance
* demo: clean up font_book code
* Fix: Make sure `TextEdit` contents expand to fill width if applicable
* ProgressBar: minimum width and fix for having it in an infinite layout
* clippy fix
* Add collapsing header select as selectable label
* Modified Tree demo adding selectable example
* Update egui/src/containers/collapsing_header.rs
Selected is not linked to selectable
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui/src/containers/collapsing_header.rs
Description example
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Changing example without name clashing
* Fixing merge issue (ah I miss P4 sometimes)
* Fixing doctest example
* Add possibility to show background to a single one
* Fixing clippy test
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Allow using the layout cursor to restrict available area
* Avoid id clashes when putting panels inside a Ui
* Panels: Propagate height/width range to inner Ui
* Allow easy placement of panels inside of Ui:s
* demo: simplify Windows with Panels demo
* Generalize http fetch
- allow bytes as request body
- expose request and response headers in API
- update http example to show response headers and allow POST requests
* clippy fixes
* add missing comment, pub
* doc comment fix
* fix: missing argument when feature syntect not enabled
* formatting fixes
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* remove commented out code
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* formatting fixes
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* cargo fmt
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* added new line styles
* update changelog
* fix#524
Add missing functions to `HLine` and `VLine`
* add functions for creating points and dashes from a line
* apply suggestions
* clippy fix
* address comments
This allows for resizaeable grids, where the last column will be given the remainder of the width.
To demonstrate, the widget gallery window is now resizeable.
* Fix margin for grid layout nested inside grid
* Minor fix for grid layout
At time of end_row, current state is finished updating row_height.
Might as well use that instead of previous state.
* Fix horizontal advancing for nested layouts in grid
* Add back horizontal layout
* Add test for nested layouts in grids
* make test table striped
* Improve table test case with slider for dynamic text
* Added plot items:
* Arrows, also called "Quiver plots" in matplotlib etc.
* Convex polygons
* Text
* Images
Other changes:
* Make HLine/VLine into PlotItems as well.
* Add a "fill" property to Line so that we can fill/shade the area between a line and a horizontal reference line.
* Add stems to Points, which are lines between the points and a horizontal reference line.
* Allow using .. when specifying ranges for values generated by explicit callback functions, as an alias for f64::NEG_INFINITY..f64::INFINITY
* Allow using ranges with exclusive end bounds for values generated by parametric callback functions to generate values where the first and last value are not the same.
* update changelog
* add legend background
* Use old 1.51 toolchain instead of bleeding edge
1.52 and 1.53 has problems with incremental compilation,
so some people chose to stay on 1.51 for now.
So let's make sure egui supports 1.51 for a while!
* Update to cint 0.2.2 to get rust 1.51.0 compatability
* Tweak style
More compact, less round, less noisy
* Button text is now same size as body text
* The rounder corners are now less rounded
* Collapsing headers no longer have a frame around them
* Combo-boxes looks better when opened
* Slightly more muted colors
* Remove extra line spacing after `\n` (i.e. between paragraphs)
* Thinner scrollbars
* Tweak light mode
* Tweak shadows
* Fix broken doc link
* Add style tweak to CHANGELOG
* initial work on markers
* clippy fix
* simplify marker
* use option for color
* prepare for more demo plots
* more improvements for markers
* some small adjustments
* better highlighting
* don't draw transparent lines
* use transparent color instead of option
* don't brighten curves when highlighting
* Initial changes to lengend:
* Font options
* Position options
* Internal cleanup
* draw legend on top of curves
* update changelog
* fix legend checkboxes
* simplify legend
* remove unnecessary derives
* remove config from legend entries
* avoid allocations and use line_segment
* compare against transparent color
* create new Points primitive
* fix doctest
* some cleanup and fix hover
* common interface for lines and points
* clippy fixes
* reduce visibilities
* update legend
* clippy fix
* change instances of "curve" to "item"
* change visibility
* Update egui/src/widgets/plot/mod.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui/src/widgets/plot/mod.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui_demo_lib/src/apps/demo/plot_demo.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui_demo_lib/src/apps/demo/plot_demo.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* changes based on review
* add legend to demo
* fix test
* move highlighted items to front
* dynamic plot size
* add legend again
* remove height
* clippy fix
* update changelog
* minor changes
* Update egui/src/widgets/plot/legend.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui/src/widgets/plot/legend.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui/src/widgets/plot/legend.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* changes based on review
* add functions to mutate legend config
* use horizontal_align
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* initial work on markers
* clippy fix
* simplify marker
* use option for color
* prepare for more demo plots
* more improvements for markers
* some small adjustments
* better highlighting
* don't draw transparent lines
* use transparent color instead of option
* don't brighten curves when highlighting
* update changelog
* avoid allocations and use line_segment
* compare against transparent color
* create new Points primitive
* fix doctest
* some cleanup and fix hover
* common interface for lines and points
* clippy fixes
* reduce visibilities
* Update egui/src/widgets/plot/mod.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui/src/widgets/plot/mod.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui_demo_lib/src/apps/demo/plot_demo.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Update egui_demo_lib/src/apps/demo/plot_demo.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* changes based on review
* fix test
* dynamic plot size
* remove height
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* add plot legends
* don't show crosshairs when hovering over legend
* add a toggle for the legend
* changes based on review
* improve legend behavior when curves share names
* translate touch events from glium to egui
Unfortunately, winit does not seem to create _Touch_ events for the touch pad
on my mac. Only _TouchpadPressure_ events are sent.
Found some issues (like
[this](https://github.com/rust-windowing/winit/issues/54)), but I am not sure
what they exactly mean: Sometimes, touch events are mixed with
touch-to-pointer translation in the discussions.
* translate touch events from web_sys to egui
The are a few open topics:
- egui_web currently translates touch events into pointer events.
I guess this should change, such that egui itself performs this kind of
conversion.
- `pub fn egui_web::pos_from_touch_event` is a public function, but I
would like to change the return type to an `Option`. Shouldn't this
function be private, anyway?
* introduce `TouchState` and `Gesture`
InputState.touch was introduced with type `TouchState`, just as
InputState.pointer is of type `Pointer`.
The TouchState internally relies on a collection of `Gesture`s. This commit
provides the first rudimentary implementation of a Gesture, but has no
functionality, yet.
* add method InputState::zoom()
So far, the method always returns `None`, but it should work as soon as the
`Zoom` gesture is implemented.
* manage one `TouchState` per individual device
Although quite unlikely, it is still possible to connect more than one touch
device. (I have three touch pads connected to my MacBook in total, but
unfortunately `winit` sends touch events for none of them.)
We do not want to mix-up the touches from different devices.
* implement control loop for gesture detection
The basic idea is that each gesture can focus on detection logic and does not
have to care (too much) about managing touch state in general.
* streamline `Gesture` trait, simplifying impl's
* implement first version of Zoom gesture
* fix failing doctest
a simple `TODO` should be enough
* get rid of `Gesture`s
* Provide a Zoom/Rotate window in the demo app
For now, it works for two fingers only. The third finger interrupts the
gesture.
Bugs:
- Pinching in the demo window also moves the window -> Pointer events must be
ignored when touch is active
- Pinching also works when doing it outside the demo window -> it would be nice
to return the touch info in the `Response` of the painter allocation
* fix comments and non-idiomatic code
* update touch state *each frame*
* change egui_demo to use *relative* touch data
* support more than two fingers
This commit includes an improved Demo Window for egui_demo, and a complete
re-write of the gesture detection. The PR should be ready for review, soon.
* cleanup code and comments for review
* minor code simplifications
* oops – forgot the changelog
* resolve comment fee8ed83db (r623226656)
* accept suggestion https://github.com/emilk/egui/pull/306#discussion_r623229228
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* fix syntax error (dough!)
* remove `dbg!` (why didnt clippy see this?)
* apply suggested diffs from review
* fix conversion of physical location to Pos2
* remove redundanct type `TouchAverages`
* remove trailing space
* avoid initial translation jump in plot demo
* extend the demo so it shows off translation
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
This adds a new `zoom_delta` to input.
This is hooked up to ctrl-scroll on egui_web and egui_glium.
Browsers convert trackpad pinch gestures to ctrl-scroll,
so this means you can not pinch-to-zoom plots (on trackpad).
In the future we can support multitouch pinch-to-zoom via the same
`InputState::zoom_factor()` function
* drag and zoom support for plots
* update doctest
* use impl ToString
* revert back to Into<String> until #302 is solved
* Apply suggestions from code review
Co-authored-by: ilya sheprut <optitel223@gmail.com>
* use persistence feature for PlotMemory
* * split plot into multiple files
* add curve from function
* move more functionality into ScreenTransform struct
* changes from code review in base branch
* let user specify a range for generated functions
* rename file
* minor changes
* improve generator functionality
* improve callback and add parametric callback
* minor changes
* add documentation
* fix merge issues
* changes based on review
* rename folder
* make plot.rs the mod.rs file
* remove mod.rs
* rename file
* namespace changes
* fix doctest
* Update egui/src/widgets/plot/items.rs
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
Co-authored-by: ilya sheprut <optitel223@gmail.com>
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* drag and zoom support for plots
* update doctest
* use impl ToString
* revert back to Into<String> until #302 is solved
* Apply suggestions from code review
Co-authored-by: ilya sheprut <optitel223@gmail.com>
* use persistence feature for PlotMemory
* rename shift -> translate
* remove automatic bounds
* removed unused methods
* Into<String> -> ToString
* Apply suggestions from code review
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* avoid potential invalid bounds bug
* use new is_valid method
* improve auto bounds behavior as suggested
* use NOTHING to initialize min_auto_bounds
Co-authored-by: ilya sheprut <optitel223@gmail.com>
Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
* Deny doc errors
* Add intentional bad intradoc link to test CI
* Add cargo doc to CI
* Fix carg doc web (add wasm32 target)
* Fix intentionally broken doc-link