* add a generic ChartViewLegend component that provides an interactive legend for ChartViews
* rely more on data bindings to control Series visibility and display
* NodeLog: remove intermediate property for Loader
* StatViewer
* keep only one function to load source file
* only send request only after the previous one fully completed
* update deltaTime before initializing charts
* reset "sourceModified" property when source changes
Introduce a new TextFileViewer component with auto-reload feature based on a ListView instead of a TextArea for performance reasons. Uses the text content split on line breaks as ListView's model.
Features:
* auto-scroll to bottom
* display line numbers
* customizable line delegates (e.g.: display a real progress bar)
* color lines according to log level
Usage of DelegateModel for model filtering has not proven to be the most stable solution, and might be responsible for random crashes happening during engine's garbage collection. Implement Loader-based alternative:
* first delegate is a Loader which creates the AttributeItemDelegate if necessary
* compensate spacing using negative height when element is hidden
* use it in MetadataListView and GraphEditor 'add Node' menu
* GraphEditor: forward MenuItem key events to searchBar to be able to continue editing the filter even if it lost active focus
* allow to solo a 3D media from the GraphEditor by double clicking on a node or an attribute with the Control modifier pressed
* consistent with Viewer3D.MediaLibrary behavior (solo on Ctrl+Click on visibility button)
* handle supported file extensions in Viewer3DSettings
* add a ToolButton for duplicating/removing following nodes in corresponding entries instead of having a separate item
* change text when those button are hovered to reflect the change of action
* wording: rename "Delete Node" to "Remove Node"
* ease the deletion of a branch from a given starting point
* accessible with alt+del on a node
* re-order menu to put the most destructive operation (Clear Data) at the very end
* required for PySide2 > 5.11.1 (and compatible with 5.11.1)
* AttributeItemDelegate: test for list length to determine whether to create a slider component (if range is set to None on Python side, it will be an empty list on the QML/JS side)
* using 'C' locale to ensure floating point values can be written using '.' decimal separator
* make TextField larger by default for numbers and fill width when slider is not defined
* avoid binding loop on height for ListAttributes by using contentHeight as implicitHeight
* add explicitly id for Connections in ComboBox
* NodeEditor
* exposes Node parameters: compatibility, attributes and logs
* provides a placeholder when no active Node
* AttributeEditor
* only displays the list of Attributes
* use 'AttributeEditor' for GroupAttributes in AttributeItemDelegate
* Layout
* move NodeEditor on the same SplitView level as GraphEditor
* move current node name and menu to the Panel's header
* keep track of currently hovered node in UIGraph on Python side
* Node: show border on hover + make MouseArea contain everything else to always get hover events, even when cursor is over children attribute pins
* when visibility changes, only load current file if log is actually visible
* set 'keepCursorPosition' default value to false in 'loadCurrentFile' method
* make Drag/DropArea overflow on the attribute's label to be more tolerant when connecting attributes
* add visual feedback when hovering interactive areas
* tweak spacings between attributes
* fit when the underlying graph has changed (new/open project)
* add 'F' shortcut to fit
* trigger fit after UI has been fully initialized (correct sizes)
* increase EdgeMouseArea thickness for easier picking
* EdgeMouseArea: propagate modifiers on pressed
* increase edge visual thickness when hovered
* add edge contextual menu on right click
* Alt+RighClick shortcut to delete an edge
Handle nodes move and auto-layout on Python side by using GraphLayout and MoveNodeCommand.
* Node QML component relies on underlying core.Node object's position
* MoveNodeCommand is called after a Node has been dragged
* partial/full auto-layout for specific graph operations (Duplication, Augmentation...) are now part of those operations
* serialized position in node data allows to properly restore nodes coordinates on undo/redo
* remove all layout/node moving code from QML