Added Left/Right shortcuts for Timeline increment/decrement.

Also made sure that left/right nudging continues to work for sliders with the focus.

Fixes #52.
Fixed bug in Path inequality operator.

It was ignoring the root.
Fixed MenuButton bug whereby menu could be shown partially off screen.
Fixed SceneReader hashing, and made childNames hash constant.

The SceneReader::hash() method was lazily hashing in time for everything, regardless of whether it was even related to outPlug(). It now correctly implements the hash*() methods instead, but omits hashChildNames() because the hierarchy provided by SceneInterfaces is static over time. This shaves approximately 6% off the time to traverse 20 frames of an animated scene.
Added ValuePlug.cacheMemoryUsage() static method.
Optimised SceneReader by detecting non-animating properties.

This knocks about 30% off of the time to traverse a 20 frame test animation with a mixture of deforming and static geometry. It also reduces cache memory usage by some 60%. There is a small time overhead for single frame display, but that will be addressed in a future commit.
Optimised SceneReader::scene() for repeated access to the same scene.

This knocks 8% off the time taken to traverse a 20 frame test animation, and restores previous performance for traversing a single frame.
Added Path._emitPathChanged() protected method.

This can be used by derived classes to emit the pathChangedSignal(), avoiding emitting it if nothing is listening. All subclasses should use this in preference to self.pathChangedSignal()( self ).
Optimised ScenePath with lazy signalling.

Prior to this, every ScenePath instance was connecting to plugDirtiedSignal() on construction and then when the plug was dirtied, was forcing the creation of the pathChangedSignal() on the base class. It now never forces the creation of pathChangedSignal(), using the new _emitPathChanged() method on the base class. More importantly though, it now only connects to plugDirtiedSignal() when the pathChangedSignal() is accessed for the first time - this removes a huge amount of signal processing in the SceneHierarchy, because there a great many paths are made (one for each level of the hierarchy), but only the root path's signals are accessed.

This fixes the laggy node dragging seen after expanding the SceneHierarchy contents and moving the current frame a few times.

Fixes #209.
Added test checking substitutions on StringPlug default values.
Added Context::hasSubstitutions() method.

This can be used to query if a string contains any substitutions supported by Context::substitute().
Optimised StringPlug::getValue() and StringPlug::hash().

They now check to see if a string contains substitutions before actually performing the substitution - since most strings don't this results in a nice little speedup because we avoid allocating another string. The reduction in total runtime for the 20 frame animation test is around 9%. A little bit of further testing suggested that we may be able to eke out another 1% or so if we stored the result of hasSubstitutions along with the string in the plug's internal IECore::ObjectPtr value. Since this would require custom datatypes I decided for now that the extra complexity wasn't worth the small return - if we see hasSubstitutions() appearing as a significant factor in profiles then we can reconsider that decision.
Merge pull request #667 from johnhaddon/stringSubstitutionOptimisation

String substitution optimisation.
Implements an optimisation for StringPlugs that uses a faster code path when a string contains no variable references, giving a 9% reduction in runtime for John's animation playback test case.
Added Slider.set/getPositionIncrement() methods.

This allows the cursor key position nudging behaviour to be controlled.
Prevented Timeline slider focus from masking global frame shortcuts.

The slider increment behaviour was giving us unwanted nudging by pixel amounts without wraparound, whereas the nice global shortcuts give us increments by the frame with wraparound at the start and end of the timeline.
Fixed PathListingWidget cursor key operations.

We need to prevent Qt from passing the cursor keys to our new global shortcut created by the Timeline.
Merge pull request #666 from johnhaddon/scenePathOptimisation

Scene path optimisation
Added a todo in ImageReader.cpp.
Added 'auto expand' mode to the scene viewer.

This is implemented with a "minimumExpansionDepth" plug on the SceneView class, which specifies a number of levels to always expand by, regardless of any other settings. Currently this is exposed simply as an on/off menu item in the viewer toolbar as Ben originally requested it. Also added menu items for the existing expand/collapse selection functionality, which should make the keyboard shortcuts a bit more discoverable even if the menu items aren't that convenient in themselves.

This continues the accumulation of nonsense into the SceneProcedural in support of viewer functionality, so I added a todo to remove all the nonsense when we find the time to have the viewer do its own conversion of the scene to OpenGL.

Fixes #163
Tidied up graphics file.

Some bizarre "spiro path" effects had snuck in, which made editing the paths very confusing, even if they looked alright to the eye.