aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormescalinum <mescalinum@users.sourceforge.net>2009-09-02 20:57:19 +0000
committermescalinum <mescalinum@users.sourceforge.net>2009-09-02 20:57:19 +0000
commitdd138f1c21a2a26420bf0fc79688b64a5a09a69b (patch)
treedef6cfa9191c1f20bac51f253811dd93f65c0a75
parentb10346c77cb5de040a23da4d94f3fae29f01f459 (diff)
add a GUI external example
svn path=/trunk/externals/tclpd/; revision=12193
-rw-r--r--bitmap.tcl107
1 files changed, 107 insertions, 0 deletions
diff --git a/bitmap.tcl b/bitmap.tcl
new file mode 100644
index 0000000..5799a9d
--- /dev/null
+++ b/bitmap.tcl
@@ -0,0 +1,107 @@
+source pdlib.tcl
+
+pd::guiproc bitmap_draw_new {self c x y sz w h} {
+ set x2 [expr {$x+$w*$sz+1}]
+ set y2 [expr {$y+$h*$sz+1}]
+ $c create rectangle $x $y $x2 $y2 -outline black -tags [list $c border$c]
+ for {set i 0} {$i < $h} {incr i} {
+ for {set j 0} {$j < $w} {incr j} {
+ $c create rectangle \
+ [expr {1+$x+$j*$sz}] [expr {1+$y+$i*$sz}] \
+ [expr {$x+($j+1)*$sz}] [expr {$y+($i+1)*$sz}] \
+ -outline black -fill white -tags [list $c cell_${j}_${i}_$c]
+ }
+ }
+}
+
+pd::guiproc bitmap_draw_erase {self c x y sz w h} {
+ $c delete foo$c
+}
+
+pd::guiproc bitmap_draw_select {self c sel} {
+ $c itemconfigure border$c -outline [lindex {black blue} $sel]
+}
+
+pd::guiclass bitmap {
+ constructor {
+ pd::add_outlet $self float
+ set @sz 8
+ set @w 8
+ set @h 8
+
+ set @data [list]
+ for {set i 0} {$i < $@h} {incr i} {
+ for {set j 0} {$j < $@w} {incr j} {
+ lappend @data 0
+ }
+ }
+ }
+
+ 0_getrow {
+ set r [list]
+ set n [pd::arg 0 int]
+ for {set i [expr {$n*$@sz}]} {$i < [expr {($n+1)*$@sz}]} {incr i} {
+ lappend r [list float [lindex $@data $i]]
+ }
+ pd::outlet $self 0 list $r
+ }
+
+ object_save {
+ return [list #X obj $@x $@y bitmap $@sz $@w $@h \;]
+ }
+
+ widgetbehavior_getrect {
+ lassign $args x1 y1
+ set x2 [expr {$x1+$@w*$@sz}]
+ set y2 [expr {$y1+$@h*$@sz}]
+ return [list $x1 $y1 $x2 $y2]
+ }
+
+ widgetbehavior_displace {
+ set dx [lindex $args 0]
+ set dy [lindex $args 1]
+ if {$dx != 0 || $dy != 0} {
+ incr @x $dx
+ incr @y $dy
+ sys_gui [list $@c move $@c $dx $dy]\n
+ }
+ return [list $@x $@y]
+ }
+
+ widgetbehavior_select {
+ set sel [lindex $args 0]
+ sys_gui [list bitmap_draw_select $self $@c $sel]\n
+ }
+
+ widgetbehavior_activate {
+ }
+
+ widgetbehavior_vis {
+ set @c [lindex $args 0]
+ set @x [lindex $args 1]
+ set @y [lindex $args 2]
+ set vis [lindex $args 3]
+ if {$vis} {
+ sys_gui [list bitmap_draw_new $self $@c $@x $@y $@sz $@w $@h]\n
+ } else {
+ sys_gui [list bitmap_draw_erase $self $@c $@x $@y $@sz $@w $@h]\n
+ }
+ }
+
+ widgetbehavior_click {
+ set xpix [lindex $args 0]
+ set ypix [lindex $args 1]
+ set shift [lindex $args 2]
+ set alt [lindex $args 3]
+ set dbl [lindex $args 4]
+ set doit [lindex $args 5]
+ if {$doit} {
+ set j [expr {($xpix-$@x)/$@sz}]
+ set i [expr {($ypix-$@y)/$@sz}]
+ set idx [expr {$@sz*${i}+${j}}]
+ set d [expr {[lindex $@data $idx]==0}]
+ lset @data $idx $d
+ sys_gui [list $@c itemconfigure cell_${j}_${i}_$@c -fill [lindex {white black} $d]]\n
+ }
+ }
+}