Thursday, November 30, 2017

Recent Changes, to the sources

 Latest Nightly build now available from SourceForge. Lots of work done over the past 6 weeks, and here's the gist from the project NEWS.

        o    added -min, -max
        o    appending row to image columntype now supports %& percent-string (icon-theme).
        o    -image options now supports %& (icon-theme) percent string.
        o    -icon options now supports %& (icon-theme) percent string.
        o    -iconSize, set size of icon, default = 22.
        o drag and drop between itemgroups now works. Unecessary options removed.
        o     new command, allow the creation and manipulation of filters for use in recent menus, dialogs and widgets.
        o    added commands pack, remove.
        o    tab tearoff now fully supported, closing tearing window restores tabs to original notebook.
            tearoff window closes when last tab removed.
        o    added -detachable, -reorderable, and -enablePopup.
        o    will now close without setting -onResponse option.
        o    added -action and -content (same as -child).
        o    problems with -icon fixed.
        o    added gnocl::message as synonym for gnocl::messageDialog.
        o    module source renamed from msgDialog.c to message.c
    gnocl::radioButton, gnocl::menuRadioItem
        o    added %g substitution implemented in callback
        o    clash between markup and percept mnemonics resolved, markup removed for %_ strings.
        o    -radio, choose between button or tick (default).
        o    onToggled renamed to toggle, now works correctly
        o    %g substitution implemented in callback.
        o    %g substitution implemented in callback.
        o    new sub-command, primary.
        o     completed code for addBegin and addEnd
            although may prove of limited value in scripts, the following commands have been added:
            deactivate, itemActivate, select, reposition, get
    Widget subcommands "options" and "commands" removed from all objects. Use gnocl:: options|commands.
        o    module completely revised, commands not permissible while dialog running.
        o    added options: -data, -name, -tooltip, -widthRequest, -heightRequest and -onClicked
        o    BUG FIX: -tooltip option no longer requires setting when adding icons.
            configure sub-command now works properly
            -selectionMode fully implemented
            NEW COMMANDS: get, select, getSelection
        Module tidied up, ineffectual calls to Gtk api removed.
        Available options are:
        -child, -type, -buttons, -actionWisdgets, -data, -onResponse, -onShowHelp,
        -visible, -sensitive, -name, -heightRequest, -widthRequest, -tooltip

Saturday, October 07, 2017

September News

The codebase is currently undergoing a deep clean-up with a number of internal modifications and enhancements to largely yet unannounced features.

o added gnocl::widgets, returns a list of available widget classes.
gnocl::commands will now return only a list of non-widget creating  commands.
o commands and options calls to widgets will return lists of relevant  options, without creating object instance.
e.g. puts [gnocl::button options] ; puts [gnocl::button commands]
More complex widget such as gnocl::text with sub-object may have more  options, e.g: [puts [gnocl::text tagOptions].
o gnocl::commands will now return only a list of non-widget creating  commands.
o gnocl::info new sub-commands: 
cursors returns list of available cursors, and
subStrings returns list of callback substitution string and their meanings.

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.

# 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]



Recent Changes

Just a few additions and enhancements to the 0.9.96 code over the past couple of months. Latest sources available at Sourceforge.

    gnocl::tree, gnocl::list
        o cget -types now works.
        o FIXED: crashing when getFullList called on model with 0 rows.
        o -onPopulatePopup Substitution options %r, %c and %t changed to %R(ow), %C(olumn) and %T(ags),
             and %t reallocated to return id of widget toplevel window.
        o added -onButtonPress and -onButtonRelease
        o added getSelectionBounds for consistency with the text widget       
        o menuButton -icon can now be reconfigured.
        o FIXED: problems with serialize/deserialize, now tests for valid filename.
        o added -baseColor
        o added -orientation -leftMargin -rightMargin -margins -paragraphSpacing -lineSpacing -justify
        o new commands getSelection
        o set -wrapMode default to word.
        o added -baseFont       
    gnocl::tree, gnocl::list
        o added %S to -onButtonRelease and -onButtonPress substitutions strings, returns a list of the selected items
        o new load option, -data, will create pixbufs from inline xpm data, e.g. menu icons.
        o -onFocusOut handler, now supports %g %p %t %w %D substitution strings. Where 'D' is direction.
    gnocl::eventBox, gnocl::fixed and gnocl::window
        o completed support for the -onAdd and -onRemove events, ie. adding or removing child widget to or from a container.
        o new options -scale, -constrain, -constrainWidth, -constrainHeight, -data

Tuesday, May 23, 2017

Gnocl Gtk3+ implementation begun!

Yesterday I made the spot decision to make the move from building Gnocl against the Gtk2+ libraries to Gtk3+. At the end of the day I got the bulk of the gnocl::window module running. This doesn't mean that the conversion process will be an easy journey, it won't. The current build of Gnocl has evolved over the years and contains many legacy calls to widgets, functions, structures and macros not longer supported in Gtk3+. The immediate effect is that much of the 'glitzy' stuff working on pixmaps no longer work. Its all a question of time!

This doesn't mean that the Gtk2+ distribution will be forgotten, it still forms the backbone of the project and will be supported till most the the conversion work has been done.

One of the greatest challenges is the lack of suitable documentation. For Gtk2+ there was always Krause's excellent book, but now the emphasis would appear to be upon creating chunks of builder xml code and embedding these as strings into C-sourcecode.

It would appear though, that there's always more than one way to skin a cat, and, getting the initial 'application' running was not, shall we say, according to the manual. Actually, by working around the rules, it became simpler!

It'll be some time before a first workable, package is released, so until then, wish me luck and straightforward coding!