WIP
---------------
General Idea
==========
System overrides is currently a concept applied to ID pointer properties, a way to say 'this override data is different than its linked reference, because override system needs it, not because the user defined it as different'.
E.g. if, in an override, a RNA property points to a different ID than in the reference linked data, but that ID is an override of the one pointed to in the linked data, then this is a system override.
The idea of this tasks is to extend this principle to entire IDs, which would then behave from the user point of view essentially as non-editable, linked data.
Typical usecase would be the collections of a character. They need to be overridden so that the key objects of the character can also be overridden and edited/animated, but user should not actually ever manually edit those collections.
Behavior of System Overrides
=======================
* From a user perspective, they behave similar to linked data.
** Their properties are shown greyed out/un-editable in the UI.
* System Overrides can become editable (user) overrides from the Outliner.
** Some ID types could also automatically switch to user overrides when their properties get edited? This has UI/UX design issues though.
* 'Override from ID widget' will now perform a hierarchy override instead of a single override.
* What becomes a system override when creating an override hierarchy:
## From 3DView operator:
*** All collections are system overrides.
*** If applied on Empty-instanced linked collection, everything but armature objects are system overrides.
*** If applied on selected objects from a viewlayer-instanced collection, everything but those selected objects are system overrides.
## From Outliner:
*** Everything but the selected IDs are system overrides.
## From ID widget:
*** Everything but the selected ID are system overrides.
## From RNA API:
*** Everything are system overrides.
Tasks
=====
[] Decide a name to expose to user: Keep 'System Overrides' ? Or find something less 'technical', like maybe 'Inactive Overrides' ? 'Hidden Overrides' ? //NOTE: Would apply to both new ID system overrides, and existing IDPointer RNA properties system overrides.//
[] Define an icon for system overrides.
//Very early tentative idea: transform the underlying link into a key: {F12868484} Could also try to add a lock, but think it would make the icon overloaded? //
//Another possibility is to simply use the current liboverride icon, but in a 'grayed out' version, similar to what is done with indirectly linked libraries?//
[] Define & implement low-level technical aspect (most likely simply one new liboverride flag).
[] Define and implement default behavior (what is by default a system override vs a user-editable override).
[] ~~We probably need some sort of 'overridable anyway' properties, e.g. visibility etc. flags of collections?~~ Think re-using the existing `PROP_LIB_EXCEPTION` for this purpose is fine too... At least for now.
[] Implement hierarchy override from ID widget.
[] Update various low-level checks to define 'generic common Blender behavior' regarding those system overrides (maybe refactor or extend the `ID_IS_LINKED` usage?).
[] Hook this new concept into the Outliner UI.