views:

270

answers:

10
+8  A: 

You're well out of the comfort zone, through the discomfort zone, and halfway through the having-a-hot-poker-shoved-up-your-backside zone :-)

You should really be thinking of the toolbar as a speed-bar, somewhere where the user can go to do common operations with minimal actions. Other than the Gimp with its infamous UI, I can't fathom any application that would need anywhere near 1,000 common operations worthy of use in a speed-bar.

Perhaps you need to rethink what you're providing.

Some of the Microsoft applications do it reasonably well, they divide their toolbars into sections (e.g., drawing, statistics, formatting) and let the user decide which sections are shown. That way the user decides if they want a minimal workspace or whether they want the whole top half of their workspace taken up by toolbars.

The non-common operations should always be available by menus anyway, whether common is fixed by you (hard-coded), chosen by the user (configuring those sections) or "intelligently" shown by the program (based on previous use).

Here's what I would consider a good approach.

  1. Have all operations accessible from the menus by dividing them into sections (operations within a section should be at least vaguely related). Let's assume for now you can have 30 sections of 30 operations each (unlikely, I know, but simple for this discussion).

  2. Have a special section for adaptive operations. By that, I mean a section the program will populate with operations based on how often the user uses them. To do that, you need to keep a record of how many times an operation is used by the user (each user has their own count, of course, since their usage profile will be different).

  3. Allow the user to configure which sections are displayed in toolbars, including the adaptive one. This gives them control over it.

  4. The adaptive section should be populated by the most commonly used operation provided they don't already appear in another toolbar already. That way, the user can get at the most commonly used operations which aren't already on one of their chosen toolbars.

That seems to me the most flexible solution, giving the user total control over the use of their screen real-estate.

