GSM-Gnokii
view release on metacpan or search on metacpan
lib/GSM/Gnokii/Tk/GSMTree.pm view on Meta::CPAN
$path =~ s{/\.(/|$)}{/}; # /. & /./ => /
$path =~ s{/+\*?$}{}; # /foo/ & /foo/* => /foo
$path =~ s{^$}{/};
$path;
} # _cleanpath
sub DirCmd
{
my ($w, $dir, $showhidden) = @_;
my $pd = $w->privateData;
my $mt = ($dir =~ s{^([AB]):}{}) ? $mt{$1} : $pd->{memtype} // "ME";
$dir = _cleanpath ($dir);
# print STDERR "DirCmd ($mt, $dir, 1)\n";
my $dt;
if ($dt{$mt}{$dir}) {
# print STDERR "Get from cache\n";
$dt = $dt{$mt}{$dir};
}
else {
(my $gdir = $dir) =~ s{/+$}{};
$gdir =~ s{/}{\\}g;
$dt = $pd->{gsm}->GetDir ($mt, $gdir, 1) or return;
ref $dt eq "HASH" or return;
# Clean up
if ($dt->{tree} && ref $dt->{tree} eq "ARRAY") {
my @tree = grep { $_->{id} } @{$dt->{tree}};
if (@tree) {
$dt->{tree} = \@tree;
}
else {
delete $dt->{tree};
}
}
$dt{$mt}{$dir} = $dt; # Cache!
}
my @names = map { $_->{name} } @{$dt{$mt}{$dir}{tree}//[]} or return;
# print STDERR "Names: (@names)\n";
$showhidden or @names = grep !m/^[.]/ => @names;
return @names;
} # DirCmd
*dircmd = \&DirCmd;
sub directory
{
my ($w, $key, $val) = @_;
# print STDERR "directory ...\n";
# We need a value for -image, so its being undefined is probably caused
# by order of handling config defaults so defer it.
#$w->afterIdle ([$w, "set_dir" => $val]);
} # directory
sub set_dir
{
my ($w, $val) = @_;
# print STDERR "set_dir ($val)\n";
my $fulldir = _cleanpath ($val);
my $parent = "/";
my @dirs = ("");#$parent);
for (split m{/+} => $fulldir) {
length or next;
push @dirs, $_;
my $dir = _cleanpath (join "/" => @dirs);
$dir eq "/" and next;
$w->infoExists ($dir) or $w->add_to_tree ($dir, $_, $parent);
$parent = $dir;
}
$w->OpenCmd ($parent);
$w->setmode ($parent, "close");
} # set_dir
*chdir = \&set_dir;
sub OpenCmd
{
my ($w, $dir) = @_;
# print STDERR "OpenCmd ($dir)\n";
my $parent = $dir;
foreach my $name ($w->dirnames ($parent)) {
$name eq "." || $name eq ".." || $name eq "/" and next;
my $subdir = _cleanpath ("$dir/$name");
# print STDERR "> OpenCmd ($subdir)\n";
# $dt{$mt}{$dir} or $w->DirCmd ($subdir, 0);
if ($w->infoExists ($subdir)) {
$w->show (-entry => $subdir);
}
else {
$w->add_to_tree ($subdir, $name, $parent);
}
}
} # OpenCmd
*opencmd = \&OpenCmd;
sub add_to_tree
{
my ($w, $dir, $name, $parent) = @_;
# printf STDERR "Add (%-20s %-20s %s\n", $dir, $name, $parent // "--undef--";
my $image;# = $w->cget ("-image");
# UNIVERSAL::isa ($image, "Tk::Image") or
# $image = $w->Getimage ($image);
my $mode = "none";
$w->has_subdir ($dir) and $mode = "open";
my @args = (-image => $image, -text => $name);
if ($parent) { # Add in alphabetical order.
foreach my $sib ($w->infoChildren ($parent)) {
if ($sib gt $dir) {
push @args, (-before => $sib);
last;
}
}
}
$w->add ($dir, @args);
$w->setmode ($dir, $mode);
} # add_to_tree
( run in 0.988 second using v1.01-cache-2.11-cpan-71847e10f99 )