use warnings; use strict; use Tk; use Tk::Table; use Data::Dumper; my $buttonsPerRow = 5; $buttonsPerRow -= 1; #button numbering starts from 0... my $row = 0; my $col = 0; my $buttonNum = 0; my @buttons; my $mw = tkinit(); my $menuFrame = $mw->Frame()->pack(-expand=>1,-fill=>'both'); my $buttonFrame = $mw->Frame()->pack(-expand=>1,-fill=>'both'); my $table = $buttonFrame->Table( -columns => 5, -scrollbars => 'se', -fixedrows => 1, )->pack(-expand=>1,-fill=>'both'); my $addButton = $menuFrame->Button( -text => 'Add Button', -command => sub{ $buttons[$buttonNum] = $table->Button(); $col>$buttonsPerRow?$row++:undef; $col>$buttonsPerRow?$col=1:$col++; print "Button $buttonNum->$row:$col\n"; $buttons[$buttonNum]{'row'} = $row; $buttons[$buttonNum]{'col'} = $col; $table->put($row,$col,$buttons[$buttonNum]); configureButton($buttonNum); $buttonNum++; }, )->pack(-side=>'top'); ################################ #DragNDrop my $isDragging = 0; #boolean - left mouse button pressed and dragging my $selectedButton = 0; $mw->bind('', \&motion); my %tableRows; my %tableCols; ################################ $mw->MainLoop(); sub configureButton{ #configure the new button my $btnNum = shift; $buttons[$btnNum]->bind('', sub{ $selectedButton = $btnNum; } ); $buttons[$btnNum]->configure( -text => "Button $btnNum", -command => sub{ print "Button $btnNum pressed\n"; } ); $buttons[$btnNum]->bind('', \&buttonPress); $buttons[$btnNum]->bind('', \&buttonRelease); } sub motion { #what to do when the mouse is moving my($widget) = @_; my $e = $widget->XEvent;#get Tk Event if ($isDragging){ findCell($e->X,$e->Y); #get mouse cursor X/Y coorinates from event } return unless $isDragging; } sub buttonPress { #what to do when the left mouse button is pressed undef %tableRows; #undefine %tableRows hash in case row height has changed undef %tableCols; #undefine %tableCols hash in case column width has changed for(my $btnNum=0;$btnNum<@buttons;$btnNum++){ #recreate %tableRows and %tableCols - key=XY_coordinate val=row/col_number $tableRows{$buttons[$btnNum]->rooty} = $buttons[$btnNum]{'row'}; $tableCols{$buttons[$btnNum]->rootx} = $buttons[$btnNum]{'col'}; } $isDragging = 1; #Debugging... show root location of each row and column #foreach my $key (sort keys %tableRows){ # print "$key\n"; #} #print "------\n"; #foreach my $key (sort keys %tableCols){ # print "$key\n"; #} } sub buttonRelease { #what to do when the left mouse button is released $isDragging = 0; } sub findCell{ my $tmpX = shift; my $tmpY = shift; print "$tmpX:$tmpY\n"; #determine which row and column the mouse cursor is currently hovering over # based on mouse X/Y coordinates. }