<\body> , and > <\explain> )> <|explain> Builds a combo box which will execute whenever the user makes a choice. The may be given in any length unit. <\session|scheme|default> <\unfolded-io|Scheme] > (tm-widget (test-enum) \ \ (enum (display* "First " answer "\\n") \ \ \ \ \ \ \ \ '("gnu" "gnat" "zebra") \ \ \ \ \ \ \ \ "zebra" "10em"))) <|unfolded-io> \; <\input|Scheme] > (show test-enum) <\explain> )> <|explain> Builds a list of items which will execute whenever the user makes a choice. is a list, a value. Contrary to , all items are displayed simultaneously. If one desires scrollbars, the widget must be enclosed in a container. The width of the widget may be set using a widget. <\session|scheme|default> <\unfolded-io|Scheme] > (tm-widget (test-choice) \ \ (resize "200px" "50px" \ \ \ \ (scrollable \ \ \ \ \ \ (choice (display* answer "\\n") \ \ \ \ \ \ \ \ \ \ \ \ \ \ '("First" "Second" "Third" "Fourth" "Fifth" "Sixth") \ \ \ \ \ \ \ \ \ \ \ \ \ \ "Third")))) <|unfolded-io> \; <\input|Scheme] > (show test-choice) <\explain> )> <|explain> Builds a list of items which will execute whenever the user makes a choice. Several items may be selected at the same time. Both and are hence lists. Contrary to , all items are displayed simultaneously. If one desires scrollbars, the widget must be enclosed in a container. The width of the widget may be set using a widget. <\session|scheme|default> <\unfolded-io|Scheme] > (tm-widget (test-choices) \ \ (resize "200px" "100px" \ \ \ \ (scrollable \ \ \ \ \ \ (choices (display* answer "\\n") \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ '("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L") \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ '("B" "D" "F" "H" "J" "L"))))) <|unfolded-io> \; <\input|Scheme] > (show test-choices) > <\explain> )> <|explain> The provides a graphical representation of a tree (not a tree!). This may be part of a document or any other tree. The first node in won't be displayed. All other nodes may have attributes called which will determine the textual representation of the node, whether it has some icon next to it and which one, etc. These attributes are simply children of the nodes in at predefined positions given by the data roles specification in the argument . This is a list of identifiers for each tree label present in the data. For instance, with the following data roles specification: <\scm-code> (list \ \ (library \ \ \ DisplayRole DecorationRole UserRole:1) \ \ (collection DisplayRole UserRole:1)) we use the data: <\scm-code> (root \ \ (library "Library" "icon.png" 12345 \ \ \ \ (collection "Cool stuff" 001) \ \ \ \ (collection "Things to read" 002) \ \ \ \ (collection "Current work" 003 \ \ \ \ \ \ (collection "Forever current" 004) \ \ \ \ \ \ (collection "Read me" 005)))) Notice that the node won't be displayed by the and needs no data roles. Here is used to store database ids but it can be anything else. The supported data roles are: <\verbatim-code> <\code> DisplayRole \ \ \ \ \ \ \ ; a string to be displayed EditRole \ \ \ \ \ \ \ \ \ \ ; a string valid for an editable representation ToolTipRole \ \ \ \ \ \ \ ; a small tooltip to display when the mouse hovers over StatusTipRole \ \ \ \ \ ; for the status bar (if present and supported) DecorationRole \ \ \ \ ; file name of an icon to use CommandRole \ \ \ \ \ \ \ ; sent to the command executed after (double?) clicks UserRole:\number\ \ ; left to user definition (will be returned as strings) It is possible to omit some or all of the data role specification. By default the widget will use the tree label's string representation for , , and . For the it will try to load pixmaps named label\.xpm> in . This search happen if the is specified (i.e. a full path with or without environment variables and wildcards must be given). The default is the subtree itself (see below). The first argument of , , \ is a lambda that will be called when items are clicked. The procedure must have the following signature: <\scm-code> (lambda (Event CommandRole . UserRoles) (...)) where: <\itemize-dot> is an integer: either 1, 2 or 4 for a single, right or middle click respectively. In the future, other events could be supported (like double clicks, drag&drop, unfold, etc.) is either the value of that role if given for the data item, or the subtree itself otherwise. is a (possibly empty) list with the data for those roles given in the data role specification. If multiple selections are enabled and one is made, and will both be lists (not implemented yet). Keep in mind that the data is a tree and thus not a copy but always a pointer to the actual data (unless you copy or transform it into another format with e.g. stree>) See in and ``''. We build on the previous example, but now we add a command. Notice how the way one adds commands to departs from that of other widgets, where instead of a procedure one must provide a list with code expecting one or two arguments with fixed names (usually and ). : this is easily changed in , but it seems easier to manage empty arguments this way. <\session|scheme|default> <\input|Scheme] > (define t \ \ (stree-\tree \ \ \ '(root \ \ \ \ \ (library "Library" "$TEXMACS_PIXMAP_PATH/tm_german.xpm" 01 \ \ \ \ \ \ \ \ \ \ \ \ \ \ (collection "Cool stuff" 001) \ \ \ \ \ \ \ \ \ \ \ \ \ \ (collection "Things to read" 002) \ \ \ \ \ \ \ \ \ \ \ \ \ \ (collection "Current work" 003 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (collection "Forever current" 004) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (collection "Read me" 005)))))) <\input|Scheme] > (define dd \ \ (stree-\tree \ \ \ '(list (library DisplayRole DecorationRole UserRole:1) \ \ \ \ \ \ \ \ \ \ (collection DisplayRole UserRole:1)))) <\input|Scheme] > (define (action clicked cmd-role . user-roles) \ \ (display* "clicked= " clicked ", cmd-role= " cmd-role \ \ \ \ \ \ \ \ \ \ \ \ ", user-roles= " user-roles "\\n"))) <\input|Scheme] > (tm-widget (widget-library) \ \ (resize ("150px" "400px" "9000px") ("300px" "600px" "9000px") \ \ \ \ (vertical \ \ \ \ \ \ (bold (text "Testing tree-view")) \ \ \ \ \ \ === \ \ \ \ \ \ (tree-view action t dd)))) <\input|Scheme] > (top-window widget-library "Tree View") Notice how we must add to the name of the pixmap because we are not using the default .\ We can even use the as argument to . Changes in the buffer will show up immediately in the widget. In this example we use the default data role specification. <\warning> As of this writing (31 Dec. 2013) the implementation is sloppy and forces a full reloading of the data model for each of the . The slowdown is already noticeable with documents of a few pages like this one. Additionally, the current selection in the widget is lost after each modification to the buffer (fixing this requires writing a fully fledged and probably an intermediate copy of the data). <\session|scheme|default> <\unfolded-io|Scheme] > (tm-widget (widget-buffer) \ \ (resize ("150px" "400px" "9000px") ("300px" "600px" "9000px") \ \ \ \ (vertical \ \ \ \ \ \ (bold (text "Testing tree-view")) \ \ \ \ \ \ === \ \ \ \ \ \ (tree-view (buffer-tree) (stree-\tree '(dummy)))))) <|unfolded-io> \; <\input|Scheme] > (top-window widget-buffer "Tree View") If your has the side tools enabled, you can try this: <\session|scheme|default> <\unfolded-io|Scheme] > (tm-widget (texmacs-side-tools) \ \ (vertical \ \ \ \ (hlist (glue #t #f 15 0) (text "Document tree:") (glue #t #f 15 0)) \ \ \ \ --- \ \ \ \ (tree-view (buffer-tree) (stree-\tree '(unused))))) <|unfolded-io> \; team.> >