Hi everyone,
I use traitsui for some time now and I think I have missed something. I do prefer separating the view from the model and writing it inside a Controller or ModelView class. The documentation explain how and I have found simple examples. But I have found nothing that would allow me to use it in nested objects (and I write complex applications with a lot of depth). I am used to write this kind of code:
import traits.api as tapi
import traitsui.api as tuiapi
class Building(tapi.HasTraits):
name = tapi.Str("Home")
rooms = tapi.List(tapi.Instance("Room"))
class Room(tapi.HasTraits):
name = tapi.Str
level = tapi.Int
class BuildingHandler(tuiapi.Controller):
room_handlers = tapi.List(tapi.Instance("RoomHandler"))
def add_room(self):
new_room = Room()
self.model.rooms.append(new_room)
return RoomHandler(model=new_room)
def default_traits_view(self):
return tuiapi.View(
tuiapi.Readonly("name"),
tuiapi.Item(
"handler.room_handlers",
editor=tuiapi.ListEditor(
editor=tuiapi.InstanceEditor(),
style="custom",
item_factory=self.add_room
),
),
width=400,
height=400,
resizable=True,
)
class RoomHandler(tuiapi.Controller):
def default_traits_view(self):
return tuiapi.View(
tuiapi.Item("name"),
tuiapi.Item(
"level",
editor=tuiapi.RangeEditor(
low=-1, high=15, mode="spinner"
)
)
)
BuildingHandler(model=Building()).configure_traits()
(This simplified example that does not manage very well deletion.)
I would prefer to declare a handler with a view within to InstanceEditor. Something like:
class BuildingHandler(tuiapi.Controller):
def default_traits_view(self):
return tuiapi.View(
tuiapi.Readonly("name"),
tuiapi.Item(
"rooms",
editor=tuiapi.ListEditor(
editor=tuiapi.InstanceEditor(
handler=RoomHandler
),
style="custom",
item_factory=Room
)
),
width=400,
height=400,
resizable=True,
)
This does not work because "handler" is not an InstanceEditor keyword but I hope you get the idea.
The 7.2 version of traitsui throws me new errors (In traitsui.editor.Editor._update_editor: Notifier not found) and it seems to me that I will have to rewrite some parts of my applications. Before doing anything, I would be glad to learn from you the right way.
Thanks,
Yann