Thursday, May 07, 2015

Recent Modifications

Over the past few weeks a number of enhancements have be made to the gnocl package. Here's a brief overview of the changes:

2015-05:
    gnocl::menu, gnocl::menuRecentChooser, gnocl::statusBar
        o added -name, -data; implemented cget
        o added -name, -data; implemented cget
    gnocl::window
        o added -name
    added gnocl::application, a convience application megawidget
2015-04:
    added parent command to gnocl::volumeButton, gnocl::scale and gnocl::spinner
    gnocl::spinner
        o resolved problems with start and stop commands (same as using the -active options).
    gnocl::text
        o using the get widget command alone will return all text contents, i.e. same as "$wid get start end"
    gnocl::entry
        o wordList sub-commands "add", "clear", "delete" and "get" are now implemented.
        o enhanced the wordList subcommand with new option -split
            specifying this option will result in a string being treated as a space separated list
            of single words: e.g. "a red dog" becomes {{a} {red} {dog}}
        o enhanced the progress functionality, new options -range and -progressStep
            the command progress will increment the display by the fractions given by progressStep.
            Changing either -range or -progressStep will reset the progress display to 0.
            The use of the -progressFraction remains unaltered and is useful for resetting the progress to 0.
    gnocl::text
        o insert markup now works acceptably well, at present '            markup can only accept single, predefined options. Future
            versions may offer more, but this is probably adequate for
            most purposes requiring text pango markup.
        o renamed -markupTags to -useMarkup
    gnocl::toolBar
        checkItem/toggleButton
        o configure -data option and others now works
        o cget -iconSize now works properly
    gnocl::label
        bugfix:
            -textVariable setting now responds to the widget -useMarkup option


For me, the most exciting prospect is the ability to use pango-like markup strings in conjunction with the the text widget. Additionally, the gnocl::application convenience function offers an extremely quick way of initializing a working application complete with menus, toolbars, main container and status bar. The following tests script shows how this new script can be used:

#---------------
# test-gnocl-appl.tcl
#---------------
#!/bin/sh
#\
exec tclsh "$0" "$@"

package require Gnocl

#~~~~~~~~~~~~~~~~~~~~~~~~~
# create the basic application
#~~~~~~~~~~~~~~~~~~~~~~~~~
array set app [gnocl::application -application "MyAPP" -version 1.0 -date 07/05/15 -filetypes *.tcb]

#~~~~~~~~~~~~~~~~~~~~~~~~~
# Configure the main toplevel settings
#~~~~~~~~~~~~~~~~~~~~~~~~~
$app(topLevel) configure -title "APPLICATION" -setSize 0.5 

#~~~~~~~~~~~~~~~~~~~~~~~~~
# Configure toolbars
#~~~~~~~~~~~~~~~~~~~~~~~~~
$app(toolBar,1) add item -icon "%#New" -text New -name AAAA
$app(toolBar,2) add item -icon "%#Open" -text Open -name BBB
$app(toolBar,2) configure -visible 0

#~~~~~~~~~~~~~~~~~~~~~~~~~
# Create and pack application specific resources
#~~~~~~~~~~~~~~~~~~~~~~~~~
set app(txt) [gnocl::text -wrapMode word -name "textEdit" -useMarkup 1]
$app(container) add $app(txt) -fill {1 1} -expand 1
$app(txt) lorem ;# a bit of dummy data

#~~~~~~~~~~~~~~~~~~~~~~~~~
# Show and go!
#~~~~~~~~~~~~~~~~~~~~~~~~~
$app(statusBar) push "Ready..."
$app(topLevel) show

#~~~~~~~~~~~~~~~~~~~~~~~~~
# GUI elements can now be modified
#~~~~~~~~~~~~~~~~~~~~~~~~~
$app(toolBar,2) add item -icon "%#Yes" -name CCC
$app(help,about) configure -onClicked {puts HIDIHI}
$app(file,quit) configure -onClicked {exit}
$app(file,recent_menu) configure -onClicked {puts "HODIHO %f"}

#~~~~~~~~~~~~~~~~~~~~~~~~~
# alternatively, use aliases based upon Gtk+ builder names
#~~~~~~~~~~~~~~~~~~~~~~~~~
if 1 {
    namespace eval myApp {}
    foreach item [gnocl::inventory widget $app(topLevel)] {
        set n [$item cget -name]
        if { $n != "" } { interp alias {} ::myApp::$n {} $item }
    }
    ::myApp::textEdit insert end "\nOm Mani Padme Hum Hrih"
}