paxdiablo
Well, these buttons are for commands such as "Line between 2 Points", "Circle through 3 points" etc. etc. Many modern CAD apps have hundreds if not thousands of tools to manipulate geometry. IMO we are all out of the comfort zone and I have yet to see someone who solved this problem in a modern (i.e. I'm not required to let go of the mouse to type something on the keyboard), satisfactory way.
David Rutten
Consider this: are either of those example commands relevant if the user has fewer than 2 points selected already? Why display those options until the user actually has the prerequisite items selected? Instead, make the options more context-sensitive, displaying only those relevant to what's actually going on.
Amber
@David, you don't have to let go of the mouse to do it - there are menus you can put your commands in. For example, a top level 'Draw' menu could provide all 1,000 operations with 10x10x10, a three-level deep (hence four mouse clicks) sequence.
paxdiablo
@Pax, that solution implies you know where to find the item you need. Browsing through a menu structure is actually pretty unpleasant since it is so motion sensitive. I also don't think I can structure my tools into such well defined categories, there will always be left-overs that just won't fit. Another thing I like about tabbed-toolbars is that they are permanently on screen. Menus have to be re-opened from the top again and again, even though you *probably* need adjacent items more frequently.
David Rutten
One solution to the "menus have to be re-opened" problem is one found in things like The GIMP - tear-off menus. If you find yourself using items in a particular menu a lot, you can "tear it off", essentially turning the menu temporarily into a popped-out toolbar/palette-type window that remains on-screen until you close it.
Amber
@Dav, I like that idea of tearable UI items. I'll probably implement it, even though it will only really be a benefit if my initial structure is more layered to begin with.
David Rutten
Even GIMP does not need it - take a look at Paint Shop Pro, which is even more powerful than GIMP, yet 1000x easier to use because of its good UI layout...
BlueRaja - Danny Pflughoeft
+4  A: 

I'd think the biggest question here is "what kind of interaction flow are your typical users looking for?" Take a look at how your users actually interact with your program as it stands - are there certain patterns in how they access the various items you have on toolbars?

For instance, are some of your toolbar items extremely frequently used, while others are rarely accessed and when they are, typically accessed along with other similar functions? Perhaps the former items belong on the toolbar, while the latter items would be better suited to some kind of set of palettes that could be opened in a sidebar.

Is there any way that you can make some of the toolbars more context sensitive? It seems rather unlikely that all 1000+ of your toolbar items would actually be relevant to any particular state of the application. Instead of displaying every possible action, just display those for which the prerequisites are met: if you have an option to make a line through two points, don't display it until 2 points are actually selected.

The key thing to remember is that user interfaces should be driven by what the user needs to do and see at any given point in time.

Amber
@Dav, exactly. My guess is that only about 5% (if that) of the available tools are frequently used by any given user. Unfortunately I have no mechanisms in place to really measure this, apart from what I see during workshops.At the moment my UI is utterly flat; there is no hierarchy that makes certain elements less important than others. I can of course introduce hierarchy, but I'll always get it wrong for at least some people. Do you know an application that builds its own layering as you use it?
David Rutten
One option for "building your own layering" is something like a "frequently used actions" or "recently used actions" sidebar - something that would update on its own based on simple criteria (the former just counting invocations of a given item, the latter just keeping a history list). Another option is to allow users to customize their toolbars - this is a fairly common feature in mature applications and probably worth looking into. Also, you might consider (if it's a possibility) of trying to do some real user testing - get a few volunteer users to come in and let you observe them working.
Amber
+2  A: 

Can you describe what you're doing a bit more? From the sounds of things it's a CAD tool.

In this case, I may do something a bit different but also common.

I would firstly suggest make everything as context-sensitive as possible, and then, do this:

  1. Place very very common and general functions at the top
  2. Create a entirely new window for managing the rest of the buttons

The new window will sit off on the second monitor of the user. It can be large and extravagent, and contain searching and large icons for getting around inside it. Specifically, however, I may also add an ability for it to be navigated very fast, using the numpad.

You may detect, in the main window, when the numpad has focus and is being used, and take that as input to searching for specific commands in the offset window. Perhaps you can group them all so 100 functions exist per group, and for functions of type X, you start with a "9". I don't know your user base, and this would be only appropriate if people start to become experts in the software, but I think it's not a bad model in-general (a window off to the side to manage all these actions).

Noon Silk
Silky, I edited the original post, added a screenshot of a typical toolbar. It is indeed a CAD like app.
David Rutten
David: I see it. Quite nice. I do still think that shifting it off into a new window, a-la photoshop and friends, will be the best approach. Shortcutting it via the numpad would add the extra speed and easy-access that I think you're looking for. Also, one further thing. A slightly unique approach would be to have the menu navigatable WITH the mouse, but WITHOUT clicking. Then the user can keep their selection, but hover over the buttons, and it will prompt to perform that action, and you can confirm with the keyboard.
Noon Silk
Another option for navigation-without-clicks is radial menus.
Amber
Gawd I *love* radial menus. I'm pretty sure that they've been patented though. We already had to pull the 'float last button to top' feature in the current toolbars because some ####### threatened to sue us over it.@Silky, interesting ideas. I need to digest this for a bit.
David Rutten
IANAL, but the pure number of applications with radial menus leads me to wonder whether such a patent would even hold up under scrutiny.
Amber
I think just a general click-free layered menu would be nice. Perhaps it pops up when you press `alt`, and, and it contains items for the sub command you're working on (that you've selected over on the floating menu), and is transparent. That would be quite beautiful I think. Just keep holding alt, move the mouse (no click) and click only on the one you want to do. Hmm.
Noon Silk
Just to add to the general fun, I think it would be quite acceptable to also create a tab of 'frequently used', but don't make it obvious that this is happening. It could have a max of 5% of the total # of items, (as you've said in another post). Thus is may end up with 50 functions, or more, segmented by type. But it would be a nice thing to do, and quite trivial.
Noon Silk
+3  A: 

