7.3 KiB
TODO
TODO-list for the Egui project. If you looking for something to do, look here.
Top priority
- Text input: text selection etc
- Fix
is_mouse_over_area()for menu bar:- Probably a good time to create some sort of
ctx.top_panel()allocation system and refactor paint layers
- Probably a good time to create some sort of
Other
- Widgets
- Tooltips:
- Tooltip widget: Something that looks like this: (?) :that shows text on hover.
- ui.info_button().on_hover_text("More info here");
- Allow adding multiple tooltips to the same widget, showing them all one after the other.
- Tooltip widget: Something that looks like this: (?) :that shows text on hover.
- Text input
- Input
- Text focus
- Cursor movement
- Text selection
- Clipboard copy/paste
- Move focus with tab
- Vertical slider
- [/] Color picker
- linear rgb <-> sRGB
- HSV
- Color edit button with popup color picker
- Gamma for value (brightness) slider
- Easily edit users own (s)RGBA quadruplets (
&mut [u8;4]/[f32;4]) - RGB editing without alpha
- Additive blending aware color picker
- Premultiplied alpha is a bit of a pain in the ass. Maybe rethink this a bit.
- Hue wheel
- Tooltips:
- Containers
- Scroll areas
- Vertical scrolling
- Scroll-wheel input
- Drag background to scroll
- Kinetic scrolling
- Horizontal scrolling
- Scroll areas
- Input
- Distinguish between clicks and drags
- Double-click
- Text
- Support all mouse buttons
- Distinguish between touch input and mouse input
- Get modifier keys
- Keyboard shortcuts
- Copy, paste, undo, ...
- Text
- [/] Unicode
- Shared mutable expanding texture map
- Text editing of unicode
- Change text style/color and continue in same layout
- [/] Unicode
- Menu bar (File, Edit, etc)
- Sub-menus
- Keyboard shortcuts
- Layout
- Generalize Layout (separate from Ui)
- Break out
Regionwith min_size + max_size + cursor + layout - Table with resizable columns
- Grid layout
- Point list
- Windows
- Positioning preference:
window.preference(Top, Right)- Keeping right/bottom on expand. Maybe cover jitteryness with quick animation?
- Make auto-positioning of windows respect permanent side-bars.
- Positioning preference:
- Visuals
- Pixel-perfect painting (round positions to nearest pixel).
- Fix
aa_size: should be 1, currently fudged at 1.5 - Fix thin rounded corners rendering bug (too bright)
- Smoother animation (e.g. ease-out)? NO: animation are too brief for subtelty
- Veriy alpha and sRGB correctness
- sRGBA decode in fragment shader
- Fix alpha blending / sRGB weirdness in WebGL (EXT_sRGB)
- Thin circles look bad
- Optimize small filled circles with the global texture.
- Id
- struct TempId(u64); struct StateId(u64);
TempIdis count-based. Only good for interaction. Can't be used for storing state.StateIdmust be generated from e.g. label (window title, ...), and is required for storing state (window position, ...).- Both can be conveted to
Idwhich is used for temporary stuff like interactions and animations. - An
Ui:s has two seed ids: one state, one temp. State is ONLY generated byStateId, no polution. A newUiregion is either created with e.g. a label to generate a new childStateId, or the region inherits the same id as the parent (but differentTempIdseed).
- struct TempId(u64); struct StateId(u64);
- Demo
- Manual layout example:
- ui.child_ui_pos(pos).label("Label at specific position");
- ui.child_ui_rect(rect).label("Label in a rectangle");
- Manual layout example:
- Reactive mode
- Ask Egui if an event requires repainting
- Only repaint when mouse is over a Egui window (or is pressed and there is an active widget)
Backends
-
Extract egui_app as egui_backend
-
egui_glium
-
egui_web
- async HTTP requests
-
egui_bitmap: slow reference rasterizer for tests
- Port https://github.com/emilk/imgui_software_renderer
- Less important: fast rasterizer for embedded 🤷♀️
-
egui_terminal (think ncurses)
- replace
round_to_pixelwithround_to_Xwhere user can select X to be e.g. width of a letter
- replace
-
egui_svg: No idea what this would be for :)
egui_web
- Scroll input
- Change to resize cursor on hover
- Port most code to Rust
- Read url fragment and redirect to a subpage (e.g. different examples apps)]
- Async HTTP requests
- Fix WebGL colors/blending (try EXT_sRGB)
- Embeddability
- Support canvas that does NOT cover entire screen.
- Support multiple eguis in one web page.
- Filtering events to avoid too frequent repaints
- Multiple canvases from the same rust code
- Different Egui instances, same app
- Allows very nice web integration
Modularity
trait Widget(Label,Slider,Checkbox, ...)trait Container(Frame,Resize,ScrollArea, ...)widget::TextButtonimplemented as acontainer::Buttonwhich contains awidget::Label.- Easily chain
Containers without nested closures.- e.g.
ui.wrap(Frame::new()).wrap(Resize::new()).wrap(ScrollArea::new()).show(|ui| ...)
- e.g.
- Attach labels to checkboxes, radio buttons and sliders with a separate wrapper-widget ?
Other
- Persist UI state in external storage
- Persist Example App state
- Create an Egui icon (or use an emoji)
- Build in a profiler which tracks which
Uiin which window takes up CPU.- Draw as flame graph
- Draw as hotmap
- Integrate puffin?
- Windows should open from
UIs and be boxed by parent ui.- Then we could open the example app inside a window in the example app, recursively.
- Implement a minimal markdown viewer
Names and structure
- Rename things to be more consistent with Dear ImGui ?
- Put everything in
Contextbehind the same Mutex?struct Context(Arc<Mutex<ContextImpl>>);, with e.g.context.lock().memory.foo? - Resolve the various uses of "heading", "header", "title" etc
Global widget search
Ability to do a search for any widget. The search works even for collapsed regions and closed windows and menus. This is implemented like this: while searching, all region are layed out and their add_content functions are run. If none of the contents matches the search, the layout is reverted and nothing is shown. So windows will get temporarily opened and run, but if the search is not a match in the window it is closed again. This means then when searching your whole GUI is being run, which may be a bit slower, but it would be a really awesome feature.
Done
- Widgets
- Label
- Button
- Checkbox
- Radiobutton
- Collapsing header region
- Tooltip
- Movable/resizable windows
- Kinetic windows
- Add support for clicking hyperlinks
- Containers
- Vertical slider
- Resize any side and corner on windows
- Fix autoshrink
- Automatic positioning of new windows
- Vertical slider
- Simple animations
- Clip rects
- Separate Ui::clip_rect from Ui::rect
- Use clip rectangles when painting
- Use clip rectangles when interacting
- Adjust clip rects so edges of child widgets aren't clipped
- Use HW clip rects
- Image support
- Show user textures
- API for creating a texture managed by
egui::app::Backend