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
<mailto:nicolaih...@gmail.com>>:
2016-08-10 20:42 GMT+02:00 Nicolai Hess <nicolaih...@gmail.com
<mailto:nicolaih...@gmail.com>>:
2016-08-10 19:12 GMT+02:00 Nicolai Hess <nicolaih...@gmail.com
<mailto:nicolaih...@gmail.com>>:
2016-08-10 19:05 GMT+02:00 Offray Vladimir Luna Cárdenas
<offray.l...@mutabit.com <mailto: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