Kev
Kev

Reputation: 16321

Dynamic layout additions in Rebol3

I would like to dynamically add a button to the layout of a view, with the actor causing this addition belonging to a button that is already part of the layout.

I started with this:

REBOL [title: "Dynamic Button Addition"]
tilesize: 60x60
curtile: 1
stylize [
    p: button [
        facets: [init-size: tilesize  max-size: tilesize]
        actors: [
            on-action: [
                ++ curtile
                append tiles compose [ p (to-string curtile) ]
                print ? tiles/options/content                
                v/redraw
            ]
        ]
    ]
]
v: [
    tiles: hgroup [ p "1" ]
]
view v

...which does not appear to have the value of tiles/options/content change with each click.

I can get it to change if make these changes:

                append tiledata compose [ p (to-string curtile) ]

and

tiledata: [ p "1" ]
v: [
    tiles: hgroup tiledata

However, this does not cause any change on screen. If I replace the last four lines with this:

v: view [
    tiles: hgroup tiledata
]

...so that v is now the view rather than the view's layout, I get this error when I click:

** Script error: v has no value
** Where: actor all foreach do-actor unless do-face if actor all foreach do-actor if do-event do-event if do-event either -apply- wake-up loop -apply- wait forever try do-events if view do either either either -apply-
** Near: actor face :data

This makes sense to me, because v is not yet done being defined, until I exit the program, IIUC.

How, then, can I make changes to v before the program ends, but after it's been passed to view?

Upvotes: 1

Views: 95

Answers (1)

sqlab
sqlab

Reputation: 6436

Not very nice, but working if you replace

               v/redraw

with these two lines

                unview/all          
                view v

And there is a real dynamic example on how to update a layout that has already be viewed

I will simplify it

stylize [
  tbox: hpanel [
    actors: [
        on-make: [
            append face/options [
                content: [
                ]
            ]
            do-actor/style face 'on-make none 'hpanel
        ]
    ]
  ]
]

view/across [
  button "button 1"
    on-action [
        append-content test compose [
            button ( join "button "   2 + length? test/gob)
        ]
    ]   
  test: tbox
 ]

Upvotes: 1

Related Questions