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

Last change on this file since 3370 was 3370, checked in by ronosman, 11 years ago

Fix DND regression in photo selection.

  • Property svn:eol-style set to LF
File size: 26.2 KB
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_ABKHAZIAN   
42             wxLANGUAGE_AFAR   
43             wxLANGUAGE_AFRIKAANS   
44             wxLANGUAGE_ALBANIAN   
45             wxLANGUAGE_AMHARIC   
46             wxLANGUAGE_ARABIC   
47             wxLANGUAGE_ARABIC_ALGERIA   
48             wxLANGUAGE_ARABIC_BAHRAIN   
49             wxLANGUAGE_ARABIC_EGYPT   
50             wxLANGUAGE_ARABIC_IRAQ   
51             wxLANGUAGE_ARABIC_JORDAN   
52             wxLANGUAGE_ARABIC_KUWAIT   
53             wxLANGUAGE_ARABIC_LEBANON   
54             wxLANGUAGE_ARABIC_LIBYA   
55             wxLANGUAGE_ARABIC_MOROCCO   
56             wxLANGUAGE_ARABIC_OMAN   
57             wxLANGUAGE_ARABIC_QATAR   
58             wxLANGUAGE_ARABIC_SAUDI_ARABIA   
59             wxLANGUAGE_ARABIC_SUDAN   
60             wxLANGUAGE_ARABIC_SYRIA   
61             wxLANGUAGE_ARABIC_TUNISIA   
62             wxLANGUAGE_ARABIC_UAE   
63             wxLANGUAGE_ARABIC_YEMEN   
64             wxLANGUAGE_ARMENIAN   
65             wxLANGUAGE_ASSAMESE   
66             wxLANGUAGE_AYMARA   
67             wxLANGUAGE_AZERI   
68             wxLANGUAGE_AZERI_CYRILLIC   
69             wxLANGUAGE_AZERI_LATIN   
70             wxLANGUAGE_BASHKIR   
71             wxLANGUAGE_BASQUE   
72             wxLANGUAGE_BELARUSIAN   
73             wxLANGUAGE_BENGALI   
74             wxLANGUAGE_BHUTANI   
75             wxLANGUAGE_BIHARI   
76             wxLANGUAGE_BISLAMA   
77             wxLANGUAGE_BRETON   
78             wxLANGUAGE_BULGARIAN   
79             wxLANGUAGE_BURMESE   
80             wxLANGUAGE_CAMBODIAN   
81             wxLANGUAGE_CATALAN   
82             wxLANGUAGE_CHINESE   
83             wxLANGUAGE_CHINESE_SIMPLIFIED   
84             wxLANGUAGE_CHINESE_TRADITIONAL   
85             wxLANGUAGE_CHINESE_HONGKONG   
86             wxLANGUAGE_CHINESE_MACAU   
87             wxLANGUAGE_CHINESE_SINGAPORE   
88             wxLANGUAGE_CHINESE_TAIWAN   
89             wxLANGUAGE_CORSICAN   
90             wxLANGUAGE_CROATIAN   
91             wxLANGUAGE_CZECH   
92             wxLANGUAGE_DANISH   
93             wxLANGUAGE_DUTCH   
94             wxLANGUAGE_DUTCH_BELGIAN   
95             wxLANGUAGE_ENGLISH   
96             wxLANGUAGE_ENGLISH_UK   
97             wxLANGUAGE_ENGLISH_US   
98             wxLANGUAGE_ENGLISH_AUSTRALIA   
99             wxLANGUAGE_ENGLISH_BELIZE   
100             wxLANGUAGE_ENGLISH_BOTSWANA   
101             wxLANGUAGE_ENGLISH_CANADA   
102             wxLANGUAGE_ENGLISH_CARIBBEAN   
103             wxLANGUAGE_ENGLISH_DENMARK   
104             wxLANGUAGE_ENGLISH_EIRE   
105             wxLANGUAGE_ENGLISH_JAMAICA   
106             wxLANGUAGE_ENGLISH_NEW_ZEALAND   
107             wxLANGUAGE_ENGLISH_PHILIPPINES   
108             wxLANGUAGE_ENGLISH_SOUTH_AFRICA   
109             wxLANGUAGE_ENGLISH_TRINIDAD   
110             wxLANGUAGE_ENGLISH_ZIMBABWE   
111             wxLANGUAGE_ESPERANTO   
112             wxLANGUAGE_ESTONIAN   
113             wxLANGUAGE_FAEROESE   
114             wxLANGUAGE_FARSI   
115             wxLANGUAGE_FIJI   
116             wxLANGUAGE_FINNISH   
117             wxLANGUAGE_FRENCH   
118             wxLANGUAGE_FRENCH_BELGIAN   
119             wxLANGUAGE_FRENCH_CANADIAN   
120             wxLANGUAGE_FRENCH_LUXEMBOURG   
121             wxLANGUAGE_FRENCH_MONACO   
122             wxLANGUAGE_FRENCH_SWISS   
123             wxLANGUAGE_FRISIAN   
124             wxLANGUAGE_GALICIAN   
125             wxLANGUAGE_GEORGIAN   
126             wxLANGUAGE_GERMAN   
127             wxLANGUAGE_GERMAN_AUSTRIAN   
128             wxLANGUAGE_GERMAN_BELGIUM   
129             wxLANGUAGE_GERMAN_LIECHTENSTEIN   
130             wxLANGUAGE_GERMAN_LUXEMBOURG   
131             wxLANGUAGE_GERMAN_SWISS   
132             wxLANGUAGE_GREEK   
133             wxLANGUAGE_GREENLANDIC   
134             wxLANGUAGE_GUARANI   
135             wxLANGUAGE_GUJARATI   
136             wxLANGUAGE_HAUSA   
137             wxLANGUAGE_HEBREW   
138             wxLANGUAGE_HINDI   
139             wxLANGUAGE_HUNGARIAN   
140             wxLANGUAGE_ICELANDIC   
141             wxLANGUAGE_INDONESIAN   
142             wxLANGUAGE_INTERLINGUA   
143             wxLANGUAGE_INTERLINGUE   
144             wxLANGUAGE_INUKTITUT   
145             wxLANGUAGE_INUPIAK   
146             wxLANGUAGE_IRISH   
147             wxLANGUAGE_ITALIAN   
148             wxLANGUAGE_ITALIAN_SWISS   
149             wxLANGUAGE_JAPANESE   
150             wxLANGUAGE_JAVANESE   
151             wxLANGUAGE_KANNADA   
152             wxLANGUAGE_KASHMIRI   
153             wxLANGUAGE_KASHMIRI_INDIA   
154             wxLANGUAGE_KAZAKH   
155             wxLANGUAGE_KERNEWEK   
156             wxLANGUAGE_KINYARWANDA   
157             wxLANGUAGE_KIRGHIZ   
158             wxLANGUAGE_KIRUNDI   
159             wxLANGUAGE_KONKANI   
160             wxLANGUAGE_KOREAN   
161             wxLANGUAGE_KURDISH   
162             wxLANGUAGE_LAOTHIAN   
163             wxLANGUAGE_LATIN   
164             wxLANGUAGE_LATVIAN   
165             wxLANGUAGE_LINGALA   
166             wxLANGUAGE_LITHUANIAN   
167             wxLANGUAGE_MACEDONIAN   
168             wxLANGUAGE_MALAGASY   
169             wxLANGUAGE_MALAY   
170             wxLANGUAGE_MALAYALAM   
171             wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM   
172             wxLANGUAGE_MALAY_MALAYSIA   
173             wxLANGUAGE_MALTESE   
174             wxLANGUAGE_MANIPURI   
175             wxLANGUAGE_MAORI   
176             wxLANGUAGE_MARATHI   
177             wxLANGUAGE_MOLDAVIAN   
178             wxLANGUAGE_MONGOLIAN   
179             wxLANGUAGE_NAURU   
180             wxLANGUAGE_NEPALI   
181             wxLANGUAGE_NEPALI_INDIA   
182             wxLANGUAGE_NORWEGIAN_BOKMAL   
183             wxLANGUAGE_NORWEGIAN_NYNORSK   
184             wxLANGUAGE_OCCITAN   
185             wxLANGUAGE_ORIYA   
186             wxLANGUAGE_OROMO   
187             wxLANGUAGE_PASHTO   
188             wxLANGUAGE_POLISH   
189             wxLANGUAGE_PORTUGUESE   
190             wxLANGUAGE_PORTUGUESE_BRAZILIAN   
191             wxLANGUAGE_PUNJABI   
192             wxLANGUAGE_QUECHUA   
193             wxLANGUAGE_RHAETO_ROMANCE   
194             wxLANGUAGE_ROMANIAN   
195             wxLANGUAGE_RUSSIAN   
196             wxLANGUAGE_RUSSIAN_UKRAINE   
197             wxLANGUAGE_SAMI   
198             wxLANGUAGE_SAMOAN   
199             wxLANGUAGE_SANGHO   
200             wxLANGUAGE_SANSKRIT   
201             wxLANGUAGE_SCOTS_GAELIC   
202             wxLANGUAGE_SERBIAN   
203             wxLANGUAGE_SERBIAN_CYRILLIC   
204             wxLANGUAGE_SERBIAN_LATIN   
205             wxLANGUAGE_SERBO_CROATIAN   
206             wxLANGUAGE_SESOTHO   
207             wxLANGUAGE_SETSWANA   
208             wxLANGUAGE_SHONA   
209             wxLANGUAGE_SINDHI   
210             wxLANGUAGE_SINHALESE   
211             wxLANGUAGE_SISWATI   
212             wxLANGUAGE_SLOVAK   
213             wxLANGUAGE_SLOVENIAN   
214             wxLANGUAGE_SOMALI   
215             wxLANGUAGE_SPANISH   
216             wxLANGUAGE_SPANISH_ARGENTINA   
217             wxLANGUAGE_SPANISH_BOLIVIA   
218             wxLANGUAGE_SPANISH_CHILE   
219             wxLANGUAGE_SPANISH_COLOMBIA   
220             wxLANGUAGE_SPANISH_COSTA_RICA   
221             wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC   
222             wxLANGUAGE_SPANISH_ECUADOR   
223             wxLANGUAGE_SPANISH_EL_SALVADOR   
224             wxLANGUAGE_SPANISH_GUATEMALA   
225             wxLANGUAGE_SPANISH_HONDURAS   
226             wxLANGUAGE_SPANISH_MEXICAN   
227             wxLANGUAGE_SPANISH_MODERN   
228             wxLANGUAGE_SPANISH_NICARAGUA   
229             wxLANGUAGE_SPANISH_PANAMA   
230             wxLANGUAGE_SPANISH_PARAGUAY   
231             wxLANGUAGE_SPANISH_PERU   
232             wxLANGUAGE_SPANISH_PUERTO_RICO   
233             wxLANGUAGE_SPANISH_URUGUAY   
234             wxLANGUAGE_SPANISH_US   
235             wxLANGUAGE_SPANISH_VENEZUELA   
236             wxLANGUAGE_SUNDANESE   
237             wxLANGUAGE_SWAHILI   
238             wxLANGUAGE_SWEDISH   
239             wxLANGUAGE_SWEDISH_FINLAND   
240             wxLANGUAGE_TAGALOG   
241             wxLANGUAGE_TAJIK   
242             wxLANGUAGE_TAMIL   
243             wxLANGUAGE_TATAR   
244             wxLANGUAGE_TELUGU   
245             wxLANGUAGE_THAI   
246             wxLANGUAGE_TIBETAN   
247             wxLANGUAGE_TIGRINYA   
248             wxLANGUAGE_TONGA   
249             wxLANGUAGE_TSONGA   
250             wxLANGUAGE_TURKISH   
251             wxLANGUAGE_TURKMEN   
252             wxLANGUAGE_TWI   
253             wxLANGUAGE_UIGHUR   
254             wxLANGUAGE_UKRAINIAN   
255             wxLANGUAGE_URDU   
256             wxLANGUAGE_URDU_INDIA   
257             wxLANGUAGE_URDU_PAKISTAN   
258             wxLANGUAGE_UZBEK   
259             wxLANGUAGE_UZBEK_CYRILLIC   
260             wxLANGUAGE_UZBEK_LATIN   
261             wxLANGUAGE_VALENCIAN   
262             wxLANGUAGE_VIETNAMESE   
263             wxLANGUAGE_VOLAPUK   
264             wxLANGUAGE_WELSH   
265             wxLANGUAGE_WOLOF   
266             wxLANGUAGE_XHOSA   
267             wxLANGUAGE_YIDDISH   
268             wxLANGUAGE_YORUBA   
269             wxLANGUAGE_ZHUANG   
270             wxLANGUAGE_ZULU 
271         /;
272use Uploader::GUI::wxFrameAUI;
273use File::Slurp ;
274use Data::Dumper;
275use Storable;
276use File::HomeDir;
277use File::Spec;
278use Uploader::PWG;
279use Uploader::ImageList;
280use Uploader::GUI::wxLoginDlg;
281use Wx::Locale qw/:default/;
282
283
284$|=1;
285
286__PACKAGE__->mk_accessors( 
287    qw/
288          pwg
289          site_url
290          site_username
291          site_password
292          http_username
293          http_password
294          rejects
295          imagelist
296          storable_file
297          wx_thumb_dir
298          resized_dir
299          preview_dir
300          userdata_dir
301          resized_dir
302          thumb_dir
303          conf_file
304          locale
305          current_language
306          version
307          imagelist_version
308          use_offline
309          login_dlg
310          branding
311          frame
312      / 
313);
314
315sub FilterEvent {
316    my( $self, $event ) = @_;
317   
318    Wx::LogMessage "EventType %s", $event->GetEventType();
319   
320    return -1;
321}
322
323
324sub OnInit {
325    my( $self ) = @_;
326   
327    $self->version(
328        '2.0.2c'
329    );
330   
331    # to check if we can use stored cache
332    $self->imagelist_version(
333        '3'
334    );
335
336    Wx::InitAllImageHandlers();
337    my $applicationName = "pLoader" ;
338    $self->SetAppName( $applicationName );
339    $self->SetVendorName( "Piwigo Team" );
340
341    $self->{IMGTYPE} = {
342        'jpg' => wxBITMAP_TYPE_JPEG,
343        'gif' => wxBITMAP_TYPE_GIF,
344        'png' => wxBITMAP_TYPE_PNG,
345    };
346
347    $self->_init_userdir;
348
349
350    my $conf = retrieve $self->conf_file if -e $self->conf_file;       
351
352    if(defined $conf ){
353        $self->SetKeyValues($conf);
354    }
355    else {
356        $self->_readParams( 'pLoader.ini' ) unless defined $conf ;
357    }
358
359
360    $self->site_url(
361        $self->{site_url}
362    );
363   
364
365    $self->site_username(
366        $self->{site_username}
367    );
368    $self->site_password(
369        $self->{site_password}
370    );
371
372    $self->http_username(
373        $self->{http_username}
374    );
375    $self->http_password(
376        $self->{http_password}
377    );
378
379
380    $self->current_language(
381        $self->{current_language}||wxLANGUAGE_ENGLISH
382    );
383   
384    $self->init_locale;
385
386    my $not_exit = $self->Login();
387    # user pressed OK
388    if($not_exit){
389        if( !$self->use_offline ){
390            while( $not_exit and !$self->_is_connected ){
391                $not_exit = $self->Login();
392                last if $self->use_offline;
393            }
394        }
395        $self->_init_imagelist;
396        $self->_init_thumbimagelist;
397        $self->_init_frame;
398    }
399
400    $not_exit;
401}
402
403
404sub _is_connected {
405    my ( $self ) = @_;
406
407    my $is_connected;
408
409    if($self->pwg->login_result->{stat} eq 'ok'){
410        $is_connected = 1;
411    }
412    else{
413        Wx::MessageBox( 
414            sprintf(
415                "%s\n\n%s %s %s",
416                $self->pwg->login_result->{message},
417                gettext("Connection to"),
418                $self->site_url,
419                gettext("failed"),
420            ),
421            gettext("Piwigo login error"),
422            wxOK | wxICON_EXCLAMATION, 
423        );
424    }
425   
426    $is_connected;
427}
428
429
430my $locale;
431sub init_locale {
432    my ( $self, $language ) = @_;
433   
434    $self->current_language(
435        $language
436    ) if defined $language;
437
438    undef $locale;
439    $locale = Wx::Locale->new(
440        $self->current_language
441    );
442    $locale->AddCatalogLookupPathPrefix( '../locale');
443    if(!$locale->AddCatalog( 'pLoader.mo' )){
444        Wx::LogMessage gettext("Cannot find translation catalog files. Use default language");
445    }
446    $self->locale($locale);     
447}
448
449sub StoreConnectionProperties {
450    my ( $self ) = @_;
451
452    eval {   
453        store( 
454            {
455                map{
456                   $_ => $self->{$_},
457                }
458                qw/
459                    site_url
460                    site_username
461                    site_password
462                    http_username
463                    http_password
464                    current_language
465                /
466            },
467            $self->conf_file
468        );
469    };
470}
471
472sub _init_imagelist {
473    my ( $self ) = @_; 
474
475    my $stored_imagelist;
476   
477    my $use_new_imagelist;
478   
479    if( -e $self->storable_file ){
480        eval {
481            $stored_imagelist = retrieve $self->storable_file;
482        };
483        if($@){
484            Wx::LogMessage(
485                gettext("An error has occured. Can not read %s\n%s"),
486                $self->storable_file,
487                $@
488            );
489            $use_new_imagelist = 1 ;
490        }
491        # should have a valid imagelist
492        else{
493            $use_new_imagelist = 1 unless $self->imagelist_version eq $stored_imagelist->{imagelist_version};
494            if($use_new_imagelist){
495                Wx::LogMessage(gettext("pLoader has to reset image cache."));
496            }
497        }
498    }
499    else{
500        $use_new_imagelist = 1 ;
501    }
502
503    if($use_new_imagelist){
504        $stored_imagelist = $self->_default_imagelist_params ;
505    }
506
507
508    $self->imagelist(
509        Uploader::ImageList->new(
510            $stored_imagelist
511        )
512    );
513
514    $self->imagelist->RescaleCallback(
515        sub { $self->RescaleImage(@_) }
516    );
517
518    $self->imagelist->ResizeCallback(
519        sub { $self->ResizeImage(@_) }
520    );
521}
522
523
524sub _default_imagelist_params {
525    my ( $self ) = @_ ;
526
527    my $params = {
528        new_files        => [],
529        thumb_size       => 120,
530        site_thumb_dir   => $self->thumb_dir,
531        wx_thumb_size    => 120,
532        wx_thumb_dir     => $self->wx_thumb_dir,
533        preview_ratio    => 25, 
534        preview_dir      => $self->preview_dir,
535        resize_w         => 800,
536        resize_h         => 600,
537        site_resized_dir => $self->resized_dir,
538        type             => 'jpg',
539        filter           => 'Lanczos',
540        blur             => 0.9,
541        quality          => 100,
542        wx_quality       => 80,
543        th_quality       => 90,
544        auto_rotate      => 1,
545        remove_uploaded_from_selection => 1,
546        interlace        => 'Line',
547        create_resized   => 1,
548        use_exif_preview => 1,
549        prefix           => 'TN',
550        count            => 0,
551        storable_file    => $self->storable_file,
552        userdata_dir     => $self->userdata_dir,
553        default_photo_name => gettext('File name'),
554        default_name_prefix => gettext('Photo '),
555        upload_rejects   =>  [],
556        image_sums       => {},
557        sums             => [],
558        version          => $self->version,
559        imagelist_version => $self->imagelist_version,
560        RescaleCallback  => sub { $self->RescaleImage(@_) },
561        ResizeCallback   => sub { $self->ResizeImage(@_) },
562    };
563
564    return $params;
565}
566
567sub Login {
568    my ( $self ) = @_; 
569
570    $self->login_dlg( 
571        Uploader::GUI::wxLoginDlg->new(
572            {
573                title         => gettext("Piwigo login"),
574                site_url      => sub { $self->site_url(@_) },
575                site_username => sub { $self->site_username(@_) },     
576                site_password => sub { $self->site_password(@_) },
577                use_offline   => sub { $self->use_offline(@_) },       
578            }
579        )
580    ) unless $self->login_dlg;
581
582    my $icon = Wx::Icon->new();
583    $icon->LoadFile('../res/favicon.ico', wxBITMAP_TYPE_ICO);
584    $self->login_dlg->SetIcon($icon);   
585
586   
587    my $rval = $self->login_dlg->ShowModal();
588    $self->login_dlg->Show(0);
589
590    $self->_init_branding;
591
592
593    $self->pwg(
594        # get these parameters from dialog or from file
595        Uploader::PWG->new(
596            {
597                site_url       => $self->site_url,
598                site_username  => $self->site_username,
599                site_password  => $self->site_password,
600                http_username  => $self->http_username,
601                http_password  => $self->http_password,
602                branding       => $self->branding,
603            }
604        )
605    );
606   
607    $rval;
608}
609
610sub _init_userdir {
611    my ( $self ) = @_;
612   
613    my $applicationName = $self->GetAppName ;
614    my $userdatadir = File::Spec->canonpath(
615        File::Spec->catfile(
616            File::HomeDir->my_data(), 
617            "\.$applicationName"
618        )
619    );
620
621    if(! -d $userdatadir){
622        if(! mkdir $userdatadir){
623            Wx::MessageBox( 
624                sprintf(
625                    "%s directory creation failed",
626                    $userdatadir,
627                ),
628                "pLoader working directory creation error",
629                wxOK | wxICON_EXCLAMATION, 
630            );
631
632            $userdatadir = File::Spec->canonpath(
633                File::Spec->catfile(
634                    File::Spec->tmpdir(), 
635                    "\.$applicationName"
636                )
637            );
638            mkdir $userdatadir;
639        }       
640    }
641
642    $self->userdata_dir($userdatadir);
643   
644    $self->conf_file(
645        File::Spec->catfile(
646            $self->userdata_dir, 
647            ".$applicationName.conf"
648        )
649    );
650
651   
652
653    $self->storable_file(
654        File::Spec->catfile($self->userdata_dir, 'pLoader.dat')
655    );
656   
657    my $thumbdir = File::Spec->catfile($self->userdata_dir, 'thumbnails');
658    mkdir $thumbdir unless -d $thumbdir ;
659    $self->thumb_dir($thumbdir);
660
661    my $wxthumbdir = File::Spec->catfile($self->userdata_dir, 'wxthumbnails');
662    mkdir $wxthumbdir unless -d $wxthumbdir ;
663    $self->wx_thumb_dir($wxthumbdir);
664
665
666    my $resizedir = File::Spec->catfile($self->userdata_dir, 'resize');
667    mkdir $resizedir unless -d $resizedir ;
668    $self->resized_dir($resizedir);
669
670    my $previewdir = File::Spec->catfile($self->userdata_dir, 'preview');
671    mkdir $previewdir unless -d $previewdir ;
672    $self->preview_dir($previewdir);
673
674       
675}
676
677sub _init_thumbimagelist {
678    my ( $self ) = @_;
679
680   
681    $self->imagelist->wx_thumb_imglist(
682        Wx::ImageList->new( 
683            $self->imagelist->wx_thumb_size, 
684            $self->imagelist->wx_thumb_size, 
685            1,
686            0
687        )
688    );
689   
690    # reload images
691    $self->_reload_thumb_images;
692}
693
694
695sub _reload_thumb_images {
696    my ( $self ) = @_;
697   
698    my $wximagelist = $self->imagelist->wx_thumb_imglist;
699    my $sums = $self->imagelist->sums;
700
701    map {
702        my $image = $self->imagelist->image_sums->{$_};
703
704        $wximagelist->Add(
705            Wx::Bitmap->new( 
706                $image->wx_thumb_file, 
707                $self->GetWxBitmapType($self->imagelist->type), 
708            )
709        );
710    }
711    @$sums ;
712
713}
714
715sub GetWxBitmapType {
716    my ( $self, $type ) = @_;
717   
718    $self->{IMGTYPE}->{$type};
719}
720
721
722sub RescaleImage {
723    my ( $self, $image_file, $image_file_out, $type, $ratio, $width, $height, $quality ) = @_;
724   
725
726    my $image = Wx::Image->new(
727            $image_file, 
728            $self->GetWxBitmapType($type),
729            0
730    );
731   
732    my $w;
733    my $h;
734
735    my $img_w = $image->GetWidth;
736    my $img_h = $image->GetHeight;
737   
738    # use a ratio ( 25% default ) if defined
739    # default ratio is used for preview.
740    if($ratio){
741        $w = $ratio*$img_w/100 ;
742        $h = $ratio*$img_h/100 ;
743    }
744    # use specified width and height
745    else{
746        # portrait
747        if( $img_w < $img_h ){
748            $w = $height;
749        }
750        else{
751            $w = $width;
752        }
753        # to respect aspect ratio
754        $h = sprintf(
755            "%.0f",
756            ($w*$img_h)/$img_w
757        );
758    }
759
760    $image->Rescale(
761        $w,
762        $h,
763        wxIMAGE_QUALITY_HIGH
764    );
765   
766    $quality ||= 90;
767   
768    $image->SetOption( 
769        "quality", 
770        $quality 
771    );
772   
773    if(!$image->SaveFile(
774        $image_file_out,
775        $self->GetWxBitmapType($type),
776    )){
777        Wx::LogMessage(
778            gettext("An error has occured. Can not save file %s"),
779            $image_file_out,
780        )
781    };
782}
783
784sub ResizeImage {
785    my ( $self, $image_file, $image_file_out, $type, $width, $height, $quality ) = @_;
786   
787
788    my $image = Wx::Image->new(
789            $image_file, 
790            $self->GetWxBitmapType($type),
791            0
792    );
793
794    my $w;
795    my $h;
796
797    my $img_w = $image->GetWidth;
798    my $img_h = $image->GetHeight;
799   
800        # portrait
801        if( $img_w < $img_h ){
802            $w = $height;
803        }
804        else{
805            $w = $width;
806        }
807        # to respect aspect ratio
808        $h = sprintf(
809            "%.0f",
810            ($w*$img_h)/$img_w
811        );
812
813   
814
815    $image->Rescale(
816        $w,
817        $h,
818        wxIMAGE_QUALITY_HIGH
819    );
820
821    $image->Resize(
822        [ $width, $height ], [ 0, 20],
823    );
824   
825    $quality ||= 90;
826   
827    $image->SetOption( 
828        "quality", 
829        $quality 
830    );
831   
832    if(!$image->SaveFile(
833        $image_file_out,
834        $self->GetWxBitmapType($type),
835    )){
836        Wx::LogMessage(
837            gettext("An error has occured. Can not save file %s"),
838            $image_file_out,
839        )
840    };
841}
842
843# some labels differ with branding ( piwigo.com or piwigo.org )
844sub _init_branding {
845    my ( $self ) =@_;
846   
847    if( $self->site_url =~ /\.piwigo\.com/ ){
848        $self->branding(
849            {
850                category  => gettext("album"), 
851                Category  => gettext("Album"), 
852                categories => gettext("albums"),       
853                Categories => gettext("Albums"),
854                'Add new category' => gettext("Add new album"), 
855            }
856        );
857    }
858    else{
859        $self->branding(
860            {
861                categorie  => gettext("categorie"),     
862                Categorie  => gettext("Categorie"),     
863                categories => gettext("categories"),   
864                Categories => gettext("Categories"),   
865                'Add new category' => gettext("Add new category"),     
866            }
867        );
868    }   
869}
870
871sub SaveConfig {
872    my ( $self, $params ) = @_; 
873
874   my $config = Wx::ConfigBase::Get;
875
876   map {
877       $config->WriteInt( $_, $params->{$_} )
878   } keys %$params;
879
880   $config->Write( 'Perspective', $params->{Perspective} )
881       
882}
883
884
885sub _init_frame {
886    my ( $self ) = @_; 
887
888    my $config = Wx::ConfigBase::Get;
889
890    my $x = $config->ReadInt( "X", 50 );
891    my $y = $config->ReadInt( "Y", 50 );
892    my $w = $config->ReadInt( "Width", 1024 );
893    my $h = $config->ReadInt( "height", 768 );
894    my $prev_w = $config->ReadInt( "PreviewWidth", 400 );
895    my $prev_h = $config->ReadInt( "PreviewHeight", 300 );
896    my $perspective = $config->Read( "Perspective" );
897    my $imageviewer_index = $config->ReadInt( "ImageviewerIndex", 0 );
898   
899    #printf("Config x %s, y %s, w %s, h %s, prev_w %s, prev_h %s\n", $x, $y, $w, $h, $prev_w, $prev_h);
900   
901    my $url = $self->site_url;
902   
903    if($self->use_offline){
904        $url = gettext("Work Offline");
905    }
906
907    $self->frame(
908        Uploader::GUI::wxFrameAUI->new( 
909            {
910                x         => $x,
911                y         => $y,
912                width     => $w,
913                height    => $h,
914                title     => sprintf("pLoader - Piwigo uploader %s - [%s]", $self->version, $url),
915                pwg       => $self->pwg,
916                imagelist => $self->imagelist,
917                preview_w => $prev_w,
918                preview_h => $prev_h,
919                perspective => $perspective,
920                imageviewer_index => $imageviewer_index,
921            }
922        )
923    );
924       
925    $self->frame->SetSize( $x, $y, $w, $h );
926    $self->frame->Show( 1 );
927    $self->SetTopWindow( $self->frame );
928
929    my $icon = Wx::Icon->new();
930    $icon->LoadFile('../res/favicon.ico', wxBITMAP_TYPE_ICO);
931    $self->frame->SetIcon($icon);       
932}
933
934sub _readParams {
935        my( $self, $file ) = @_ ;
936
937
938        my $expr_params ;
939        eval { $expr_params = read_file( $file ); } ;
940       
941        my $paramValues = [] ;
942        if($expr_params){
943                my $expr = '$paramValues = ' ;
944                $expr .=  "$expr_params ; " ;
945                eval $expr ;
946        }
947       
948        return unless 'ARRAY' eq ref $paramValues ;
949       
950        if(scalar(@$paramValues )){
951            my $params = $paramValues->[0] ;
952            $self->SetKeyValues($params);
953        }
954}
955
956
957
958sub SetKeyValues {
959    my ( $self, $params )= @_; 
960
961    foreach( keys %$params ) {
962        $self->{$_} = $params->{$_} ;
963    }
964}
965
966
9671;
Note: See TracBrowser for help on using the repository browser.