summaryrefslogtreecommitdiff
path: root/blt/demos/dragdrop2.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'blt/demos/dragdrop2.tcl')
-rwxr-xr-xblt/demos/dragdrop2.tcl183
1 files changed, 183 insertions, 0 deletions
diff --git a/blt/demos/dragdrop2.tcl b/blt/demos/dragdrop2.tcl
new file mode 100755
index 00000000000..eb3c1674b10
--- /dev/null
+++ b/blt/demos/dragdrop2.tcl
@@ -0,0 +1,183 @@
+#!../src/bltwish
+
+package require BLT
+
+
+# --------------------------------------------------------------------------
+# Starting with Tcl 8.x, the BLT commands are stored in their own
+# namespace called "blt". The idea is to prevent name clashes with
+# Tcl commands and variables from other packages, such as a "table"
+# command in two different packages.
+#
+# You can access the BLT commands in a couple of ways. You can prefix
+# all the BLT commands with the namespace qualifier "blt::"
+#
+# blt::graph .g
+# blt::table . .g -resize both
+#
+# or you can import all the command into the global namespace.
+#
+# namespace import blt::*
+# graph .g
+# table . .g -resize both
+#
+# --------------------------------------------------------------------------
+if { $tcl_version >= 8.0 } {
+ namespace import blt::*
+ namespace import -force blt::tile::*
+}
+source scripts/demo.tcl
+
+if { ([info exists tcl_platform]) && ($tcl_platform(platform) == "windows") } {
+ source scripts/send.tcl
+ SendInit
+ SendVerify
+}
+
+# ----------------------------------------------------------------------
+# This procedure is invoked each time a token is grabbed from the
+# sample window. It configures the token to display the current
+# color, and returns the color value that is later passed to the
+# target handler.
+# ----------------------------------------------------------------------
+
+proc package_color {token} {
+ set bg [.sample cget -background]
+ set fg [.sample cget -foreground]
+
+ $token.label configure -text "Color" -background $bg -foreground $fg
+ return $bg
+}
+
+# ----------------------------------------------------------------------
+# This procedure is invoked each time a token is grabbed from an
+# entry widget. It configures the token to display the current
+# string, and returns the string that is later passed to the target
+# handler.
+# ----------------------------------------------------------------------
+proc package_string {str token} {
+ if {[string length $str] > 20} {
+ set mesg "[string range $str 0 19]..."
+ } else {
+ set mesg $str
+ }
+ $token.label configure -text $mesg
+ return $str
+}
+
+# ----------------------------------------------------------------------
+# Main application window...
+# ----------------------------------------------------------------------
+label .sample -text "Color" -height 2 -borderwidth 3 -relief sunken
+
+#
+# Set up the color sample as a drag&drop source for "color" values
+# and "string" values
+#
+drag&drop source .sample -packagecmd {package_color %t}
+drag&drop source .sample handler color
+drag&drop source .sample handler string
+
+#
+# Set up the color sample as a drag&drop target for "color" values:
+#
+drag&drop target .sample handler color {set_color %v}
+
+#
+# Establish the appearance of the token window:
+#
+set token [drag&drop token .sample -activebackground yellow ]
+label $token.label -text "Color"
+pack $token.label
+
+scale .redScale -label "Red" -orient horizontal \
+ -from 0 -to 255 -command adjust_color
+frame .redSample -width 20 -height 20 -borderwidth 3 -relief sunken
+
+scale .greenScale -label "Green" -orient horizontal \
+ -from 0 -to 255 -command adjust_color
+frame .greenSample -width 20 -height 20 -borderwidth 3 -relief sunken
+
+scale .blueScale -label "Blue" -orient horizontal \
+ -from 0 -to 255 -command adjust_color
+frame .blueSample -width 20 -height 20 -borderwidth 3 -relief sunken
+
+frame .color
+label .color.label -text "Color:"
+pack .color.label -side left
+entry .color.value -width 10
+pack .color.value -side left -expand yes -fill both
+
+bind .color.value <KeyPress-Return> {set_color [%W get]}
+
+#
+# Set up the entry widget as a drag&drop source for "string" values:
+#
+drag&drop source .color.value \
+ -packagecmd {package_string [%W get] %t} \
+ -selftarget yes
+drag&drop source .color.value handler string
+
+#
+# Set up the entry widget as a drag&drop target for "string" values:
+#
+drag&drop target .color.value handler string {
+ %W delete 0 end
+ %W insert 0 "%v"
+}
+
+#
+# Establish the appearance of the token window:
+#
+set token [drag&drop token .color.value]
+label $token.label
+pack $token.label
+
+# ----------------------------------------------------------------------
+# This procedure loads a new color value into this editor.
+# ----------------------------------------------------------------------
+proc set_color {cval} {
+ set rgb [winfo rgb . $cval]
+
+ set rval [expr round([lindex $rgb 0]/65535.0*255)]
+ .redScale set $rval
+
+ set gval [expr round([lindex $rgb 1]/65535.0*255)]
+ .greenScale set $gval
+
+ set bval [expr round([lindex $rgb 2]/65535.0*255)]
+ .blueScale set $bval
+}
+
+# ----------------------------------------------------------------------
+# This procedure is invoked whenever an RGB slider changes to
+# update the color samples in this display.
+# ----------------------------------------------------------------------
+proc adjust_color {args} {
+ set rval [.redScale get]
+ .redSample configure -background [format "#%.2x0000" $rval]
+ set gval [.greenScale get]
+ .greenSample configure -background [format "#00%.2x00" $gval]
+ set bval [.blueScale get]
+ .blueSample configure -background [format "#0000%.2x" $bval]
+
+ .sample configure -background \
+ [format "#%.2x%.2x%.2x" $rval $gval $bval]
+ if {$rval+$gval+$bval < 1.5*255} {
+ .sample configure -foreground white
+ } else {
+ .sample configure -foreground black
+ }
+}
+
+table . \
+ 0,0 .sample -columnspan 2 -pady {0 4} \
+ 1,0 .color -columnspan 2 -padx 4 -pady 4 \
+ 2,0 .redScale \
+ 2,1 .redSample \
+ 3,0 .greenScale \
+ 3,1 .greenSample \
+ 4,0 .blueScale \
+ 4,1 .blueSample
+
+eval table configure . [winfo children .] -fill both