2011-06-10 11 views
5

¿Es posible ajustar el tamaño/fuente de TogglerBar, de forma que todos sean igualmente grandes en caso de tener un tamaño de nombre diferente?Ajustar el tamaño del botón TogglerBar en Mathematica

El ejemplo siguiente es la solución propuesta por Belisario para: "Can TogglerBar be used as multiple CheckBox in Mathematica ?"

me gustaría cada botón para ser de igual tamaño.

Manipulate[Graphics[ 
{ 
{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*) 
If[MemberQ[whatToDisplay, "I am a Circle"], 
{Red, Circle[{5, 5}, r]}], 
If[MemberQ[whatToDisplay, "and I am a very nice Square"], {Blue, 
Rectangle[{5, 5}, {r, r}]}], 
If[MemberQ[whatToDisplay, "Other"], {Black, 
Line[Tuples[{3, 4}, 2]]}] 
}, 
PlotRange -> {{0, 20}, {0, 10}} 
], 
{{r, 1, Style["Radius", Black, Bold, 12]}, 1, 5, 1, 
ControlType -> Slider, 
ControlPlacement -> Top}, 
[email protected]{{whatToDisplay, True, 
Style["What", Black, Bold, 12]}, {"I am a Circle", 
"and I am a very nice Square", "Other"}, 
ControlType -> TogglerBar, 
Appearance -> "Horizontal", 
ControlPlacement -> Top}] 

enter image description here

EDITAR: Es feo apunté en el código (si es que todavía podemos llamar a eso un código), pero se ve bien en la pantalla.

enter image description here

enter image description here

Respuesta

4

