Hi Offrey,
I think one problem is that the tree is always rebuild (on every selection?)

even with
self needRebuild:false
tree needREbuild: false.

all subwidgets of the notebook (tree and body) are removed and rebuild from
changeBodys call to     self buildWithSpecLayout: self class defaultSpec.
I don't know if this is a bug or unavoidable.


2016-08-18 17:31 GMT+02:00 Offray Vladimir Luna Cárdenas <
offray.l...@mutabit.com>:

> Hi all,
>
> Thanks Nicolai. Your examples helped me to advance and now I have the
> basic possibility to modify the tree. The two methods that did the trick
> are #addNode and #highlightNextitem, listed below, but I still get a MNU:
> receiver of "selectedMorphList is nil, anytime I try to highlight the next
> item and even from time to time with your code example. If you or anyone
> want to work with the code directly please install run the playgrounds at
> [1], [2] & [3], select any node after running [3] and press the Plus
> button. You'll see that nodes are added in the tree after the current
> selection, but the recently added node doesn't get the selection after
> being created (instead the MNU mentioned before, appears).
>
> I will try to use the new created grafoscopio node and look for the
> TreeNodeModel which has this node as a content to get the highlight.
>
> Help as always is greatly appreciated.
>
> Cheers,
>
> Offray
> [1] http://ws.stfx.eu/M5A1F2NPD0QU
> [2] http://ws.stfx.eu/EVOY0UKH74L0
> [3] http://ws.stfx.eu/5EF0OCUIG7CY
>
> ================
>
> GrafoscopioNotebook>>addNode
>     tree needRebuild: true.
>     tree highlightedItem content addNodeAfterMe.
>     self notebookContent: notebook.
>     self highlightNextItem.
>     self buildWithSpecLayout: self class defaultSpec.
>
> ================
>
> GrafoscopioNotebook>>highlightNextItem
>     | currentItem |
>     currentItem := tree highlightedItem.
>     currentItem
>         ifNotNil: [ | allItems index childrenSize parentNode |
>             currentItem parentNode
>                 ifNil: [
>                     parentNode := currentItem container.
>                     allItems := parentNode roots ]
>                 ifNotNil: [
>                     parentNode := currentItem parentNode.
>                     allItems := parentNode children value. ].
>             childrenSize := currentItem content parent children size.
>             index := allItems indexOf: currentItem.
>             (index < childrenSize) ifTrue: [
>                 "{allItems . currentItem . index } inspect."
>                 currentItem selected: false.
>                 parentNode
>                     highlightedItem: ((allItems at:(index+1))
> selected:true;
>                     takeHighlight;yourself).
>             ]
>         ]
>
>
>
> On 11/08/16 13:05, Nicolai Hess wrote:
>
>
>
> 2016-08-10 21:03 GMT+02:00 Nicolai Hess <nicolaih...@gmail.com>:
>
>>
>>
>> 2016-08-10 20:42 GMT+02:00 Nicolai Hess <nicolaih...@gmail.com>:
>>
>>>
>>>
>>> 2016-08-10 19:12 GMT+02:00 Nicolai Hess <nicolaih...@gmail.com>:
>>>
>>>>
>>>>
>>>> 2016-08-10 19:05 GMT+02:00 Offray Vladimir Luna Cárdenas <
>>>> offray.l...@mutabit.com>:
>>>>
>>>>> Hi,
>>>>>
>>>>> I have been fighting with this for several hours until now. I can't
>>>>> understand how to manage change on selections on TreeModels with Spec,
>>>>> which is really frustrating....
>>>>>
>>>>> Here is what I have:
>>>>>
>>>>> GrafoscopioNotebook>>initializePresenter
>>>>>     tree whenSelectedItemChanged:   [ :item |
>>>>>         self updateBodyFor: item.
>>>>>         header whenTextChanged: [ :arg |
>>>>>             (tree selectedItem content header) = arg
>>>>>                 ifFalse: [
>>>>>                     (tree highlightedItem) content header: arg.
>>>>>                     tree roots: tree roots]]]
>>>>>
>>>>> GrafoscopioNotebook>>updateBodyFor: item
>>>>>     item
>>>>>         ifNotNil: [ self changeBody: item ]
>>>>>         ifNil: [ self inform: 'Nil node'  ]
>>>>>
>>>>> and #changeBody: deals with putting a textual or code pane according
>>>>> to some tags on the selected node (and it's working properly).
>>>>>
>>>>> The problem seems that when I add/delete nodes to my tree, or while
>>>>> changing the selection between nodes, the item variable becomes 
>>>>> temporarily
>>>>> nil and I can't update the contents of the body to correspond to the
>>>>> current selection. I would like to say explicitly that a new tree added
>>>>> node gets the selection and that the deletion of nodes gives selection to
>>>>> its siblings or parent (if there are not siblings) and that node body pane
>>>>> should be updated accordingly.
>>>>>
>>>>> Again, any hint would be really valuable... I'll take a break from the
>>>>> computer to dissipate current frustration... Pharo is generally a happy
>>>>> productive place... but not today :-/... anyway some hits are part of
>>>>> learning to play with it.
>>>>>
>>>>
>>>> Hi Offray,
>>>> I do remember that I tried this as well, I will if I can find out how
>>>> far I got it to work.
>>>>
>>>
>>> a simiple example:
>>>
>>> |t nodeBlock |
>>> nodeBlock:= [:class | |node|
>>>     node := TreeNodeModel new.
>>>     node hasChildren:[ class subclasses isEmpty not].
>>>     node children: [class subclasses collect:[:subclass | nodeBlock
>>> value: subclass]].
>>>     node content: class].
>>> t:=TreeModel new.
>>> t roots: (Morph subclasses collect:[:class | nodeBlock value:class]).
>>> t whenBuiltDo:[ t selectedItem:( t roots first
>>> selected:true;takeHighlight;yourself)].
>>> t openWithSpec
>>>
>>> the important part is the "takeHighlight" and to call it after the
>>> widget is built
>>>
>>>
>>>
>>
>>
>> And an awfull example on how to modify selection (only the nodes of the
>> root, couldn't find out how to do it for arbitrary subnodes)
>>
>> |t nodeBlock |
>> nodeBlock:= [:class | |node|
>>     node := TreeNodeModel new.
>>     node hasChildren:[ class subclasses isEmpty not].
>>     node children: [class subclasses collect:[:subclass | nodeBlock
>> value: subclass]].
>>     node content: class].
>> t:=TreeModel new.
>> t autoDeselection:true.
>> t roots: (Morph subclasses collect:[:class | nodeBlock value:class]).
>> t menu:[:menu ||group|
>>     group := MenuGroupModel new.
>>     menu addMenuGroup: group.
>>     group addMenuItem:(MenuItemModel new name:'next';action:[
>>         |item|
>>         item := t selectedItem.
>>         item ifNotNil:[|allItems index|
>>             allItems := item container roots.
>>             index := allItems indexOf: item.
>>             (index < allItems size) ifTrue:[item selected:false. item
>> container selectedItem:((allItems at:(index+1))
>> selected:true;takeHighlight;yourself)]
>>             ]
>>         ])].
>> t whenBuiltDo:[ t selectedItem:( t roots first
>> selected:true;takeHighlight;yourself)].
>> t openWithSpec
>>
>> again, the important part is #selectedItem: and #takeHighlight, otherwise
>> the model doesn't know about the selection change.
>>
>>
>>
> Hm, yes, updating the selection after deletion is much more difficult. The
> problem is that most in spec TreeModel is done for creating the tree
> widget, not
> for managing nodes and changes afterwards.
>
>
>>
>>
>>>
>>>>
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Offray
>>>>>
>>>>>
>>>>> On 07/08/16 16:11, Offray Vladimir Luna Cárdenas wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I have a Spec TreeModel to represent the GUI of a grafoscopio
>>>>>> notebook.
>>>>>>
>>>>>> The message that deletes nodes is something like this:
>>>>>>
>>>>>> ============
>>>>>>
>>>>>> GrafoscopioNotebook>>removeNode
>>>>>>     | nodeToDelete |
>>>>>>     nodeToDelete := tree selectedItem content.
>>>>>>     nodeToDelete parent removeNode: nodeToDelete.
>>>>>>     tree selectedItem: tree selectedItem parentNode.
>>>>>>     tree needRebuild: true.
>>>>>>     tree roots: tree roots.
>>>>>>     self buildWithSpecLayout: self class defaultSpec.
>>>>>>
>>>>>> =============
>>>>>>
>>>>>> And its working fine in the sense that it deletes the selected node,
>>>>>> but after the deletion the contents of the old node are showed no matter 
>>>>>> if
>>>>>> I change the node selection on the tree. I would like to manage 
>>>>>> selections
>>>>>> in a smart way, so if I add a new node to the notebook, the new node gets
>>>>>> the selection. If I delete a notebook node, the previous node gets 
>>>>>> selected
>>>>>> or the parent if no more siblings are encountered and so on. There is 
>>>>>> some
>>>>>> simple example to look for, about managing and updating selections in a
>>>>>> TreeModel interface?
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Offray
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>
>

Reply via email to