A Proposal for Interface Creation, Editing and Configuration

I’ve written a proposal for interface tools and configuration that I hope will be read and considered by the rest of the development community. I also thought I’d share it here. While it appears on harkyman.com, I’ve reposted here for your convenience. Any thoughts – realizing that we’re not talking about interface specifics, but interface creation tools?

The proposal follows:

                 While I can’t be at the upcoming development sprint (which, realistically, it’s not like I should be — when it comes to coding, I’m a hack <i>AT BEST</i>), I did want to write something up about a few ideas for working with the interface that have weighed on me for the past year or so. With one exception at the end, this isn’t about how the user interacts with Blender. I’ll leave that up to better minds than my own. But, when it comes to how that interface is created — the actual tools that are used — I’d like to pitch in my 2 cents.

AN INTERFACE EDITOR
Right now, the one and only way to edit/change/test/configure the Blender interface is through c coding. That’s a huge problem. Let’s call the set of all people who can code in c “Group C”. Let’s call all people who are good at interface design “Group I”. The overlap between Group C and Group I is dwindlingly tiny. Very tiny. Most likely just a few people. Restricting the job of interface work to the C/I overlap is a huge mistake. Why not put in some more work up front, and give access to the entire Group I? I’m proposing that Blender’s interface (and by this I mean buttons, panels, header elements, panel elements, etc., not such things as Click-n-Hold vs. modal click) be configurable directly from within the application, and that any configurations that are created be savable to an external file, much like Themes are saved into Python files currently.

DESIGNING THE INTERFACE WITHIN THE APPLICATION
At the moment, a user can change the “rt” value and play around with button configurations. That’s nice for making screen shots, but very limited. Best would be a system in which all interface elements (colors, panels, button contexts, menus) are changable by the user, along with some nice examiner and informational panels a la an IDE. Call it an IDE for Blender’s widgets. At any point, the current state of all controls could be dumped to a Python file. In fact, Blender’s base configuration would be converted (one time!) to such a format, and that base file would be loaded at runtime to configure the default interface. Elements could also be exported and imported on a modular basis.

This would not only be great for users, but for developers as well. If you code a new feature or module, the last thing you want to have to worry about is digging through the interface code, doing the math for buttons, etc. You build your feature, properly code it’s DNA and RNA, compile and run. Switch into “interface edit” mode, create a new panel in the proper buttons context, add/configure/arrange widgets and link them to proper RNA right in Blender. Bind key commands to the operators you’ve written. When you’ve got it as you like it — export the new panel and bindings either as a simple module that anyone can import to try (sort of like a patch), or just save your entire configuration as a new default. When it comes time to commit your feature/module/etc., the interface code exports and patches right in to the trunk version of the interface configurator.

From a user standpoint, one could configure tools, menus, and pop-ups to suit their workflow — even creating toolboxes or toolbars with their favorite widgets. They would be easily sharable with others, and if useful enough could be included in future releases.

A scheme like this really continues and extends the promise to the artistic community that Blender has already begun. To the artistic community, Blender says: “Here’s a great tool, at no cost to you.” And now, this great tool can be customized by you without any special knowledge. But even better than that, you as an artist get the potential to benefit from the entire community of Group I, not just the C/I coincidence.

Will people do stoopid things to their Blender interface? Of course. Will this take the onus away from Blender’s development team to make the interface as good as it can be? Of course not. I think that such a system, though, would drastically improve the interface in short order. You’re reducing the testing and experimentation cycle to virtually zero time. It’s instant feedback, and almost no effort to game something differently and give it a try. Our interface people will be significantly more productive with such a system.

PREFERRED TOOL
Apart from my system-level suggestion above, I do have one specific idea that’s nagged at me for a while. It’s a “preferred tool” designator. When working in the 3D, which comprises a vast majority of the time, Blender artists are confronted with a number of pop-up menus: Specials, Merge, Mirror, Edge, etc. While it’s fairly simple to, say, press the W-key followed by a number to select an option, I’ve found that in my own work, I tend to use tools in clusters. While I’m performing a certain portion of the modeling pipeline, I might use Subdivide a number of times in a row. What would be fantastic would be to structure those sorts of pop-ups to allow for the on-the-fly designation of a “preferred tool.” Then, instead of repeatedly pressing W, then 1 (or just using the mouse to choose it), you hit the menu key (W) with a modifier (like Ctrl) and it just activates the preferred tool. Done with that part of your work and moving on to something else? Set a different preferred tool. You could also include secondary and tertiary tools (Alt, and Ctrl-Alt?). This way, Blender works the way that you want it to — losing nothing in the process. All of the options are still there, but you can easily bend Blender to the specific task you are doing, on the fly.

SUMMARY

While I have great faith in rest of the development team to come up with good solutions for the road ahead, I wanted to place a vote for ultimate configurability. A system that lets interface design and configuration take place directly in the application workspace would not only benefit users in the long run, but have immediate benefits for the developers themselves.

The sort of sharability and openness that we already enjoy with BLEND files and artistry could be extended even further, and we would all come out ahead.

Interesting points…

I guess that with the RNA datablocks in the outliner there’s always a “default” way to get at all the data in the scene… so given that I guess it’s less scary suggestion than it might have been …

I’m all for flexibility, but there is always a balance… I’d trade COMPLETE customisation for FAST and accesable customisation… a custom “hotbox” or “shelf” is quick and accesable… for example… and well within anyones reach… i think it’s important to think through what the extents should be and probably have different levels of it…

