Thread 3 TableMatrix Probleme... (21 answers)
Opened by zipster at 2006-02-20 14:26

ptk
 2006-02-21 10:01
#45249 #45249
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich habe dein Skript etwas verfeinert:
* keine Verwendung von absoluten Zahlen wie 2, sondern die aktuellen Werte von borderwidth und highlightthickness
* Fix beim Ausrechnen der @x_coords
* Versuch, das Entry exakt auf die Zelle zu positionieren. Außerdem ist das Entry jetzt weiß, wie das sonstige HList, und hat keinen Rahmen mehr.
* Füllen des Entries mit dem aktuellen Zellwert
Unter X11 sieht das jetzt anständig aus, unter Windows könnten vielleicht Widgets verschoben sein. Man müsste jetzt noch den Cursor im Entry richtig positionieren (Fleißarbeit, Benutzung von index() und fontMeasure()) und vielleicht ein <Return>-binding ans Entry hängen.

Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
use Tk::HList;
use Tk::ItemStyle;

my $mw = MainWindow->new();
my $hlist = $mw->Scrolled("HList",
-header => 1,
-columns => 4,
-scrollbars => 'osoe',
-width => 70,
-selectbackground => 'SeaGreen3',
-background => 'white',
)
->pack();


my $headerstyle = $hlist->ItemStyle('window',
-padx => 0,
-pady => 0,
);

my $btn_from = $hlist->Button(-text => 'From', -relief => 'flat', -command => [ \&MyTk::HList::order, 0, 0 ]);
my $btn_subj = $hlist->Button(-text => 'Subject', -relief => 'flat', -command => [ \&MyTk::HList::order, 1, 0 ]);
my $btn_date = $hlist->Button(-text => 'Date', -relief => 'flat', -command => [ \&MyTk::HList::order, 2, 0 ]);
my $btn_size = $hlist->Button(-text => 'Size', -relief => 'flat', -command => [ \&MyTk::HList::order, 3, 1 ]);

$hlist->header('create', 0, -itemtype => 'window', -widget => $btn_from, -style => $headerstyle);
$hlist->header('create', 1, -itemtype => 'window', -widget => $btn_subj, -style => $headerstyle);
$hlist->header('create', 2, -itemtype => 'window', -widget => $btn_date, -style => $headerstyle);
$hlist->header('create', 3, -itemtype => 'window', -widget => $btn_size, -style => $headerstyle);

my @x_coords = ($hlist->cget(-borderwidth) + $hlist->cget(-highlightthickness));

my @mails = (['test@email.de', 'Re:HList?', '1999-11-20', '1432'],
["dummy\@foo.com", "Re: HList?", "1999-11-21", "2335"],
['abc@foo.com', 'Re: Re: HList xxx?', '2004-10-12', '965'],
);

for my $index (0..$#mails) {
$hlist->add($index);
for my $textin (0..scalar(@{$mails[$index]}-1)) {
$hlist->itemCreate($index, $textin,
-text => $mails[$index]->[$textin],
);
}
}

my $x = $x_coords[0];
for(0..3){
$x += $hlist->columnWidth($_);
push(@x_coords,$x);
}
print $_,"\n" for(@x_coords);

my $entry;
$hlist->bind('<Double-1>',[\&MyTk::HList::edit,Ev('x'),Ev('y')]);
$hlist->bind('<Button-1>',sub{if(defined $entry){$entry->destroy();$entry = undef}});

MainLoop();


# -----------------------------------------------------------------------------

package MyTk::HList;

my $last_btn;
my $switch;

BEGIN {
$last_btn = -1;
$switch = 0;
}

sub order {
my ($which, $numorder) = @_;

$hlist->delete('all');

my @sorted_mails = $numorder
? sort{$a->[$which] <=> $b->[$which]} @mails
: sort{$a->[$which] cmp $b->[$which]} @mails;

if ($which == $last_btn) {
$switch = 1 if $switch == 0;
$switch = -$switch;
@sorted_mails = reverse @sorted_mails if $switch == -1;
}
else {
$last_btn = $which;
$switch = 0;
}

for my $index(0..$#sorted_mails) {
$hlist->add($index);
for my $textin(0..scalar(@{$sorted_mails[$index]}-1)) {
$hlist->itemCreate($index, $textin,
-text => $sorted_mails[$index]->[$textin],
);
}
}
}

sub edit{
my ($hlist,$x,$y,$entryref) = @_;
my ($col,$width);
my $entryPath = $hlist->nearest($y);
if($hlist->info('exists',$entryPath)){
($col) = grep{$x > $x_coords[$_] && $x <= $x_coords[$_+1]}0..scalar(@x_coords)-1;
$width = $x_coords[$col+1] - $x_coords[$col];
print "X: $x .. Col: ",$col," -> ",$x_coords[$col],"/",$x_coords[$col+1]," .. Width: ",$width,"\n";
}
$y = ($hlist->infoBbox($entryPath))[1];
my $y2 = ($hlist->infoBbox($entryPath))[3];
my $height = $y2-$y;
my $e = $hlist->itemCget($entryPath, $col, -text);
$entry = $hlist->Entry(-textvariable => \$e, -borderwidth => 0, -bg => $hlist->cget(-bg))->place('-x' => $x_coords[$col], '-y' => $y + $btn_from->height + $hlist->cget(-highlightthickness) + $hlist->cget(-borderwidth), -width => $width, -height => $height);
# XXX an die richtige Stelle positionieren: $entry->index(...);
}

View full thread 3 TableMatrix Probleme...