2016-02-08 15:02 GMT+01:00 Thierry Goubier <thierry.goub...@gmail.com>:
> > > 2016-02-08 11:31 GMT+01:00 Nicolai Hess <nicolaih...@gmail.com>: > >> >> >> 2016-02-08 10:37 GMT+01:00 stepharo <steph...@free.fr>: >> >>> Hi guys >>> >>> I should say that I'm sick (gift from my little boy) so may be this is >>> obvious. >>> >>> I'm looking at the code of Spec and I hate this code :) >>> >>> widgetDo: aBlock >>> >>> ^ self widget ifNotNil: aBlock >>> >>> >>> I do not see why widgetDo: has to test for nil >>> So I transformed >>> >>> widgetDo: aBlock >>> >>> ^ self widget ifNotNil: aBlock >>> >>> into >>> >>> >>> widgetDo: aBlock >>> >>> ^ aBlock cull: self widget >>> >>> BTW I hate all the cull: call. They are connected with sloppiness). It >>> is far too easy to use cull: >>> I do not know how many arguments, I do not care I use cull: >>> cull: is slow slow and help producing messing API. >>> >> > aBlock value: value: value: > > does not much better than cull:, imho. Usually, the api documentation of > the block are just what you'll find in existing code, nothing else. > > >> >>> And it broke. The methodBrowser example did not work anymore and many >>> others. >>> Debugger felt down.... >>> I feel sad. Now my brain is dead so I cannot concentrate more. >>> >>> >>> Stef >>> >>> >> This is a big problem with morphic/spec ui elements. You never know for >> sure >> what code this >> self update ---> search through all (dynamicly added) dependents and >> notify >> will finally call. >> > > I don't think there is any way around it. You have to decouple view(s) > from model(s), and, hence have those propagation constraints by way of > notifications. > > Of course, a true alternative would be to use a proper propagation > constraint system... > > >> In this example we are about to *built* the widgets and in this run , we >> change a component that >> will update all dependents goes back and forth between model, adapter and >> widget. And all >> before the widget is actually accessible for the widgetDo: call. >> >> (and, REALLY we need to clean this up. This is really bad code if we >> announce a textChanged announcement for >> a text component, if we *initialize* an *empty textcomponent* with an >> *empty text*!). >> > > In short, whatever way you look at it, this initialization difficulty is a > hard problem. > > Morphic makes it a bit harder than expected because a Morph can be > considered as active as soon as it is created, not just when it has been > opened in the world. > Here is an example: |t| t:=TextModel new. t text:'hello'. t openWithSpec. t hasUnacceptedEdits it shows that our text has unaccepted edits, although the text did not change. ( and there is actually no text decoration indicating this state). I tried to follow the trace from #openWithSpec to the call that sets #hasUnacceptedEdits:true. I don't think this is a problem of "initialization is difficult" but a problem of pluging rubric text components as widgets for spec. The way spec-models are working and the way rubric works, just don't fit well. (see issue 16873Adding a new Method marks current entry in SendersOf MessageBrowser as dirty for another example. The cause is that rubric somehow changes this "hasUnacceptedEdits state" when the text actually *did not change*. And this again is difficult to trace down. And I don't know how to fix this. Help appreciate > > Thierry > >