Wrangler
view release on metacpan or search on metacpan
lib/Wrangler/Wx/FileBrowserTreeList.pm view on Meta::CPAN
# pop(@selections);
last;
}
}
}
my $lastId = $selections[-1];
# Wrangler::debug("Last dir in listing is $lastId");
## insert a placeholder item below dirs
my $itemId = $filebrowser->InsertImageStringItem( $lastId,
'New directory',
$filebrowser->{images}->{ 'folder' }
);
$filebrowser->SetOurItemData($lastId, { ref_to_ => 'richlist type data' });
$filebrowser->SetItemData($lastId, $lastId);
# make sure the listing is scrolled, so the user can see the new item, and start label edit
$filebrowser->EnsureVisible($itemId);
$filebrowser->EditLabel($itemId);
# this is all we can do here, the directory is actually created in OnEndLabelEdit()
$filebrowser->{our_stash} = { mkdir => $itemId };
}
sub Rename {
my $filebrowser = shift;
my $w = $filebrowser->{wrangler};
my @selections = $filebrowser->GetSelections(); # docs: wxPerl note: In wxPerl this method takes no parameters and returns a list of Wx::TreeItemIds.
my $selCnt = @selections;
Wrangler::debug("FileBrowser: Rename: $selCnt items ");
for(@selections){
push(@{ $filebrowser->{our_stash}->{rename} }, {
id => $_,
file => $filebrowser->GetItemText($_),
});
}
if($selCnt == 0){
return;
}elsif($selCnt == 1){
# the actual rename is done in OnEndEditLabel()
# (use the LabelEdit editor to handle the rename)
$filebrowser->EditLabel( $selections[0] );
}elsif($selCnt > 1){
# use a more sophisticated dialogue for multi-renames
require Wrangler::Dialog::MultiRename;
my $dialog = Wrangler::Dialog::MultiRename->new($filebrowser->{our_stash}->{rename});
if($dialog->ShowModal() == wxID_OK){
if( $dialog->{pre}->IsModified || $dialog->{ins}->IsModified ){
Wrangler::debug("Prepend/append-rename was used ");
my $pre = $dialog->{pre}->GetValue();
my $ins = $dialog->{ins}->GetValue();
foreach my $item (@{ $filebrowser->{ourclipboard} }){
my $oldpath = File::Spec->catfile( $filebrowser->{current_dir}, $item->{file});
my ($file, $dirs, $suffix) = File::Basename::fileparse($item->{file}, qr/\.[^.]*/);
my $newpath = File::Spec->catfile( $filebrowser->{current_dir}, $pre.$file.$ins.$suffix);
next if $oldpath eq $newpath; # prevent that the update-internal-tree gets corrupted, and of course an unnecessary fs IO
# todo: check this via the OnEditLabel dirty? function
## do the actual rename
$filebrowser->{wrangler}->{fs}->rename($oldpath, $newpath);
## update the internal metadata tree
# $self->{tree}->{$newpath} = $self->{tree}->{$oldpath};
# delete($self->{tree}->{$oldpath});
## update GUI
Wrangler::debug("Wrangler::FileBrowser::rename(multi): rename($oldpath, $newpath) ");
$filebrowser->SetItemText($item->{id}, $pre.$file.$ins.$suffix);
}
}elsif( $dialog->{multi}->IsModified ){
Wrangler::debug("Pattern-rename was used ");
my $multi = $dialog->{multi}->GetValue();
$multi = decode_utf8($multi); # decode
Encode::_utf8_off($multi); # then remove the utf8-flag the hard way
my $oldlen = $dialog->{length};
my $newlen = length($multi);
Wrangler::debug("MULTI: $multi OLDLEN: $oldlen NEWLEN:$newlen");
}
}else{
Wrangler::debug("Multiple rename CANCELd ");
}
# clear ourclipboard
undef($filebrowser->{our_stash});
# Fire the rename via the Event which are triggered by EditLabel OnBEginEdit / OnEndEdit
# $filebrowser->EditLabel($selId);
}
}
sub OurDelete { # treelistctrl has a Delete() as well!
my $filebrowser = shift;
my $w = $filebrowser->{wrangler};
my @selections = $filebrowser->GetSelections(); # docs: wxPerl note: In wxPerl this method takes no parameters and returns a list of Wx::TreeItemIds.
my $selCnt = @selections;
return if $selCnt == 0;
Wrangler::debug("FileBrowser: delete: $selCnt items ");
# create a progress dialog
my $pd = Wx::ProgressDialog->new("Deleting...", "Deleting...", $selCnt, $filebrowser, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_REMAINING_TIME );
my $cnt=1;
for my $currId (@selections){
my $richlist_item = $filebrowser->GetItemData( $currId )->GetData();
my $path = $richlist_item->{'Filesystem::Path'};
## just to be sure we don't del the 'up-dir'!
## system's "rm" denies deleting it but rmtree, which we use here, inteprets it as a valid path and deletes it!
if($path =~ /\.\.$/){
Wrangler::debug("FileBrowser: skipped delete of the 'up-dir'! ");
$pd->Update($_);
next;
}
if( $richlist_item->{'Filesystem::Type'} eq 'Directory' ){
Wrangler::debug("FileBrowser: delete ($cnt of $selCnt): currId:$currId, path:$path");
## delete dir
# $w->{fs}->rmdir($path);
}else{
Wrangler::debug("FileBrowser: delete ($cnt of $selCnt): currId:$currId, path:$path");
## delete file
# $w->{fs}->delete($path);
}
$filebrowser->DeleteChildren($currId);
$filebrowser->Delete($currId);
$pd->Update($cnt);
$cnt++;
last if $cnt > $selCnt;
}
# select the 'next' item after the delete(s)
# if($_ == $selCnt){
# my $next_id = $filebrowser->GetNextItem($currId, wxLIST_NEXT_ALL);
# $filebrowser->SetItemState( $next_id, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
# }
( run in 2.760 seconds using v1.01-cache-2.11-cpan-81fc1098f69 )