The people   Coding standards   Design   Rewrite rule   TODO   DONE   Sun Java  

Javadocs   Class Hierarchy   Index   NAWS   MTRX   security   servlets   Skang   Squeal & Stuff   zen developer  


NAWS

NAWS stands for Not A Widget Set, it will not be a widget set, it will be a single, generalised widget and a single generalized widget container.

The idea is roughly this -

NAWS should allow pixel perfect layout on any OS/JVM combination. This is very important, it gives the GUI designers the freedom from differences that has been sorely lacking on the web.

All widgets should be shaped, so that you can have two roundish widgets snuggling up to each other. All widgets should be font sensitive, this could break pixel perfection though. The shape should be definable by a mask graphic, or a combination of graphics primitives.

Labels should be able to display multiline flowed text or a graphic, with the graphic being a .png, .jpg, .gif (in that order of preference), and with animation support. Labels should be able to be attached to all other widgets as prompts. Labels should have automatic disabled graphics (ghosting) created and the option of supplying one. So that a widgets prompt gets ghosted when the widget gets ghosted, and to provide ghosting support for the other widget types. Labels can have a different text / graphic for the mouse hover state. Label graphics should naturally be paintable.

Borders are shaped outlines that can be put around anything. Not really a widget, just a decoration. When using graphics, the border could be part of the graphic, so no actual border is needed. Might be able to make Labels as containers do the job of Borders.

Buttons are Labels that can be clicked. Alternate text / graphics for the clicked state should be catered for. Radio buttons can be handled by widget notification. Checkboxes are buttons that are sticky. The difference between Checkboxes and toggled Buttons is purely cosmetic.

Icons are movable Buttons.

Text editing fields are Labels that allow the text to be edited. Masks and validation should be built in.

Progress indicators are Labels with two graphics where the first graphic is slowly revealed by chipping away at the second overlayed graphic. Default graphics should be supplied.

Containers should be automatically scrollable if needed. Actually, Containers could be just Labels that allow sub widgets, but I don't think I will go that far B-). On second thoughts, I might.

All else is really just a Container with several of the basic widgets in them. A List is just a collection of Buttons. A Menu is not very different from a List with sub Lists. Choices are Lists where the selected item is usually all that is shown. A ComboBox is a Choice with a Text at the top. Scroll bars are containers with a movable Button in them. Spread sheets are grids with Label widgets in them, but this is generalised, so any widget can go in a cell. The cell being edited at the moment is a TextField. Tabbed panes are a row of Buttons that select different skins for the pane. A Toolbar is a strip full of Buttons. A Tooltip is a popup Label. Trees are a collapsible set of Buttons.

Since Skang does fine with just a Frame; Dialogs, Windows, etc are just a container with various decorations / border widgets. Close, minimize, maximise, etc are just Buttons. Resizing bars are just movable Buttons where the edge of the container follows the Button. Split panes are a simialr thing. Title bars are also similar, but the entire container follows the Button.

I think I have covered the basic widget types. More complicated things like file and colour choosers are left as an exercise for the reader.

Except for the basic widget and container, the entire thing should take about as many lines of code as there are lines of text just used to describe them B-). In other words, I write a shaped, clickable, editable, movable, scrollable Label that allows sub Labels, and has excelent graphics support, all else is just convenience wrappers around the Label class.

The major advantages are that all widgets act the same, and the code is kept small. I should be able to do better than Swing in a whole lot less than two megabytes (the size of Swing). Since everything is generalized, weird things are too easy to do. Wanna put a ComboBox in your TitleBar? ScollBars in your Menus? Have a throbber that is a rotating Earth with clickable countries? All very easy to do. Clicking on the Buttons of a rotating container could be hard for the user though B-).

3D GUI's

I have about a books worth of ideas on how to design user interfaces, both for software and actual real world objects (sometimes refered to as hardware). I am very good at UI design. I don't have time to write my book at the moment, but I should point out how this affects NAWS. NAWS should have the ability to wrap it's skins around a 3D object.

