Hi,

Thanks to NIcolai's help with his minimalist example I'm on track now and finally I have started to understand better the events in Spec. My problem was in the incorrect use of whenHighlightedItemChanged. Now the code its working fine and I can browse the tree and see the related contents on the respective UI panels (see attached screenshot and code at [*] at the end to see how was solved).

Now I'm facing another issue: As you can see in the attached screenshot the UI has four parts: A tool bar above all, a tree with the node title (called node header) at left and a bigger panel at right with node contents (called node body). I would like to make the node body behave in a similar way as in my previous non-Spec interface, so it can react differently according to the node tags. If the node is tagged as code, it will become a playground with node contents inside such playground. If node is not tagged it will be a text like now (this is already working). So my questions are:

1) How can I populate a Spec-Glamour playground with a particular text code?
2) How can I initializeWidgets with some kind of conditions depending on the kind of selection I have done on the tree? At this moment my initializeWidgets look like this:

==[2a]===========
GrafoscopioGUI>>initializeWidgets
    "Buils graphical interface elements"

    windowMainMenu := self windowMainMenu.
    tree := self tree.
    nodeHeader := self newTextInput.
    nodeBody :=
        tree selectedItem notNil
            ifTrue: [ self updateBody ]
            ifFalse: [nodeBody := self newText].
    windowMainMenu applyTo: self.
    self focusOrder
        add: windowMainMenu;
        add: tree;
        add: nodeHeader;
        add: nodeBody.
================

and my updataBody (where I think that this conditional behavior could be looks like this:

==[2b]===========
GrafoscopioGUI>>updateBody
    "update the displayed content associated to the body of a node"

    (tree selectedItem content tags = 'código')
        ifTrue: [
^ nodeBody text: 'I should be playground because I am tagged as ', tree selectedItem content tags
        ]
        ifFalse: [
            ^ nodeBody text: tree selectedItem content body
        ]
================

So, more precisely, what I need to put in the ifTrue part of [2b] to make the interface to return a playground with pre-populated code? (is it the proper place?)

Finally, here is the code that made the tree update properly, just for the curious ones.

==[*]============
GrafoscopioGUI>>tree
    | notebook |
    notebook := GrafoscopioNode new becomeDefaultTestTree.
    tree := TreeModel new.
    tree
        roots: notebook children;
        childrenBlock: [:node | node children];
        displayBlock: [:node | node title ].
    tree whenHighlightedItemChanged:
         [tree selectedItem notNil
            ifTrue: [
                self updateHeader.
                self updateBody.
            ]
         ].
    ^ tree
================

Cheers,

Offray


On 03/01/16 18:33, Offray Vladimir Luna Cárdenas wrote:
Thanks again Nicolai! I will start from here :-).

Offray

On 03/01/16 18:20, Nicolai Hess wrote:


2016-01-03 23:52 GMT+01:00 Offray Vladimir Luna Cárdenas <off...@riseup.net>:

    Hi,

    On 03/01/16 08:45, Nicolai Hess wrote:


        There is any way to run a minimal GUI with a tree using your
        example? I'm still missing a key concept on how to use spec
        and binding between widgets.


    what is missing ? this is a minimal gui with a tree component.

    Ohh, what is missing is not in the example, but in my
    understanding on how to use/start it. I would expect for
    something like "example openWithSpec" to start deconstructing it,
    but I'm still lost about it. I will be working on it today and
    tomorrow to see if I can come with better questions.


Ok, for this example you can just start it with:

TreeDemo new openWithSpec

It opens a window with two panes, the upper pane shows a tree with some nodes (subclasses of class Morph) The lower pane shows the text(name) of the selected node. You can change and accept (cmd+s) the text in the
lower pane, which will update the name of the tree node.


    Cheers,

    Offray




Reply via email to