Thread Suche: Tabelle mit DragDrop-Funktionalität
(31 answers)
Opened by
GoodFella
at 2007-01-09 21:27
User since 2007-01-09
192
Artikel
BenutzerIn
Habe mich jetzt ein bischen mit Drag-Scrollen beschäftigt: von Tk::TableMatrix gibt es die Methoden scanMark und scanDragto; leider ist das einzige, was meine Test zum Effekt hatten, eine vertikale Scrollbewegung (nur nach unten) bei jeder noch so kleinen Mausbewegung. Ich möchte, dass wenn ich ein Element am draggen bin und über den Rand der Tablle hinausgehe, dass die Tabelle dann langsam in diese Richtung scrollt.
Habe dann weitergegoogled, bin auf <Leave> und <Enter> gestossen; daraus habe ich folgendes Script gebaut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
#!/usr/local/bin/perl -w
use Tk; use Tk::TableMatrix; require Tk::JBrowseEntry; require Tk::DragDrop; require Tk::DropSite; use strict;
my $tm_array = {}; my $t; my @drag = (); my @drop = ();
sub switch_cells { if ($drag[0] == $drop[0]) # Selbe Zeile { if ($drag[1] >= 0) # Kein Titel { my $drag_coords = $drag[0].','.$drag[1]; my $drop_coords = $drop[0].','.$drop[1]; my $drag_val = $tm_array->{$drag_coords}; my $drop_val = $tm_array->{$drop_coords};
$t->set($drop_coords, $drag_val); $tm_array->{$drop_coords} = $drag_val;
$t->set($drag_coords, $drop_val); $tm_array->{$drag_coords} = $drop_val; } } }
my $start_row = -3; my $end_row = 50; my $start_col = 0; my $end_col = 50; my $display_cols = 10; my $display_rows = 10; my $nr_rows = $end_row - $start_row + 1; my $nr_cols = $end_col - $start_col + 1; my $title_rows = ($start_row < 0) ? (abs($start_row)) : (0); my $title_cols = ($start_col < 0) ? (abs($start_col)) : (0);
foreach my $row (($start_row - $title_rows)..$end_row) { foreach my $col (($start_col - $title_cols)..$end_col) { $tm_array->{"$row,$col"} = "$row:$col"; } }
my $top = MainWindow->new; $top->geometry('870x300');
$top->bind( '<MouseWheel>', [ sub { $_[0]->yviewScroll(-($_[1]/120)*3, 'units'); }, Tk::Ev('D') ] );
$t = $top->Scrolled( 'TableMatrix', -titlerows => $title_rows, -titlecols => $title_cols, -rows => $nr_rows, -cols => $nr_cols, -height => $display_rows, -width => $display_cols, -variable => $tm_array, -roworigin => $start_row, -colorigin => $start_col, -colstretchmode => 'none', -rowstretchmode => 'none', -selectmode => 'single', -drawmode => 'fast', -maxwidth => 800, -maxheight => 600, -rowheight => -20, -colwidth => -200, -resizeborders => 'none', -sparsearray => 0, -selecttitle => 0, -state => 'disabled', -font => ['Tahoma', 10, 'bold'], -bg => '#D4D0C8', -fg => '#000000' );
$t->tagConfigure('Normal', -bg => '#D4D0C8', -fg => 'black'); $t->tagConfigure('DragSelected', -bg => '#EEEE11', -fg => 'black'); #$t->tagConfigure('DarkRed', -bg => '#881111', -fg => 'black'); #$t->tagConfigure('LightRed', -bg => '#EE9999', -fg => 'black'); #$t->tagConfigure('DarkGreen', -bg => '#118888', -fg => 'black'); #$t->tagConfigure('LightGreen', -bg => '#99EEEE', -fg => 'black');
my $cb_use = $t->Checkbutton( -text => 'nutzen' ); my @test_arr = ( 'TEXT', 'ZAHL', '#.## ¤', '#.## ¤ / # ¤', 'PLZ', 'TT.MM.JJJJ', 'TT.MM.JJ' ); my $test_var = $test_arr[0]; my $be_format = $t->JBrowseEntry( -label => '', -variable => \$test_var, -choices => \@test_arr, -state => 'normal', -font => ['Tahoma', 8], -width => 10 ); my $lbl_hl = $top->Label(-text => "Headline");
$t->windowConfigure("-3,0", -window=>$cb_use); $t->windowConfigure("-2,0", -window=>$be_format); $t->windowConfigure("-1,0", -window=>$lbl_hl);
$top->bind( '<B1-Motion>', [ \&dragscroll ] ); sub dragscroll { my @coords = (($t->pointerx - $t->rootx), ($t->pointery - $t->rooty)); }
my ($dnd_t, $ds_t); $dnd_t = $t->DragDrop( -event => '<B1-Motion>', -sitetypes => [qw(Local)], -startcommand => sub { my @coords = split(",", $t->index('@'.($t->pointerx - $t->rootx).','.($t->pointery - $t->rooty))); if (($coords[0] >= 0) and ($coords[1] >= 0)) { $t->tagCell('Normal', $drop[0].','.$drop[1]) if (@drop); $t->tagCell('Normal', $drag[0].','.$drag[1]) if (@drag); @drag = @coords; $dnd_t->configure( -text => $tm_array->{$drag[0].','.$drag[1]} ); $t->tagCell('DragSelected', $drag[0].','.$drag[1]); return 0; } else { return(1); } } ); $ds_t = $t->DropSite ( -droptypes => ['Local'], -dropcommand => sub { @drop = split(",", $t->index('@'.($t->pointerx - $t->rootx).','.($t->pointery - $t->rooty))); $t->tagCell('Normal', $drag[0].','.$drag[1]); $t->tagCell('DragSelected', $drop[0].','.$drop[1]); &switch_cells; } );
my $btn_dragscroll_left = $top->Button( -text => chr(0x37), -width => 1, -height => 13, -font => ['Webdings', 7], -relief => 'raised' ); my $btn_dragscroll_right = $top->Button( -text => chr(0x38), -width => 1, -height => 13, -font => ['Webdings', 7], -relief => 'raised' );
my $button = $top->Button( -text => 'Exit', -width => 135, -command => sub{ $top->destroy } );
$btn_dragscroll_left->place( -x => 1, -y => 20 ); $t->place( -x => 20, -y => 20 ); $btn_dragscroll_right->place( -x => 842, -y => 20 );
my $inside_scroll = 0; $btn_dragscroll_left->bind( '<Enter>', [ sub { $inside_scroll = 1; $btn_dragscroll_left->configure( -relief => 'sunken' ); while($inside_scroll == 1) { $t->xviewScroll(-1, 'units'); $t->after(100); $t->update; } } ] ); $btn_dragscroll_left->bind( '<Leave>', [ sub { $inside_scroll = 0; $btn_dragscroll_left->configure( -relief => 'raised' ); } ] );
$btn_dragscroll_right->bind( '<Enter>', [ sub { $inside_scroll = 1; $btn_dragscroll_right->configure( -relief => 'sunken' ); while($inside_scroll == 1) { $t->xviewScroll(1, 'units'); $t->after(100); $t->update; } } ] ); $btn_dragscroll_right->bind( '<Leave>', [ sub { $inside_scroll = 0; $btn_dragscroll_right->configure( -relief => 'raised' ); } ] );
$button->place( -x => 20, -y => 260 );
Tk::MainLoop;
Momentan passiert folgendes: Wenn man mit dem Mousebutton über den entsprechenden Buttons ist, scrollt die Tabelle langsam. Geht man jedoch mit gedrückter Maustaste über die Buttons, passiert gar nichts.
Jemand eine Idee, wie man das hinbekommen könnte? Wär auch für eine Alternative dankbar, was ich da zusammengebaut habe, ist alles andere als sauber (update in ner while-schleife)
[edit]Habe gerade herausgefunden, dass TableMatrix von alleine drag-scrollt, und zwar wenn man die Shift-Taste gedrückt hält. Leider beendet das Drücken der Shift-Taste auch jegliches Draggen.[/edit]\n\n
<!--EDIT|GoodFella|1168804187-->
View full thread Suche: Tabelle mit DragDrop-Funktionalität
|