Adam Hughes
Adam Hughes

Reputation: 16319

Inspect stack of traits for TreeView?

We're trying to assess the feasibility of this idea:

We have a pretty deep stack of HasTraits objects in a modeling program. For example, if we are modeling two materials, we could access various attributes on these with:

Layer.Material1.Shell.index_of_refraction
Layer.Material5.Medium.index_of_refraction

We've used this code for simulations, where we merely increment the values of a trait. For example, we could run a simulation were the index_of_refraction of one of these materials varies from 1.3 to 1.6 over 10 iterations. It actually is working quite nicely.

The problem is in selecting the desired traits for the simulation. Users aren't going to know all of these trait variable names, so we wanted to present a heirarchal/tree view of the entire trait structure of the program. For the above two traits, it might look like:

Layer
 - Material1
    - Shell
        - index_of_refraction
 - Material2
    - Medium
        - index_of_refraction

Etc...

I know that traitsui supports TreeEditors, but are there any examples of building a TreeEditor based on the inspection of a HasTraits stack like this? What is the most straightforward way to get the Stack of traits from an object? Essentially, is this idea feasible or should I go back to the drawing board?

Thanks

Upvotes: 2

Views: 143

Answers (2)

Adam Hughes
Adam Hughes

Reputation: 16319

enter image description here

Here is an image from Robert's solution.

Followup Discussion

Robert, imagine I had a custom TreeEditor. It doesn't seem to let me use it directly:

Item('myitem', editor=TreeEditor())

I get:

traits.trait_errors.TraitError: The 'adapter' trait of an ITreeNodeAdapterBridge instance must be an implementor of, or can be adapted to implement, ITreeNode or None, but a value of [<pame.gensim.LayerSimulation object at 0x7fb623bf0830>] <class 'traits.trait_handlers.TraitListObject'> was specified.

I've tried this with _ValueTree, ValueTree, value_tree_editor, value_tree_editor_with_root, _ValueEditor and ValueEditor.

The only one that works is ValueEditor, therefore, even though I can understand how to subclass TraitsNode, it doesn't seem like it's going to work unless I hook everything up through an EditorFactory. IE the behavior we want to customize is all the way down in TreeEditor, and that's buried under _ValueEditor, ValueEditor, EditorFactory etc...

Does this make any sense?

Upvotes: 1

Robert Kern
Robert Kern

Reputation: 13430

The ValueEditor does this. You can take a look at how it configures the TreeEditor to do this here:

https://github.com/enthought/traitsui/blob/master/traitsui/value_tree.py

Upvotes: 2

Related Questions