Am Mittwoch, 3. Dezember 2003 06:27 schrieb [EMAIL PROTECTED]:
> Hi all,
>
> I have a problem with list & text-list vid objects.
>
> If I set up a list with a particular font style all subsequent text-list
> seem to use the same font object ... see example the code below.
>
> I dont want to specify a particular font style in my text-list .... (as in
> the real application there are many possible text-list's)
>
> Changing
>     text 100
> to
>     text font [] 1000
> seems to fix the problem in this particular example but in my real world
> application, which has multiple columns in the list, is doesnt seem to fix
> the problem.
>
> Any ideas? ... or perhaps an explanation of how to force a seperate font
> object for the list object?
>

Reason:
/font and /para are stored in sub-objects. and this objects are shared with 
the base-style. So changing the sub-object affect every face using that font.
Not only next text-lists, but everything using 'text.

Solution:
You have to clone the font-object for each face where you change it.
You can trigger that with layout[text font[] para[]].
This syntax is because the [] contains an object-spec.
So you can say [text font[style: 'bold]] and have a unique bold font in your 
face.
view layout[
        across
        text "Hello" font[style: 'bold]
        text "World" font[style: 'italic]
]

Experiments:
Writing [font[]] everywhere is annoying.
So i tried using styles. (change in your text-list)
                ;style tx text 100 font[] ;all 'tx share the same font
                style tx text 100 with[append init [font: make font[]]]
                ; ^ each tx own font
                across a: tx b: tx
I checked for cloning with [ probe same? a/font b/font ]

With the first version: style tx text 100 font[]
 the style 'tx gets its own font. then all 'tx share this font. that saves 
some font-objects.

Second version: style tx text 100 with[append init [font: make font[]]]
this makes sure each face gets its own font. 
the [append init[]] is the rebol way of a constructor.
layout does it after it has filled the face from the arguments.
So font and size etc are already calculated.
Hint: when cloning objects, sub-objects stay shared, series (blocks, strings), 
functions are copied.
So the 'init -block is unique for each face, and we can simply append.

Your example changed:

rebol []

data1: ["Hello" "world" "here" "are" "some" "lines" "in" "a" "list"]
data2: ["This" "is" "a" "normal" "text" "list"]

lv-lay: layout [
    my-list: list 400x200 with [picked: false]    
    [
                ;style tx text 100 font[] ;all 'tx share the same font
                style tx text 100 with[append init [font: make font[]]]
                ; ^ each tx own font
                across a: tx b: tx
    ]
    supply [
        if count > length? data1 [face/show?: false exit]
        face/show?: true
        
        ; print [count index]
        ;print [count index pick data1 count]
        face/text: pick data1 count
        face/font/style: 'bold
    ]
    
    button "Show Text List" [
        view/new layout [text-list data data2]
                probe same? a/font b/font
    ]
]

view lv-lay
quit

> Cheers Phil
>
> 8< ---------------------------
>

HTH
-Volker


-- 
To unsubscribe from this list, just send an email to
[EMAIL PROTECTED] with unsubscribe as the subject.

Reply via email to