A simple example, the user is in a 3D space (VRML world for instance), and there is a cube sitting in front of her with the NAWS version of matrix.skang running on one side of the cube. She can walk up to the cube and start clicking on it. She can pick up the cube, rotate it, walk around it, etc, and so long as she can still see the widgets, she can still use them.

A complex example, the user (in her VRML world) is carrying around a mobile phone object, which is your usual blobby mobile phone shape. Someone else sends a Jabber message to the user, and a keyboard / monitor combination pops out of the mobile blob and allows the user to have a Jabber conversation. The mobile phone blob has widgets all over it for controlling the mobile phone functions. Some of them are on opposite sides, and she needs to rotate it to get to them all.

Then there is our throbber, which will morph into a network health indicator. It could be displayed as a VRML sphere with country shaped widgets that you can click on to zoom in on a particular country to see more details. It must still rotate of course B-).

While I am on the subject of 3D, machines that can't handle the full 3D should have fallback options, to an isometric view, then an overhead veiw. Even beafier machines should degrade gracefully. We should have a target FPS, with each object informed of how long it gets to render itself, and making decisions about complexity of rendering based on that.

Blended GUI's (Copyright 2002-10-12 by David Seikel)

All windows are alpha blended together with, say a 50% transperancy. and solid colours for the widgets of the current window. This should result in very dark or very light screens. In the former, text is white, in the later, text is black. First mouse wheel moves you up and down the stack of windows at the current mouse location. First mouse wheel pushed (That is the middle button) and scrolled moves you up and down, but takes the current window with you. Unless the current widget uses the mouse wheel or middle button off course. If using Space Orbs, we have enough axis to go around. Up and down go up and down windows, twisting scrolls things. Up and down aare good uses of buttons four and five on my mouse. Just allow the user to map buttons as they see fit.

Have the transparency of windows between you and the current window increased to say 75%. Make the two transparency levels adjustable, or have window transparency depend on depth in the stack (four windows plus a desktop, desktop is 0%, deepest window is 20%, next is 40%, etc,).

Then we can have lot's of useful little animations in the windows, to provide a very dynamic environment. Widgets can throb slowly, all at different rates. Anything needing attention can flash quickly. Backgrounds can swirl, rotate, or scan slowly. On the desktop, you have a system console with a background image, or "screen saver". The desktop can be the 3D world you are in, the windows are floating in front of you, then you will need a two wheel mouse AND a Space Orb.

Any "screen saver" can be a background, or a privacy screen (with password). Privacy screens in the real world take over your monitor while you are away, requiring a password to go away, which is how current screen savers work. In the 3D space, your windows are visible to others, but only as the screen saver animation. Each window getting it's own privacy screen lets out information about number, size, and relative position of windows, so we need an option to screen the entire desktop. Indiviual windows, or the whole desktop, can just be invisible to others. Default to privacy screens in a 3D world, and allow some ACTIVE method for users to share windows. Active means that you can't leave yourself open accidently.

In the 3D space, we need a new name for the "desktop", cause we don't actually carry a desk with us when we walk around. "Fogtop", "ClothesTop", "HUD", I'll think of something good sooner or later. Got it! Wearable Information Device - WID. WIDs, containing windows, containing widgets! Or maybe use "wedges" / "widges" for windows? So, with WIDs, Widges, Widgets, and 6 degrees of freedom, we have a WWW6 (3W6 / 3w6 / Triple W 6 [ = 3 x 2 x u x 6 = 6u6 = 36u] ?) interface, instead of the outdated WIMP interface. "WIDGE" = Wearable Information Device Gizmo Enclosure B-). "WIDGET" = Wearable Information Device Gizmo, Enclosed Thing (I know, I'm getting desperate, but it matches Thing.class in matrix-RAD, which Widget.class is a sub class of).

All this from a dream I had last night, possibly inspired by the new Amiga "Every window can be transparent and shaped" stuff, which I have only seen a couple screen shots of. Gotta have a good look at this new Amiga stuff now.


This file was last modified on Saturday, 30-Oct-2004 11:23:15 EST