Adobe Photoshop approaches (I can't say "solves") this issue through pallets of controls. The individual pallets can float on the screen, be docked to the window, and can have tabs inside them with additional pallets. Also, most pallets can have a context menu with access to meta-settings for the pallet itself.

It also has a number of key items in a traditional toolbar, some of which change dynamically as the context changes. For instance, when you begin to stretch a layer, a box appears where you can type an exact dimension. When you change tools, the toolbar changes to include controls that relate only to that tool. And so forth.

One good thing about this approach is that many heavy users have multiple monitors and it is often practical and useful to float many pallets onto a second monitor.

I think it works partly because the controls are sensibly collected into the pallets so that related controls are together.

I'm certain it has an upper bound for number of total controls, however.

RBerteig
Adobe CS4 UI is definitely a big step up from prior versions. And there are lots of things I like about it, but discoverability is not one of them. Another problem with this particular type of design is that it is very difficult for plug-in programmers to nudge their own buttons into the existing UI.
David Rutten
For better discoverability, you probably have to look at Adobe Lightroom as the better example. It doesn't yet love multiple monitors, but it is a good example of the result of research into the workflow needs of a specific user community. And despite that focus, it is still remarkably easy to find the features without falling back on training or manuals.
RBerteig
+1  A: 

You might consider looking at techniques from websites, since websites with hundreds of pages are more common than apps with hundreds of buttons.

A very web-like solution is to add a "search command" box. It does require the user to use the keyboard, but if you index the commands well they won't have to memorize the names of all commands, just what they do.

One possibility is to make your tab-toolbar hierarchical. e.g. in the screenshot you showed, Analysis, Freeform, Primitive, and Util would be tabs underneath Surface.

To figure out how to categorize things, you could try grabbing some typical users and doing card sorting tests. It might get a bit hairy with 1,000 cards, but you'll find out how your users want to group the buttons.

Dav's suggestions of a context-sensitive toolbar sounds good to me too.

Selene
+1  A: 

One alternative I've seen, in GIS programs, is to abandon putting this at the top of the window altogether. For example, ArcGIS puts the (very few) quite common "commands" in the menu/toolbars, but then has an entire docked window in their UI (which can be turned on and off) that provides a tree view of all of the available commands (they call this ArcToolbox - not too creative of a name on their part, but it makes sense to their users).

There are quite a few advantages to this - The main one is that you can have a hierarchical, categorized structure of commands that's fairly fast to navigate. In addition, plugability becomes quite easy, as plugins can just add commands to the tree or create new tree nodes.

It's not as elegant, in some ways, but it seems to be fairly easy for most people to handle.

Reed Copsey
It does sound like a good approach. I have a dark-brown feeling I'll end up writing 4 different UIs for this and make it all optional...
David Rutten
I would stick with one UI. Have a single UI, since that means users will have one (hopefully simple) UI to learn and to deal with. Supporting a single option is MUCH easier than trying to support multiple choices, especially if you have >1000 commands. You're already way, way overboard - try to make it as consistent as possible.
Reed Copsey
+2  A: 

The user has two hands. One usually on the keyboard, for modifier keys and such, and the other on the mouse. A CAD user probably has a very nice mouse with 5 or 6 buttons.

I believe that I might like an interface designed to pop up around the current mouse position. Not just a right-click context menu, but surround the mouse with a text menu, an icon toolbar or three. Maybe two context menus. This doesn't have to be radial although radial looks nice. I like exploded radial, with a big hole in the center so the area around the mouse stays visible. But the interface could be rectangular and work fine.

Then I would use the left hand fingers on the keyboard. Assign 12345 to functions in one toolbox/menu. Assign qwert for another toolbox/menu and asdfg and zxcvb. Give the spacebar a big important function and of course Ctrl, Alt, Shift, even Caps Lock.

Then use sequences of these easy to hit left hand keys to select functions. asdf and qwer should get the most important stuff. For the newer user, each keystroke should update the menu display so that they can see what is happening. For the experienced user, the display should never slow down the command input.

Oh, and have a fast way to repeat the last command and maybe the 2nd-5th last command. Maybe have a visible last command stack and use the numbers 1-5 to move a different command to the top of the stack and another easy to hit key like back-tick to run the top command on the stack.

For example, the user should be able to hit Space to pop the menus and qqrwe to select the function and have it execute right then.

Of course the mouse can still be used to navigate and select commands. But I think the keyboard method would give the best speed, much like vi as a text editor does. I think that having to hold Ctrl Alt and Shift and hit keys, all with the left hand leads to finger cramps.

Zan Lynx
Hi Zan, I can tell you are a man who knows what he likes :) I appreciate the accuracy of your suggestion and I agree with a lot of it. There's a couple things I have to keep in mind. 1) Many users do not use my software enough to be able to learn the 50-secret-shortcut methods. 2) I'm running as a plug-in inside a larger application which already has many and keyboard conventions. My app will eventually have to run on Windows and MacOS, including pesky foreign keyboards.I think I'll at least try and elaborate on the 'radial' menu approach. It's too good not to.
David Rutten
+1  A: 

