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;






















Reply via email to