Ideal D GUI Toolkit

Michel Fortin michel.fortin at michelf.ca
Tue May 21 17:42:18 PDT 2013


On 2013-05-21 12:31:53 +0000, "Diggory" <diggsey at googlemail.com> said:

> On Tuesday, 21 May 2013 at 12:12:12 UTC, Jacob Carlborg wrote:
>> On 2013-05-20 22:40, Diggory wrote:
>>> UI toolkits are a lot of work but they're not as unreasonably big as
>>> everyone seems to be suggesting... I've written a couple myself in a
>>> procedural language using Direct3D to draw everything. Had all the
>>> standard controls, various layout options, even a syntax highlighted
>>> code editor, clipboard interaction, keyboard focus, etc.
>> 
>> I think you underestimate what's needed and the controls people want to 
>> have. Did you have date picker, color picker, support for 
>> internationalization, field formatters and so on.
> 
> I had support for custom dialogs, drawing etc. and file dialogs were 
> built in so it was possible to create your own color picker, etc. in a 
> very few lines of code. The way it was designed, custom field 
> formatters were trivial. The point is we don't need to have a date 
> picker and color picker and every other control built in, at least not 
> initially. All we need is an easily extensible framework with the 
> simple controls, and then we can add more complicated controls as they 
> are requested. Once the framework is in place it will be very easy for 
> many people to contribute and everything will get done much more 
> quickly.

Not at all. It's the reverse.

Once the framework is in place, you'll have what you need to put 
buttons and fields in a window and work with them. Then comes the hard 
part.

Good luck trying to create a common ground API for table views on Mac, 
GTK, KDE and Windows. If you want to offer an API to manipulate the 
data in the table view, you'll likely need to reimplement the whole 
thing yourself. That's a *huge* amount of work and a pile of details 
will most likely be off (scrolling, selection behaviour, drag & drop). 
Or you can try to piggy-back on the platform table view widget, but 
then you're limiting the API to the lowest common denominator.

Then look at toolbars and the customization panel for toolbar items. Or 
text views, including styling text, adding links and images inline with 
the text, supporting selections (where some platforms support disjoint 
selection), enabling and controlling spell-checking and autocorrection 
(native at least on OS X).

Then comes the platform-standard UI conventions and controls. On OS X 
for instance you have popovers, sheets (alerts attached to windows), 
segmented controls (multiple buttons attached together), multiple 
layouts for buttons including a specific button style for help buttons, 
application-specific menu bar on OS X and window-specific everywhere 
else, the color picker is always a non-modal floating palette on OS X 
but not on other platforms, preference windows instantly apply their 
settings on OS X (and have no OK button), not on other platforms. 
Standard keyboard shortcuts are quite different between platforms too. 
Each convention not followed will make your app look a little out of 
place.

And even if you could create the perfect abstraction layer, it'll be a 
nightmare to write something with it. In theory it'll work everywhere, 
but in practice you still need to specify different platform-specific 
things for each control to make them look at home, perhaps using 
slightly different layouts. Then you need to test it on all platforms, 
and when you hit a bug you'll need to find out if the bug lies in your 
application, the platform's code, or the abstracted intermediary GUI 
layer.

I'm not saying it's impossible to do, just that it'll require a 
gigantic effort going beyond the simple window-button-field concepts 
into more featureful widgets and trying to emulate platform-native 
behaviours and layouts. And don't forget that you'll be chasing 
multiple moving targets. GUI concepts are still evolving, and each 
platform is changing things slightly differently these days.

That said, there's plenty of value in having a drawing API capable of 
showing a window, and perhaps some buttons and menus, for prototyping 
things. Perhaps you could build a widget API for games that'd work on 
top of that, as games usually don't use native controls that much. But 
I can tell that creating an abstraction layer around native widgets 
won't take you very far. Just try the table view thing if you want to 
convince yourself. Or toolbars.

-- 
Michel Fortin
michel.fortin at michelf.ca
http://michelf.ca/



More information about the Digitalmars-d mailing list