Development of druid is currently driven by the needs of Runebender, a font editor, and this will continue to be true for the scope of this roadmap. Runebender is a creative desktop application, supporting Windows, macOS, and Linux (via Gtk).
A major goal for Runebender, and thus druid, is to offer a polished user experience. There are many factors to this goal, including performance, a rich palette of interactions (thus a widget library to support them), and playing well with the native platform.
This last point deserves more explanation. The intent of druid is not that you can write a single program that will magically look and feel native on all supported platforms. It's questionable whether such a thing can be done, and chasing it leads to a "lowest common denominator" approach. Rather, the goal of druid is to make it possible to create an app which respects platform conventions and expectations around things like window management, menus, and behaviour, but with a distinct visual language. Where possible, we will try and make this easier for the application author, but our expectation is that writing a good application will require significant platform-specific code. We would like to make it fairly easy to write this code within the framework, using Rust's cfg
annotations (#[cfg(target_os = "macos")] { // your code here }
), and we would also like to make it easy to make simple 'utility' applications that just need some basic UI, and want to be cross platform. Druid will not attempt to mimic platform UI styling (at least in the near future) for the simple reason that it's very difficult to get that 100% accurate, and being only 90% accurate is the uncanny valley.
Interest in a general toolkit for writing GUI applications in Rust appears strong, and it is a longer term goal for druid to become viable in that space. However, druid should still be considered experimental. Simple use cases that are similar to Runebender will probably be well supported. Beyond that, over the next few months, the theme is "gentle stretching" - features that would require major architectural support are likely out of scope, though the energy of a passionate contributor counts for a lot.
This roadmap is intended to cover approximately January, February, and March.
The main goal for 0.5.0 is to finish the fundamental architectural todos that we've identified. These are major low-level projects that are necessary for building real applications; without them druid is non-viable.
-
addressable widgets (needs issue) a number of features such as async loading of resources, controlling scroll position of a specific scroll widget, and routing commands to a widget that is multiple container-widgets deep in the tree require widgets to have 'identity'. @raphlinus has picked up this project and is working on it currently; the implementation will be in two parts, the first (most important) bit being to implement identity itself and routing of events based on identity, and the second being optimizations on this so that we can find a specific widget in a very large tree in sub-linear time.
-
lifecycle refactor: (issue #404). Widgets need to be notified when they are added and removed from the graph, when they are activated or deactivated, and in a number of other circumstances.
-
z-order painting (needs issue) for things like combo boxes and (non-system) modal dialogs, we need an ability to paint at a specific z-order.
-
paint bounds (#401) currently, there is no way for a widget to indicate that it will draw outside of its bounds. This means we cannot correctly handle things like drop shadows or z͘a̮̤͡ḷg̛̱͔̖̠̥ó̬.
-
continuing improvement in text support, including multiline labels (#428).
Has been pubished. This is not a focused release, just a snapshot of the current state. It includes a bunch of patches that happen to include some API breakage, and felt good to release before this next significant batch of changes.
The most significant additions are multi-format copy/paste (#330), a reworked file open/save API (#376), major work on lenses (#339, #344, #367), and a bunch of widget improvements. There has also been a bunch of energy spent on cleaning up the structure of the druid crates, and refining the API.
Along with myself and @raphlinus, this release includes work from a rollcall of contributors (in the approximate order of their first merged PR since the last release, and trying not to leave anyone out; apologies if I have!):
- @zaynetro, for a container widget (#148), label improvements, list widget improvements (#397) and much more,
- @scholtzan, who wrote a very nice toggle switch widget (#231) and added preliminary de_DE localization (#294),
- improved text support in piet from @hwchen,
- @ForLoveOfCats, who did a bunch of work improving the scroll widget,
- @Zarenor, for a split panel widget (with some ux help from @kbalt),
- @futurepaul for a whole bunch of things, including text label cursor positioning (#257), the EnvScope widget (#279), a wonderful readme rewrite (#301) an SVG widget (#353) plus lots of refactoring and cleanup,
- @ratmice for lots of bug fixes and cleanup (#317, #314),
- @xStrom, for several thoughtful patches and issues,
- @Ralith for a flood of great stuff, including major improvements & feature work for lenses (#340, #341, #344, #352), and improvements to the textbox widget and conversion from text to other data types (#346),
- @LiHRaM, who hacked on the
AppDelegate
(#283, #286), - @8176135, thanks to whom you can now actually set the starting window size (#274),
- placeholder label text by @Stanislav-Lapata,
- small (but valuable) Windows fixes & improvements from @edwin0cheng,
- and typo fixes, drivebys, and other small but welcome improvements from @crsaracco, @nilsmartel, @mendelt, @ul, @gmorenz, and @theduke.
Thank you everyone for your work!