You are not going to be able to do this due to the nature of the widget you are using. As I am sure you notice when you click any parent or child in the tree you get the entire frame highlighted. It is double clicking on this frame that performs the specified action. You cannot isolate the + or - by itself because it is part of the widget and frame.

What you might want to try is to change the -command=>\&addSelected to not transfer from left to right upon activation and also change the -command=>\&removeSelected to also not remove when acticated. Just stick with the drag and drop to transfer and possibly create an alt click (right click) menu to signify the delete function or also use the drag and drop function to remove from the "Selected Files" side.

I know neither of these ways are probably what you are looking for but the widget you chose to use is limited in this way. I am sure there is a more advanced method of mapping two frames on a single line and having the + be in a seperate frame but this should give you something to go off of. Maybe one of the other monks will devote more time to giving you a more viable solution.

Here is a simple solution that worked somewhat how you wanted it to.

use Tk; require Tk::DirTree; require Tk::DragDrop; require Tk::DropSite; require Tk::LabFrame; my $CalTreeWidth = 30; my $CalTreeHeight = 20; my $selectionWidth = 30; my $selectionHeight = 8; my $p1 = MainWindow->new(); our($CalTree, $listbox); my $leftFrame = $p1->LabFrame(-label=>"System Configuration", -labelsi +de=>"acrosstop") ->pack(-side=>"left",-fill=>'y', -anchor=>"nw"); my $CalTreeScrollBarY = $leftFrame->Scrollbar(); my $CalTreeScrollBarX = $leftFrame->Scrollbar(-orient=>"horiz"); $CalTree = $leftFrame->Tree(-yscrollcommand=>['set',$CalTreeScrollBarY +], -xscrollcommand=>['set',$CalTreeScrollBarX] +, -width=>$CalTreeWidth, -height=>$CalTreeHeight, -drawbranch=>1, -selectmode=>"extended", -command=>\&addSelected); $CalTreeScrollBarY->configure(-command=> [yview=>$CalTree]); $CalTreeScrollBarX->configure(-command=> [xview=>$CalTree]); $CalTree->DragDrop(-event => '<B1-Motion>', -text => "", -sitetypes => qw(Local)); $CalTree->DropSite(-droptypes => qw(Local), -dropcommand => [\&removeSelected]); $CalTreeScrollBarX->pack(-side=>"bottom",-fill=>"x"); $CalTree->pack(-side=>"left",-fill=>"both"); $CalTreeScrollBarY->pack(-side=>"left",-fill=>"y"); my $selFrame = $p1->LabFrame(-label=>"Selected Items", -labelside=>"ac +rosstop") ->pack(-fill=>"y", -expand=>1); my $listboxScrollBarY = $selFrame->Scrollbar(); my $listboxScrollBarX = $selFrame->Scrollbar(-orient=>"horiz"); $listbox = $selFrame->Tree(-width=>$selectionWidth,-height=>$selection +Height,-drawbranch=>1, #-command=>\&removeSelected, -selectmode=>"extended", -yscrollcommand=>['set',$listboxScrollBarY], -xscrollcommand=>['set',$listboxScrollBarX] ); $listboxScrollBarY->configure(-command=> [yview=>$listbox]); $listboxScrollBarX->configure(-command=> [xview=>$listbox]); $listbox->DropSite(-droptypes => qw(Local), -dropcommand => [\&addSelected]); $listbox->DragDrop(-event => '<B1-Motion>', -text => "", -sitetypes => qw(Local)); $listboxScrollBarX->pack(-side=>"bottom",-fill=>"x"); $listbox->pack(-side=>"left",-fill=>"both"); $listboxScrollBarY->pack(-side=>"right",-fill=>"y"); $CalTree->add("parent", -text=>"parent1111"); $CalTree->addchild("parent", -text=>"child1"); $CalTree->addchild("parent.0", -text=>"grandchild1"); $CalTree->addchild("parent.0", -text=>"grandchild2"); $CalTree->addchild("parent", -text=>"child2"); $CalTree->addchild("parent.1", -text=>"grandchild1"); $CalTree->addchild("parent.1", -text=>"grandchild2"); $CalTree->autosetmode(); MainLoop; sub addSelected { print "InterncalCal.pm: addSelected()\n"; foreach ($CalTree->info("selection")) { print " Found selected: " . $CalTree->entrycget($_,"-text") . " +\n"; my $item = $CalTree->entrycget($_,"-text"); if ($CalTree->info("parent",$_) eq ""){ # has no parent, so selection must have been 'root'. In other wo +rds, 'select all' foreach($CalTree->info("children", $_)){ my $parent = $CalTree->entrycget($_,"-text"); next if ($CalTree->entrycget($_,"-state") eq "disabled"); if (!$listbox->info("exists",$parent)){ $listbox->add("$parent", -text=>$parent); # if parent does n +ot exist, create him first } foreach($CalTree->info("children", $_)){ my $no = 0; my $item = $CalTree->entrycget($_,"-text"); foreach($listbox->info("children", $parent)){ $no++ if ($listbox->entrycget($_,"-text") eq $item); #if b +oth parent and child exist, no need to add again } if (!$no){ $listbox->addchild($parent,-text=>$item); # add item if do +es not already exists } } } } else { my $parent = $CalTree->entrycget($CalTree->info("parent",$_), "- +text"); if ($parent =~ /\d{4}/){ # since we are not tracking from root (which contains 4 digits +, this item should be at the root of the selection list if (!$listbox->info("exists",$item)){ # add item to list if do +es not exist $listbox->add("$item", -text=>$item); } foreach my $child ($CalTree->info('children',$_)){ #add all of + its children as well my $no = 0; my $childname = $CalTree->entrycget($child,"-text"); foreach ($listbox->info('children',$item)){ $no++ if ($listbox->entrycget($_,"-text") eq $childname); } if (!$no){ $listbox->addchild($item,-text=>$childname); } } } else { if ($listbox->info("exists",$parent)){ foreach($listbox->info("children", $parent)){ return if ($listbox->entrycget($_,"-text") eq $item); #if +both parent and child exist, no need to add again } } else { $listbox->add("$parent", -text=>$parent); # if parent does n +ot exist, create him first } $listbox->addchild($parent,-text=>$item); # add item } } } $listbox->autosetmode(); } sub removeSelected { print "InterncalCal.pm: removeSelected()\n"; my @toplevel; foreach ($listbox->info("selection")){ print " Found selected: " . $listbox->entrycget($_,"-text") . " +\n"; # don't remove the top level ones until all the selected items und +erneath have been removed # this is a hack !!! if ($listbox->entrycget($_,"-text") !~ /\s/){ push @toplevel, $_; next; } $listbox->delete("entry",$_); } $listbox->delete("entry",$_) foreach(@toplevel); $listbox->autosetmode(); }
Basically I just cleaned up your formatting a bit and commented out the command function of the left side Lab Frame widget.
www.perlskripts.com

In reply to Re: Re: Re: Tk::Tree double click on + by Elijah
in thread Tk::Tree double click on + by gri6507

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.