source: extensions/pLoader/trunk/src/Uploader/GUI/wxApp.pm @ 4467

Revision 4467, 23.1 KB checked in by ronosman, 10 years ago (diff)

Feature 1052 added : photo re-upload management. When uploading an already added photo, the user is warned and has a choice on action for files, simple properties and multi-values properties.

  • Property svn:eol-style set to LF
Line 
1# +-----------------------------------------------------------------------+
2# | pLoader - a Perl photo uploader for Piwigo                            |
3# +-----------------------------------------------------------------------+
4# | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
5# +-----------------------------------------------------------------------+
6# | This program is free software; you can redistribute it and/or modify  |
7# | it under the terms of the GNU General Public License as published by  |
8# | the Free Software Foundation                                          |
9# |                                                                       |
10# | This program is distributed in the hope that it will be useful, but   |
11# | WITHOUT ANY WARRANTY; without even the implied warranty of            |
12# | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
13# | General Public License for more details.                              |
14# |                                                                       |
15# | You should have received a copy of the GNU General Public License     |
16# | along with this program; if not, write to the Free Software           |
17# | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
18# | USA.                                                                  |
19# +-----------------------------------------------------------------------+
20package Uploader::GUI::wxApp;
21use strict;
22use base qw/Wx::App Class::Accessor::Fast/;   
23use Wx qw/
24             wxBITMAP_TYPE_GIF
25             wxBITMAP_TYPE_ICO
26             wxBITMAP_TYPE_BMP
27             wxBITMAP_TYPE_PNG
28             wxBITMAP_TYPE_JPEG
29             wxIMAGE_QUALITY_NORMAL
30             wxIMAGE_QUALITY_HIGH
31             wxSPLASH_CENTRE_ON_SCREEN
32             wxSPLASH_TIMEOUT
33             wxDefaultPosition
34             wxDefaultSize
35             wxSIMPLE_BORDER
36             wxFRAME_TOOL_WINDOW
37             wxFRAME_NO_TASKBAR wxSTAY_ON_TOP
38             wxWHITE
39             wxICON_EXCLAMATION
40             wxOK
41             wxLANGUAGE_CHINESE_SIMPLIFIED   
42             wxLANGUAGE_CZECH   
43             wxLANGUAGE_DANISH   
44             wxLANGUAGE_DUTCH   
45             wxLANGUAGE_ENGLISH   
46             wxLANGUAGE_FRENCH   
47             wxLANGUAGE_GERMAN   
48             wxLANGUAGE_HUNGARIAN
49             wxLANGUAGE_ITALIAN   
50             wxLANGUAGE_JAPANESE   
51             wxLANGUAGE_POLISH   
52             wxLANGUAGE_PORTUGUESE   
53             wxLANGUAGE_PORTUGUESE_BRAZILIAN   
54             wxLANGUAGE_RUSSIAN   
55             wxLANGUAGE_SLOVAK   
56             wxLANGUAGE_SPANISH   
57         /;
58use Uploader::GUI::wxFrameAUI;
59use File::Slurp ;
60use Data::Dumper;
61use Storable;
62use File::HomeDir;
63use File::Spec;
64use Uploader::PWG;
65use Uploader::ImageList;
66use Uploader::GUI::wxLoginDlg;
67use Wx::Locale qw/:default/;
68use utf8;
69
70$|=1;
71
72__PACKAGE__->mk_accessors( 
73    qw/
74          pwg
75          site_url
76          site_username
77          site_password
78          http_username
79          http_password
80          rejects
81          imagelist
82          storable_file
83          wx_thumb_dir
84          resized_dir
85          userdata_dir
86          resized_dir
87          thumb_dir
88          conf_file
89          layout_file
90          locale
91          current_language
92          languages
93          available_languages
94          version
95          imagelist_version
96          use_offline
97          login_dlg
98          branding
99          frame
100          perspective
101          imageviewerIndex
102          frameLayout
103          chunk_size
104          layout_clean
105          colors
106          eng_colors
107          positions
108          eng_positions
109          default_photo_names
110          eng_default_photo_names
111                  upload_hd
112                  eng_upload_hd
113      / 
114);
115
116sub FilterEvent {
117    my( $self, $event ) = @_;
118   
119    Wx::LogMessage "EventType %s", $event->GetEventType();
120   
121    return -1;
122}
123
124
125sub OnInit {
126    my( $self ) = @_;
127   
128    $self->version(
129        '2.0.5C'
130    );
131   
132    # to check if we can use stored cache
133    $self->imagelist_version(
134        '9'
135    );
136
137    $self->languages(
138      [
139             ["中文 (%s)", wxLANGUAGE_CHINESE_SIMPLIFIED, 'Chinese simplified'],   
140             ["Česky (%s)", wxLANGUAGE_CZECH, 'Czech'],   
141             ["Dansk (%s)", wxLANGUAGE_DANISH, 'Danish'],   
142             ["Deutsch (%s)", wxLANGUAGE_GERMAN, 'German'],   
143             ["English (%s)", wxLANGUAGE_ENGLISH, 'English'],   
144             ["Español (%s)", wxLANGUAGE_SPANISH, 'Spanish'],   
145             ["Français (%s)", wxLANGUAGE_FRENCH, 'French'],   
146             ["Italiano (%s)", wxLANGUAGE_ITALIAN, 'Italian'],   
147             ["日本語 (にほんご) (%s)", wxLANGUAGE_JAPANESE, 'Japanese'],   
148             ["Magyar (%s)", wxLANGUAGE_HUNGARIAN, 'Hungarian'],
149             ["Nederlands (%s)", wxLANGUAGE_DUTCH, 'Dutch'],   
150             ["Polski (%s)", wxLANGUAGE_POLISH, 'Polish'],   
151             ["Português Brasileiro (%s)", wxLANGUAGE_PORTUGUESE_BRAZILIAN, 'Portuguese Brazil'],   
152             ["Português Portugal (%s)", wxLANGUAGE_PORTUGUESE, 'Portuguese Portugal'],   
153             ["Русский (%s)", wxLANGUAGE_RUSSIAN, 'Russian'],
154             ["Slovenčina (%s)", wxLANGUAGE_SLOVAK, 'Slovak'],
155      ]
156    );
157    # some languages may be unavailable due to system configuration.
158    $self->_filter_available_languages;
159    Wx::InitAllImageHandlers();
160    my $applicationName = "pLoader" ;
161    $self->SetAppName( $applicationName );
162    $self->SetVendorName( "Piwigo Team" );
163
164    $self->{IMGTYPE} = {
165        'jpg' => wxBITMAP_TYPE_JPEG,
166        'gif' => wxBITMAP_TYPE_GIF,
167        'png' => wxBITMAP_TYPE_PNG,
168    };
169
170    $self->_init_userdir;
171
172    my $conf = retrieve $self->conf_file if -e $self->conf_file;       
173
174    if(defined $conf ){
175        $self->SetKeyValues($conf);
176    }
177    else {
178        $self->_readParams( 'pLoader.ini' ) unless defined $conf ;
179    }
180
181    # when language is switched, need a new layout
182    unlink $self->layout_file if $self->layout_clean;
183    $self->layout_clean(0);
184
185    my $layout = retrieve $self->layout_file if -e $self->layout_file; 
186    if(defined $layout ){
187        $self->SetKeyValues($layout);
188    }
189
190
191    $self->site_url(
192        $self->{site_url}
193    );
194   
195
196    $self->site_username(
197        $self->{site_username}
198    );
199    $self->site_password(
200        $self->{site_password}
201    );
202
203    $self->http_username(
204        $self->{http_username}
205    );
206    $self->http_password(
207        $self->{http_password}
208    );
209
210
211    $self->current_language(
212        $self->{current_language}||Wx::Locale::GetSystemLanguage()
213    );
214
215    $self->chunk_size(
216        $self->{chunk_size}||500_000
217    );
218   
219    $self->init_locale;
220    $self->_init_localized_properties;
221
222    my $not_exit = $self->Login();
223    # user pressed OK
224    if($not_exit){
225        $self->StoreConnectionProperties;
226        if( !$self->use_offline ){
227            while( $not_exit and !$self->_is_connected ){
228                $not_exit = $self->Login();
229                last if $self->use_offline;
230            }
231        }
232        $self->_init_imagelist;
233        $self->_init_thumbimagelist;
234        $self->_init_frame;
235    }
236
237    $not_exit;
238}
239
240# some properties are displayed in choice list, with translated strings
241# the translation has to be reverted to store a language independant value
242sub _init_localized_properties {
243    my ( $self ) = @_;
244
245    $self->colors(
246        ['Black', 'White']
247    );
248    # We need to translate back to english when we store properties
249    $self->eng_colors(
250        {
251            map { gettext($_) => $_ } @{$self->colors} 
252        }
253    );
254    $self->positions(
255        [
256            'Top',
257            'Left',
258            'Right',
259            'Bottom',
260            'Top left',
261            'Top right',
262            'Bottom left',
263            'Bottom right',
264            'Center',
265        ]
266    );
267
268    $self->eng_positions(
269        { 
270             map { gettext($_) => $_ } @{$self->positions} 
271        }
272    );
273       
274        $self->upload_hd(
275            [
276                    'No',
277                        'Yes, use HD resized of the original photo',
278                        'Yes, use a copy of the original photo',
279                ]
280        );
281
282    $self->eng_upload_hd(
283        {
284             map { gettext($_) => $_ } @{$self->upload_hd} 
285        }
286    );
287       
288    $self->default_photo_names(
289        [
290             'None',
291             'File name',
292             'File path and name',
293             'Prefix',
294             'Prefix + rank number',
295             'Rank number + prefix',
296             'Prefix + create date chrono',
297             'Create date chrono + prefix',
298        ]
299    );
300    $self->eng_default_photo_names(
301        {
302             map { gettext($_) => $_ } @{$self->default_photo_names} 
303        }
304    );
305}
306
307sub _filter_available_languages {
308    my ( $self ) = @_;
309
310    # check if the locale can be set and the translation catalog available
311    $self->available_languages(
312        [
313            grep {$_} 
314            map{
315                            #  a locale may be unavailable due to system limitations ( ex: chinese, japanese when language pack are not installed )
316                            if(Wx::Locale::IsAvailable($_->[1])){
317                            my $locale = Wx::Locale->new($_->[1]);
318                            $locale->AddCatalogLookupPathPrefix('../locale');
319                            $_ if $locale->AddCatalog('pLoader');
320                                }
321            }
322            @{$self->languages}
323        ]
324    );
325}
326
327sub _is_connected {
328    my ( $self ) = @_;
329
330    my $is_connected;
331
332    if($self->pwg->login_result->{stat} eq 'ok'){
333        $is_connected = 1;
334    }
335    else{
336        Wx::MessageBox( 
337            sprintf(
338                "%s\n\n%s %s %s",
339                $self->pwg->login_result->{message},
340                gettext("Connection to"),
341                $self->site_url,
342                gettext("failed"),
343            ),
344            gettext("Piwigo login error"),
345            wxOK | wxICON_EXCLAMATION, 
346        );
347    }
348   
349    $is_connected;
350}
351
352
353my $locale;
354sub init_locale {
355    my ( $self, $language ) = @_;
356   
357    $self->current_language(
358        $language
359    ) if defined $language;
360
361    undef $locale;
362    $locale = Wx::Locale->new(
363        $self->current_language
364    );
365    $locale->AddCatalogLookupPathPrefix( '../locale');
366    if(!$locale->AddCatalog( 'pLoader.mo' )){
367        Wx::LogMessage gettext("Cannot find translation catalog files for %s. Use default language"), $locale->GetCanonicalName();
368    }
369    $self->locale($locale);     
370}
371
372sub StoreConnectionProperties {
373    my ( $self ) = @_;
374
375    eval {   
376        store( 
377            {
378                map{
379                   $_ => $self->{$_},
380                }
381                qw/
382                    site_url
383                    site_username
384                    site_password
385                    http_username
386                    http_password
387                    current_language
388                    chunk_size
389                    layout_clean
390                /
391            },
392            $self->conf_file
393        );
394    };
395}
396
397sub StoreLayoutProperties {
398    my ( $self ) = @_;
399
400    eval {   
401        store( 
402            {
403                map{
404                   $_ => $self->{$_},
405                }
406                qw/
407                      perspective
408                      imageviewerIndex
409                      frameLayout
410                /
411            },
412            $self->layout_file
413        );
414    };
415}
416
417sub _init_imagelist {
418    my ( $self ) = @_; 
419
420    my $stored_imagelist;
421   
422    my $use_new_imagelist;
423   
424    if( -e $self->storable_file ){
425        eval {
426            $stored_imagelist = retrieve $self->storable_file;
427        };
428        if($@){
429            Wx::LogMessage(
430                gettext("An error has occured. Can not read %s\n%s"),
431                $self->storable_file,
432                $@
433            );
434            $use_new_imagelist = 1 ;
435        }
436        # should have a valid imagelist
437        else{
438            $use_new_imagelist = 1 unless $self->imagelist_version eq $stored_imagelist->{imagelist_version};
439            if($use_new_imagelist){
440                Wx::LogMessage(gettext("pLoader has to reset image cache."));
441            }
442        }
443    }
444    else{
445        $use_new_imagelist = 1 ;
446    }
447
448    if($use_new_imagelist){
449        $stored_imagelist = $self->_default_imagelist_params ;
450    }
451
452
453    $self->imagelist(
454        Uploader::ImageList->new(
455            $stored_imagelist
456        )
457    );
458
459    $self->imagelist->RescaleCallback(
460        sub { $self->RescaleImage(@_) }
461    );
462
463    $self->imagelist->ResizeCallback(
464        sub { $self->ResizeImage(@_) }
465    );
466
467    $self->imagelist->YieldCallback(
468        sub { Wx::Yield }
469    );
470}
471
472
473sub _default_imagelist_params {
474    my ( $self ) = @_ ;
475
476    my $params = {
477        new_files        => [],
478        hd_filter        => 'Lanczos',
479        hd_blur          => 0.9,
480        hd_quality       => 95,
481        hd_w             => 1600,
482        hd_h             => 1200,
483        hd_interlace     => 'Line',
484        thumb_size       => 120,
485        site_thumb_dir   => $self->thumb_dir,
486        wx_thumb_size    => 100,
487        wx_thumb_dir     => $self->wx_thumb_dir,
488        resize_w         => 800,
489        resize_h         => 600,
490        site_resized_dir => $self->resized_dir,
491        type             => 'jpg',
492        filter           => 'Lanczos',
493        blur             => 0.9,
494        quality          => 95,
495        wx_quality       => 90,
496        th_quality       => 90,
497        auto_rotate      => 1,
498                upload_hd        => 'No',
499        remove_uploaded_from_selection => 1,
500        interlace        => 'Line',
501        create_resized   => 1,
502        prefix           => 'TN',
503        count            => 0,
504        storable_file    => $self->storable_file,
505        userdata_dir     => $self->userdata_dir,
506        default_photo_name => 'File name',
507        default_name_prefix => gettext('Photo '),
508        upload_rejects   =>  [],
509        image_sums       => {},
510        sums             => [],
511        version          => $self->version,
512        imagelist_version => $self->imagelist_version,
513        RescaleCallback  => sub { $self->RescaleImage(@_) },
514        ResizeCallback   => sub { $self->ResizeImage(@_) },
515        watermark_text => gettext("my watermark"),
516        watermark_text_size => 12,
517        watermark_position => 'Center',
518        watermark_y => 10,
519        watermark_x => 10,
520        watermark_color => 'White',
521                reupload_action_files => 1,
522                reupload_action_properties => 2,
523                reupload_action_properties_m => 1,
524    };
525
526    return $params;
527}
528
529sub Login {
530    my ( $self ) = @_; 
531
532    $self->login_dlg( 
533        Uploader::GUI::wxLoginDlg->new(
534            {
535                title         => gettext("Piwigo login"),
536                site_url      => sub { $self->site_url(@_) },
537                site_username => sub { $self->site_username(@_) },     
538                site_password => sub { $self->site_password(@_) },
539                use_offline   => sub { $self->use_offline(@_) },       
540            }
541        )
542    ) unless $self->login_dlg;
543
544    my $icon = Wx::Icon->new();
545    $icon->LoadFile('../res/favicon.ico', wxBITMAP_TYPE_ICO);
546    $self->login_dlg->SetIcon($icon);   
547
548   
549    my $rval = $self->login_dlg->ShowModal();
550    $self->login_dlg->Show(0);
551
552    $self->_init_branding;
553   
554    if ($self->site_url !~ /^http:/){
555        $self->site_url(
556            sprintf(
557                "http://%s",
558                $self->site_url
559            )
560        );     
561    }
562
563    $self->pwg(
564        # get these parameters from dialog or from file
565        Uploader::PWG->new(
566            {
567                site_url       => $self->site_url,
568                site_username  => $self->site_username,
569                site_password  => $self->site_password,
570                http_username  => $self->http_username,
571                http_password  => $self->http_password,
572                branding       => $self->branding,
573                chunk_size     => $self->chunk_size,
574                use_offline    => $self->use_offline,
575                version        => $self->version,
576            }
577        )
578    );
579
580    $rval;
581}
582
583sub _init_userdir {
584    my ( $self ) = @_;
585   
586    my $applicationName = $self->GetAppName ;
587    my $userdatadir = File::Spec->canonpath(
588        File::Spec->catfile(
589            File::HomeDir->my_data(), 
590            "\.$applicationName"
591        )
592    );
593
594    if(! -d $userdatadir){
595        if(! mkdir $userdatadir){
596            Wx::MessageBox( 
597                sprintf(
598                    "%s directory creation failed",
599                    $userdatadir,
600                ),
601                "pLoader working directory creation error",
602                wxOK | wxICON_EXCLAMATION, 
603            );
604
605            $userdatadir = File::Spec->canonpath(
606                File::Spec->catfile(
607                    File::Spec->tmpdir(), 
608                    "\.$applicationName"
609                )
610            );
611            mkdir $userdatadir;
612        }       
613    }
614
615    $self->userdata_dir($userdatadir);
616   
617    $self->conf_file(
618        File::Spec->catfile(
619            $self->userdata_dir, 
620            ".$applicationName.conf"
621        )
622    );
623
624    $self->layout_file(
625        File::Spec->catfile(
626            $self->userdata_dir, 
627            ".$applicationName.layout"
628        )
629    );
630
631    $self->storable_file(
632        File::Spec->catfile($self->userdata_dir, 'pLoader.dat')
633    );
634   
635    my $thumbdir = File::Spec->catfile($self->userdata_dir, 'thumbnails');
636    mkdir $thumbdir unless -d $thumbdir ;
637    $self->thumb_dir($thumbdir);
638
639    my $wxthumbdir = File::Spec->catfile($self->userdata_dir, 'wxthumbnails');
640    mkdir $wxthumbdir unless -d $wxthumbdir ;
641    $self->wx_thumb_dir($wxthumbdir);
642
643
644    my $resizedir = File::Spec->catfile($self->userdata_dir, 'resize');
645    mkdir $resizedir unless -d $resizedir ;
646    $self->resized_dir($resizedir);
647}
648
649sub _init_thumbimagelist {
650    my ( $self ) = @_;
651
652   
653    $self->imagelist->wx_thumb_imglist(
654        Wx::ImageList->new( 
655            $self->imagelist->wx_thumb_size, 
656            $self->imagelist->wx_thumb_size, 
657            1,
658            0
659        )
660    );
661   
662    # reload images
663    $self->_reload_thumb_images;
664}
665
666
667sub _reload_thumb_images {
668    my ( $self ) = @_;
669   
670    my $wximagelist = $self->imagelist->wx_thumb_imglist;
671    my $sums = $self->imagelist->sums;
672
673    map {
674        my $image = $self->imagelist->image_sums->{$_};
675
676        $wximagelist->Add(
677            Wx::Bitmap->new( 
678                $image->wx_thumb_file, 
679                $self->GetWxBitmapType($self->imagelist->type), 
680            )
681        );
682    }
683    @$sums ;
684
685}
686
687sub GetWxBitmapType {
688    my ( $self, $type ) = @_;
689   
690    $self->{IMGTYPE}->{$type};
691}
692
693
694sub RescaleImage {
695    my ( $self, $image_file, $image_file_out, $type, $ratio, $width, $height, $quality ) = @_;
696   
697
698    my $image = Wx::Image->new(
699            $image_file, 
700            $self->GetWxBitmapType($type),
701            0
702    );
703   
704    my $w;
705    my $h;
706
707    my $img_w = $image->GetWidth;
708    my $img_h = $image->GetHeight;
709   
710    # use a ratio ( 25% default ) if defined
711    # default ratio is used for preview.
712    if($ratio){
713        $w = $ratio*$img_w/100 ;
714        $h = $ratio*$img_h/100 ;
715    }
716    # use specified width and height
717    else{
718        # portrait
719        if( $img_w < $img_h ){
720            $w = $height;
721        }
722        else{
723            $w = $width;
724        }
725        # to respect aspect ratio
726        $h = sprintf(
727            "%.0f",
728            ($w*$img_h)/$img_w
729        );
730    }
731
732    $image->Rescale(
733        $w,
734        $h,
735        wxIMAGE_QUALITY_HIGH
736    );
737   
738    $quality ||= 90;
739   
740    $image->SetOption( 
741        "quality", 
742        $quality 
743    );
744   
745    if(!$image->SaveFile(
746        $image_file_out,
747        $self->GetWxBitmapType($type),
748    )){
749        Wx::LogMessage(
750            gettext("An error has occured. Can not save file %s"),
751            $image_file_out,
752        )
753    };
754}
755
756sub ResizeImage {
757    my ( $self, $image_file, $image_file_out, $type, $width, $height, $quality ) = @_;
758   
759
760    my $image = Wx::Image->new(
761            $image_file, 
762            $self->GetWxBitmapType($type),
763            0
764    );
765
766    my $w;
767    my $h;
768
769    my $img_w = $image->GetWidth;
770    my $img_h = $image->GetHeight;
771   
772        # portrait
773        if( $img_w < $img_h ){
774            $w = $height;
775        }
776        else{
777            $w = $width;
778        }
779        # to respect aspect ratio
780        $h = sprintf(
781            "%.0f",
782            ($w*$img_h)/$img_w
783        );
784
785   
786
787    $image->Rescale(
788        $w,
789        $h,
790        wxIMAGE_QUALITY_HIGH
791    );
792
793    $image->Resize(
794        [ $width, $height ], [ 0, 20],
795    );
796   
797    $quality ||= 90;
798   
799    $image->SetOption( 
800        "quality", 
801        $quality 
802    );
803   
804    if(!$image->SaveFile(
805        $image_file_out,
806        $self->GetWxBitmapType($type),
807    )){
808        Wx::LogMessage(
809            gettext("An error has occured. Can not save file %s"),
810            $image_file_out,
811        )
812    };
813}
814
815# some labels differ with branding ( piwigo.com or piwigo.org )
816sub _init_branding {
817    my ( $self ) =@_;
818   
819    if( $self->site_url =~ /\.piwigo\.com/ ){
820        $self->branding(
821            {
822                category  => gettext("album"), 
823                Category  => gettext("Album"), 
824                categories => gettext("albums"),       
825                Categories => gettext("Albums"),
826                'Add new category' => gettext("Add new album"), 
827                'Category name' => gettext("Album name :"),
828                'New category' => gettext("New album"),
829            }
830        );
831    }
832    else{
833        $self->branding(
834            {
835                category  => gettext("categorie"),     
836                Category  => gettext("Categorie"),     
837                categories => gettext("categories"),   
838                Categories => gettext("Categories"),   
839                'Add new category' => gettext("Add new category"),
840                'Category name' => gettext("Category name :"),
841                'New category' => gettext("New category"),
842            }
843        );
844    }   
845}
846
847sub SaveConfig {
848    my ( $self, $params ) = @_; 
849
850   my $config = Wx::ConfigBase::Get;
851
852   map {
853       $config->WriteInt( $_, $params->{$_} )
854   } keys %$params;
855
856   $config->Write( 'Perspective', $params->{Perspective} )
857       
858}
859
860
861sub _init_frame {
862    my ( $self ) = @_; 
863
864    my $url = $self->site_url;
865   
866    if($self->use_offline){
867        $url = gettext("Work Offline");
868    }
869
870    $self->frame(
871        Uploader::GUI::wxFrameAUI->new( 
872            {
873                title     => sprintf("pLoader - Piwigo uploader %s - [%s]", $self->version, $url),
874                pwg       => $self->pwg,
875                imagelist => $self->imagelist,
876                perspective => $self->perspective,
877                imageviewer_index => $self->imageviewerIndex,
878                frameLayout => $self->frameLayout,
879            }
880        )
881    );
882 
883    $self->frame->Show( 1 );
884    $self->SetTopWindow( $self->frame );
885
886    my $icon = Wx::Icon->new();
887    $icon->LoadFile('../res/favicon.ico', wxBITMAP_TYPE_ICO);
888    $self->frame->SetIcon($icon);       
889}
890
891sub _readParams {
892        my( $self, $file ) = @_ ;
893
894
895        my $expr_params ;
896        eval { $expr_params = read_file( $file ); } ;
897       
898        my $paramValues = [] ;
899        if($expr_params){
900                my $expr = '$paramValues = ' ;
901                $expr .=  "$expr_params ; " ;
902                eval $expr ;
903        }
904       
905        return unless 'ARRAY' eq ref $paramValues ;
906       
907        if(scalar(@$paramValues )){
908            my $params = $paramValues->[0] ;
909            $self->SetKeyValues($params);
910        }
911}
912
913
914
915sub SetKeyValues {
916    my ( $self, $params )= @_; 
917
918    foreach( keys %$params ) {
919        $self->{$_} = $params->{$_} ;
920    }
921}
922
923
9241;
Note: See TracBrowser for help on using the repository browser.