YaST2 Developers Documentation: YCP UI Reference: Widgets



YCP UI Widget Reference

Back to the widget index

Tree Scrollable tree selection

Description

A tree widget provides a selection from a hierarchical tree structure. The semantics are very much like those of a SelectionBox. Unlike the SelectionBox, however, tree items may have subitems that in turn may have subitems etc.

Each item has a label string, optionally preceded by an ID. If the item has subitems, they are specified as a list of items after the string.

The tree widget will not perform any sorting on its own: The items are always sorted by insertion order. The application needs to handle sorting itself, if desired.

Arguments

string label

Optional

itemList items the items contained in the tree

itemList ::=
[
item
[ , item ]
[ , item ]
...
]

item ::=
string |
`item(
[ `id( string ), ]
string
[ , true | false ]
[ , itemList ]
)

The boolean parameter inside `item() indicates whether or not the respective tree item should be opened by default - if it has any subitems and if the respective UI is capable of closing and opening subtrees. If the UI cannot handle this, all subtrees will always be open.

Special Properties

string Label the label above the Tree
itemId CurrentItem the currently selected item

Sample Usage

`Tree( `id( `treeID ), "treeLabel", [ "top1", "top2", "top3" ] );

Examples

Example 1: Tree1.ycp

{
    UI::OpenDialog(
	       `VBox(
		     `Tree(`id(`dest_dir),
				   "Select destination directory:",
				   [
				    `item(`id(`root), "/" , true,
					  [
					   `item(`id(`etc), "etc",
						 [
						  `item("opt"),
						  `item("SuSEconfig"),
						  `item("X11")
						 ]
						 ),
					   `item("usr", false, 
						 [
						  "bin",
						  "lib",
						  `item("share",
						       [
							"man",
							"info",
							"emacs"
							]
						       ),
						  `item(`id(`usr_local),"local"),
						  `item("X11R6",
							[
							 "bin",
							 "lib",
							 "share",
							 "man",
							 "etc"
							 ]
							)
						  ]
						 ),
					   `item(`id(`opt), "opt", true,
						 [
						  "kde",
						  "netscape",
						  "Office51"
						  ]
						 ),
					   `item("home"),
					   "work",
					   `item(`id(`other), "<other>")
					   ]
					  )
				   ] ),
		     `HBox(
			   `PushButton(`id(`sel_opt),		`opt(`hstretch), "/&opt" ),
			   `PushButton(`id(`sel_usr),		`opt(`hstretch), "/&usr" ),
			   `PushButton(`id(`sel_usr_local),	`opt(`hstretch), "/usr/&local" )
			   ),
		     `PushButton(`id(`ok), `opt(`default), "&OK")
		     )
	       );

    any id = nil;

    repeat
	{
	    id = UI::UserInput();

	    if      ( id == `sel_usr)		UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, "usr"  );
	    else if ( id == `sel_usr_local)	UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, `usr_local );
	    else if ( id == `sel_opt) 		UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, `opt );
	} until ( id == `ok );

    // Get the input from the tree.
    //
    // Notice: The return value of UI::UserInput() does NOT return this value!
    // Rather, it returns the ID of the widget (normally the PushButton)
    // that caused UI::UserInput() to return.
    string dest_dir = (string) UI::QueryWidget(`id(`dest_dir), `CurrentItem);

    // Close the dialog.
    // Remember to read values from the dialog's widgets BEFORE closing it!
    UI::CloseDialog();


    // Pop up a new dialog to echo the selection.
    UI::OpenDialog(
	       `VBox(
		     `Label("Selected destination directory: " + dest_dir),
		     `PushButton(`opt(`default), "&OK")
		     )
	       );
    UI::UserInput();

    UI::CloseDialog();
}
		

Example 2: Tree2.ycp

{
    // Build a dialog with a tree for directory selection, three
    // buttons with common values and a label that directly echoes any
    // selected directory.
    //
    // The tree in this example uses the `notify option that makes
    // UI::UserInput() return immediately as soon as the user selects a
    // tree item rather than the default behaviour which waits for the
    // user to activate a button.
    
    UI::OpenDialog(
	       `VBox(
		     `Tree(`id(`dest_dir),
			   `opt(`notify),
				   "Select destination directory:",
				   [
				    `item(`id(`root), "/" , true,
					  [
					   `item(`id(`etc), "etc",
						 [
						  `item("opt"),
						  `item("SuSEconfig"),
						  `item("X11")
						 ]
						 ),
					   `item("usr", false, 
						 [
						  "bin",
						  "lib",
						  `item("share",
						       [
							"man",
							"info",
							"emacs"
							]
						       ),
						  `item(`id(`usr_local),"local"),
						  `item("X11R6",
							[
							 "bin",
							 "lib",
							 "share",
							 "man",
							 "etc"
							 ]
							)
						  ]
						 ),
					   `item(`id(`opt), "opt", true,
						 [
						  "kde",
						  "netscape",
						  "Office51"
						  ]
						 ),
					   `item("home"),
					   "work",
					   `item(`id(`other), "<other>")
					   ]
					  )
				   ] ),
		     `HBox(
			   `PushButton(`id(`sel_opt),		`opt(`hstretch), "/&opt" ),
			   `PushButton(`id(`sel_usr),		`opt(`hstretch), "/&usr" ),
			   `PushButton(`id(`sel_usr_local),	`opt(`hstretch), "/usr/&local" )
			   ),
		     `HBox(
			   `Label("Current Value:"),
			   `Label(`id(`echo), `opt(`outputField), "?????????")
			   ),
		     `PushButton(`id(`ok), `opt(`default), "&OK")
		     )
	       );

    any id = nil;

    repeat
	{
	    id = UI::UserInput();

	    if      ( id == `sel_usr)		UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, "usr"  );
	    else if ( id == `sel_usr_local)	UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, `usr_local );
	    else if ( id == `sel_opt) 		UI::ChangeWidget( `id( `dest_dir ), `CurrentItem, `opt );
	    else if ( id == `dest_dir)
	    {
		UI::ChangeWidget( `id( `echo ), `Value, "hello");
		symbol current_dir = (symbol) UI::QueryWidget(`id(`dest_dir), `CurrentItem);
		UI::ChangeWidget( `id( `echo ), `Value, current_dir);
	    }
	} until ( id == `ok );


    // Close the dialog.
    // Remember to read values from the dialog's widgets BEFORE closing it!
    UI::CloseDialog();

}
		

Back to the widget index


YaST2 Developers Documentation: YCP UI Reference: Widgets

Generated Fri May 21 12:39:01 2004