Gnocl Icon Catalogue

WJG (18/10/18) Any Linux distro will contain a wide range of icons installed not only by default, but also the applications which may have been installed by a user. This simple Gnocl script shows how to display the various categories of icon in a tabbed notebook. Here's what it looks like running.

gnocl_icon_catalogue_img

Anyone familiar with Gnocl will notice that in this script widgets are accessed via their names rather than registred widget-ids. This removes the need for global variables or accessing widgets in the global namespace. It does mean, that unique names have to be defined.

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

package require Gnocl


proc stock {lst } {

  set stockItems [lsort [gnocl::info allStockItems] ]
  foreach item $stockItems {
    # trap non-existing icons
    if { [catch { $lst add [list [list %#$item $item ]] }] } {
        $lst cellConfigure end 1 -value $item -visible 1
    }
  }

}

proc main {} {
  gnocl::vBox -name container
  gnocl::statusBar -name status
  gnocl::notebook -name nb -tabPosition left -tabAlign left

  [container] add [nb] -fill 1 -expand 1
  [container] add [status]

  gnocl::window -child [container] -title "Icon Catalogue" -width 300 -height 650 -name win -visible 0
  win centre
  win configure -visible 1

  [status] push "Searching for installed icons..."
  gnocl::update

  set i 0

  foreach context [lsort [gnocl::iconTheme contexts]] {
        
        [status] push "Searching $context"
        
        gnocl::update

        gnocl::list -name lst($i) \
                -titles {"Icon" "Description"} \
                -types {image string} \
                -onSelectionChanged { 
                        [status] push "Showing \"[%w get [%w getSelection] 1 ]\"" 
                        preview-icon [%w get [%w getSelection] 1 ] 
                        }
                        
        nb addPage [lst($i)] $context

        if { $context == "Stock" }  { stock [lst($i)] ; continue }
                        
        foreach item [gnocl::iconTheme icons -context $context] {
                
                if { [catch { [lst($i)] add [list [list %&$item $item ]] }] } {
                        [lst($i)] cellConfigure end 1 -value $item -visible 1
                }
       
        }
        incr i
 }

 [status] push "Click icon to display."

 gnocl::window -title "Icon Preview" -child [gnocl::image -name preview -image %&emblem-web -scale 2] -setSize 0.125

}

proc preview-icon {item} {
        set pb [gnocl::pixBuf load -icon $item -size 200]
        preview configure -image %?$pb        
}

main