Saturday, January 16, 2010

gnocl::text and the new gnocl::textBuffer object

Yesterday was a day mixed with annoyances - a whole pile of them and the coding was no exception. Next time, make sure the documentation referred to matches the version of installed on your system! I wasted a good couple of hours trying to implement support for the GtkTexBuffer "paste-done" event but no matter how I checked and re-wrote the code it would stil crash my scripts!!!! Why? This signal is implemented since Version 2.15 and I have version 2.14 installed! That's what happens when one fails to check which set of docs are bookmarked in the browser. Ok, I've just commented out the relevant code for now, just until I upgrade to Gtk+ 2.19 or whatever its up to now!
Today, however, I thought that I'd take a look at implementing a new module, gnocl::textBuffer using the prototype gnocl::assistant module builder mentioned earlier in this blog. Worked a treat, only needed a couple of tweeks and its working well.
This new module enables the script to create multiple text buffers to be created and registered with the interpreter. Nice! This value of this lies in decluttering the UI. Different docs currently open for editing can be accessed through a menu rather than using tabs or new edit windows. Really nice stuff. This has also required th addition of a new gnocl::text option '-buffer' which enables the script to interactively switch between buffers. This script shows how it works.

# test-text-buffer.tcl
# William J Giddings
# 16/Jan/2010
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

package require Gnocl

set box1 [gnocl::box -orientation vertical]
set box2 [gnocl::box ]
$box1 add $box2

set txt [gnocl::text \
-baseFont {Sans 14} \
-editable no \
-text "Come to me in the silence of the night\nChristina Rossetti (1830-1894)" \
-scrollbar always]

foreach {i j} {0 Title 1 Verse-1 2 Verse-2 3 Verse-3} {
set rad($i) [gnocl::radioButton \
-text $j \
-variable buff \
-onValue $i]
$rad($i) configure -onToggled { $txt configure -buffer $tbuf($buff) }
$box2 add [set rad($i)]

$box1 add $txt -fill {1 1} -expand 1

gnocl::window -child $box1 -defaultWidth 480 -defaultHeight 240 -onDestroy {exit}

set verse(0) [$txt get start end]

set verse(1) {Come to me in the silence of the night;
Come to me in the speaking silence of a dream;
Come with soft rounded cheeks and eyes as bright
As sunlight on a stream;
Come back in tears,
O memory, hope, love of finished years.}

set verse(2) {O dream how sweet, too sweet, too bitter sweet,
Whose wakening should have been in Paradise,
Where souls brimfull of love abide and meet;
Where thirsting longing eyes
Watch the slow door
That opening, letting in, lets out no more.}

set verse(3) {Yet come to me in dreams that I may live
My very life again cold in death:
Come back to me in dreams, that I may give
Pulse for pulse, breath for breath:
Speak low, lean low,
As long ago. my love, how long ago.}

set tbuf(0) [gnocl::textBuffer -text $verse(0)]
set tbuf(1) [gnocl::textBuffer -text $verse(1)]
set tbuf(2) [gnocl::textBuffer -text $verse(2)]
set tbuf(3) [gnocl::textBuffer -text $verse(3)]


And here's a snapshot:

Reblog this post [with Zemanta]

No comments: