abstreet/ezgui
Dustin Carlino 476751147c starting a new dropdown widget and using it for picking walk buttons.
avoids the cloneable mess. but has lots of new little issues...
2020-03-05 15:00:42 -08:00
..
examples generalize checkboxes slightly. use in demo 2020-03-04 15:55:44 -08:00
src starting a new dropdown widget and using it for picking walk buttons. 2020-03-05 15:00:42 -08:00
Cargo.toml use my glutin fix to start windows on linux faster, until it's upstreamed 2020-02-28 12:54:21 -08:00
README.md start a standalone ezgui example 2020-03-03 16:24:27 -08:00

ezgui notes

I'm considering cleaning this thing up and releasing a new crate.

Features

Runs in lots of places. Specifically:

  • Linux, Mac, Windows via glium
  • wasm via glow. Text support coming in O(months). https://github.com/RazrFalcon/resvg/issues/229
  • Dealing with DPI sucks. There's one place to set a scale factor, then have all text and widgets and stuff scaled up.

Fully vector.

  • usvg -> lyon -> polygons
  • Load an svg button, programatically swap colors, rotate, scale, etc
  • Even text!

Lots of orthogonalish stuff that probably doesn't belong in a GUI library, but is darn useful. I didn't design this as a GUI library, I just made exactly the stuff I need for A/B Street.

  • Plots and histograms
  • Screenshot entire map in chunks for visual diff tests

The canvas. Concept of map- and screen-space. Nice 2D panning and zooming.

Composites and ManagedWidgets.

  • flexbox styling via stretch, although I don't understand when margin/padding doesnt work.
  • buttons, checkboxes (wrapper over buttons), sliders, pop-up menus, fillers for custom magic, plots, histograms, extremely basic text entry

Weird API. No callbacks. You manually plumb events to widgets, ask about results. No smart diffing of widget trees; usually recreate everything from scratch (it's perfectly cheap in my use cases) or replace a widget in a composite.

Wizard... though I'm not sure about this pattern. Been switching to settings panels that ask you lots of stuff at once, give defaults.

Design choices

NOT performance critical. When I spot something causing noticeable problems, I profile and fix it reactively. There's so much waste everywhere, like constantly recreating widgets from scratch and re-uploading similar geometry over and over. The perf is totally fine for my (reasonably complicated) use cases; if you find something that doesn't work for you, let's look at it.

Messy error handling. unwraps and panics in different places.

Backend impl is minimal. No traits, plumbing generics -- why would you ever compile in more than one option anyway?

One (simple) uber-shader. Don't do anything fancy in the shader, calculate geometry on the CPU. We can use the same geometry for drawing and detecting mouseover.

Major problems

Type-safe Outcomes via low-boilerplate enums?

Configuring default style

FAQ

Why OpenGL?

My requirements are super simple; I don't need the power of Vulkan or the new stuff. I want something simple that runs everywhere. If you want to make this work with WGPU or something else, it should be easy. The 3 backend implementations (glium, glow on native, glow on wasm) are each about 300 lines.

Why another? Shouldn't we consolidate?

We should. I didn't particularly want to write a GUI library; nothing did what I wanted when I started. I don't know if it's worth polishing this up and making it a real contender in the Rust GUI space, or efforts should be consolidated in another library.

Comparison to alternatives

Huge list here. Notably, why not iced? Biggest blocker is that I can't run the examples today; there's some bug with the wgpu support on both of my Linux laptops. https://github.com/hecrj/iced/issues/212. This is a deal-breaker -- I want stuff I make to run anywhere without hassle. I looked at adding a glium backend to iced, but the current structure has tons of backend-specific code. In contrast, ezgui has a super tiny backend API -- basically just upload triangles and draw them -- and all of the heavy logic sits on top of that.

Naming

  • coldbrew (stronger than iced coffee? ;) )
  • allegro (where most pivotal meetings with my UX designer have happened, but this is also the name of some library)
  • coco (for the geom library)
  • abstgui (too obvious)