Thursday, August 24, 2017

Displaying Tcl dict contents in a gnocl::list widget


The following script shows how to display the contents of a simple Tcl dict within a gnocl::list widget.

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

package require Gnocl

namespace eval pkg {}

#---------------
# Create a gnocl::list displaying the contents of a Tcl dict.
#---------------
# Arguments:
#    val        dict data to display.
#    args
# Returns:
#    wid of gnocl::list containing the dict data.
#
proc pkg::dict2list { vals } {
       
    set res ""
   
    # get a complete list of info keys
    set c key
    dict for {id info} $vals {
        foreach {a b} $info {
            if { [string first $a $c] == -1 } { lappend c $a }
            }
    }
   
    set headings [lsort -unique $c]
    set res [gnocl::list -titles $c]

    # populate the list
    dict for {id info} $vals {
        set row2 [string repeat "{} " [llength $c]]
        set row2 [lreplace $row2 0 0 $id]
        foreach {a b} $info {
            set d [lsearch $c $a]
            set row2 [lreplace $row2 $d $d $b]
        }
        $res add [list $row2]

        set row ""

    }   
   
    return $res
}

#---------------
# Add a new column to an existing list or tree
# Create new widget, add data and insert into parent container.
#---------------
# Arguments:
#    wid        gnocl::list/gnocl::tree to modify
#    title    title for new column
#   type    data type
# Returns:
#    wid        widget id of replacement object
#
proc pkg::addColumn { wid title type } {

    set titles [$wid cget -titles]
    set types  [$wid cget -types]
    set data [$wid getFullList]
   
    lappend titles $title
    lappend types $type
   
    set parent [gnocl::winfo parent $wid]
       
    $wid delete
   
    set wid [gnocl::list -titles $titles -types $types]
    $wid add $data
    $parent configure -child $wid
   
    return $wid

}

#---------------
# Script Main Function
#---------------
# Arguments:
#    args
# Returns:
#    none
#
proc main { args } {

   
    dict set employeeInfo 12345-A forenames "Joe"
    dict set employeeInfo 12345-A surname   "Schmoe"
    dict set employeeInfo 12345-A street "147 Short Street"
    dict set employeeInfo 12345-A city   "Springfield"
    dict set employeeInfo 12345-A phone  "555-1234"
   
    dict set employeeInfo 98372-J forenames "Anne"
    dict set employeeInfo 98372-J surname   "Other"
    dict set employeeInfo 98372-J street "32995 Oakdale Way"
    dict set employeeInfo 98372-J city   "Springfield"
    dict set employeeInfo 98372-J phone  "555-8765"   
       
    set lst [pkg::dict2list $employeeInfo]


    gnocl::window -child $lst -setSize 0.25 -width 800 -y 500 -x 100


   # add an extra column to the list

    set lst [pkg::addColumn $lst email string]

}

main



No comments: