¿Cómo ocultar o mostrar elementos de la GUI de manera efectiva?Tengo una GUI que oculta o muestra algunos elementos según el selector.
Por ahora he encapsulado todos los elementos que cambian en los respectivos If Box(), y cambio cada uno de ellos cuando cambia el selector ComboBox, de la siguiente manera:
Names Default To Here( 1 );
modeSelectorOptions = {"Mode1", "Mode2"};
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(
Function(
{this},
Match(this << Get Selected(),
modeSelectorOptions[1], Write("\!nMode1");IB1<< Set (1); IB2 << Set(0)/*many more when script expanded*/,
modeSelectorOptions[2], Write("\!nMode2");IB1<< Set (0); IB2 << Set(1)/*many more when script expanded*/,
)
)
);
),
Button Box("All Modes", Write("Always active")),
IB1 = If Box(1, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB2 = If Box(0, Button Box("GUI ELEMENT for Mode2", Write("Button pressed")))
);
NW = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU>This works, but it is not very scalable.
I need to hide or unhide certain elements depending on the mode throughout the whole window with many elements. I have to encapsulate each of those changing elements in an If Box(), name it and don't forget to include it in the Match statement of the <EM>Selector de modo</EM>.
It is not very scalable, especially when I move into 10-20 different elements.
Is there any way to, let's say, just raise a corresponding flag in Match statement, define all the IF boxes with those flags and then just give command to redraw them?
Something like this, where redrawIfBoxes is an expression that redraws all the IF boxes so that changed flag takes effect:
<CODE class=" language-jsl">Names Default To Here( 1 );
modeSelectorOptions = {"Mode1", "Mode2"};
mode1Flag = 1;
mode2Flag = 0;
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(
Function(
{this},
Match(this << Get Selected(),
modeSelectorOptions[1], Write("\!nMode1");mode1Flag = 1;mode2Flag = 0;redrawIfBoxes,
modeSelectorOptions[2], Write("\!nMode2");mode1Flag = 0;mode2Flag = 1;redrawIfBoxes,
)
)
);
),
Button Box("All Modes", Write("Always active")),
IB1 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB2 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed")))
);
NW = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU><CODE class=" language-jsl">
<CODE class=" language-jsl"><LINGO-LABS id="lingo-labs-824762" slang="en-US" mode="UPDATE"><LINGO-LABEL>Automatización y scripting</LINGO-LABEL></LINGO-LABS>Re: ¿Cómo ocultar/mostrar elementos de la GUI de manera efectiva?Por ahora lo tengo hecho así:
Names Default To Here( 1 );
modeSelectorOptions = {"Mode1", "Mode2"};
mode1Flag = 1;
mode2Flag = 0;
mode1IfBoxes = {IB1, IB3, IB5};
mode2IfBoxes = {IB2, IB4, IB6};
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(
Function(
{this},
Match(this << Get Selected(),
modeSelectorOptions[1], Write("\!nMode1");mode1Flag = 1;mode2Flag = 0;redrawIfBoxes,
modeSelectorOptions[2], Write("\!nMode2");mode1Flag = 0;mode2Flag = 1;redrawIfBoxes,
)
)
);
),
Button Box("All Modes", Write("Always active")),
IB1 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB2 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed"))),
IB3 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB4 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed"))),
IB5 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB6 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed")))
);
redrawIfBoxes = Expr(
mode1IfBoxes << Set (mode1Flag);
mode2IfBoxes << Set (mode2Flag);
);
NW = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU>Let me know if there is a more robust way.<BR />With more modes redrawIfBoxes can be changed from Expression to Function to match list of IfBoxes to a specific flag without ever needing to update the function.
The only two places to update - lists of If Boxes and Match statement in selector combobox.
Re: ¿Cómo ocultar/mostrar elementos de la GUI de manera efectiva?Depende de tu aplicación final y de lo que consideres "robusto" y fácil de gestionar, pero existen diferentes opciones:
- Podrías usar si hay cajas
- XPath podría ser útil
- También puedes simplemente envolver tus botones dentro de algún contenedor, por lo que solo necesitarías una caja por modo.
- Podrías usar << Visibilidad("Contraer")
- Podrías actualizar el texto/las acciones de los botones dinámicamente cuando se produzcan cambios
No necesariamente de la manera en que yo lo haría, pero esto está aquí solo para dar algunas ideas potenciales.
Names Default To Here( 1 );
mode_options = {"Mode1", "Mode2"};
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(Function({this},
this << Inval;
selection = Contains(mode_options, this << Get Selected);
ibs << Set(0);
ibs[selection] << Set(1);
this << Update Window;
));
),
Button Box("All Modes", Write("Always active")),
If Box(0,
V List Box(
Button Box("GUI ELEMENT for Mode1", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode1", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))
)
),
If Box(0,
V List Box(
Button Box("GUI ELEMENT for Mode2", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode2", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode2", Write("Button pressed"))
)
)
);
ibs = gui << Xpath("//IfBox");
// JMP things
modeSelector << Set(2, Run Script(0));
modeSelector << Set(1, Run Script(1));
nw = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU>