# 0.35.0¶

• Sequence Path displays file sequences with a single frame
• OpDialogue now supports op.userData()[“UI”][“buttonLabel”], for specifying a custom label for the OK button.
• Removed requirement of the boost build having a patched python library capable of participating in garbage collection.
• Fixed bug in Collapsible when calling setChild() with a widget currently parented elsewhere.
• Fixed various GafferUI.Container bugs which prevented successful transfer of Widgets between containers.
• Added workarounds for unwanted Qt behaviours - parentless Widgets becoming top-level windows, and widgets being hidden when reparented.
• Added setClassLoader and getClassLoader methods to the op application. These may be used by configuration files to customise the loading of ops (the application is available as an “application” variable to the startup scripts).
• Calling BrowserEditor.registerMode() with the label of an existing mode now overrides the previous registration, rather than adding a second with an identical name.
• The standard BrowserEditor modes are now accessible publicly as BrowserEditor.FileSystemMode, BrowserEditor.FileSequenceMode and BrowserEditor.OpMode.
• The browser OpMode now takes an additional classLoader argument to the constructor, allowing the use of custom class loaders.
• The ParameterValueWidget.registerType() method now accepts an optional uiTypeHint argument, which allows the registration of custom uis, which parameters can request using the standard [“UI”][“typeHint”] userData entry.
• Added ValueType class members to TypedObjectPlug bindings, so that appropriate values can be constructed easily.
• GraphComponent.children() python method now accepts a typeId to filter the result.
• Fixed bug which meant that colour swatches for plugs had the wrong colour when first shown.
• Simplified EditorWidget implementations by removing setScriptNode() method - now the scriptNode is always provided at construction and cannot be subsequently changed. Renamed ScriptWindow.getScript() to ScriptWindow.scriptNode() and EditorWidget.getScriptNode() to EditorWidget.scriptNode() for consistency.
• Menus now support a “shortCut” entry in the MenuItemDefinition to provide keyboard shortcuts. The standard application, file and edit menus now provide the expected shortcuts, and are greyed out appropriately when they cannot be used for whatever reason.
• Added ScriptNode undoAvailable() and redoAvailable() methods.
• CompoundNodule now supports a vertical orientation, specified using a new argument to the constructor.
• GafferUI.LinearContainer now supports decreasing as well as increasing child ordering, controlled with the setDirection() and getDirection() methods.
• Fixed ordering of nodules in vertically oriented NodeGadgets.
• PathPlugValueWidget doesn’t update the plug value as you type any more - this was causing constant computation with invalid values. The value is now only set when editing finishes.
• Fixed problems with PathChooserWidget which meant the wrong file/directory was displayed on opening (truncated by one).
• ParameterValueWidget popup menus may now be customised by external code, using the ParameterValueWidget.popupMenuSignal().
• The Path class now implements a much more readable repr.
• The DictPath class now accepts an additional “dictTypes” argument to the constructor, which can be used to define what types it considers to be branches in the path (all other types are considered leaves).
• The OpMatcher.defaultInstance() function now takes an optional classLoader argument, which is used to create the shareable OpMatcher.
• The BrowserEditor.Mode class now has a _createOpMatcher() method which may be overridden by derived classes. Typically this would be overridden to use a custom ClassLoader for the ops.
• Moved Label.VerticalAlignment and Label.HorizontalAlignment enums to GafferUI namespace - to allow their use in other parts of the API. They are temporarily available under their old names for backwards compatibility.
• GridContainer.addChild() now accepts an alignment parameter to control alignment of the child within its cells.
• Path setFromString, append and truncateUntilValid methods now return self, to allow easy chaining and use in list comprehensions.
• Fixed problem which could cause MultiLineTextWidget to raise an Exception when losing focus as part of a ui being destroyed.
• Fixed SelectionMenu so that standard python strings (and not QStrings) are returned from the getCurrentItem() and getItem() methods.
• The OpPathPreview is now more flexible in what it considers to be a ClassLoader for ops, to provide better support for custom ClassLoaders.
• The PathListing widget now allows multiple levels of hierarchy to be expanded, by holding either Shift (all levels) or Control (one level) while expanding a level. In addition, expansionChangedSignal() is not emitted only once for batched changes, such as those caused by setExpandedPaths() and the new recursive expansion/collapsing.
• Layouts now remember their correct splitting ratios when they’re saved. Added a useful layout for use with scenes.
• The ExpressionNode now supports string as well as numeric output types.
• The execute app now operates over frame ranges defined using the -frames command line argument.
• When not in gui mode, the Render node waits for the render subprocess to complete before returning from execute().
• StringPlug inputs now automatically substitute $name,${name} and ### tokens using values from the current context when their value is accessed during a computation. This behaviour can be controlled using the new PerformsSubstitutions plug flag.
• Node computations are now cached in memory and reused when possible. Hashes representing computations are available using the ValuePlug::hash() method, and Node implementations must now implement the new Node::hash() method to assist in computing hashes.
• Added GraphComponent::getChild( childIndex ) method, providing constant-time access to children by index. This improved the implementation of SplinePlug, ChildSet and the GraphComponent getitem method in Python.
• The op application now supports the loading of presets at launch, using the new “-preset presetName” command line option.
• Added a simple ConfirmationDialogue class.
• Presets are now stored in subdirectories based on class name, to avoid clashes between presets for different classes.
• Added a small UI for deleting presets.
• Resolved browser errors caused by broken symlinks. FileSystemPath now returns True for isValid() if a path is a broken symlink (it seems unreasonable for children() to return invalid paths) and falls back to os.lstat() to generate path info if os.stat() fails due to a broken link.
• Fixed problem where SequencePath would error in info() when given an invalid base path. Now it returns None as expected.