Name

MultiSelectionBox — Selection box that allows selecton of multiple items

Synopsis

MultiSelectionBox ( string label ,
  list items );
 

Parameters

string label

Options

shrinkable

make the widget very small

Optional Arguments

list items

the items initially contained in the selection box

Description

The MultiSelectionBox displays a ( scrollable ) list of items from which any number (even nothing!) can be selected. Use the MultiSelectionBox's SelectedItems property to find out which.

Each item can be specified either as a simple string or as `item( ... ) which includes an ( optional ) ID and an (optional) 'selected' flag that specifies the initial selected state ('not selected', i.e. 'false', is default).

Usage

 	`MultiSelectionBox( `id( `topping ), "select pizza toppings:", [ "Salami", `item( `id( `cheese ), "Cheese", true ) ] )

Examples

          {
    // Simple MultiSelectionBox example:
    //
    // All items are simple strings, none has an ID, no item preselected.
    
    UI::OpenDialog(
	       `VBox( 
		     `MultiSelectionBox( "Select pizza toppings:",
					 [
					  "Cheese",
					  "Tomatoes",
					  "Mushrooms",
					  "Onions",
					  "Salami",
					  "Ham"
					 ] ),
		     `PushButton("&OK")
		     )
	       );
    UI::UserInput();
    UI::CloseDialog();
}

        
          {
    // More realistic MultiSelectionBox example:
    //
    // Items have IDs, some are preselected.
    // Notice 'false' is default anyway for the selection state,
    // so you may or may not explicitly specify that.
    
    UI::OpenDialog(
	       `VBox( 
		     `MultiSelectionBox( "Select pizza toppings:",
					 [
					  `item( `id(`cheese   	), "Cheese"	, true  ),
					  `item( `id(`tomatoes 	), "Tomatoes"	, true  ),
					  `item( `id(`mush     	), "Mushrooms"	, false ),
					  `item( `id(`onions	), "Onions" 	),
					  `item( `id(`sausage	), "Salami" 	),
					  `item( `id(`pork	), "Ham"	)
					 ] ),
		     `PushButton( `opt(`default), "&OK")
		     )
	       );
    UI::UserInput();
    UI::CloseDialog();
}

          
          // Advanced MultiSelectionBox example:
//
// Retrieve the list of selected items and output it.
{
    
    UI::OpenDialog(
	       `VBox( 
		     `MultiSelectionBox( `id(`toppings), "Select pizza toppings:",
					 [
					  `item( `id(`cheese   	), "Cheese"	, true  ),
					  `item( `id(`tomatoes 	), "Tomatoes"	, true  ),
					  `item( `id(`mush     	), "Mushrooms"	, false ),
					  `item( `id(`onions	), "Onions" 	),
					  `item( `id(`sausage	), "Salami" 	),
					  `item( `id(`pork	), "Ham"	)
					 ] ),
		     `PushButton( `opt(`default), "&OK")
		     )
	       );
    UI::ChangeWidget(`toppings, `SelectedItems, [`sausage, `onions] );
    
    UI::UserInput();
    list selected_items = (list) UI::QueryWidget( `id(`toppings), `SelectedItems );

    y2debug( "Selected items: %1", selected_items );
    
    // Remember to retrieve the widget's data _before_ the dialog is closed,
    // i.e. before it is destroyed!
    
    UI::CloseDialog();

    
    
    // Concatenate the list of selected toppings to one multi-line string.
    
    string pizza_description = "";

    foreach ( `topping, selected_items, ``{
	pizza_description = sformat( "%1\n%2", pizza_description, topping );
    } );


    // Open a new dialog to echo the selection.
    
    UI::OpenDialog(
	       `VBox(
		     `Label( "Your pizza will come with:\n" ),
		     `Label( pizza_description ),
		     `PushButton( `opt(`default), "&OK" )
		     )
	       );
    UI::UserInput();
    UI::CloseDialog();
}

        
          // Example showing how to replace SelectionBox items
{

    list all_toppings =
	[
	 "Cheese",
	 "Ham",
	 "Mushrooms",
	 "Pepperoni",
	 "Rucola",
	 "Salami",
	 "Tomatoes",
	 "Tuna"
	 ];

    list veggie_toppings =
	[
	 "Cheese",
	 "Mushrooms",
	 "Pepperoni",
	 "Rucola",
	 "Tomatoes"
	 ];

    UI::OpenDialog(`HBox(`VSpacing(15),	// layout trick: force minimum height
			 `VBox(
			       `HSpacing(25),	// force minimum width
			       `MultiSelectionBox(`id(`toppings), "Toppings:", all_toppings ),
			       `Left( `CheckBox(`id(`veggie), `opt(`notify), "&Vegetarian" ) ),
			       `PushButton(`id(`ok), "&OK" )
			       )
			 )
		   );

    symbol button = nil;

    do
    {
	button = (symbol) UI::UserInput();

	if ( button == `veggie )
	{
	    boolean vegetarian = (boolean) UI::QueryWidget(`veggie, `Value );

	    if ( vegetarian )	UI::ChangeWidget(`toppings, `Items, veggie_toppings );
	    else		UI::ChangeWidget(`toppings, `Items, all_toppings );
	}
	
    } while ( button != `ok );

    list<string> order = (list<string>) UI::QueryWidget(`toppings, `SelectedItems );
    UI::CloseDialog();


    //
    // Show the result
    //

    
    UI::OpenDialog(`VBox(
			 `Label( sformat( "Your order: %1", mergestring( order, ", " ) ) ),
			 `PushButton(`opt(`default), "&OK" )
			 )
		   );
    UI::UserInput();
    UI::CloseDialog();
}

        
          // Example showing how to replace SelectionBox items
{

    list all_toppings =
	[
	 `item(`id( "Cheese"	), "Cheese",	true ),
	 `item(`id( "Tomatoes"	), "Tomatoes",	true ),
	 `item(`id( "Ham"	), "Ham"	),
	 `item(`id( "Mushrooms"	), "Mushrooms"	),
	 `item(`id( "Pepperoni"	), "Pepperoni"	),
	 `item(`id( "Rucola"	), "Rucola"	),
	 `item(`id( "Salami"	), "Salami"	),
	 `item(`id( "Tuna"	), "Tuna"	)
	 ];

    list veggie_toppings =
	[
	 `item(`id( "Cheese"	), "Cheese",	true ),
	 `item(`id( "Tomatoes"	), "Tomatoes",	true ),
	 `item(`id( "Mushrooms"	), "Mushrooms"	),
	 `item(`id( "Pepperoni"	), "Pepperoni"	),
	 `item(`id( "Rucola"	), "Rucola"	)
	 ];

    UI::OpenDialog(`HBox(`VSpacing(15),	// layout trick: force minimum height
			 `VBox(
			       `HSpacing(25),	// force minimum width
			       `MultiSelectionBox(`id(`toppings), "Toppings:", all_toppings ),
			       `Left( `CheckBox(`id(`veggie), `opt(`notify), "&Vegetarian" ) ),
			       `PushButton(`id(`ok), "&OK" )
			       )
			 )
		   );

    symbol button = nil;

    do
    {
	button = (symbol) UI::UserInput();

	if ( button == `veggie )
	{
	    boolean vegetarian = (boolean) UI::QueryWidget(`veggie, `Value );

	    if ( vegetarian )	UI::ChangeWidget(`toppings, `Items, veggie_toppings );
	    else		UI::ChangeWidget(`toppings, `Items, all_toppings );
	}
	
    } while ( button != `ok );

    list<string> order = (list<string>) UI::QueryWidget(`toppings, `SelectedItems );
    UI::CloseDialog();


    //
    // Show the result
    //

    
    UI::OpenDialog(`VBox(
			 `Label( sformat( "Your order: %1", mergestring( order, ", " ) ) ),
			 `PushButton(`opt(`default), "&OK" )
			 )
		   );
    UI::UserInput();
    UI::CloseDialog();
}