# EguiStruct
[](https://crates.io/crates/egui_struct)
[](https://docs.rs/egui_struct)
[](https://github.com/PingPongun/egui_struct/blob/master/LICENSE)
EguiStruct is a rust derive macro that creates egui UI's from arbitrary structs and enums.
This is useful for generating data bindings that can be modified and displayed in an [egui](https://github.com/emilk/egui) ui.
Crate idea is similar to crates [egui-probe](https://github.com/zakarumych/egui-probe), [enum2egui](https://github.com/matthewjberger/enum2egui), [egui_inspect](https://github.com/Meisterlama/egui_inspect) and [egui-controls](https://github.com/aalekhpatel07/egui-controls), but there are some important differences:
## EguiStruct vs similar crates
| egui version | 0.26 (0.21-0.28) **** | 0.27/0.28 | 0.23/0.24.1/0.26 | 0.20 | N/A |
| Layout* | Grid | Grid | Group/nested | Nested | Grid |
| i18n support | ✅ (rust-i18n**) | ❌ | ❌ | ❌ | ❌ |
| Field description | ✅ on hover hint (from attribute) | ❌ | ❌ | ❌ | ✅ third column (from doc comment) |
| Rename field/variant | ✅ | ✅ | ✅/❌ (enum only) | ❌ | ❌ |
| Mass name case conversion | ✅ | ✅ | ❌ | ❌ | ❌ |
| Callback on-change | ✅ | ❌ | ❌ | ❌ | ❌ |
| Reset button | ✅ | ❌ | ❌ | ❌ | ❌ |
| Skip field | ✅ | ✅ | ✅ | ✅ | ❌ |
| | | | | | |
| Numerics & strings support | ✅ | ✅ | ✅ | ✅ | ✅ |
| Vec support | ✅/❌ (does not support adding/removing elements) | ✅ std, smallvec1/2 | ✅ | ✅ | ❌ |
| Other support | ✅ bool, Option, [T;N] | ✅ bool, Option, [T;N], some of egui types | ✅ bool, Option | ✅ bool, [T;N] | ❌ |
| HashMap/Set support | ✅ std, indexmap | ✅ std, hashbrown | ✅ std, hashbrown | ❌ | ❌ |
| Map field/override impl | ✅ | ✅ | ❌ | ✅ | ❌ |
| Struct derive | ✅ | ✅ | ✅ | ✅ | ✅ |
| Enum derive | ✅ | ✅ | ✅ | ❌ | ❌ |
| Custom types in derive | ✅ | ✅ | ✅ | ✅ | ❌ |
| | | | | | |
| Configuration numerics | ✅ Slider(min,max), Slider(min,max,step), DragValue(min,max), DragValue, List | ✅ DragValue(min,max), DragValue | ❌ | ✅ Slider(min,max), DragValue | ❌ |
| Configuration string | ✅ multi/singleline, List | ✅ multi/singleline | ❌ | ✅ multi/singleline | ❌ |
| Configuration user types | ✅ | ❌ | ❌ | ❌ | ❌ |
| Configuration others | ❌ | ✅ Color32, bool, Enum(combobox or inline buttons), sets/vecs/maps | ❌ | ❌ | ❌ |
| List/Combobox wrapper | ✅ *** | ❌ | ❌ | ❌ | ❌ |
\* Everything is put inside scroll&grid layout (with collapsable rows)
- Gui is less chaotic,
- all values are aligned,
- Gui is comact in width
** integrated/with i18n in mind (with [rust-i18n](https://github.com/longbridgeapp/rust-i18n) crate (or if using extractor [modified rust-i18n](https://github.com/PingPongun/rust-i18n.git)))
*** Wrap `T: Clone + ToString + PartialEq` type into `Combobox<T>` and pass through `config` attribute iterator with all possible values → field will be shown as combobox
**** See section `Usage >> egui version` (`EguiStruct` supports all versions of egui through features; other crates support only "newest" one, support for other is by using legacy version)
## Usage
### Basic description
Add `egui_struct` to your `Cargo.toml`:
```toml
egui_struct = "0.4"
```
Add derive macro `EguiStruct` to struct you want to show (and all nested types):
```Rust
#[derive(EguiStruct)]
pub struct TupleStruct(u8, u32, String, SubData);
```
then to show data, you only need to call `show_top(..)` on top level struct:
```Rust
});
```
### Detailed description
See [docs](https://docs.rs/egui_struct/latest/egui_struct/index.html).
### Example
See ./demo

### egui version
`egui_struct 0.4` by default depends on `egui 0.26`. To use other versions of egui use correct feature in `Cargo.toml`, eg. to make it work with egui 0.28:
```toml
egui_struct = { version = "0.4", default-features = false, features = [ "egui28" ] }
```
OR use `[patch]` section.
Default egui version feature will be updated to newest egui on semver minor release(0.5).
## TODO
- elegant error/invalid input handling & helpful messages (macro)
- add bounds
- tests
- code cleanup & simplify
- support adding/removing elements for Vec&Hashmap's
- (requires specialization) EguiStructEq/EguiStructClone default impl