This patch substitutes by isAttachedToDocument() (almost) everywhere where
getNameInDocument() is used for this purpose.
The very few places not touched by this patch demand a (just a little) less trivial change.
When we change the returning type of getNameInDocument() to std::string,
those places will be easily found, because they shall generate a compiler error
(converting std::string to bool).
Rationale:
The fact that getNameInDocument() return nullptr to indicate
that the object is not attached to a document is responsible for lots of bugs
where the developer does not check for "nullptr".
The idea is to eliminate all those uses of getNameInDocument() and, in the near future,
make getNameInDocument() return always a valid std::string.
* On lines where the variable type is obvious from inspection, avoid repeating the type using auto.
* When possible use a ranged for loop instead of begin() and end() iterators
* Part: fix Placement/Shape onChanged() handling
* App: fix property ordering problem when undo/redo
See https://tracker.freecadweb.org/view.php?id=4265#c14271
* Gui: fix undo/redo signaling
Make sure to signal after all properties has been restored
This reverts commit b0452667c72f330323f6b3366f45bf039d05feef, reversing
changes made to b2d99f3fa7b4c7c305aed4a8d975a8624a6d590f.
See forums discussion: https://forum.freecadweb.org/viewtopic.php?p=549120
The enumeration items are exposed through sub path '.Enum'. When
'ShowAll' is enabled in property view, this sub path is exposed as a
sub property item named 'Enum', and can be either manually edited or
bound with an expression.
The sketcher view provider doesn't need a transaction on double-click or otherwise shows a useless entry in the undo dialog which when undoing leads to weird behaviour
C++ view provider will get the call of attach() before restoring
properties. However, python view object will delay the call until Proxy
is restored.
The reason why this problem did not show up eariler is because
ViewProviderPythonFeature::getDefaultDisplayMode() did not fallback to
its parent implementation if there is no Python override. This can be
considered as a bug, which is fixed during the merge. And the display
mode restore problem is the side effect of the fix.
This patch prevents syncing DocumentObject::Visibility when view
provider hides itself before updating. Some object may have additional
logic based on object visibility change. For example, GroupExtension
monitors its children visibility for exporting, and propgate changes to
upper hierarchy.
Previously, box style selection is rendered using customized
SoBoxSelectionRenderAction, which does not support selection context,
i.e. it does not work with Link.
This patch implements context aware bound box rendering inside
SoFCSelectionRoot, SoFCSelection and SoFCPathAnnotation (for always on
top rendering). The box rendering in SoBoxSelectionRenderAction is
disabled on construction. Box style selection can be enabled for
individual object through property SelectionStyle (moved from
ViewProviderGeometryObject to ViewProviderDocumentObject), or globally
through Parameter BaseApp/Preferences/View/ShowSelectionBoundingBox.
In addition, the parameter BaseApp/Preferences/View/UseNewSelection is
used to override selection model reported from
ViewProvider::useNewSelectionModel(). The reason being that, the same
parameter is already used to toggle selection model inside
SoFCSelection. This avoids inconsistency of selection model choice
between view provider and the SoFCSelection node inside. Note that if
the parameter 'UseNewSelection' is set to false, those view providers
that choose old selection model will not work with Link.
* Major refactor of tree view to support external linking.
* Item update and selection change are now mostly handled by timer for
performance improvement.
* Major change to drag and drop for better support of switching between
copy, move and replace action, and auto adjustment of placement and
relative link.
* Add second column for user changable object description.
* Unified tree view options and action into command group
Std_TreeViewActions.
* Modified object search function to find external objects using
Expression syntax.
Context aware selection makes it possible to select the same Coin3D node
in different hierarchies (i.e. context) without ambiguity.
New/modified APIs in ViewProvider (the first two are the most crucial
APIs for context aware selection to work):
* getElementPicked(), supercedes getElement(). Given a Coin3D pick
point, this function returns a dot separated subname reference as a
path leads to the selected object.
* getDetailPath(), supercedes getDetail(). Given a subname reference,
this function returns an SoFullPath leads to the Coin3D node of the
selected object or sub-element (with SoDetail).
* (has)HiddenMarker(), check/return a special text marker for context
aware override of object visibility.
* partialRender(), render only part of the object based on given
subname references. It can render, e.g. some faces of a solid, or
some children of a container. It uses the 'secondary' extension of
SoSelectionElementAction to select which elements to render or hide.
The actually rendering functionality will be added in the following
patch.
* update()/onChanged(), modified to sync Visibility property from
DocumentObject.
* useNewSelectionModel(), modified to return the default true view
parameter. This is for test in the early stage of Link development,
probably not needed anymore.
* getBoundingBox(), a convenience function to obtain the bounding box
of a sub-object/element regardless of object's visibility. It uses
getDetailPath() and SoGetBoundingBoxAction to obtain bounding box
through Coin3D. It will be used in later sub-element box selection
functionality.
New/modified APIs in ViewProviderDocumentObject:
* getElementPicked()/getDetailPath() provides actual implementation to
support container like (sub)object selection without ambiguity. It
relies on DocumentObject::getSubObject() to walk the path.
* reattach(), called when undo deleteion
* forceUpdate()/isUpdateForced(), force update even if object is
invisible. These are used by Link to force update the visual of a
linked object regardless of its visibility.
* getLinkedViewProvider(), return the linked view provider with
hierarchy.
ViewProviderDocumentObjectPy:
* Object attribute is made writtable. Assigning it is equaivalant of
calling ViewProviderDocumentObject::attach() in Python.
Property:
* Extended property status bitset. Mirror most of PropertyType and
allow dynamic change property type.
* Cache property name and type to improve performance
* Centralize property status change signalling
* Change aboutToSetValue()/hasSetValue() to virtual
* Add new API getFullName() to obtain full quanlified name of the property
AtomicPropertyChangeInterface:
* Allow calling aboutToSetValue()/hasSetValue() when actually changed
PropertyLists:
* Refactor implementation by an abstract class PropertyListBase and a
template class PropertyListsT, to allow better code reuse.
PropertyListT is derived from AtomicPropertyChangeInterface to allow
more efficient change on individual elements.
* All list type property now accept setting python value as a dictionary
with index as key to set individual element of a list.
* Add touch list for more efficient handling of value changes. The list
contains the index of changed value. And empty touch list should be
treated as the entire list is changed. PropertyContainerPy expose this
functionality with getPropertyTouchList().
PropertyPersistentObject:
* New property to allow dynamic creation of any FreeCAD object derived
from Base::Persistence, and use it as a property.
DynamicProperty:
* Use boost multi_index_container for efficient property lookup while
keeping order.
* Modify to be allowed to use in PropertyContainer directly
PropertyContainer:
* Use boost multi_index_container for efficient property lookup while
keeping order.
* Allow adding/removing dynamic property on all property container
* Modify Save/Restore() to persist property status, and better handle
transient property which can now be dynamically enabled/disabled per
object.
* Add new API getFullName() to obtain full quanlified name of the property.
Implemented by Document, DocumentObject, and also
ViewProviderDocumentObject if future patch
DocumentObject and FeaturePython are modified to accommondate the
dynamic property changes.
Removed get/setCustomAttribute() implementation from DocumentObjectPy,
and rely on PropertyContainerPy for the implementation, because of the
additional dynamic property support in property container.
Gui::ViewProviderDocumentObject, which is derived from
PropertyContainer, is also modified accordingly