Hi,
I think your solution is to use the newFromXPM methods.
my $bitmap = Wx::Bitmap->newFromXPM( \@xpmdata );
my $icon = Wx::Icon->newFromXPM( \@xpmdata );
@xpmdata is just an array of xpm strings - so one array element per line
if the xmp data is from a file.
Given some inline xpm data such as
my $bitmap1 = <<EOB
....
EOB
The you would have a choice of doing
A)
my @xpmdata = split(/\n/, $bitmap1);
my $bitmap = Wx::Bitmap->newFromXPM( \@xpmdata );
or
B)
open my $fh, '<', \$bitmap1;
my $bitmap = Wx::Bitmap->new(
Wx::Image->new($fh, wxBITMAP_TYPE_XPM)
);
close( $fh );
Using method B) you can imagine creating a module dynamically that
bundles a any number of PNG files together in its __DATA__ section and
records the name, size and offset of each PNG in the main body of the
module code.
It would be quite simple I think to add a GetBitmap method to this
module that would return bitmap objects by name.
Hope some of it helps
Regards
Mark
On 28/06/2013 20:16, herbert breunung wrote:
Thanks so much for taking the time.
The real reason for this rather silly test was to fill xpm
bitmaps with loadfile method. this was a first test to look if there is
something coming out of the pipe. do i have to write a handler for that,
because that would give Kephra a total independence of config files,
if it could have also inline icons.
thanks a lot.
herbert
Hi Herbert,
On 26/06/2013 18:11, herbert breunung wrote:
greetings comrads
I have seen the XRC custom example in Wx::Demo and did
....
Wx::MemoryFSHandler::AddTextFile( 'file.xpm', <<'EOB' );
....
my $ed = Wx::TextCtrl->new($frame, -1,'');
$ed->LoadFile('memory:file.xpm');
but i get just error also loading into the bitmap doesn't work.
Any Suggestions?
Thanks a lot
Herbert aka lichtkind
I had to look at the wxWidgets source to figure out what is happening here.
It turns out that you cannot use the name of a memory file anywhere that you
can use a filename. Only some specific methods accept the name of a 'memory'
file. Internally, only some 'Load' methods use wxFileSystem and streams. For
these methods, passing the name of a 'memory' file will work. In addition to
the XRC method in Wx::Demo, Wx::HtmlWindow->LoadPage() will accept a 'memory'
file.
Other methods, such as Wx::TextCtrl->LoadFile, are implemented as thin
wrappers around the operating system file open / read functions. So in these
cases 'memory:file.xpm' is not going to work.
I don't see anywhere in the documentation that you can tell which methods use
filestreams though :(
For information, I have attached an example of how you can get a file handle
to a memory file and read the content. It all looks pointless though and there
seems multiple better ways to structure this in Perl.
Hope it helps
Mark
#---------------------------------------------------------------------
#/usr/bin/perl
package MyFrame;
use strict;
use warnings;
use Wx qw( :textctrl :sizer :panel :window);
use Wx::FS;
use base qw( Wx::Frame );
sub new {
my $class = shift;
my $self = $class->SUPER::new( @_ );
my $mainpanel = Wx::Panel->new($self, -1, [-1,-1], [-1,-1],
wxTAB_TRAVERSAL|wxBORDER_NONE);
my $text = Wx::TextCtrl->new($mainpanel, -1, "", [-1,-1],[-1,-1]);
# Fairly pointless use of Virtual File System directly
# Create Virtual File System
{
my $content = 'The quick brown fox jumped over the lazy dog';
Wx::FileSystem::AddHandler( Wx::MemoryFSHandler->new );
Wx::MemoryFSHandler::AddTextFile( 'sample.txt', $content );
}
# Get file content from virtual filesystem
{
my $fs = Wx::FileSystem->new;
my $mfile = $fs->OpenFile('memory:sample.txt');
my $fh = $mfile->GetStream;
my $textcontent = '';
while(<$fh>) {
$textcontent .= $_;
}
$text->ChangeValue($textcontent);
}
# Clean up VS
{
Wx::MemoryFSHandler::RemoveFile( 'sample.txt' );
}
my $panelsz = Wx::BoxSizer->new(wxVERTICAL);
my $framesz = Wx::BoxSizer->new(wxVERTICAL);
$panelsz->Add($text, 1, wxEXPAND|wxALL, 0);
$mainpanel->SetSizer($panelsz);
$framesz->Add($mainpanel, 1, wxEXPAND|wxALL, 0);
$self->SetSizer($framesz);
$self->Center;
return $self;
}
package MyApp;
use strict;
use warnings;
use Wx;
use Wx::FS;
use base qw( Wx::App );
sub OnInit {
my $self = shift;
my $win = MyFrame->new(undef, -1, 'Wx::FS Test');
$self->SetTopWindow($win);
$win->Show(1);
return 1;
}
package main;
use strict;
use warnings;
my $app = MyApp->new;
$app->MainLoop;