[JOB] 18-03-06, here is another kind of font chooser dialog with a "live preview" of the available (build in) font styles. The dialog is based on tablelist, hence the search functionality is implemented with the help of the "configure -colorizecommand" sub-command. [WikiDBImage fontselectiondialog.png] Here is the code: * fontseldialog.tcl ====== # ------------------------------------------------------------------------ # fontseldialog.tcl --- # ------------------------------------------------------------------------ # (c) 2017, Johann Oberdorfer - Engineering Support | CAD | Software # johann.oberdorfer [at] gmail.com # www.johann-oberdorfer.eu # ------------------------------------------------------------------------ # This source file is distributed under the BSD license. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the BSD License for more details. # ------------------------------------------------------------------------ # Purpose: # Create a tableview and show the available font styles # in 2 columss name / fixed font / formatted_text... # ------------------------------------------------------------------------ package require Tk package require -exact tablelist_tile 6.0.1 package provide fontseldialog 0.1 namespace eval fontseldialog { variable widgetDefaults variable widgetImages variable widgetVars array set widgetDefaults { title "Font Selection Dialog" font "" } # initializing required images... set this_dir [file dirname [info script]] set image_dir [file join $this_dir "images"] set image_file [file join $this_dir "ImageLib.tcl"] proc LoadImages {image_dir {patterns {*.gif}}} { foreach p $patterns { foreach file [glob -nocomplain -directory $image_dir $p] { set img [file tail [file rootname $file]] if { ![info exists images($img)] } { set images($img) [image create photo -file $file] } }} return [array get images] } if { [file exists $image_file] } { source $image_file array set widgetImages [array get images] } else { array set widgetImages [LoadImages \ [file join $image_dir] {"*.gif" "*.png"}] } proc GetFontInformation {} { variable widgetDefaults variable widgetVars # make shure to create fonts + data list only once if {[info exists widgetVars(font_info)] && [llength $widgetVars(font_info)] > 0} { return $widgetVars(font_info) } set widgetVars(font_info) [list] foreach font [lsort -dictionary [font families]] { # top and bottom spacing for this font is very big, # so let's filter out this specific font: if {$font == "Cambria Math"} { continue } set fid [font create -family $font] set fmetrics "" if {[font metrics $fid -fixed]} { set fmetrics "*" } lappend widgetVars(font_info) \ [list [string trim $font] $fmetrics $widgetDefaults(sampletxt) $fid] } return $widgetVars(font_info) } proc ShowFont {fname fid} { variable widgetVars wm title $widgetVars(this) "Font selection dialog - $fname" # $widgetVars(wlabel) configure -font $fid } proc CancelCmd {} { variable widgetVars set widgetVars(is_ok) 2 } proc OKButtonCmd {} { variable widgetVars set widgetVars(is_ok) 1 } proc EnableOkButtonCmd {} { variable widgetVars $widgetVars(ok_button) configure -state normal } proc DisableOkButtonCmd {} { variable widgetVars $widgetVars(ok_button) configure -state disabled } proc EntryBindingsCmd {tbl {mode "default"}} { variable widgetDefaults variable widgetVars switch -- $mode { "default" { set widgetVars(combobox_var) "" set searchtxt [string trim $widgetVars(entry_var)] # if {$searchtxt == "" } { return } } "refresh" { # force refresh set widgetVars(entry_var) "" set widgetVars(combobox_var) "" set searchtxt "" } "combo" { set widgetVars(entry_var) "" set searchtxt [string trim $widgetVars(combobox_var)] } default { return -code error \ "programmer's error: unknown $mode in proc EntryBindingsCmd" } } $tbl selection clear 0 end $tbl delete 0 end set idx 0 foreach item [GetFontInformation] { set font [lindex $item 0] set fid [lindex $item end] if { $searchtxt == "" || \ [string first $searchtxt $font] != -1} { $tbl insert end $item $tbl cellconfigure "$idx,2" -font $fid incr idx } } $widgetVars(wstatus_label) configure -text \ "There are $idx fonts available." DisableOkButtonCmd } proc TextSearch {w string tag} { $w tag remove $tag 0.0 end if {$string == ""} { return } set cur 0.0 while 1 { set cur [$w search -count length $string $cur end] if {$cur == ""} { break } $w tag add $tag $cur "$cur + $length char" set cur [$w index "$cur + $length char"] } } # recursive function proc WinfoGetAllTextWidgets {wparent wlist} { upvar $wlist widget_list foreach w [winfo children $wparent] { if { [winfo class $w] == "Text" } { lappend widget_list $w } WinfoGetAllTextWidgets $w widget_list } } proc ColorizeCmd {tbl textWidget key row col tabIdx1 tabIdx2 inStripe selected} { variable widgetVars if {! [info exists widgetVars(entry_var)] || [winfo class $textWidget] != "Text" } { return } # -development- # set wtext_list [list] # WinfoGetAllTextWidgets $tbl wtext_list # puts "There are [llength $wtext_list] text widgets available." # foreach wtext $wtext_list { puts $wtext } set searchtxt [string trim $widgetVars(entry_var)] if {[string length $searchtxt] <= 1} { return } # #ce5555 / White $textWidget tag configure search \ -background LightYellow -foreground Black TextSearch $textWidget $searchtxt search } proc ComboBoxSelectedCmd {tbl w} { EntryBindingsCmd $tbl "combo" } # ------------------------------------------------------------------------- # gui declaration # ------------------------------------------------------------------------- proc fontseldialog {args} { variable widgetDefaults variable widgetImages variable widgetVars # "entia non sunt multiplicanda praeter necessitatem" # - (use) no more things than necessary" array set widgetDefaults { sampletxt "Entia non sunt multiplicanda praeter necessitatem." } set wparent "" set ind 0 while { $ind < [llength $args] } { switch -exact -- [lindex $args $ind] { "-parent" { incr ind set wparent [lindex $args $ind] incr ind } "-title" { incr ind set widgetDefaults(title) [lindex $args $ind] incr ind } "-font" { incr ind set widgetDefaults(font) [lindex $args $ind] incr ind } default { puts "unknown option [lindex $args $ind]" return "" } } } set w $wparent.fontseldialog set widgetVars(this) $w catch {destroy $w} toplevel $w -class FontSelDialog wm title $w widgetDefaults(title) wm geometry $w "800x650+150+150" wm transient $w $wparent bind $w "[namespace current]::CancelCmd" set fmain [ttk::frame $w.main -relief groove] pack $fmain -side bottom -fill x ttk::button $fmain.chk \ -text "Continue with selected font..." \ -compound left \ -image $widgetImages(dialog-ok) \ -command "[namespace current]::OKButtonCmd" \ -state disabled set widgetVars(ok_button) $fmain.chk ttk::button $fmain.cancel \ -text "Cancel" \ -image $widgetImages(dialog-close) \ -compound left \ -command "[namespace current]::CancelCmd" \ pack $fmain.chk $fmain.cancel -side left -expand true -padx 4 -pady 4 # -------------------------- # font selection gui # -------------------------- set f [ttk::frame $w.help -height 20] pack $f -side bottom -fill x set widgetVars(wlabelframe) $f set msg "Hint: You might want to use one of the \"UI\" font styles" append msg "\nwhich are easy to read and look good for user interfaces." ttk::label $f.lbl -text $msg pack $f.lbl -anchor center set widgetVars(wlabel) $f.lbl set f [ttk::frame $w.entry] pack $f -side top -fill x ttk::label $f.lcombo -text "Filter: " ttk::combobox $f.combo \ -width 5 -state readonly \ -values [list "" "ExtB" "FB" "MS" "MT" "Sans" "UI" "Hand" "Script" "Light"] \ -textvariable "[namespace current]::widgetVars(combobox_var)" set widgetVars(wcombobox) $f.combo ttk::label $f.lbl \ -image $widgetImages(dialog-search) ttk::entry $f.entry \ -width 40 \ -textvariable "[namespace current]::widgetVars(entry_var)" set widgetVars(wentry) $f.entry ttk::button $f.bttn \ -compound left \ -image $widgetImages(dialog-refresh) \ -style Toolbutton set widgetVars(wentry_bttn) $f.bttn pack $f.lcombo $f.combo $f.lbl -side left -padx 5 -pady 5 pack $f.entry -side left -padx 5 -pady 5 -fill x -expand true pack $f.bttn -side left -padx 2 set tf $w.tf ttk::frame $tf set tbl $tf.tbl set vsb $tf.vsb tablelist::tablelist $tbl \ -columns { 0 "Font Name" left 0 "fixed" center 0 "Sample text" left 0 "Font ID" right } \ -labelcommand tablelist::sortByColumn \ -yscrollcommand [list $vsb set] -width 0 \ -spacing 1 \ -showseparators yes \ -selectmode single \ -font APP_FONT_STD_NORMAL \ -stripebackground #E0E8F0 \ -selectbackground #A9D0F5 \ -stretch all $tbl configure -colorizecommand "[namespace current]::ColorizeCmd" $tbl columnconfigure end -hide yes ttk::scrollbar $vsb -orient vertical -command [list $tbl yview] grid $tbl -row 0 -rowspan 2 -column 0 -sticky news grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 pack $tf -side top -expand yes -fill both set f [ttk::frame $w.status] pack $f -side top -fill x ttk::label $f.status # -image $widgetImages(dialog-search) set widgetVars(wstatus_label) $f.status pack $f.status -anchor center -padx 5 -pady 5 bind [$tbl bodypath] {+ set t [winfo parent %W] set x [expr {%x + [winfo x %W]}] set y [expr {%y + [winfo y %W]}] # enable move-over effect, focus $t $t configure -activestyle frame $t activate "@$x,$y" ::fontseldialog::ShowFont \ [lindex [$t get "@$x,$y"] 0] \ [lindex [$t get "@$x,$y"] end] } bind [$tbl bodypath] {+ set t [winfo parent %W] $t configure -activestyle none } bind [$tbl bodypath] {+ set t [winfo parent %W] set x [expr {%x + [winfo x %W]}] set y [expr {%y + [winfo y %W]}] # if a tablelist has only a few entries, an "empty area" # is shown after the last row # the following if clause ensures that a click in # this area simply has no effect set row [lindex [split [$t containingcell $x $y] ","] 0] if {$row == -1} { ::fontseldialog::DisableOkButtonCmd } else { set cell [$t nearestcell $x $y] ::fontseldialog::EnableOkButtonCmd } } bind [$tbl bodypath] "[namespace current]::OKButtonCmd" bind $widgetVars(wentry) \ "[namespace current]::EntryBindingsCmd $tbl" $widgetVars(wentry_bttn) configure \ -command "[namespace current]::EntryBindingsCmd $tbl refresh" bind $widgetVars(wcombobox) <> \ "[namespace current]::ComboBoxSelectedCmd $tbl %W" # --------------------------- # fill tablelist with content # --------------------------- set default [lindex [$tbl configure -font] 3] set idx 0 foreach item [GetFontInformation] { set font [lindex $item 0] set fid [lindex $item end] $tbl insert end $item $tbl cellconfigure "$idx,2" -font $fid incr idx } $widgetVars(wstatus_label) configure -text \ "There are $idx fonts available." # perform font name preselection (if any) # --------------------------------------- if { $widgetDefaults(font) != ""} { # try to find font name and calculate index set data [list] foreach litem [$tbl get 0 end] { lappend data [lindex $litem 0] } if { [set idx [lsearch $data $widgetDefaults(font)]] != -1 } { # bummer ! $tbl selection set $idx $tbl see [expr {$idx -3}] EnableOkButtonCmd } } after 6000 "catch {pack forget $widgetVars(wlabelframe)};" # -------------------------- # -------------------------- # wait user grab $widgetVars(this) tkwait variable "[namespace current]::widgetVars(is_ok)" grab release $widgetVars(this) if { $widgetVars(is_ok) == 1 } { # read actual selection: set sel [$tbl curselection] set retval [string trim [lindex [$tbl get $sel] 0]] } else { set retval "" } # clean fonts before leaving the dialog (if that matters)... foreach item [GetFontInformation] { set fid [lindex $item end] set widgetVars(font_info) [list] catch {font delete $fid} } destroy $widgetVars(this) return $retval } } ====== * fontseldialog_test.tcl ====== set dir [file dirname [info script]] set auto_path [linsert $auto_path 0 [file join $dir "."]] set auto_path [linsert $auto_path 0 [file join $dir ".."]] set auto_path [linsert $auto_path 0 [file join $dir "../../lib"]] # test-run ... package require Tk package require tile package require -exact tablelist_tile 6.0.1 package require fontseldialog 0.1 wm withdraw . set showconsole 0 if { $showconsole && $::tcl_platform(platform) == "windows"} { console show console eval {wm protocol . WM_DELETE_WINDOW {exit 0}} } set rval [fontseldialog::fontseldialog \ -parent "" \ -title "Select Font Style:" \ -font "Comic Sans MS" \ ] puts "Selection return value is: \"$rval\"" ====== * pkgIndex.tcl ====== package ifneeded fontseldialog 0.1 \ [list source [file join $dir fontseldialog.tcl]] ====== * ImageLib.tcl ====== # ImageLib.tcl --- # Automatically created by: CreateImageLib.tcl set images(dialog-clear) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAABGwAAARsAHIJ/VUAAAAB3RJTUUH4QEaCTEiD+SBFQAAA0tJREFUOMu1lM9vVFUUx79vOvOm M9MOLWJKpAmx7T+g3WioUMvYuBPSCIQ0uDASVyzY6J8gCxPiT4hglNB2OsO0aaJxeH3zyxh/YRWw UrugKKhtdDozjzrvzbx73/26qNO0UIREPclZ3JNzPjnn3vO9Gkn8l+a7M+BJCSnFPxYppeC67v2B nvIwOZXixGSKnvLuCczmTH5w7iylEPcGKqWQSMb5yI4d6OzsRDIZp9oEaphpCiHw5BO7cPrMu3TF HZ2ShOPUcH7kQ37+xWdsWCZrMp4YJUk03MwaHE+M0BUuSXJ+fo7vnHqTjmOv5fgAwO9vgq4H0Xgg IQUGnt6Lh7dtQyK12qlhprm4+CsOPH8YtlMFQWja6p2760dvkD1PYix+ntnsNEnSqTkkyWkzzZNv vM6x8RGS5O0Vi1JKXv3+Ct96+yTrbh3rp9hwkJ7E2PgozYxBkrQdmySZy2dIktZKmcIT/OrSl3zv 7Cm6rruh/i5gwxMXxmiY6b8hFdq1KkvlIl23zkszX3Nk9Bwtq7JprW+ztRjaf0C79sMsCp/mEPD7 UbHKAIAbCzeQyRgYHHx2Jhrd8mCLDQCZrMGOju3Y/VQ/bMeGHtBRFwI7H92Jxx/rRaGQ6/U88WDA bM7k0tIiDh48DGulgnCoBX/8vowtrVFYt0vo69sDv9+PickU7wucNtNcWvoNw8MvoGyV0KwHceXy d5iaSqFQyCMSboW1UsLA3hj0oI7khTiVUncDhRBIpz9mvV7H/n1DWC4V0RwM4ZtvZ7Dw0wKOvvTy Cdu2YUxfRKg5gkqlhD39/QhHwkhNJCjWqcUHAFTErV9uoaNjO5pDIUTCLZidvYq5a7OIDcQQbW17 NRYb1Ny6i1wui0ikBT7Nh57uHvw4P4c/q9VYA6g11FG1qzjz/mn27doNDUQ+n8ehQ8MI6sETtZrz SjAYTJLo+uTiR71t7W3o6e5BMjGOY8eOP9Pe1m6uAZVSEEJAColKpcxkKg5N82Hfc0OIRqPdTU1N C7quQ0oJIWSXY1evG2YaN2/+jCNHXsRDW7dquq4jEAhA07TVxW5AhRAolZaPlsvlLiEEpJQblSQl hBCwLAvFYvE1ISRc14VSai1H+99/7H9rfwF2imSw0yqcowAAAABJRU5ErkJggg== }] set images(dialog-close) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAA3XAAAN1wFCKJt4AAAACXZwQWcAAAAQAAAAEABcxq3DAAACR0lEQVQ4y6VTQU/iQBh9U7qQ lrYYg7uLlOXA3kyMRy9rW7xx4LQHf2LPvRETbfXkgcSQGE8eQFi2Io20WCyd6ezBhYgHL36nyffe fPneezOEc47PlLg6uJYl5mYzG4SAadqJeX5O3xJdyxJzYWgD2MCFFUimU0euVltytdoi06njWtbG cBIETlHXW7Kut0gQrHERAPhkYiu1mlk7PpZACAadjjnv9x3XstoAgIcHp1ivm3qzKYFzDDodM7q/ twH8FgEgoxTZcolssUAWhtANQxqcnprRcOgAgKrrpm4YEvV9CJr2ymUMAEA453AJEdNGw1ErFbPe bEpZFEHQNNx73jMA1AyjmEURBEXB4OwsDsdj78vdXdvknJJVCi4hYlKvO2qlYvw4OpKz+Rw5VQUA sDCEoKoYXFzE0XjsFfr9tsk5XW+wNosQcaHrjra7+6t6eKiA/g9CFDG6upqHo9GlNByuL2/EuCpG KehyCbpYAFn22kxT0CQBo/Q9HRsSwp0dRy6XjerBgZwlCXKS9Dr05QVCPo/R9XUcPz562mSyKcEl RHza3nbkrS3j+/6+zJdLkHweDzc3cwD4urenrHp/e704fnrytoKgbXJOBQAISiU7Xywa5UZDTmcz MEox7Hbjme9fznz/ctjtxoxSpGGIcqMh54tFIyiV7LUHjDGwNEUaxwCAye1t/BJFXvn5uQ0Aj4w5 f3o9Y+fnTxmcI0tTsPfvwC8UnIKiGACQzOfetyRZ6/wI3zBxnMvZAFBh7ORtVB/h5LPf+R+0911L hE5qiwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMC0wMi0xN1QwNzowMzozMy0wNzowMBY/EYkAAAAl dEVYdGRhdGU6bW9kaWZ5ADIwMTAtMDEtMTFUMDk6MTI6NDItMDc6MDDvvfybAAAANHRFWHRMaWNl bnNlAGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL0dQTC8yLjAvbGoGqAAAABl0 RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAATdEVYdFNvdXJjZQBHTk9NRS1Db2xv cnOqmUTiAAAAMXRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nbm9tZS1j b2xvcnMvUB216wAAAABJRU5ErkJggg== }] set images(dialog-ok) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAABGwAAARsAHIJ/VUAAAAB3RJTUUH4gMCEiUV4H3hYAAAAfJJREFUOMulk1tI03EUxz+/XZi7 OOlvWGLRBYmgYAbaGgiVUMgcVA89lC9JIvXQZUGjCEIIgiAcjB4iih6iXjKCSPKphzKDkuWg2Lz0 8G+rzVVb0cLm1NNDW0imLTxPB37n+zm331EiwlLMwBKtbED37XY5FNwk9wevip6M+f8LEIuHZWrm Eyf3B/jyY4RQ37Ge0pvpX2LXaWXfuspNh+8AEf0hJuM6NtZtK7+Fs23BXEO9i7HUIKu1LTyNPMHb 1BEqC9D38m7DgxchVtZUYFI2Hj3vp6v1InXL15+YBxhNDEtn0CMTmcTvvT57fe9Vm8dLMjNKYdLC zLSNxg0tam4SE0A6m5Bzt7zsa95L4OZOWlwdUl1Zy6wkyeXzOK0rGIgM0X2wd16VSkQIXN8jmjZF daUdEQOJ9Gei+jt2NbmZLKT5+g1qHG6O+C6ovwIA/NdaBbKsqdWYljwOyzKyuQ+YjRrh2Dh3zoyo RT9SsKtfbd/cyePwAFIw8DETx6QsxPS3HPVdXnDQ6s9bGE+8kUu9h6lyfMdoMGC3NHK+/YZSShkA BczKXFHRV4AZsHrosabSSTl+Zbc0n0L0uC6p9xPD0WjUD1QB1mLsr+QiUoIYi1uxrmVHxRBiFsSs Ue8EnICtKDYBxpJOLXbOSilVrHLBoJ+h/c25hpqBXwAAAABJRU5ErkJggg== }] set images(dialog-refresh) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAA3XAAAN1wFCKJt4AAAACXZwQWcAAAAWAAAAFgDcxelYAAAD1UlEQVQ4y7WUTWxVRRSAv3Pv fX2vrX30V6CFtggqUUuEACYqYSPBRBISo9GFGhe6Ihij7khcYGKIPwtdCTUujGIibHSjgaiJGgkY UcGFQJG0tFADNIX2te/eOTPHxa2vvHYncZJJbmbO/WbmO2dGzIz/oyUAm178ZFsURx96H3pvBRbH 0Ujw4YWfB585mgAgDD68YVVvf08HcRwRR7KoRwIigpkRDHywRf3C6LXe70+cGwT6EwCvvm95V5lz YzdICjHJHDyJbwJHggAGhJtg6ue+fWDl7Utw6vtqKsxCHmyBKAhBBBHYtKaD9ava6CwXqaTK6NVZ fvlrgpErMwTLgYVE0DTgQ97NwrxjC4bTQPCGF0Mk8PSWfjaubq/5a2yI6Wwpcv+qVv4cu8Hhn0aZ dcpzW/v54OtzeG+oGhbsJrAZ6gPqPQis62+tgy5sa3vKvPTYnfx9vcqa5S049agPOO/5t8pqKpx6 vM+PsXl1mWBGZSZl/+HvmLhRoburlae2P0BXWwsA5aYC5aYCAKoBVY+qr6mI5lXkE94H7unrIBKh sVTg9CXPVW3n5HDKrn2f8fGXP1LNXN0JnPOoBjLnF6rIB1U9EYZTpZDExFFMsaUDEaGh2ETbbW1c nFSSOF4AdmgwnPMLkmf5oFOPhcDLew8wNF5BBHrvewgRAWBlVzOvPDFAEkd14EzzikidLnAcAlmm OPWEKOLAm7vrfpzNlDcO/sqZC5fZsesoYS5JNqdxYPNWxidmSF2+sbodp05R57Ek1EHVB/a8d5jh 6SaSYhOdd2zADD7f80gt5ofTY7x96HdcNr/jqOY4U5wqqvVgp5716+6lodhIlmke57Q2H0Jg5OIY zvk5FQsuSDVTnPNg9eDGYoFntw+w48G7OPjtWU4OXeHuntY5qJE5z1fHzuJcM2kaL66KNHM4pwh5 xo+fOk9fdyfLOpcA0NZSZNfOgdqCPgTiKOKPs8MMT0CUeNLMLa6KNFMyp4gYx0+dZ/e+QyTiee35 7Ty+bePiJzKKmJicZu/gEYJ0oE6pZtQci5mxZue71r2ym0pViUWw6YtE5V7AqE5eYkVrxJOPbmbL xrW0L2mmMpty7Lch3v/0G2YLS4mSIiEYTaWESyNjDH3xqsxfaecIPmAClJYRfECAQrmby2mVdw4e Y99HRwiagcQUGlsolZeDJHjNy08d9SrARitTlRWlxlJ+GSTKX14RRAyKJRqKPQtkGGaAGYiBGZWp aSz4cRFpTgBmxs+8Hjr635q6XujkFpppen1q5MR+oE3MDBEpAN3AUmDyP3LbgVlgDLj2D6PDY5hT ZmYmAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAxLTExVDA5OjEyOjUyLTA3OjAwUkpEuQAAACV0 RVh0ZGF0ZTptb2RpZnkAMjAxMC0wMS0xMVQwOToxMjo1Mi0wNzowMCMX/AUAAAA0dEVYdExpY2Vu c2UAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC9sagaoAAAAGXRF WHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAABN0RVh0U291cmNlAEdOT01FLUNvbG9y c6qZROIAAAAxdEVYdFNvdXJjZV9VUkwAaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dub21lLWNv bG9ycy9QHbXrAAAAAElFTkSuQmCC }] set images(dialog-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== }] ====== <> Utility Dialog