'''[JOB] - 2018-01-05 20:54:59''' Since tablelist version 6.0 the functionality has been extended to maintain a separate header. ====== 1. Added support for header items (aka title rows) with the aid of the new "header", "headerpath", and "headertag" subcommands. ... 2. Added the "embed(ttk)checkbutton" and "embed(ttk)checkbuttons" subcommands, which provide interactive cell editing with the aid of persistently embedded checkbuttons. ... ====== With the following script (which basically was copied over from [Csaba Nemethi]'s tablelist demo section and slightly modified), one can produce the following output: [WikiDBImage tablelist_yet_another_header_cellconfigure_example.png] Here is the modified embeddedWindows_tile.tcl demo code: ====== set dir [file dirname [info script]] # where to find required packages: set auto_path [linsert $auto_path 0 [file join $dir "lib"]] package require Tk package require Tablelist_tile # custom checkbutton style goes here: set image(checkbox-off) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAACMAAAAWCAYAAABKbiVHAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAABGwAAARsAHIJ/VUAAAAB3RJTUUH4AwPFSQzE9atXgAABBZJREFUSMeVVlluIzcQfcWl2a1e LAWyDRuYr1xlrjA5QuZMyREmR8hFDH/YH7JlybAcaOmFvZD5cMh0S7KUFCBAaBarXtWrhWStxWdi jPG/vhARjDFgjMEYAyLy+n0dAGCMwVoLIgLnHIyxAx/uG+2D6boOVVWhLMsfq9XqGxHBWot9PcYY iMg77d+31vrzvt5oNEIYhhRFEYIgAABvl4j+BWOtRdM0yPP863q9/rOua8RxDMYYpJTgnPss1XWN qqpgjPFAnWNnywXRB2uthZQSWZZ9j+P49yAIBnrkjFVVhe12+16W5QQAlFKYTCbgnEMIMTCotUae 59Bao65r1HUNAAO9fbHWous6AEAYhgjD8K84jn+KosgHIRxvVVV93W63EyLC7e0tpJQH/Lp0KqUg pURRFFiv12jbduDU1VGfLgCQUvrA67qeGGMsY4yiKPqwbYzBcrm0eZ5DKYWbmxtfdMfA9J3WdQ0p Jd7e3vD6+oqLiwtorQ/ocv8552iaxlPfti2UUri+viYhBBgAaK0hpUSSJD76U13mzhhj3rCU8mjX HcusKw1HnaOPVVXlwcRxPIjiHBinE0URlFIDuk7dIyJ0XQdjDLquQ57nvwIA226378YYhGEIKeXg 0jnDjo4wDDEajdC27dFs9O/sj4Ou61AUxW/WWrCqqiZE5IF8lt5TgxEAgiA4CaZPfX8QAkBZlh/B aa0RBMGAlv8DxlEjhEDbtt7ROZoYY96nrxk3iIhoENl+Me5P330w/a75LxQ7fbdarLVgSZKgLEts t1u/O7quO9vWDohSCgCw2+0OAtq/o5RyBTuY+kqpj2ylaUq73Q673c5nw6XtlLjFZ4xB27Zomubo IuxL0zS+4DnnvmvDMPwA48ZxVVXo76lzbdo0Ddq2hZQSTdPg9fUVxhgIIY5S1d/0nHN0XYe2bcE5 R5ZlRERgnHOMx2NorfHy8oKu66CUOhmhqxu3i1arFcqyBOf8bPG7AtdawxgDpRTCMPw4IyJcXl4S EWE2m2E+nx8U6bEohRAgIjw9PeHu7g7T6RRZlkFr/WnNOCCOriiKkGUZubHC3McvX758j6IIs9kM Dw8P0FqfjHCz2eD+/h6LxQJKKQRBMNjM52ZNFEWYTqfkVpBflE5ptVr9eHx8/FYUBdI0xe3tLUaj EZIkAWMMTdNgt9uhqiosFgssl0tcXV0hy7JBBlxxftaFQgiMx+Of0zR9cLqDx5WToijw/Pxs5/M5 8jxHkiSIoghCCDRNg6IofDumaYrRaIQgCHxX9bPQf3o6EEEQIE1TiuP4gM7BS88dtm2Lsizx/v5u N5sN1us1tNYIwxBZlsF1oBDCr5H+9nVA3KT9R/ePJEl+EUJ8WuhHwezvnT7X+4/u/Tv9Z+g+sHPy N32hrShk9cTaAAAAAElFTkSuQmCC }] set image(checkbox-on) [image create photo -data { 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 7o/TOb3h/5dcVPetRFgGAAAAAElFTkSuQmCC }] set image(search) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAA3XAAAN1wFCKJt4AAAACXZwQWcAAAAWAAAAFgDcxelYAAAEVElEQVQ4y7WT209UVxTGv3Xm DsMwcxhgRIyDVkGMZYy1aRWiVaJtkJvpQ31pbN/atA99aI1RmxBNGPGlf0ANSU1No6maam1VRlCw iSi1tNXCjBEGGS7OgbngzDlnzpy9++BgjC3oiyv5spK9d35r5dtrEeccryKEV0IFYPyfM2rvONJI oPcA1HNAJGAcoFEOdnz/Vwd/ehkwPWuF3+93QdC/q6yq2rVxw0aIohtWqxWKLCMWn8WNG714MDJy nTj7bN++Q3+9FNjv93sFA+9uam72rqhYhfN9w/HuwWn9XnjWsdYrJt+pKTXs2lzpDIcf4Oy5s5Jm 0H0HvjgQebHHBv2b1tbdXrGojLUcupC8GUrO7qqrShz9dNtY7fqV0Yu/Rx81H7yQKBQ9rKmxyW3Q 8ENbW5txIbARANqPtddVLK9oLi9fjtavL87t2fH6RP36pUVmo2DSdKa57JZM5TKX8mPfg+G9Hd1V 5w43OFavXl07HAzuAXBiwY6Js899Ph86f74TXVrqnN5U7bEDHAycA2CCQFmDAFbkzIszMjw8Fbgb q6nxgYjvWNQKAlYaTUZ03XnE3qgskzWdZRVNl1WNxTXGEpzzpJbVZ6YTmdHSYuf4L7cnsjabDZxh 66JWcGAZYzrGpZRotZpG5EzWxMmgMQgZ4iyjM6j992O3NT2bsedbDAP3I9uzWQ2qmsl70RwrRqMJ Ze78mVAkwVctdSSJSIaeVTKMRW8FZ/qDE6k0BIiJOWWZaDfNJpPJEjWjPlwczBGQ0/Leel+J4cLt iEMwGXvFAlsildbGY3I2TAJ/LBBcnME6NR2r2FlTDFVVoanK2OLjJuDXoaF/8FFDjZvrWvnoRKwk MpuaiymqDAACezLs4QnpNUHX1n/csK7kZn8/VEX9ftGOxcLiM6FQ6Lfq6pFNJ/Zvs3/o79429She XFLkuGUvsFji8bQrKiXfthr5lhMHttuj0UkMDg5mhoaDsRdu3rFjbR5OloGW5pYyr3clzvcFZ3v+ nNbvjs441y53xbf6PKbGzZXO4eA9dHZ2Ih6PQ5KktMVkazh9+nTPgmAAOHr08DpGwrcrvBVv1tbW weUUYbXZoMgypBkJPT3duN7bq2QzGWvVmjUoK1uCrq5AStHSTadOnrm6IHg+2juO7CZOn0BAOThK VVVNyLIaUNT0pUuX++J2u+1cc+O7eUs8HpjMZgQCgZSsplpPnTxzZVHw00ui+Q+mnAAA1Rs2vCU6 HBd31m8p8HiWwGKxoKurKyWrqaedC8+BDERkJiIbEeUDcORUCMA5r3sDA0NTk9H3L1/peTw5NQlV VVFXV5cvwHiciIxEREIOSERkAmAGYMnJBiAPQD6AglwBJwAXgML7Q38HxyKRDy5fuTYXHgtDkqLQ s7rT7XbbAJjnN48vIJazQH/m3Xxm4VDoDzCh5WrPjQ6bxVwuCPhSkiQdgP4fj+mJscIzMjyXkSuo P5fnxTnn+BdfFBTdhrqWWgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMC0wMS0xMVQwOToxMzowMy0w NzowMFMfKlcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTAtMDEtMTFUMDk6MTM6MDMtMDc6MDAiQpLr AAAANHRFWHRMaWNlbnNlAGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL0dQTC8y LjAvbGoGqAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAATdEVYdFNvdXJj ZQBHTk9NRS1Db2xvcnOqmUTiAAAAMXRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9jb2RlLmdvb2dsZS5j b20vcC9nbm9tZS1jb2xvcnMvUB216wAAAABJRU5ErkJggg== }] ttk::style element create Custom.Checkbutton.indicator \ image [list \ $image(checkbox-off) \ {disabled selected} $image(checkbox-off) \ {selected} $image(checkbox-on) \ {disabled} $image(checkbox-off)] ttk::style layout Custom.TCheckbutton [list \ Checkbutton.padding -sticky nswe -children [list \ Custom.Checkbutton.indicator \ -side left -sticky {} \ Checkbutton.focus -side left -sticky w -children { \ Checkbutton.label -sticky nswe }]] ttk::style map Custom.TCheckbutton \ -background [list active \ [ttk::style lookup Custom.TCheckbutton -background]] ttk::style configure Custom.TCheckbutton -indicatormargin 0 -takefocus 0 # test code, - copied over from tablelist's demo section - wm title . "Tile Library Scripts" # # Add some entries to the Tk option database # set dir [file dirname [info script]] # source [file join $dir option_tile.tcl] # # Create the font TkFixedFont if not yet present # catch {font create TkFixedFont -family Courier -size -12} if {[tablelist::getCurrentTheme] eq "aqua"} { # # Work around the improper appearance of the tile scrollbars # interp alias {} ttk::scrollbar {} ::scrollbar } else { # # Make the embedded buttons as small as possible. Recall that in most # themes, the tile buttons consist of the following element hierarchy: # # Button.border # Button.focus (one of its options is -focusthickness) # Button.padding (two of its options are -padding and -shiftrelief) # Button.label # if {[info commands "::ttk::style"] ne ""} { interp alias {} styleConfig {} ttk::style configure } elseif {[string compare $tile::version "0.7"] >= 0} { interp alias {} styleConfig {} style configure } else { interp alias {} styleConfig {} style default } styleConfig Embedded.Toolbutton -focusthickness 0 -padding 0 -shiftrelief 0 } # # Create a vertically scrolled tablelist widget with 5 # dynamic-width columns and interactive sort capability # set tf .tf ttk::frame $tf -class ScrollArea set tbl $tf.tbl set vsb $tf.vsb tablelist::tablelist $tbl \ -columns {0 "File Name" left 0 "Bar Chart" center 0 "File Size" right 0 "View" center 0 "Seen" center} \ -setgrid no -yscrollcommand [list $vsb set] -width 0 if {[$tbl cget -selectborderwidth] == 0} { $tbl configure -spacing 1 } $tbl columnconfigure 0 -name fileName $tbl columnconfigure 1 -formatcommand emptyStr -sortmode integer $tbl columnconfigure 2 -name fileSize -sortmode integer $tbl columnconfigure 4 -name seen ttk::scrollbar $vsb -orient vertical -command [list $tbl yview] proc emptyStr val { return "" } # # Create a bold font # set tblFont [$tbl cget -font] set size [font actual $tblFont -size] if {$size == 0} { ;# e.g., on Ubuntu set size -12 } eval font create BoldFont [font actual $tblFont] -size $size -weight bold # # Populate the tablelist widget # if {[info exists ttk::library]} { cd $ttk::library } else { cd $tile::library } set totalSize 0 set maxSize 0 foreach fileName [lsort [glob *.tcl]] { set fileSize [file size $fileName] $tbl insert end [list $fileName $fileSize $fileSize "" no] incr totalSize $fileSize if {$fileSize > $maxSize} { set maxSize $fileSize } } $tbl header insert 0 [list "[$tbl size] *.tcl files" "" $totalSize "" ""] $tbl header rowconfigure 0 -foreground "Blue" -background "LightYellow" # # Creates a frame widget w to be embedded into the specified cell of the # tablelist widget tbl, as well as a child frame representing the size of the # file whose name is diplayed in the first column of the cell's row. # proc createFrame {tbl row col w} { # # Create the frame and replace the binding tag "Frame" # with "TablelistBody" in the list of its binding tags # frame $w -width 102 -height 14 -background ivory -borderwidth 1 \ -relief solid bindtags $w [lreplace [bindtags $w] 1 1 TablelistBody] # # Create the child frame and replace the binding tag "Frame" # with "TablelistBody" in the list of its binding tags # frame $w.f -height 12 -background red -borderwidth 1 -relief raised bindtags $w.f [lreplace [bindtags $w] 1 1 TablelistBody] # # Manage the child frame # set fileSize [$tbl cellcget $row,fileSize -text] place $w.f -relwidth [expr {double($fileSize) / $::maxSize}] } # # Creates a button widget w to be embedded into the specified cell of the # tablelist widget tbl. # proc createButton {tbl row col w} { set key [$tbl getkeys $row] ttk::button $w \ -style Embedded.Toolbutton \ -image $::image(search) \ -takefocus 0 \ -command [list viewFile $tbl $key] } # # Displays the content of the file whose name is contained in the row with the # given key of the tablelist widget tbl. # proc viewFile {tbl key} { set top .top$key if {[winfo exists $top]} { raise $top return "" } toplevel $top set fileName [$tbl cellcget k$key,fileName -text] wm title $top "File \"$fileName\"" # # Create a vertically scrolled text widget as a grandchild of the toplevel # set tf $top.tf ttk::frame $tf -class ScrollArea set txt $tf.txt set vsb $tf.vsb text $txt -background white -font TkFixedFont -highlightthickness 0 \ -setgrid yes -yscrollcommand [list $vsb set] catch {$txt configure -tabstyle wordprocessor} ;# for Tk 8.5 and above ttk::scrollbar $vsb -orient vertical -command [list $txt yview] # # Insert the file's content into the text widget # set chan [open $fileName] $txt insert end [read $chan] close $chan set bf $top.bf ttk::frame $bf set btn [ttk::button $bf.btn -text "Close" -command [list destroy $top]] # # Manage the widgets # grid $txt -row 0 -column 0 -sticky news grid $vsb -row 0 -column 1 -sticky ns grid rowconfigure $tf 0 -weight 1 grid columnconfigure $tf 0 -weight 1 pack $btn -pady 10 pack $bf -side bottom -fill x pack $tf -side top -expand yes -fill both # # Mark the file as seen # $tbl rowconfigure k$key -font BoldFont $tbl cellconfigure k$key,seen -text yes } # # Create embedded windows in the columns no. 1 and 3 # set rowCount [$tbl size] for {set row 0} {$row < $rowCount} {incr row} { $tbl cellconfigure $row,1 -window createFrame -stretchwindow yes $tbl cellconfigure $row,3 -window createButton } set bf .bf ttk::frame $bf set btn [ttk::button $bf.btn -text "Close" -command exit] # # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news if {[tablelist::getCurrentTheme] eq "aqua"} { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns } else { grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 pack $btn -pady 10 pack $bf -side bottom -fill x pack $tf -side top -expand yes -fill both # ------------------------------------------------------------- # ------------------------------------------------------------- set TESTMODE 1 if {$TESTMODE == 1} { catch {console show} console eval {wm protocol . WM_DELETE_WINDOW {exit 0}} source [file join [file dirname [info script]] "app/ped.tcl"] } proc checkButtonCallback {tbl w row col} { puts "--> Checkbutton callback arg's: $tbl $w $row $col" } proc createHdrButton {tbl row col w} { ttk::checkbutton $w \ -style Custom.TCheckbutton \ -takefocus 0 \ -command "checkButtonCallback $tbl $w $row $col" } # -stretchwindow yes $tbl header cellconfigure 0,seen -window createHdrButton # ------------------------------------------------------------- # ------------------------------------------------------------- ======