David,

This post is pretty old but I thought I'd respond anyway as I'm an avid user of your software, Grasshopper, as well as Stack Overflow. When using components in your software I typically find my self in two separate modes: looking for components I'm already aware of, or figuring out what other components are available that might be able to perform what I'm trying to achieve.

When using components that I'm already aware of 99% of the time I end up using the feature where you can double click on the canvas and type all or part of the component name. Even when I'm looking for new components I tend to use that feature more then the toolbar. Say I know I want to divide a line, but I don't know where the Icon is. I'll just enter the name "Divide" to search for all the commands with "Divide" in their name.

While the toolbar is useful for seeing an overall view of what's available. I end up spending a lot of time dragging components out just to see what inputs they accept. Thus I think it would be useful to make the toolbar more dynamic and context sensitive. For example if the user selects a component that can output points, then I'd like to see a separate toolbar pop up that only shows components that can take points as an input. Autodesk Revit has functionality like this where, for example, if a user selects a wall they will be presented with all the tools related to modifying walls.

With your software this would be easy as you could simply cross reference the output of the currently selected component with the inputs of all available components to generate the dynamic tab. Ultimately this would allow users to quickly answer the question "where can I go from here" by selecting individual components in their current definition.

Eric Anastas
A: 

A few labels and tooltips (and logical grouping!) can go a long way: take a look at the UI in Office 2007/2010; It's actually really good (people complain because it's different than it was before).

Now imagine that same UI without the labels on the buttons...

Simply add labels to your buttons and group them into drop-downs, and your UI will be great!

BlueRaja - Danny Pflughoeft
+3  A: 

these buttons are for commands such as "Line between 2 Points", "Circle through 3 points" etc. etc. Many modern CAD apps have hundreds if not thousands of tools to manipulate geometry

This sticks out, to me, as the big failing. Maybe that's why I've always found CAD programs so incredibly difficult and frustrating to use.

Here's how I look at it. Before CAD, what did we do? Pencil and paper, with ruler, compass, triangles, t-squares, french curves, and so on. So the transition to computer was done by making each tool a "tool". Then to add more features, you add more "tools".

But that's backwards. I didn't use a compass because it had a great user interface -- it's actually a bit clumsy -- but because it provided a perfect circle. If I could draw a perfect circle with my pencil freehand, I wouldn't ever reach for the compass!

Well, my computer can draw a perfect circle, and the very concept of "tools" are irrelevant to it. Go look at some old videos of human-computer interaction, before we knew what "toolbars" were. On RAND's GRAIL, if you wanted to delete something, you'd scribble it out. If you want to draw a box with the corner chopped off, you draw a box and then chop the corner off. On Ivan Sutherland's Sketchpad, if I want to draw a line between two points, I draw a line between two points, and the computer understands the constraint that the line should be between those two points. These aren't that hard for a computer to figure out.

I don't know what 1000 things your CAD program does, but I think they probably fall into a relatively small number of categories:

  • draw new things
  • stretch/deform things
  • move things (often with one point/axis/side/etc fixed)
  • delete things
  • ...

So why do I need more than a handful of tools? If I draw a squiggly circle, chances are really good that I want a real circle. Let me draw and figure out what I want. Don't make me use any toolbars.

Ken