Added menu item for loading renderman shaders from file.

Fixes #125.
Fixed error which could occur when a non-focussed PathChooserDialogue received a click.
Fixed hiding of Menu when using the search box.

Previously, the __menuActionTriggered method was getting called /after/ the menu command had returned. This meant that if the menu item popped up a modal dialogue, the menu wasn't hidden until after the dialogue had returned. Connecting directly to the signal on the menu item, /before/ connecting the command means that __menuActionTriggered is called first and the menu gets hidden at the right moment.
Merge pull request #406 from johnhaddon/loadShaderFromDisk

Menu item for loading a RenderManShader via a file browser
Fixed tab focus ordering in NodeEditor.

It's still possible to use a ListContainer in such a way that you get bad focus orders, but it's fixed enough for the purposes of the NodeEditor, which is the only place bad ordering has been reported to date. See comments in ListContainer.py for possible alternative approaches that may hold some promise, but were fruitless so far.

For the most part, fixes #107.
Improved GadgetWidget focus behaviour.

It no longer accepts focus from tab events, as that's confusing. It steals focus and releases it on mouse enter and leave events, as requested in #119. I experimented with painting a border around the GadgetWidget (viewer and graph editor) when they had the focus, but I wasn't particularly keen on the way it looked. Will await feedback before going any further with that.
Improved appearance of focussed buttons.

They now have a highlighted border whereas before they looked the same as any other button.
Merge pull request #410 from johnhaddon/tabFocusOrder

Tab focus order
Added a new test for SplinePlug.

I wrote this while hunting down a problem that turned out to be unrelated, but you can never have too many tests...
Added spline parameter support to RenderManShader::loadShader().

Splines are represented as a pair of shader parameters called <name>Positions and <name>Values, and which are mapped to a single SplinePlug called <name>. UI to follow.
Reintroduced SplinePlugValueWidget and SplineWidget.

SplineWidget now uses the appropriate colour transform for the display, and gets the curve the right way up (Qt origin is top left). SplinePlugValueWidget uses ramp drawing mode for colour splines.
Fixed RenderManShaderUI to take into account spline parameter name munging.
SplinePlug fixes.

A medley of fixes relating to the SplinePlug :

- Implemented SplinePlug::createCounterpart()
- Made CompoundPlugSerialiser public so it can be used by derived classes
- Fixed SplinePlug serialisation.
- Removed redundant setValue() calls in ValuePlug serialisation - values are now set only on the leaf plugs. Fixes #2.

Among other things this now allows SplinePlugs to be happily saved and loaded, cut and pasted, and promoted to Boxes.
Replaced smart pointers with raw pointers in SplinePlug API where appropriate.
Improved SplinePlugValueWidget drawing.

SplinePlugValueWidget now supports highlighting. SplineWidget now correctly paints within a border defined by the stylesheet, and caches the computation of the gradient used for drawing the ramp.
Fixed LabelPlugValueWidget to deal with plug == None case.

Also documented that derived classes should be able to handle plug == None in the PlugValueWidget.setPlug() comments. Currently, not all derived classes support this properly.
Fixed CompoundNumericPlugValueWidget.setPlug().

Previously, it wasn't updating the plugs referenced by its child NumericPlugValueWidgets.
Fixed NumericPlugValueWidget to handle plug == None and changing plug type.
Added support for multiple positions in Slider classes.
Stopped representing duplicate endpoints as SplinePlug::pointPlugs().

Storing them duplicated made it very hard for scripts and the ui to keep things shipshape. The multiplicity of the endpoints is now calculated by SplinePlug::setValue() and stored on a new endPointMultiplicity plug. SplinePlug::getValue() then uses the value stored to restore the duplicate endpoints. This allows us to correctly round-trip values through the SplinePlug while maintaining a more manageable internal representation.