Mathematica 8 introducido Overlay que permite superponer fácilmente varias expresiones una encima de la otra. Junto con Invisible (de v6), tenemos todos los ingredientes necesarios para sincronizar fácilmente todos los tamaños de botón sin recurrir a contar espacios o píxeles. El código siguiente ilustra su uso, con las partes pertinentes destacamos:

 
DynamicModule[{options, allLabels, size, pad} 
, options = 
    { "I am a Circle" -> {Red, Circle[{5, 5}, size]} 
    , "and I am a very nice Square" -> {Blue, Rectangle[{5, 5}, {size, size}]} 
    , "Other" -> {Black, Line[Tuples[{3, 4}, 2]]} 
    } 
; allLabels = options[[All, 1]] 
; pad[label_] := Overlay[Append[Invisible /@ allLabels, label], Alignment -> Center] 
; Manipulate[ 
    Graphics[what /. options /. size -> r, PlotRange -> {{0, 20}, {0, 10}}] 
    , {{r, 1, "Radius"}, 1, 5, 1} 
    , {{what, {}, "What"}, # -> pad[#] & /@ allLabels, TogglerBar} 
    ] 
] 

Manipulate result

La definición:

pad[label_] := 
    Overlay[Append[Invisible /@ allLabels, label], Alignment -> Center] 

define una función que las pilas de todas las etiquetas de forma invisible encima de la otra, y luego pone la etiqueta deseada visiblemente encima de eso. El resultado es la etiqueta deseada con suficiente espacio en blanco en cada lado para acomodar cualquiera de las otras etiquetas.

La declaración Manipulate utiliza pad para crear las etiquetas para el TogglerBar:

{{what, {}, "What"}, # -> pad[#] & /@ allLabels, TogglerBar}

Tenga en cuenta que las etiquetas se especifican en la forma value ->label para permitir que los valores que conservan su forma original sin los especificadores Overlay y Invisible agregadas por pad.

+0

+1 rellenando automáticamente todo correctamente sin contar! – acl

3

Mathematica puede tener una opción en algún lugar de hacer esto, pero no lo saben. Por lo tanto, aquí hay una propuesta de solución: En primer lugar, esta rellena una cadena a la izquierda y derecha de forma que es de longitud n:

Clear[strpad]; 
strpad[str_String, n_] := Module[ 
{strlength, exc, excr}, 
    strlength = [email protected]; 
    exc = Floor[(n - strlength)/2]; 
    excr = n - strlength - exc; 
    StringJoin[ 
     Table[" ", {i, exc}], 
     str, 
     StringJoin[Table[" ", {i, excr}]]]] 

A continuación, modificar su programa para que sea usted utiliza estas cadenas acolchados o agregar un Rule[#, strpad[#, 30]] & /@ inmediatamente antes de {"I am a Circle", "and I am a very nice Square", "Other"}, para que su código se convierte en

Manipulate[ 
    Graphics[{{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*) 
If[MemberQ[whatToDisplay, "I am a Circle"], {Red, 
Circle[{5, 5}, r]}], 
    If[MemberQ[whatToDisplay, "and I am a very nice Square"], {Blue, 
Rectangle[{5, 5}, {r, r}]}], 
    If[MemberQ[whatToDisplay, "Other"], {Black, 
Line[Tuples[{3, 4}, 2]]}]}, 
PlotRange -> {{0, 20}, {0, 10}}], {{r, 1, 
    Style["Radius", Black, Bold, 12]}, 1, 5, 1, ControlType -> Slider, 
ControlPlacement -> Top}, 
[email protected]{{whatToDisplay, True, Style["What", Black, Bold, 12]}, 
    Rule[#, strpad[#, 30]] & /@ {"I am a Circle", "and I am a very nice Square", "Other"},ControlType -> TogglerBar, Appearance -> "Horizontal", 
ControlPlacement -> Top}] 
+0

¿Funciona con fuentes proporcionales? –

+0

@belisarius único que hace es almohadilla con la mano la cadena con espacios ... – acl

+0

@acl pero eso no va a resultar en cajas iguales si las letras no se Monospaced –

4

Ésta es una forma, aunque no del todo satisfactoria, porque la longitud del panel no se incluye automáticamente. Digamos que es una primera aproximación ...

Manipulate[ 
Graphics[{{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*) 
    If[MemberQ[whatToDisplay, "I am a Circle"], {Red, Circle[{5, 5}, r]}], 
    If[MemberQ[whatToDisplay, "and I am a very nice Square"], 
               {Blue, Rectangle[{5, 5}, {r, r}]}], 
    If[MemberQ[whatToDisplay, "Other"], {Black, Line[Tuples[{3, 4}, 2]]}]}, 
    PlotRange -> {{0, 20}, {0, 10}}], 
    {{r, 1, Style["Radius", Black, Bold, 12]}, 1, 5, 1, ControlType -> Slider, 
               ControlPlacement -> Top}, 


[email protected]{{whatToDisplay, True, Style["What", Black, Bold, 12]}, 
      (# -> Panel[#, ImageSize -> 150, FrameMargins -> 0, 
          Background -> White, 
          Alignment -> Center]) & /@ 
      {"I am a Circle", "and I am a very nice Square", "Other"}, 
      ControlType -> TogglerBar, 
      Appearance -> "Horizontal", 
      ControlPlacement -> Top}] 

enter image description here

Editar

aquí se tiene un mejor enfoque, con cálculo automático de tamaño:

(* get the Image Size first*) 
ley = {"I am a Circle", "and I am Square", "Other"}; 
sZ = Max[Dimensions[ImageData[Rasterize[#][[1]]]][[2]] & /@ ley]; 

Manipulate[ 
Graphics[ 
{{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*) 
    If[MemberQ[whatToDisplay, "I am a Circle"], 
            {Red, Circle[{5, 5}, r]}], 
    If[MemberQ[whatToDisplay, "and I am a very nice Square"], 
            {Blue, Rectangle[{5, 5}, {r, r}]}], 
    If[MemberQ[whatToDisplay, "Other"], 
            {Black, Line[Tuples[{3, 4}, 2]]}]}, 
    PlotRange -> {{0, 20}, {0, 10}}], 

(*Controls Follow *) 

{{r, 1, Style["Radius", Black, Bold, 12]}, 1, 5, 1, 
    ControlType  -> Slider, 
    ControlPlacement -> Top }, 

    [email protected]{{whatToDisplay, True, Style["What", Black, Bold, 12]}, 
    (# -> Panel[#, ImageSize -> sZ, 
        FrameMargins -> 0, 
        Background -> White, 
        Alignment -> Center]) & /@ ley, 
    ControlType  -> TogglerBar, 
    Appearance  -> "Horizontal", 
    ControlPlacement -> Top}] 
Cuestiones relacionadas