eg triggering a “one off” command… (eg add a button, to a toolbar, radial menu or shelf) vs modifying the layout of a set of related controls… eg material/textures… (probably panels or panel groups)…

If I’ve highly customised the interface and I get a new version of blender it’d be nice for new functions to have a default place to go… (lightwave had fully customisable tabs of buttonbars, but new features always got put under “additional” ready for you to move them to where you liked… they did have the advantage that the tools panel (settings for the tool) was not customisable…
When new features get added it’d be good to have a means to merge the new stuff easily with my custom setup…

Merging new stuff into a thoroughly customized setup is one of the down sides of what I’m talking about, for sure. Not sure how you’d solve that. Personally, I don’t think most people who do serious work would play around with the guts of the interface too much. Good point, though.

depends really…:wink:

I would hack the guts of the interface to offer custom materials for games as an example (basically to offer presets where you just put images in the right slots for example)…

I can also see that it might happen for those using blender “for a purpose other than intended”… CAD for example…

but I think you’re right, most people will want to create a custom toolbar/buttonbar or radial menu, modify their key shortcuts and probably their mouse/keyboard inputs (selection, viewnav etc) and that’s it: anything more will be left alone by the majority…

Sorry to bring up lightwave as an example again, but they had a standalone editor that allowed you to create a panel and graphically just add widgets and move them around.

It had grouping and heirarchies and alignment tools… so you could layout your interface just how you want. You’d then basically export as Lscript or C code and add function calls to the buttons…

Assuming all the RNA is a simple python command then you’d just put the command in the function for the button…

something like this could have presets ranging from “model view toolbar”, modeling header etc right up to new script window for example…

Helloooo

hexagon 2.5???

Sounds like modo to me.

Great thinking Harkyman…it certainly would put an end to the constant whining.
Oh wait…forgot where I was for a second.:eyebrowlift:
I’m hoping your voice is heard.

P. Monk

I’m loving the suggestion to let the “I” crowd edit the interfaces. It really does broaden the ability for work to be done on Blender by people who love the areas they are working on, and would potentially reduce the workload of those “C” coders who’s passions lie in features and not interfaces.

Alltaken

I have worked with a number of other (non 3d) apps that use editable button bars or tabed panels(owned by Adobe?).
And I have setup different remappable keyboards based on the workspace (or setup mode) that I need at the time. These workspaces, keyboard maps and button bars are linked and mapped to a function key for quick swapping. Check out Avid video editing software and Workspaces for more detail (my work system is pretty pimped out).

I like the idea of customising as long as there is a bare default available at all times too.

I like this idea.

I was going to include in the next update to my last proposal a “Theme tool” which I believe has some functionality of your “Interface Edit mode”.

Basically you would click this tool and you could navigate the interface clicking any element to set its color and style using a color selector and style selector popup (style: rounded, shaded, etc).

Your proposal goes beyond color and style, and is very interesting the idea of creating custom panels with custom functionality. Could be very powerful together with macros and python triggering.

I believe that those widgets (small units like buttons or drop down menues) should be pre-made since they need programming knowledge. For instance a “number button” has a functionality that can not be created by “Group I”: this kind of button, when clicked, becomes editable with the keyboard… pressing ESC leaves the value as it was before editing… clicking on the right arrow increments the value… etc.
(Although the “style” would be nice to be tweakable)

But there could be a widget manager from where “Group I” could drag all the widgets they need on the panel they are creating. And “Group C” would be feeding a repository creating widgets suggested by “Group I”. These widgets could be just another element of a Blend file just like a material, an IPO, an Action… (from a user stand point). Or have their own sub-folder in Blender’s main folder, and be included like we include scripts.

I believe it will be a different thing to create custom panels than customizing the base interface (but I can’t be sure until knowing how Blender will be).
I mean, some functions of Blender include more than one widget/button, they are a group of buttons/widgets interacting together: you choose an option, then some other buttons appear depending on what option you chose, and/or depend on the type of object you have selected, etc.

This kind of functionality I’m not sure how feasible would be to leave it in hands of “Group I”.

It would be nice to have pointers set to mouse or combo inkey stuff for UI setup…

e.g. alt+shift+LMb bring up a customization wizard for hot key and color for any item clicked on, buttons headers etc…maybe also in viewports, but a list that is context driven by that view port.(3d window would have wireframe color etc…).

Sounds interesting I just would suggest that the customized interface overwrites interface settings in the read blend file. Cause I really find it weird if you get the custom interface of somebody else by opening their blend file.

as long as it doesn’t slow things down, brilliant.

a specific counter example is maya’s radial menu’s. radial (pie) menu’s are meant to be fast due to muscle memory and large hit area, so you start to memorise that r.click drag-up-drag-left brings up vertex edit mode for example. unfortunately in maya you can do that move before maya has time to draw the menu’s. you either don’t get the operation you need, or you wait for menu’s to display, slowing you down.

would be terrible to have dynamic everything in blender, but have it hindered by slow updates.

I hope there would be eye candy pie menu’s. I consider the whole nodes eye candy too. Very well done, especially in comparison to what other apps have.

hi musk, that’s what the LOAD UI toggle button is for in blenders load file dialogue so you don’t have to load someone else’s layout. :slight_smile:

Yes, whether or not we make a new way of implementing the GUI, one of the features that I would like to see in 2.50 is a User Preference that determines the default state of the Load UI button. It is tedious to have to click it each time.

Quoted for agreement!:yes: