aboutsummaryrefslogtreecommitdiff
path: root/extensions/gui/ix/mat.wid
diff options
context:
space:
mode:
authorcarmen rocco <ix9@users.sourceforge.net>2006-09-19 23:21:31 +0000
committercarmen rocco <ix9@users.sourceforge.net>2006-09-19 23:21:31 +0000
commit5689251b4df7456f43a0d3b357672bbd9fc3a40c (patch)
tree98e8bd772edf971e3cda5bff8dece0436105ddc4 /extensions/gui/ix/mat.wid
parent2ed8e5ab0516ba0a3d66fdc5612a4631fee5f6d5 (diff)
*** empty log message ***
svn path=/trunk/; revision=5973
Diffstat (limited to 'extensions/gui/ix/mat.wid')
-rwxr-xr-xextensions/gui/ix/mat.wid688
1 files changed, 0 insertions, 688 deletions
diff --git a/extensions/gui/ix/mat.wid b/extensions/gui/ix/mat.wid
deleted file mode 100755
index 237bf772..00000000
--- a/extensions/gui/ix/mat.wid
+++ /dev/null
@@ -1,688 +0,0 @@
-foreach package {snack tkdnd tkpath} {package require $package}
-namespace eval ::ix {
- proc rc {} {return [format "\#%06x" [expr "int(floor(rand() * 16777216))"]]}
- proc rgb {} {return [list [expr "int(floor(rand() * 256))"] [expr "int(floor(rand() * 256))"] [expr "int(floor(rand() * 256))"]]}
- proc lighten {rgb r} {set l {}; foreach c $rgb {lappend l [expr {(256 - $c) * $r + $c}]}; return $l}
- proc darken {rgb r} {set l {}; foreach c $rgb {lappend l [expr {$c - ($c * $r)}]}; return $l}
- proc color {rgb} {return [format "\#%02x%02x%02x" [expr int([lindex $rgb 0])] [expr int([lindex $rgb 1])] [expr int([lindex $rgb 2])]]}
- proc random_txt {n} {
- set i 0
- set text ""
- while {$i < $n} {
- set int [expr "int(floor(rand()*62))"]
- if {$int < 10} {incr int 48} elseif {$int < 36} {incr int 55} else {incr int 61}
- set text "$text[format %c $int]"
- incr i
- }
- return $text
- }
-
- proc mat_sel {p t a x y} {
- variable _
- set _($t:sc) [rc]
- switch $a {
- first {
- foreach xy {x y} {set _($t:c$xy) [set $xy];set _($t:f$xy) [set $xy]}
- $p.m create path [::tkpath::coords rect $_($t:cx) $_($t:cy) 0 0 -rx 12 -ry 12] \
- -tags sel -stroke $_($t:sc) -strokewidth 12 -strokeopacity 0.3}
- release {$p.m delete sel}
- motion {
- mat_updatesel $p $t [mat_cleansel $p $t [$p.m find overlapping $_($t:fx) $_($t:fy) $x $y]]
- if {$x >= $_($t:cx)} {set xa $_($t:fx);set xb $x} else {set xa $x;set xb $_($t:fx)}
- if {$y >= $_($t:cy)} {set ya $_($t:fy);set yb $y} else {set ya $y;set yb $_($t:fy)}
- set w [expr {abs($xb - $xa)}]
- set h [expr {abs($yb - $ya)}]
- $p.m coords sel [::tkpath::coords rect $xa $ya $w $h -rx 12 -ry 12]
- $p.m itemconfigure sel -stroke $_($t:sc)}}}
-
- proc mat_item_new {p t id d} {
- variable _
- if {$id eq "-"} {
- if {[dict keys $_($t)] eq ""} {set id 0} else {
- set id -1
- while true {if {[lsearch -integer [dict keys $_($t)] [incr id]] == -1} {break}}
- }
- }
- set _($t:ci) $id
- mat_item_ua $p $t $id abs {x 0 xx 0 y 0 yy 0 g 0 v 1} 0
- mat_item_ua $p $t $id abs $d 0
- mat_item_draw $p $t $id
- }
-
- proc mat_item_draw {p t is} {
- variable _
- if {$is eq "all"} {set is [dict keys $_($t)]}
- foreach id $is {
- set tags [list item i$id $id]
- set color [dict get $_($t:g) $_($t:cg) color]
- switch [dict get $_($t) $id type] {
- note {
- $p.m create path [::tkpath::coords rect 0 0 0 0 -rx 3 -ry 3] -tags [concat $tags r] -stroke [color [lighten $color 0.4]] -strokeopacity 1.0 -fill [color $color] -fillopacity 0.08
- $p.m create path [::tkpath::coords rect 0 0 0 0 -rx 3 -ry 3] -tags [concat $tags q] -fill [color $color] -strokewidth 0 -fillopacity 0.8
- }
- sound {
- snack:::sound s$id
- set filename [dict get $_($t) $id filename]
- s$id read $filename
- $p.m create path [::tkpath::coords rect 0 0 0 0 -rx 3 -ry 3] -tags [concat $tags r] -strokewidth 0 -fill [color $color] -fillopacity 0.08
- $p.m create waveform 0 0 -tags [concat $tags w] -sound s$id -fill white
- set length [expr [s$id length] / ($_($t:samplerate) + 0.0) * 1000]
- mat_item_ua $p $t $id abs [dict create xx [expr [dict get $_($t) $id x] + $length]] 0
- $p.m create text 0 0 -tags [concat $tags tl] -font {{bitstream vera sans} 8} -fill HotPink -anchor nw -justify left -text "[string range $length 0 10] s"
- $p.m create rectangle 0 0 0 0 -tags [concat $tags tlr] -fill LightGreen -width 0
- $p.m raise [$p.m find withtag "i$id && tl"]
- $p.m create text 0 0 -tags [concat $tags tf] -font {{bitstream vera sans} 8} -fill NavyBlue -anchor ne -justify right -text $filename
- $p.m create rectangle 0 0 0 0 -tags [concat $tags tfr] -fill gray90 -width 0
- $p.m raise [$p.m find withtag "i$id && tf"]
- }
- }
- mat_redraw $p $t $id
- }
- }
-
- proc mat_item_delete {p t} {
- variable _
- foreach item $_($t:sel) {
- foreach i [$p.m find withtag i$item] {
- $p.m delete $i
- }
- dict unset _($t) $item
- set _($t:sel) {}
- mat_item_info $p $t ""
- pd [concat $t.rp _cb delete $item \;]
- }
- }
-
- proc mat_quant {p t y v} {
- variable _
- if {$y eq "xx"} {set y x}; if {$y eq "yy"} {set y y}
- if {$y eq "x" || $y eq "y"} {
- set v [expr {int( ($v + $_($t:q$y) / 2.0 ) / ($_($t:q$y) + 0.0))*$_($t:q$y)}]
- }
- return $v
- }
-
- proc mat_item_pos {p t item r x y xx yy} {
- mat_item_ua $p $t $item $r [dict create x $x y $y xx $xx yy $yy] 1}
-
- proc mat_item_ua {p t item r u redraw} {
- variable _
- foreach a [dict keys $u] {
- switch $r {abs {dict set _($t) $item $a [dict get $u $a]}
- rel {dict set _($t) $item $a [expr {[dict get $_($t) $item $a] + [dict get $u $a]}]}}
- pd [concat $t.rp _cb update $item $a [pdtk_enquote [dict get $_($t) $item $a]] \;]
- }
- if {$redraw == 1} {mat_redraw $p $t $item}
- }
-
- proc mat_draw {p t a x y} {
- variable _
- switch $a {
- motion {
- if {$_($t:af) == 1} {
- mat_item_pos $p $t $_($t:ci) abs [mat_tr $p $t y i $y] [mat_tr $p $t x i $x] [mat_tr $p $t y i $_($t:fy)] [mat_tr $p $t x i $x]
- } else {
- mat_item_pos $p $t $_($t:ci) abs [mat_tr $p $t x i $x] [mat_tr $p $t y i $y] [mat_tr $p $t x i $_($t:fx)] [mat_tr $p $t y i $y]
- }
- }
- first {mat_item_new $p $t - [dict create type note g $_($t:cg) x 0 y 0 xx 0 yy 0 v 1]}}}
-
- proc mat_resize_canvas {p t a x y} {mat_viewpoint $p $t [dict create action resize x $x y $y]}
-
- proc mat_redraw {p t items} {
- variable _
- if {$_($t:af) == 1} {
- array set a {x y y x xx yy yy xx}
- } else {
- array set a {x x y y xx xx yy yy}
- }
- switch $items {
- all {set items [dict keys $_($t)]}
- default {}}
- foreach id $items {
- set x [mat_tr $p $t x t [dict get $_($t) $id $a(x)]]
- set y [mat_tr $p $t y t [dict get $_($t) $id $a(y)]]
- set qx [mat_tr $p $t x t [mat_quant $p $t x [dict get $_($t) $id $a(x)]]]
- set qy [mat_tr $p $t y t [mat_quant $p $t y [dict get $_($t) $id $a(y)]]]
- set wx [expr {[dict get $_($t) $id $a(xx)] - [dict get $_($t) $id $a(x)]}]
- if {$wx == 0} {set wx 1}
- set sx [expr abs([mat_tr $p $t x id $wx])]
- set qsx [expr int(abs([mat_tr $p $t x id [expr {[mat_quant $p $t x [dict get $_($t) $id $a(xx)]] - [mat_quant $p $t x [dict get $_($t) $id $a(x)]]}]]))]
- set wy [expr {[dict get $_($t) $id $a(yy)] - [dict get $_($t) $id $a(y)]}]
- if {$wy == 0} {set wy 1}
- set sy [expr abs([mat_tr $p $t y id $wy])]
- set qsy [expr int(abs([mat_tr $p $t y id [expr {[mat_quant $p $t y [dict get $_($t) $id $a(yy)]] - [mat_quant $p $t y [dict get $_($t) $id $a(y)]]}]]))]
- set ro [expr {int( [set s$a(y)] / 2.0 )}]
- if {[lsearch -integer $_($t:sel) $id] >= 0} {
- set color $_($t:sc)
- } else {
- set color [color [dict get $_($t:g) [dict get $_($t) $id g] color]]
- }
- switch [dict get $_($t) $id type] {
- note {
- set r [$p.m find withtag "i$id && r"]
- set q [$p.m find withtag "i$id && q"]
- $p.m coords $r [::tkpath::coords rect $x $y $sx $sy -rx $ro -ry $ro]
- $p.m coords $q [::tkpath::coords rect $qx $qy $qsx $qsy -rx $ro -ry $ro]
- $p.m itemconfigure $q -fillopacity [dict get $_($t) $id v] -fill $color
- }
- sound {
- set waveform [$p.m find withtag "i$id && w"]
- set r [$p.m find withtag "i$id && r"]
-# set ro [expr int($ro / 2.)]
- set ro 6
- $p.m coords $r [::tkpath::coords rect $x $y $sx $sy -rx $ro -ry $ro]
- $p.m itemconfigure $r -fillopacity [dict get $_($t) $id v] -fill $color
- $p.m coords $waveform $x $y
- $p.m itemconfigure $waveform -width $sx -height [expr int($sy)]
-# $p.m itemconfigure $waveform -width $sx
- $p.m coords [$p.m find withtag "i$id && tl"] [expr $x + 4] [expr $y + 4]
- $p.m coords [$p.m find withtag "i$id && tlr"] [$p.m bbox [$p.m find withtag "i$id && tl"] ]
- $p.m coords [$p.m find withtag "i$id && tf"] [expr $x + $sx] [expr $y + 4]
- $p.m coords [$p.m find withtag "i$id && tfr"] [$p.m bbox [$p.m find withtag "i$id && tf"] ]
- }
- }
- }
- }
-
- proc mat_item_v {p t a x y} {
- variable _
- foreach item $_($t:sel) {
- mat_item_ua $p $t $item rel [dict create v [expr {($x - $_($t:cx)) / 100.0}]] 1
- }
- mat_item_info $p $t $_($t:sel)
- }
-
- proc mat_move_canvas {p t a x y} {mat_viewpoint $p $t [dict create action move x $x y $y]}
-
- proc mat_move_object {p t a x y} {
- variable _
- set mx [mat_tr $p $t x d [expr {$x - $_($t:cx)}]]
- set my [mat_tr $p $t y d [expr {$y - $_($t:cy)}]]
- if {$_($t:af) == 1} {
- foreach item $_($t:sel) {mat_item_pos $p $t $item rel $my $mx $my $mx}
- } else {
- foreach item $_($t:sel) {mat_item_pos $p $t $item rel $mx $my $mx $my}
- }
- mat_item_info $p $t $_($t:sel)
- }
-
- proc mat_resize_left {p t a x y} {mat_resize_object $p $t x $x $y}
- proc mat_resize_right {p t a x y} {mat_resize_object $p $t xx $x $y}
- proc mat_resize_top {p t a x y} {mat_resize_object $p $t y $x $y}
- proc mat_resize_bottom {p t a x y} {mat_resize_object $p $t yy $x $y}
- proc mat_resize_tl {p t a x y} {mat_resize_object $p $t x $x $y; mat_resize_object $p $t y $x $y}
- proc mat_resize_tr {p t a x y} {mat_resize_object $p $t x $x $y; mat_resize_object $p $t yy $x $y}
- proc mat_resize_bl {p t a x y} {mat_resize_object $p $t xx $x $y; mat_resize_object $p $t y $x $y}
- proc mat_resize_br {p t a x y} {mat_resize_object $p $t xx $x $y; mat_resize_object $p $t yy $x $y}
-
- proc mat_resize_object {p t e x y} {
- variable _
- if {$_($t:af) == 1} {
- array set ax {x y xx y y x yy x}
- } else {
- array set ax {x x xx x y y yy y}
- }
- set m [mat_tr $p $t $ax($e) d [expr $$ax($e) - $_($t:c$ax($e))]]
- foreach item $_($t:sel) {mat_item_ua $p $t $item rel [dict create $e $m] 1}
- mat_item_info $p $t $_($t:sel)
- }
-
- proc mat_cleansel {p t sel} {
- set clean {}
- foreach item $sel {if {[lindex [$p.m itemcget $item -tags] 0] eq "item"} {lappend clean [lindex [$p.m itemcget $item -tags] 2]}}
- set clean [lsort -integer -unique $clean]
- return $clean
- }
-
- proc mat_loc {p t si x y} {
- variable _
- if {$si == 1} {
- set sy $y
- set sx $x
- set x [mat_tr $p $t x i $x]
- set y [mat_tr $p $t y i $y]
- } else {
- set sy [mat_tr $p $t y t $y]
- set sx [mat_tr $p $t x t $x]
- }
- $p.m coords lY [concat M 0 $sy L [winfo width $p.m] $sy]
- $p.m coords lX [concat M $sx 0 L $sx [winfo height $p.m]]
- $p.m itemconfigure loc -text [list $x $y]
- }
-
- proc mat_hover {p t x y} {
- variable _
-# mat_loc $p $t 1 $x $y
- if {[$p.m find withtag sel] ne ""} {
- mat_sel $p $t motion $x $y
- } else {
- set clicked [mat_cleansel $p $t [$p.m find overlapping [expr $x - 2] [expr $y - 2] [expr $x + 2] [expr $y + 2]]]
- if {$clicked ne ""} {
- mat_resize_modes $p $t $x $y [lindex $clicked end]
- if {[llength $_($t:sel)] <= 1} {mat_updatesel $p $t [lindex $clicked end]}
- } else {
- mat_mode $p $t move_canvas
- }
- }
- }
-
- proc mat_resize_modes {p t x y id} {
- variable _
- set d 3
- set dx [expr {abs([mat_tr $p $t x t [dict get $_($t) $id x]] - $x)}]
- set dxx [expr {abs([mat_tr $p $t x t [dict get $_($t) $id xx]] - $x)}]
- set dy [expr {abs([mat_tr $p $t y t [dict get $_($t) $id y]] - $y)}]
- set dyy [expr {abs([mat_tr $p $t y t [dict get $_($t) $id yy]] - $y)}]
- if {$dx < $d && $dy < $d} {
- mat_mode $p $t resize_tl
- } elseif {$dxx < $d && $dy < $d} {
- mat_mode $p $t resize_tr
- } elseif {$dx < $d && $dyy < $d} {
- mat_mode $p $t resize_bl
- } elseif {$dxx < $d && $dyy < $d} {
- mat_mode $p $t resize_br
- } elseif {$dx < 5} {
- mat_mode $p $t resize_left
- } elseif {$dxx < 5} {
- mat_mode $p $t resize_right
- } elseif {$dy < 1} {
- mat_mode $p $t resize_top
- } elseif {$dyy < 1} {
- mat_mode $p $t resize_bottom
- } else {
- mat_mode $p $t move_object
- }
- }
-
- proc mat_item_info {p t clicked} {
- variable _
- set n 0;$p.m delete hover
- foreach item $clicked {
- set info ""
- set data [dict get $_($t) $item]
- foreach d $data {lappend info [string range $d 0 7]}
- $p.m create text [list [expr [winfo width $p.m] - 8.0] [expr [winfo height $p.m] - 8.0 - 11 * $n.0]] -fill $_($t:sc) -justify right -anchor se -font {{bitstream vera sans mono} 10} -tags hover -text $info
- incr n
- }}
-
- proc mat_togglesel {p t d} {
- variable _
- if {[lsearch -integer $_($t:sel) $d] < 0} {
- set _($t:sel) [concat $_($t:sel) $d]
- } else {
- set _($t:sel) [lsearch -inline -not -all -integer $_($t:sel) $d]
- }
- mat_redraw $p $t $d
- }
-
- proc mat_updatesel {p t ns} {
- variable _
- set os $_($t:sel)
- set _($t:sel) $ns
- mat_redraw $p $t [lsort -unique -integer [concat $os $ns]]
- mat_item_info $p $t $ns
- }
-
- proc mat_click {m button action p t x y X Y} {
- variable _
- set clicked [mat_cleansel $p $t [$p.m find overlapping $x $y $x $y]]
- set a [$p.m itemcget mode -text]
- switch $action {
- first {
- foreach xy {x y} {set _($t:f$xy) [set $xy]}
- switch $button {
- 1 {if {$m eq "control"} {
- mat_mode $p $t draw; mat_draw $p $t $action $x $y
- } elseif {$m eq "double" || $m eq "shift"} {
- if {[llength $clicked] > 0} {
- mat_togglesel $p $t $clicked
- } else {
- mat_sel $p $t first $x $y
- mat_mode $p $t sel
- }
- } elseif {[$p.m find withtag sel] ne ""} {
- mat_sel $p $t release $x $y
- } elseif {[llength $_($t:sel)] > 1 && [llength $clicked] > 0 && [lsearch $_($t:sel) $clicked] == -1} {
- mat_updatesel $p $t $clicked}}
- 2 {mat_mode $p $t resize_canvas}
- 3 {if {$clicked ne ""} {
- mat_mode $p $t item_v } else {mat_rmenu $p $t $X $Y}}}}
- motion {eval mat_$a $p $t $action $x $y}
- release {
- switch $button {
- 1 {if {$a eq "draw" || ($a eq "sel" && [expr {abs($_($t:fx) - $x)}] >13)} {eval mat_$a $p $t $action $x $y}}
- 2 {mat_mode $p $t move_canvas}
- 3 {mat_mode $p $t move_canvas}
- }
- }
- }
- foreach xy {x y} {set _($t:c$xy) [set $xy]}
- }
-
- proc mat_rmenu {p t x y} {
- variable _
- if {[winfo exists $p.rmenu] != 1} {
- set m [menu $p.rmenu -tearoff no]
- $m add command -label "zoom to fit" -command "::ix::mat_viewpoint $p $t {action fit}"
- $m add command -label "reset zoom" -command "::ix::mat_viewpoint $p $t {action reset}"
- $m add command -label "add group" -command "::ix::mat_group_new $p $t -"
- $m add cascade -label "sel to group" -menu [menu $p.rmenu.seltogroup -tearoff no]
- $m add command -label "flip axes" -command "::ix::mat_flipaxe $p $t"
- } else {
- # $p.rmenu entryconfigure 0 -label $x
- }
- $p.rmenu.seltogroup delete 0 end
- foreach group [dict keys $_($t:g)] {
- $p.rmenu.seltogroup add command -label [dict get $_($t:g) $group name] -command "::ix::mat_group_assign $p $t $group"
- }
- tk_popup $p.rmenu $x $y
- }
-
- proc mat_tr {p t d inv v} {
- variable _
- array set dm {x width y height}
- switch $inv {
- t {return [expr {($v - $_($t:${d}a)) / ($_($t:${d}b) - $_($t:${d}a) + 0.0) * [winfo $dm($d) $p.m]}]}
- i {return [expr {($_($t:${d}b) - $_($t:${d}a)) * $v /([winfo $dm($d) $p.m] + 0.0) + $_($t:${d}a)}]}
- d {return [expr {($_($t:${d}b) - $_($t:${d}a)) * $v /([winfo $dm($d) $p.m] + 0.0)}]}
- id {return [expr {$v / ($_($t:${d}b) - $_($t:${d}a) + 0.0) * [winfo $dm($d) $p.m]}]}}}
-
- proc mat_viewpoint {p t opts} {
- variable _
- switch [dict get $opts action] {
- fit {
- set i 0
- dict for {s xy} $_($t) {
- dict with xy {
- if {$i == 0} {
- set xa $x
- set xb $x
- set ya $y
- set yb $y
- }
- if {$x > $xb} {set xb $x}
- if {$x < $xa} {set xa $x}
- if {$y > $yb} {set yb $y}
- if {$y < $ya} {set ya $y}
- if {$xx > $xb} {set xb $xx}
- if {$xx < $xa} {set xa $xx}
- if {$yy > $yb} {set yb $yy}
- if {$yy < $ya} {set ya $yy}
- incr i
- }
- }
- set _($t:xa) $xa
- set _($t:xb) $xb
- set _($t:ya) $ya
- set _($t:yb) $yb
- }
- reset {
- set _($t:ya) $_($t:yao);set _($t:yb) $_($t:ybo);set _($t:xa) $_($t:xao);set _($t:xb) $_($t:xbo)
- }
- move {
- foreach xy {x y} {
- set mvt [mat_tr $p $t $xy d [expr {[dict get $opts $xy] - $_($t:c$xy)}]]
- foreach ab {a b} {set _($t:${xy}$ab) [expr {$_($t:${xy}$ab) - $mvt}]}}
- }
- zoom {
- array set dir {in 0.5 out 1.5}
- foreach xy [dict get $opts axe] {
- set radius [expr {($_($t:${xy}b) - $_($t:${xy}a)) / 2. * $dir([dict get $opts dir])}]
- set center [mat_tr $p $t $xy i [dict get $opts $xy]]
- set _($t:${xy}a) [expr {$center - $radius}]
- set _($t:${xy}b) [expr {$center + $radius}]
- }
- }
- resize {
- foreach xy {x y} {
- set mvt [mat_tr $p $t $xy d [expr {[dict get $opts $xy] - $_($t:c$xy)}]]
- set _($t:${xy}a) [expr {$_($t:${xy}a) - $mvt}]
- set _($t:${xy}b) [expr {$_($t:${xy}b) + $mvt}]}
- }
- scroll {
- set xy [dict get $opts axis]
- set mv [expr {($_($t:${xy}b) - $_($t:${xy}a)) / 4.0}]
- foreach ab {a b} {set _($t:${xy}$ab) [expr {[dict get $opts units] > 0 ? $_($t:${xy}$ab) + $mv : $_($t:${xy}$ab) - $mv }]}
- }
- }
- mat_redraw $p $t all
- mat_gridlines $p $t
- }
- proc mat_flipaxe {p t} {
- variable _
- set _($t:af) [expr $_($t:af) == 1 ? 0 : 1]
-
- set ya $_($t:ya)
- set xa $_($t:xa)
- set xb $_($t:xb)
- set yb $_($t:yb)
- set qx $_($t:qx)
- set qy $_($t:qy)
- set mx $_($t:mx)
- set my $_($t:my)
-
- set _($t:ya) $xa
- set _($t:xa) $ya
- set _($t:yb) $xb
- set _($t:xb) $yb
- set _($t:qx) $qy
- set _($t:qy) $qx
- set _($t:mx) $my
- set _($t:my) $mx
-
- mat_gridlines $p $t
- mat_redraw $p $t all
- }
- proc mat_clip {p t action} {
- variable _
- switch $action {
- selecta {
- mat_updatesel $p $t [dict keys $_($t)]
- }
- cut {
- set _($t:c) [dict create]
- set i 0
- foreach item $_($t:sel) {
- dict set _($t:c) $i [dict get $_($t) $item]
- incr i
- }
- mat_item_delete $p $t
- }
- copy {
- set _($t:c) [dict create]
- set i 0
- foreach item $_($t:sel) {
- dict set _($t:c) $i [dict get $_($t) $item]
- incr i
- }
- }
- paste {
- set pasted {}
- foreach item [dict keys $_($t:c)] {
- mat_item_new $p $t - [dict get $_($t:c) $item]
- }
- }
- }
- }
-
- proc mat_mode {p t m} {
- array set cursor {draw pencil move_canvas fleur move_object dotbox item_v box_spiral resize_canvas bogosity sel cross_reverse resize_left left_side resize_right right_side resize_top top_side resize_bottom bottom_side resize_tl top_left_corner resize_tr top_right_corner resize_bl bottom_left_corner resize_br bottom_right_corner}
- $p.m itemconfigure mode -text $m
- $p.m configure -cursor $cursor($m)
- }
-
- proc mat_group_assign {p t group} {
- variable _
- foreach item $_($t:sel) {
- mat_item_ua $p $t $item abs [dict create g $group] 0
- }
- }
-
- proc mat_group_new {p t grp} {
- variable _
- set exists 0
- dict for {key val} $_($t:g) {if {[dict get $val name] eq $grp} {set exists 1}}
- if {$exists == 0} {
- if {$grp eq "-"} {set grp [random_txt [expr "int(floor(rand() * 10 + 2))"]]}
- set n -1
- while true { if {[lsearch -integer [dict keys $_($t:g)] [incr n]] == -1} {break}}
- dict set _($t:g) $n name $grp
- dict set _($t:g) $n color [rgb]
- set _($t:cg) $n
- mat_groups_view $p $t
- mat_group_active $p $t $n
- }
- }
-
- proc mat_groups_view {p t} {
- variable _
- $p.m delete [$p.m find withtag group]
- foreach i [dict keys $_($t:g)] {
- set id [$p.m create text [concat 68.0 [expr {38.0 + 11 * $i}]] -fill [color [dict get $_($t:g) $i color]] -justify right -anchor e -font {{bitstream vera sans mono} 10} -tags [concat group $i lb] -text [dict get $_($t:g) $i name]]
- $p.m bind $id <Enter> "::ix::mat_group_active $p $t $i"
- $p.m bind $id <1> "::ix::mat_group_assign $p $t $i"
- set bx [$p.m bbox $id]
- $p.m lower [$p.m create path [::tkpath::coords rect [lindex $bx 0] [lindex $bx 1] [expr [lindex $bx 2] - [lindex $bx 0]] [expr [lindex $bx 3] - [lindex $bx 1]] -rx 6 -ry 6] -tags [concat group $i bg] -strokewidth 1 -stroke white -fill white -fillopacity 0.5]
- }
- }
-
- proc mat_group_active {p t g} {
- variable _
- set _($t:cg) $g
- foreach n [dict keys $_($t:g)] {
- if {$g == $n} {set cb black; set cl white; set tl 1} {set cb white; set cl [color [dict get $_($t:g) $n color]]; set tl 0.5}
- set idb [$p.m find withtag "group && $n && bg"]
- $p.m itemconfigure $idb -fill $cb -fillopacity $tl -stroke $cl
- set idl [$p.m find withtag "group && $n && lb"]
- $p.m itemconfigure $idl -fill $cl;
- if {$g == $n} {$p.m raise $idb;$p.m raise $idl;}
- }
- }
-
- proc mat_key {p t k b} {
- puts $k
- switch $b {
- 1 {
- switch $k {
- 22 {mat_item_delete $p $t}
- 38 {mat_clip $p $t selecta}
- 53 {mat_clip $p $t cut}
- 54 {mat_clip $p $t copy}
- 55 {mat_clip $p $t paste}
- 97 {mat_viewpoint $p $t {action reset}}
- 98 {mat_viewpoint $p $t {action scroll units -1 axis y}}
- 100 {mat_viewpoint $p $t {action scroll units -1 axis x}}
- 102 {mat_viewpoint $p $t {action scroll units 1 axis x}}
- 104 {mat_viewpoint $p $t {action scroll units 1 axis y}}
- 107 {mat_item_delete $p $t}
- }
- }
-# 0 {
-# switch $k {
-# }
-# }
- }
- }
-
- proc mat_drop {p t dropped x y} {
-# foreach d $dropped {
- foreach d [split $dropped "\n"] {
- set x [mat_tr $p $t x i $x]
- set y [mat_tr $p $t y i $y]
- mat_item_new $p $t - [dict create type sound g 1 v 1 x $x y $y xx $x yy $y filename [regsub -- {^file:[/]+} $d "/"]]
- }
- }
-
- proc mat_new {p t w h bg ln xa xb ya yb qx qy mx my samplerate} {
- variable _
- set sc orange
- foreach xy {x y} {foreach ab {a b} {set ${xy}${ab}o [set ${xy}${ab}]}}
- foreach a {sc ln xa xb ya yb xao xbo yao ybo qx qy mx my samplerate} {set _($t:$a) [set $a]}
- if {[winfo exists $p.m] != 1} {
- canvas $p.m -bg $bg -width $w -height $h
- pack $p.m -side left
- bind $p.m <Key> "::ix::mat_key $p $t %k 1"
- bind $p.m <KeyRelease> "::ix::mat_key $p $t %k 0"
-# dnd bindtarget $p.m text/uri-list <Drop> "::ix::mat_drop $p $t %D %x %y"
- dnd bindtarget $p.m text/plain <Drop> "::ix::mat_drop $p $t %D %x %y"
- bind $p.m <Motion> "::ix::mat_hover $p $t %x %y"
- bind $p.m <4> "::ix::mat_viewpoint $p $t {action scroll units 1 axis x}"
- bind $p.m <5> "::ix::mat_viewpoint $p $t {action scroll units -1 axis x}"
- bind $p.m <Control-4> "::ix::mat_viewpoint $p $t {action zoom dir in axe x x %x y %y}"
- bind $p.m <Control-5> "::ix::mat_viewpoint $p $t {action zoom dir out axe x x %x y %y}"
- bind $p.m <Alt-4> "::ix::mat_viewpoint $p $t {action zoom dir in axe {x y} x %x y %y}"
- bind $p.m <Alt-5> "::ix::mat_viewpoint $p $t {action zoom dir out axe {x y} x %x y %y}"
- bind $p.m <Control-Shift-4> "::ix::mat_viewpoint $p $t {action zoom dir in axe y x %x y %y}"
- bind $p.m <Control-Shift-5> "::ix::mat_viewpoint $p $t {action zoom dir out axe y x %x y %y}"
- bind $p.m <Shift-4> "::ix::mat_viewpoint $p $t {action scroll units -1 axis y}"
- bind $p.m <Shift-5> "::ix::mat_viewpoint $p $t {action scroll units 1 axis y}"
- foreach m {"Control-" "" "Shift-" "Double-"} {
- foreach bn {1 2 3} {
- set b [list [concat $bn first] [concat B${bn}-Motion motion] [concat ButtonRelease-$bn release]]
- foreach ba {0 1 2} {
- bind $p.m <$m[lindex [lindex $b $ba] 0]> "::ix::mat_click [list [string tolower [string trimright $m -1]]] $bn [lindex [lindex $b $ba] 1] $p $t %x %y %X %Y"}}}
- set bd [expr {[$p cget -bd] * 2}]
-# update
- $p configure -bg gray -width [expr {[winfo width $p.m] + $bd}] -height [expr {[winfo height $p.m] + $bd}]
- $p.m create text {20 20} -fill blue -justify left -anchor w -font {{bitstream vera sans} 18} -tags mode -text move_canvas
- $p.m create text [list [expr {$w / 2.}] 5] -fill red -justify center -anchor n -font {{bitstream vera sans} 14} -tags q -text q
- $p.m create path "M 0 0" -tags lX -stroke black -strokeopacity 0.5
- $p.m create path "M 0 0" -tags lY -stroke black -strokeopacity 0.5
- $p.m create text "10 $h" -fill red -justify left -anchor sw -font {{bitstream vera sans} 12 bold} -fill purple -tags loc -text ""
- if {[info exists _($t)] != 1} {
- set _($t) {}
- set _($t:g) {}
- set af 0; set i -1; set sel {}
- foreach a {af i sel} {set _($t:$a) [set $a]}
- mat_group_new $p $t default
- mat_group_new $p $t wavs
- }
- }
- mat_gridlines $p $t
- mat_item_draw $p $t all
- mat_groups_view $p $t
- }
-
- proc mat_gridlines {p t} {
- variable _
- set w $p.m
- $w delete gridlines
- set gh [winfo height $w]
- set gw [winfo width $w]
- foreach item [$w find withtag gridline] {$w delete $item}
- foreach xy {x y} {
- array set ta {x n y w}
- array set tj {x center y left}
- array set igx {y width x height}
- set range [expr {abs($_($t:${xy}b) - $_($t:${xy}a))}]
- set numshits [expr {$range / $_($t:q$xy)}]
- if {$numshits > $_($t:m${xy})} {set factor [expr {int($numshits / ($_($t:m${xy}) + 0.0) + 1)}]} else {
- set factor [expr {1. / (int(1./($numshits / ($_($t:m${xy}) + 0.0) + 0.0)) + 0.0)}]
- }
- set increment [expr {$_($t:q${xy}) * $factor}]
- for {set x [expr {int($_($t:${xy}a) / ($increment + 0.0) + 1)*($increment + 0.0)}]} {[expr {$_($t:${xy}a) > $_($t:${xy}b) ? $x >= $_($t:${xy}b) : $x <= $_($t:${xy}b)}]} {set x [expr {$_($t:${xy}a) > $_($t:${xy}b) ? $x - $increment : $x + $increment}]} {
- set og [mat_tr $p $t $xy t $x]
- set invgeo [winfo $igx($xy) $w]
- switch $xy {
- y {set coords [concat M [expr {int(rand()*23)}] $og L $invgeo $og]}
- x {set coords [concat M $og [expr {int(rand()*16)}] L $og $invgeo]}}
-# y {set coords [concat M 0 $og L $invgeo $og]}
-# x {set coords [concat M $og 0 L $og $invgeo]}}
- $w lower [$w create text [lrange $coords 1 2] -font {{Bitstream Vera Sans} 8} -fill [rc] -anchor $ta($xy) -text [string range $x 0 7] -justify $tj($xy) -tags gridline]
- $w lower [$w create path $coords -stroke $_($t:ln) -strokedasharray [expr {int(rand()*42 + 1)}] -tags gridline -strokewidth 1]
- }}}}
-
-#> mat frame
-#. -bd 3 #w 384 #h 144 #bg gray86 #ln white
-#. #samplerate 44100
-#. #Xa 123 #Xb 2000 #Ya 127 #Yb 0 #qx 50 #qy 1 #mx 12 #my 64
-#. @add ::ix::mat_item_new .- .| .#1 {type .#2}
-#. @update ::ix::mat_item_ua .- .| .#1 abs {.#2 .#3} 1
-#. @updaterel ::ix::mat_item_ua .- .| .#1 rel {.#2 .#3} 1
-#. @up ::ix::mat_item_ua .- .| .#1 abs {.#2 .#3} 0
-#. @uprel ::ix::mat_item_ua .- .| .#1 rel {.#2 .#3} 0
-puts "mat .- .|"
-::ix::mat_new .- .| .#w .#h .#bg .#ln .#Xa .#Xb .#Ya .#Yb .#qx .#qy .#mx .#my .#samplerate
-#bind .-.m <Enter> {focus .-.m}
-bind .-.m <Leave> {focus .^.c}