0.28.0

  • Added an InfoPathFilter, which allows filtering with an arbitrary match function applied to an arbitrary field of Path.info(). Used this to implement a filter text box for path choosers.

  • PathParameterWidget now applies path filters, and has an _filter() method which can be overridden in derived classes to define the filter.

  • GridContainer now supports the automatic parenting mechanism

  • Window now support the addition of child windows using the automatic parenting mechanism.

  • Keyword arguments can now be passed to the ContainerWidget.addChild() call generated by the automatic parenting mechanism. To properly support this, all Widget subclasses must take a **kw constructor argument, and pass it to their parent class constructor. An example use follows :

    with GafferUI.GridContainer() : # index is automatically passed to GridContainer.addChild() to specify the position of the button GafferUI.Button( “myButton”, index = ( 0, 2 ) )

    with GafferUI.ListContainer() : # expand is automatically passed to ListContainer.addChild() GafferUI.Spacer( IECore.V2i( 10 ), expand=True )

  • Added the ability to easily profile any gaffer application using the cPython profiling module, by specifying the -profileFileName command line flag. Use the pstats module to examine the resulting file.

  • Optimised the Widget event filter.

  • Fixed circular reference in GafferUI.CompoundParameterValueWidget which could cause “Underlying C/C++ object has been deleted” errors.

  • The displayFunction in GafferUI.PathListingWidget.Columns may now return a GafferUI.Image or (as an optimisation) a QtGui.QIcon.

  • Added GafferUI.PathListingWidget.defaultFileSystemIconColumn, which can be added to the list of columns passed to GafferUI.PathListingWidget to obtain an icon view.

  • Optimised Widget implementation so that the event filter is only applied when it is absolutely needed - either when a connection to one of the signals has been made or when getToolTip has been overridden. Investigations with the standard gaffer ui revealed that only about one third of widgets meet these criteria.

  • Optimised Widget implementation by lazily constructing signals when they are first accessed. This improves construction times but also reduces the memory footprint of a freshly constructed Widget by 40%.

  • Added Gaffer.lazyImport function, which imports modules in such a way that they aren’t actually loaded until first accessed.

  • Optimised startup of gaffer applications which don’t use any GL functionality, by using the new Gaffer.lazyImport functionality for PyOpenGL, IECoreGL and QtOpenGL.

  • Added buttonDoubleClickSignal() to GafferUI.Widget and GafferUI.Gadget.

  • Added setSelection() and getSelection() methods to GafferUI.TextWidget, along with a selectionChangedSignal() method. An additional selectingFinishedSignal() uses heuristics to determine when the user has finished making a selection. This is useful in Widgets which wish to provide easy methods of acting on the selection.

  • The Menu.popup() method now takes optional position and forcePosition arguments.

  • Improved PathWidget popup listing behaviour.

  • GafferUI.ScrolledContainer now always asks for enough size to completely show its contents, regardless of the scroll mode in use.

  • Deprecated GafferUI.Window setResizeable() and getResizeable() methods in favour of new setSizeMode() and getSizeMode() methods. These provide three modes - Manual (the same as the previous resizeable), Fixed (the same as the previous non-resizeable) and Automatic, whereby the window always tries to fit its child. Added a resizeToFitChild() method for cases where sizeMode is not Automatic and you know the child has been resized.

  • The OpDialogue now resizes automatically to fit the parameters initially, and adjust as parameter sections are shown and hidden.

  • The Widget class now has a keyReleaseSignal, and the GadgetWidget propagates events on this signal to the existing Gadget::keyReleaseSignal.

  • Added support for “label” attributes in menu definitions to GafferUI.Menu. This is really just a workaround for the fact that IECore.MenuDefinition uses / characters to delineate between menu entries, and sometimes we want a / in the entry name itself.

  • The VectorDataWidget now sizes itself to fit its contents.