RE: Drag and Drop in Tkx

[email protected] ("Konovalov, Vadim (Vadim)** CTR **")
Newsgroups perl.tcltk
Message-ID <35BF8D9716175C43BB9D67CA60CC345E1220F6D0@FRMRSSXCHMBSC2.dc-m.alcatel-lucent.com>
> Here's a new thread with a suggestion to include the results 
> in the Tkx
> documentation (following an earlier thread on documentation issues).
> How do we do drag and drop in Tkx? Does anyone have a simple 
> script that
> demonstrates this for, say, a listbox widget that allows 
> dropping in file
> names from folders on the desktop (in Windows, Mac, and 
> Linux)? Or, a text
> widget that allows dropping in the contents of files from a 
> simple text
> file.

I have no Tkx usage, but I'll share my more generic Tcl.pm way.

For intra-application DND, you need to use widgets that support that.
For example, BWidgets support this, so may be we could easily develop a Tkx example with BWidgets DND.

In my applications I use another way.

I use tkdnd http://wiki.tcl.tk/2768, which allows me dropping items from external applications.

It happened this way that I am using two ways of doing DND in my applications, both ways based on the same engine under the hood.

The newer way, which I currently prefer, involves some pure-tcl code, which I mostly copy-pasted from eslewhere..
Here is pure-tcl code that I feed to tcl/tk:

package require tkdnd

#the line below is just creating a widget - no "dnd" consideration
pack [entry .frTop1.current_dir -textvariable ptclv_current_dir] -side left -fill x -expand 1

# and this actually makes DND work
tkdnd::drop_target register .frTop1.current_dir *
bind .frTop1.current_dir <<Drop:DND_Files>> {
    set ptclv_current_dir [lindex %D 0]
    ptcl_refresh
}
.......
EOF

Then I even do not bother about widget .frTop1.current_dir - it has DND, binded to variable so I do not even expose widget itself to my perl program.
I do expose other widgets, however.

This approach will suit for Tkx module as well - it is front-end syntax agnostic.

Another, elder way, which I do not prefer anymore, uses Tcl::Tk syntax, and technically it is absolytely the same.

    $interp->packageRequire('tkdnd','2.0');

    my $w_curdir = $frame->Entry(-textvariable=>\$var)->pack(-side=>'left',-expand=>1,-fill=>'x');
    $interp->tkdnd__drop_target(register => $w_curdir, "*");
    $w_curdir->bind('<<Drop:DND_Files>>', \\'D', sub {
	    my (undef,undef,undef,$data) = @_;
	    ($$cwd_r) = $interp->SplitList($data);
	});

> Even in Tcl, this seems to be a poorly documented issue.

Things are not that bad if you know where to search :)

BWidgets is well-documented, so if you need inter-app DND, then it will suffice.

Usually Jeff tell us about which packages are poorly supported and which are not, and IIRC he said BWidgets are o-kay to use :)

BR,
Vadim.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.