SonyWWS / ATF

Authoring Tools Framework (ATF) is a set of C#/.NET components for making tools on Windows. ATF has been in continuous development in Sony Computer Entertainment's (SCE) Worldwide Studios central tools group since early 2005. ATF has been used by most SCE first party studios to make many custom tools such as Naughty Dog’s level editor and shader editor for The Last of Us, Guerrilla Games’ sequence editor for Killzone games (including the Killzone: Shadow Fall PS4 launch title), an animation blending tool at Santa Monica Studio, a level editor at Bend Studio, a visual state machine editor for Quantic Dream, sound editing tools, and many others.
Apache License 2.0
1.89k stars 262 forks source link

Filtered PropertyEditors #28

Closed vorptronica closed 9 years ago

vorptronica commented 9 years ago

I've been learning a lot about ATF reading the samples but I'm having trouble understanding the roles of contexts and I think they are important to what I'm trying to do now. I want to view only a subset of my loaded document data in a PropertyEditor. Starting simply, if I have a category attribute on a set of properties that are being displayed, how would I show only those data items that match a specific category? I don't want this to be a user-controlled filter; it should be fixed in code. I would like to effectively break my long list of properties into several individual property editors that display only data a single category. I'm thinking it requires a custom context (or several) that would pre-filter the data but am not certain that's right. Each property editor would require a unique context? If you could point me to a sample or documentation that could help me I'd appreciate it. Thanks! -Len

vorptronica commented 9 years ago

Ok... I figured out a way to do it but it requires modifying the framework. I've subclassed PropertyEditor as well as PropertyGridView in order to override the Items getter and do my own filtering. This also required changing the Items getter to virtual and making m_categories, m_activeProperties, and m_propertySorting protected so I could access them from my overridden getter. Is this the easiest way? Or am I missing a more obvious approach? Thanks. -Len

jhshen commented 9 years ago

Hi Len,

By default ATF's PropertyEditor uses SelectionPropertyEditingContext for displaying and editing the properties of the selected object, if there is no client-defined IPropertyEditingContext. See PropertyEditor.GetContext() method. Note SelectionPropertyEditingContext.GetPropertyDescriptors() returns all the visible properties of the selected objects.

Perhaps one approach is to set up your own IPropertyEditingContext, which can be derived or modified from SelectionPropertyEditingContext. Then you can rewrite GetPropertyDescriptors() to expose properties according to your filtering rules.

Does that sounds workable?

Shen

jhshen commented 9 years ago

Personally I prefer one property editor. If there are multiple property editors, will it be always clear which property editor to look/edit for a specific property?

vorptronica commented 9 years ago

In my case I have a LOT of properties which, when on a single panel, are quite an eyeful. I've been looking into SelectionPropertyEditingContext and how to wire a custom subclass into my project. Where is the appropriate place to change from the default context to my SelectionPropertyEditingContext subclass? In Initialize of my PropertyEditor subclass? Thanks.

jhshen commented 9 years ago

Inside PropertyEditor.GetContext() method, it calls GetMostRecentContext() to check a client-defined IPropertyEditingContext: IPropertyEditingContext context = ContextRegistry.GetMostRecentContext();

So if you can set ActiveContext once before the property editor is actually used, like this line m_contextRegistry.ActiveContext = MyPropertyEditingContext

GetMostRecentContext() call should be able to grab MyPropertyEditingContext.

If you have MyPropertyEditingContext1 & MyPropertyEditingContext2, GetMostRecentContext() will grab the most recent activated one.

ColinCren commented 9 years ago

It seems like you'll need to have m_defaultContext exposed as protected and not readonly to do what you're looking for. @Ron2 in the past has been great about exposing things for us, perhaps he can weigh in.

vorptronica commented 9 years ago

I AM able to do what I want by setting PropertyEditor.m_defaultContext to be protected (read/write) with no other changes to ATF. I'm using a custom SelectionPropertyEditingContext subclass and it's working well.

Ron2 commented 9 years ago

Thanks, @vorptronica, for the good suggestion.

I see how it would be useful to customize how the property descriptors are retrieved for the current selection set. I checked in the following addition to PropertyEditor and to the spreadsheet-style GridPropertyEditor:

/// <summary>
/// Gets or sets the default SelectionPropertyEditingContext object. This object
/// is used if there is no IPropertyEditingContext available from the IContextRegistry.
/// Set this to control custom property filtering behavior for the current
/// ISelectionContext, by overriding the SelectionPropertyEditingContext's
/// GetPropertyDescriptors(). Can't be null.</summary>
public SelectionPropertyEditingContext DefaultPropertyEditingContext
{
    get { return m_defaultContext; }
    set { m_defaultContext = value; }
}