[wdb] In certain cases I need earlier versions of widget content, similar to command [history]. Specially in search-replace-spell dialog of my not-yet published tknotepad.tcl which I developped toward the ''Eierlegende Wollmilchsau''. Not rocket science, but not really fun. Remember I'm able to do errors even on simple things. So I wrote my own history object using [obj]. (My private slogan: never again thinking yourself!)
Create new history object:
set h [obj::new history]
Methods:
$h add $content
appends $content to history. If Option -unique is set to true, then doublettes are removed;
$h back
decreases index, returns previous content,
$h forward
same, but direction forward,
$h atEnd
returns true if index at end,
$h atStart
returns true if index at start.
======
# file: history-0.1.tm
package require obj
package provide history 0.1
obj::class history
obj::configure history -unique false
obj::validatemethod history -unique bool {
if {![string is boolean -strict $bool]} then {
return -code error\
[list $self expects for -unique a boolean value\
but returned non-boolean value $bool]
}
}
obj::inscope history namespace import ::tcl::mathop::*
obj::constructor history {} {
my list {}
my index -1
}
obj::method history add str {
my list [lrange [my list] 0 [my index]] if {[$self cget -unique]} then {
set found [lsearch [my list] $str]
my list [lreplace [my list] $found $found]
}
my list [::list {*}[my list] $str]
my index [- [llength [my list]] 1]
set str
}
obj::method history back {} {
if {[my index] >= 0} then {
my index [- [my index] 1]
::lindex [my list] [my index]
}
}
obj::method history forward {} {
if {[my index]+1 < [llength [my list]]} then {
my index [+ [my index] 1]
::lindex [my list] [my index]
}
}
obj::method history get {} {
::lindex [my list] [my index]
}
obj::method history atEnd {} {
expr {[my index]+1 == [llength [my list]] ? yes : no}
}
obj::method history atStart {} {
expr {[my index] <= 0 ? yes : no}
}
======
If you prefer another [OO] system, it is a breeze to transform it. Have fun.