0.29.0

  • The Gaffer.BlockedConnection constructor now accepts a list of connections to block, as an alternative to just a single connection.

  • Added a Gaffer.LeafPathFilter class, which filters out leaf Paths.

  • Fixed problem with Dialogue.waitForButton() which meant that the keyboard focus would be in the wrong place if a parent window was provided.

  • PathListingWidget now supports user resizing of the columns. The existing automatic resizing behaviour remains, but any changes made by the user are remembered and applied as offsets to future automatic resize events.

  • PathListingWidget.Column.lessThanFunction has been replaced with PathListingWidget.Column.sortFunction. The former was a function to compare two items, whereas the latter now simply returns the data in a form that should be passed to a standard less than comparison.

  • Added PathListingWidget.selectionChangedSignal().

  • Added PathListingWidget.scrollToPath() method.

  • PathListingWidget now supports a tree view mode in addition to the existing list mode. This is exposed in the PathChooserWidget and PathChooserDialogue via a button to toggle between the modes.

  • Deprecated PathListingWidget.selectedPaths() and introduced a pair of getSelectedPaths()/setSelectedPaths() methods.

  • Added the ability to remove children from the TabbedContainer using del[start:end] notation.

  • Added GafferUI.EventLoop.executeOnUIThread().

  • Added Gaffer.DictPath, to allow browsing of dictionaries, IECore.CompoundData and IECore.CompoundObjects using the GafferUI Path components.

  • Added GafferUI.BusyWidget, for saying “i might be some time but i don’t really know how long so just twiddle your thumbs please”.

  • Fixed bug in GafferUI.Frame.removeChild.

  • PathListingWidget now copes if a field in the Path.info() is missing.

  • Added a Gaffer.IndexedIOPath class, to allow browsing inside Cortex files using the GafferUI Path components.

  • GafferUI.EventLoop in Houdini mode now pumps 5 times rather than once per hou.ui.eventLoop idle. This makes typing in text fields interactive.

  • GafferUI.TabbedContainer now has setTabsVisible() and getTabsVisible() methods.

  • Added a frame() method to GafferUI.GadgetWidget, to frame a particular bounding box in the viewport, and fixed a bug whereby setGadget() didn’t request a redraw.

  • Added setPath and getPath methods to PathListingWidget, and PathWidget.

  • Added setPathCollapsed and getPathCollapsed to PathListingWidget to allow programmatic control of the tree view.

  • Added Gaffer.ClassLoaderPath class to allow browsing of ops and suchlike.

  • GafferUI.SplitContainer.setSizes() can now be called before the SplitContainer has become visible.

  • Added GafferUI.ErrorDialogue.ExceptionHandler class to simplify error handling.

  • Added classes for previewing paths. General file information, headers, images, meshes, ops, and indexed io files and contents may all be previewed.

  • Added a BrowserEditor class for embedding a file browser into a Gaffer layout.

  • Added a browser app to browse the filesystem and display previews.

  • Renamed ScriptNode::application() method to ScriptNode::applicationRoot() and changed return type to a raw pointer in keeping with the rest of Gaffer. Added python binding.

  • Added ApplicationRoot::preferencesLocation() method to return an appropriate directory into which settings can be saved.

  • Added Widget.visibilityChangedSignal().

  • Fixed crash in python bindings for TypedObjectPlug::defaultValue, for the case of the default value being null.

  • TypedObjectPlug bindings now support the serialisation of the value and default value, provided that the bindings for the types they hold implement repr appropriately.

  • Fixed bug in GafferBindings::Serialiser which meant that serialisers were called twice unecessarily.