source: extensions/pLoader/trunk/src/Uploader/GUI/wxFrameAUI.pm @ 4117

Last change on this file since 4117 was 4117, checked in by ronosman, 14 years ago

Bug 1154 fixed : accented characters are not displayed correctly.

  • Property svn:eol-style set to LF
File size: 54.7 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::wxFrameAUI;
21use strict;
22use Carp;
23use Wx;
24use Win32;
25use Wx::DND;
26use Wx qw/
27             wxYES_NO
28             wxYES
29             wxICON_QUESTION
30             wxITEM_NORMAL
31             wxNullBitmap
32             wxID_OK
33             wxDEFAULT_FRAME_STYLE
34             wxVERTICAL
35             wxGROW
36             wxBITMAP_TYPE_JPEG
37             wxBITMAP_TYPE_GIF
38             wxBITMAP_TYPE_PNG
39             wxTB_FLAT
40             wxSIZE
41             wxWHITE
42             wxBLACK
43             wxID_CANCEL
44             wxFD_OPEN
45             wxFD_MULTIPLE
46             wxLI_HORIZONTAL
47             wxALIGN_CENTER_VERTICAL
48             wxALL
49             wxDefaultPosition
50             wxDefaultSize
51             wxTheApp
52             wxIMAGE_LIST_NORMAL
53             wxAUI_NB_TAB_MOVE
54             wxAUI_NB_TAB_SPLIT
55             wxNO_BORDER
56             wxTE_MULTILINE
57             wxTE_READONLY
58             wxITEM_NORMAL
59             wxCLIP_CHILDREN
60             wxBORDER_NONE
61             wxNullBitmap
62             wxTR_MULTIPLE
63             wxTR_EXTENDED
64             wxTR_HIDE_ROOT
65             wxTR_HAS_BUTTONS
66             wxTR_EDIT_LABELS
67             wxMAXIMIZE
68             wxOK
69             wxICON_EXCLAMATION
70             wxICON_INFORMATION
71             WXK_DELETE
72         /;
73use base qw/Wx::Frame Class::Accessor::Fast/;
74use File::Spec;
75use Wx::Locale qw/:default/;
76
77
78my @properties = 
79    qw/
80          progressdlg
81          upload_progressdlg
82          imageviewer
83          tree
84          tree_root
85          treeimglist
86          tree_item_default
87          topsizer
88          pwg
89          manager
90          logwnd
91          oldlogwnd
92          htmlhome
93          notebook
94          categories
95          imagelist
96          image_preview
97          image_prop_piwigo
98          image_prop_exif
99          image_prop_tags
100          notebook_image_properties
101          notebook_global_settings
102          general_settings_panel
103          resized_settings_panel
104          thumbnail_settings_panel
105          preview_settings_panel
106          advanced_settings_panel
107          watermark_settings_panel
108          piwigo_properties
109          exif_properties
110          general_settings
111          resized_settings
112          thumbnail_settings
113          preview_settings
114          advanced_settings
115          watermark_settings
116          toolbar
117          branding
118          perspective
119          current_imageviewer_index
120          imageviewer_mnu
121          tree_mnu
122          imageviewer_select_multi
123          frameLayout
124          piwigo_tags
125          image_tags
126      /;
127__PACKAGE__->mk_accessors( @properties );
128
129use Wx::Event 
130    qw/
131          EVT_MENU
132          EVT_TREE_SEL_CHANGED
133          EVT_TREE_END_LABEL_EDIT
134          EVT_CLOSE
135          EVT_LIST_END_LABEL_EDIT
136          EVT_LIST_ITEM_SELECTED
137          EVT_LIST_ITEM_ACTIVATED
138          EVT_LIST_ITEM_RIGHT_CLICK
139          EVT_TREE_ITEM_RIGHT_CLICK
140          EVT_LIST_KEY_DOWN
141          EVT_UPDATE_UI       
142      /;
143     
144use Uploader::GUI::wxImageListCtrl;
145use Uploader::GUI::wxImageProcessingProgressDlg;
146use Uploader::GUI::wxChoiceFilteredPanel;
147use Wx::Html;
148use Uploader::GUI::wxHtmlWindow;
149use Data::Dumper;
150use Wx::AUI;
151use Storable;
152use Uploader::GUI::wxPropertyGridPanel;
153use Encode qw/encode decode is_utf8/;
154use utf8;
155$|=1;
156
157my $ID_TREE_CTX_MENU = 20000 ;
158my $ID_IMAGEVIEWER_CTX_MENU = 20100 ;
159
160sub new {
161  my( $class, $params ) = @_;
162  my( $self ) = $class->SUPER::new( 
163                                      undef, 
164                                      -1, 
165                                      $params->{title},
166                                      wxDefaultPosition,
167                                      wxDefaultSize, 
168                                      wxDEFAULT_FRAME_STYLE
169                                   );
170
171    $self->perspective(
172        $params->{perspective}
173    );
174   
175    $self->current_imageviewer_index(
176        $params->{imageviewer_index}||0
177    );
178   
179    $self->frameLayout(
180        $params->{frameLayout} || { 'pX' => -1, 'pY' => -1, W => 800, H => 600 }
181    );
182
183    $self->pwg( $params->{pwg} );
184    $self->imagelist( $params->{imagelist} );
185
186    # callback for GUI refresh : add thumbnail images to the imageviewer control
187    $self->imagelist->SetNewFilesViewerRefreshCallback(
188        sub { $self->SetNewFilesViewerRefresh(@_) }
189    );
190
191    # callback for GUI refresh : progress dialog display of thumbnail image being created
192    $self->imagelist->SetNewFilesProgressCallback(
193        sub { $self->SetNewFilesProgress(@_) }
194    );
195
196    $self->imagelist->SetNewFilesDisplayEndInfoCallback(
197        sub { $self->SetNewFilesDisplayEndInfo(@_) }
198    );
199
200
201    # callback for GUI refresh : remove thumbnail images from imageviewer control
202    $self->imagelist->UploadImagesViewerCallback(
203        sub { $self->UploadImagesViewerRefresh(@_) }
204    );
205
206
207    # callback for GUI refresh : progress dialog display current uploaded image
208    $self->imagelist->progress_thumbnail_refresh(
209        sub { $self->UploadProgressThumbnailRefresh(@_) }
210    );
211
212    $self->imagelist->progress_msg_refresh(
213        sub { $self->UploadProgressMessageRefresh(@_) }
214    );
215
216
217    $self->imagelist->progressbar_refresh(
218        sub { $self->UploadProgressBarRefresh(@_) }
219    );
220   
221    $self->imagelist->progress_endinfo_refresh(
222        sub { $self->UploadDisplayEndInfo(@_) }
223    );
224
225
226    $self->imagelist->pwg(
227        $self->pwg
228    );
229
230    $self->imagelist->categories(
231        []
232    );
233
234
235    $self->manager( Wx::AuiManager->new );
236    $self->manager->SetManagedWindow( $self );
237    $self->_set_setting_properties;
238    $self->_initFrame;
239    $self->_initMenus;
240    $self->_initEventHandlers;
241    $self->_initImgTypes;   
242
243
244    $self->imageviewer->SelectItem(
245        $self->current_imageviewer_index
246    ) if $self->imageviewer->GetItemCount;
247   
248    $self;
249}
250
251
252sub _initImgTypes {
253    my ( $self ) = @_;
254
255    $self->{IMGTYPE} = {
256             'jpg' => wxBITMAP_TYPE_JPEG,
257             'gif' => wxBITMAP_TYPE_GIF,
258             'png' => wxBITMAP_TYPE_PNG,
259    };
260}
261
262
263sub GetWxBitmapType {
264    my ( $self, $type ) = @_;
265   
266    $self->{IMGTYPE}->{$type};
267}
268
269
270
271sub _set_setting_properties {
272    my ( $self ) = @_;
273
274    $self->piwigo_properties(
275        [
276            {
277                label => gettext("Photo caption :"),
278                value => sub { $self->imagelist->current_image->site_name(@_) },
279            },
280            {
281                label => gettext("Comment :"),
282                value => sub { $self->imagelist->current_image->site_comment(@_) },
283                type  => "LongText",
284            },
285            {
286                label => gettext("Author :"),
287                value => sub { $self->imagelist->current_image->site_author(@_) },
288            },
289            {
290                label    => gettext("File name :"),
291                value    => sub { $self->imagelist->current_image->file(@_) },
292                readonly => 1,
293            },
294            {
295                label    => gettext("Create date :"),
296                value    => sub { $self->imagelist->current_image->create_date(@_) },
297                readonly => 1,
298            },
299        ]   
300    );
301
302    $self->exif_properties(
303        [
304            {
305                label    => gettext("Create date :"),
306                value    => sub { $self->imagelist->current_image->create_date }, 
307                readonly => 1,
308            }, 
309            {
310                label    => gettext("Model :"),
311                value    => sub { $self->imagelist->current_image->exif_tag('Model') }, 
312                readonly => 1,
313            }, 
314            {
315                label    => gettext("Width :"),
316                value    => sub { $self->imagelist->current_image->exif_tag('ImageWidth') }, 
317                readonly => 1,
318            }, 
319            {
320                label    => gettext("Height :"),
321                value    => sub { $self->imagelist->current_image->exif_tag('ImageHeight') }, 
322                readonly => 1,
323            }, 
324            {
325                label    => gettext("Orientation :"),
326                value    => sub { $self->imagelist->current_image->exif_tag('Orientation') }, 
327                readonly => 1,
328            }, 
329            {
330                label    => "ISO :",
331                value    => sub { $self->imagelist->current_image->exif_tag('ISO') }, 
332                readonly => 1,
333            }, 
334            {
335                label    => gettext("Shutter speed :"),
336                value    => sub { $self->imagelist->current_image->exif_tag('ExposureTime') }, 
337                readonly => 1,
338            }, 
339            {
340                label    => gettext("Aperture :"),
341                value    => sub { $self->imagelist->current_image->exif_tag('ApertureValue') }, 
342                readonly => 1,
343            }, 
344            {
345                label    => gettext("Focal length :"),
346                value    => sub { $self->imagelist->current_image->exif_tag('FocalLength') }, 
347                readonly => 1,
348            }, 
349            {
350                label    => gettext("Lens :"),
351                value    => sub { $self->imagelist->current_image->exif_tag('Lens') }, 
352                readonly => 1,
353            }, 
354        ]
355    );   
356
357
358    $self->general_settings(
359        [
360            {
361                label     => gettext("Default author :"),
362                value   => sub { $self->imagelist->author(@_) },
363            },
364            {
365                label     => gettext("Default photo caption :"),
366                type      => 'Choice',
367                value   => sub { $self->imagelist->default_photo_name(@_) },
368                choice  => [
369                                  gettext('None'),
370                                  gettext('File name'),
371                                  gettext('File path and name'),
372                                  gettext('Prefix'),
373                                  gettext('Prefix + rank number'),
374                                  gettext('Rank number + prefix'),
375                                  gettext('Prefix + create date chrono'),
376                                  gettext('Create date chrono + prefix'),
377                              ],
378            },
379            {
380                label     => gettext("Photo caption  prefix :"),
381                value   => sub { $self->imagelist->default_name_prefix(@_) },
382            },
383            {
384                label     => gettext("Resize site image :"),
385                type      => 'Bool',
386                value   => sub { $self->imagelist->create_resized(@_) },
387            },
388            {
389                label     => gettext("Auto rotate image :"),
390                type      => 'Bool',
391                value   => sub { $self->imagelist->auto_rotate(@_) },
392            },
393            {
394                label     => gettext("Upload high (original size) :"),
395                type      => 'Bool',
396                value   => sub { $self->imagelist->upload_high(@_) },
397            },
398            {
399                label     => gettext("Remove uploaded photo from selection :"),
400                type      => 'Bool',
401                value   => sub { $self->imagelist->remove_uploaded_from_selection(@_) },
402            },
403        ]   
404    );
405   
406    $self->resized_settings(
407        [
408            {
409                label     => gettext("Site image width :"),
410                type      => 'Number',
411                value   => sub { $self->imagelist->resize_w(@_) },
412            },
413            {
414                label     => gettext("Site image height :"),
415                type      => 'Number',
416                value   => sub { $self->imagelist->resize_h(@_) },
417            },
418            {
419                label     => gettext("Site image jpeg quality :"),
420                type      => 'Number',
421                value   => sub { $self->imagelist->quality(@_) },
422            },
423            {
424                label     => gettext("Site image filter :"),
425                type      => 'Choice',
426                value   => sub { $self->imagelist->filter(@_) },
427                choice    => [ qw/Point Box Triangle Hermite Hanning Hamming Blackman Gaussian Quadratic Cubic Catrom Mitchell Lanczos Bessel Sinc/ ],
428            },
429            {
430                label     => gettext("Site image blur :"),
431                type      => 'Number',
432                value   => sub { $self->imagelist->blur(@_) },
433            },
434            {
435                label     => gettext("Site image interlace :"),
436                type      => 'Choice',
437                value   => sub { $self->imagelist->interlace(@_) },
438                choice    => [ qw/None Line Plane Partition JPEG GIF PNG/ ],
439            },
440        ]   
441    );
442
443    $self->thumbnail_settings(
444        [
445            {
446                label     => gettext("Site thumbnail size :"),
447                type      => 'Number',
448                value   => sub { $self->imagelist->thumb_size(@_) },
449            },
450            {
451                label     => gettext("Site thumbnail jpeg quality :"),
452                type      => 'Number',
453                value   => sub { $self->imagelist->th_quality(@_) },
454            },
455            {
456                label     => gettext("Photo selection thumbnail size :"),
457                type      => 'Number',
458                value   => sub { $self->imagelist->wx_thumb_size(@_) },
459            },
460            {
461                label     => gettext("Photo selection thumbnail jpeg quality :"),
462                type      => 'Number',
463                value   => sub { $self->imagelist->wx_quality(@_) },
464            },
465        ]   
466    );
467   
468    $self->preview_settings(
469        [
470            {
471                label     => gettext("Use exif preview when available :"),
472                type      => 'Bool',
473                value   => sub { $self->imagelist->use_exif_preview(@_) },
474            },
475            {
476                label     => gettext("Custom preview ratio :"),
477                type      => 'Number',
478                value   => sub { $self->imagelist->preview_ratio(@_) },
479            },
480        ]   
481    );
482
483    $self->advanced_settings(
484        [
485            {
486                label     => gettext("Transfert chunk size :"),
487                type      => 'Number',
488                value   => sub { wxTheApp->chunk_size(@_) },
489            },
490        ]   
491    );
492
493    $self->watermark_settings(
494        [
495            {
496              label  => gettext("Activate watermark :"),
497              type   => 'Bool',
498              value  => sub { $self->imagelist->watermark_activate(@_) },
499            },
500            {
501              label => gettext("Activate watermark on high definition :"),
502              type  => 'Bool',
503              value => sub { $self->imagelist->watermark_activate_pwg_high(@_) },
504            },
505            {
506              label  => gettext("Text :"),
507              value  => sub { $self->imagelist->watermark_text(@_) },
508            },
509            {
510                label     => gettext("Text size :"),
511                type      => 'Number',
512                value   => sub { $self->imagelist->watermark_text_size(@_) },
513            },
514            {
515                label     => gettext("Color :"),
516                type      => 'Choice',
517                value   => sub { $self->imagelist->watermark_color(@_) },
518                choice  => [
519                                  gettext("White"),
520                                  gettext("Black"),
521                           ],
522            },           
523            {
524                label     => gettext("Position :"),
525                type      => 'Choice',
526                value   => sub { $self->imagelist->watermark_position(@_) },
527                choice  => [
528                                  gettext("Top"),
529                                  gettext("Top left"),
530                                  gettext("Top right"),
531                                  gettext("Bottom"),
532                                  gettext("Bottom left"),
533                                  gettext("Bottom right"),
534                                  gettext("Center"),
535                                  gettext("Left"),
536                                  gettext("Right"),
537                           ],
538            },
539            {
540                label     => gettext("Top margin :"),
541                type      => 'Number',
542                value   => sub { $self->imagelist->watermark_y(@_) },
543            },
544            {
545                label     => gettext("Left margin :"),
546                type      => 'Number',
547                value   => sub { $self->imagelist->watermark_x(@_) },
548            },           
549        ]
550    );
551
552    $self->image_tags(
553        sub { eval { $self->imagelist->current_image->site_tags(@_) } }
554    );
555
556    $self->piwigo_tags(
557        sub { wxTheApp->pwg->tags }
558    ); 
559}
560
561sub _create_piwigo_tag {
562    my ( $self, $name ) = @_;
563   
564    if(
565        Wx::MessageBox( 
566            sprintf(
567                gettext("Do you want to create \"%s\" ?"), 
568                $name,
569            ),
570            gettext("Piwigo search information"),
571            wxYES_NO | wxICON_QUESTION, 
572        ) == wxYES
573    ){   
574        $self->pwg->AddTags($name);
575        $self->pwg->RefreshTags;
576    }
577}
578
579sub _refreshFrame {
580    my ( $self ) = @_;
581   
582    $self->_set_setting_properties;
583    $self->_refresh_settings_panels_properties;
584    map {
585        $_->Refresh;   
586    }
587    (
588        $self->image_prop_piwigo,
589        $self->image_prop_exif,
590        $self->image_prop_tags,
591        $self->general_settings_panel,
592        $self->resized_settings_panel,
593        $self->thumbnail_settings_panel,
594        $self->preview_settings_panel,
595        $self->advanced_settings_panel,
596        $self->watermark_settings_panel,
597    );
598   
599    $self->manager->Update;
600}
601
602
603sub _destroy_settings_panels {
604    my ( $self ) = @_;
605
606
607
608    map {
609        $self->manager->DetachPane(
610            $_
611        );
612        $_->Show(0);
613        $_->Destroy;
614    }(
615        $self->notebook_global_settings,
616        $self->notebook_image_properties,
617    );
618}
619
620#
621sub _initFrame {
622    my ( $self ) = @_;
623   
624 
625    $self->init_panels;
626
627    $self->init_aui;
628    $self->init_dnd_targets;
629
630    if( $self->imagelist->wx_thumb_imglist->GetImageCount){
631        printf("%s images\n", $self->imagelist->wx_thumb_imglist->GetImageCount); 
632        $self->ShowImageViewer;
633       
634        $self->imageviewer->Refresh(
635            $self->imagelist->wx_thumb_imglist
636        );
637       
638    }
639
640}
641
642sub _refresh_settings_panels_properties {
643    my ( $self ) = @_; 
644
645    $self->image_prop_piwigo->properties(
646        $self->piwigo_properties
647    );
648   
649    $self->image_prop_exif->properties(
650        $self->exif_properties
651    );
652
653
654    $self->general_settings_panel->properties(
655        $self->general_settings
656    );   
657
658    $self->resized_settings_panel->properties(
659        $self->resized_settings
660    );   
661
662    $self->thumbnail_settings_panel->properties(
663        $self->thumbnail_settings,
664    );   
665
666    $self->preview_settings_panel->properties(
667        $self->preview_settings,
668    );   
669
670    $self->advanced_settings_panel->properties(
671        $self->advanced_settings,
672    );   
673
674    $self->watermark_settings_panel->properties(
675        $self->watermark_settings,
676    ); 
677       
678}
679
680sub _init_settings_panels {
681    my ( $self ) = @_; 
682
683    $self->image_prop_piwigo(
684        Uploader::GUI::wxPropertyGridPanel->new( 
685            { 
686                parentwnd       => $self,
687                properties      => $self->piwigo_properties,
688                frame_callbacks => [ 
689                                          sub {
690                                              $self->imageviewer->Refresh();
691                                          },
692                                   ],
693            }
694        )
695    );
696
697    $self->image_prop_exif(
698        Uploader::GUI::wxPropertyGridPanel->new( 
699            { 
700                parentwnd       => $self,
701                frame_callbacks => [],
702                properties      => $self->exif_properties,
703            }
704        )
705    );
706
707
708    $self->general_settings_panel(
709        Uploader::GUI::wxPropertyGridPanel->new( 
710            { 
711                parentwnd       => $self,
712                properties      => $self->general_settings,
713                frame_callbacks => [], 
714            }
715        )
716    );   
717
718    $self->resized_settings_panel(
719        Uploader::GUI::wxPropertyGridPanel->new( 
720            { 
721                parentwnd       => $self,
722                properties      => $self->resized_settings,
723                frame_callbacks => [],
724
725            }
726        )   
727    );   
728
729    $self->thumbnail_settings_panel(
730        Uploader::GUI::wxPropertyGridPanel->new( 
731            { 
732                parentwnd       => $self,
733                properties      => $self->thumbnail_settings,
734                frame_callbacks => [],
735
736            }
737        )   
738    );   
739    $self->preview_settings_panel(
740        Uploader::GUI::wxPropertyGridPanel->new( 
741            { 
742                parentwnd       => $self,
743                properties      => $self->preview_settings,
744                frame_callbacks => [],
745
746            }
747        )   
748    );   
749
750    $self->advanced_settings_panel(
751        Uploader::GUI::wxPropertyGridPanel->new( 
752            { 
753                parentwnd       => $self,
754                properties      => $self->advanced_settings,
755                frame_callbacks => [],
756
757            }
758        )   
759    );   
760
761    $self->watermark_settings_panel(
762        Uploader::GUI::wxPropertyGridPanel->new(
763            {
764                parentwnd   => $self,
765                properties  => $self->watermark_settings,
766                frame_callbacks => [],
767            }
768        )
769    );
770
771    $self->image_prop_tags(
772        Uploader::GUI::wxChoiceFilteredPanel->new( 
773            { 
774                parentwnd    => $self,
775                choices      => $self->piwigo_tags,
776                selection    => $self->image_tags,
777                creation_callback => sub { $self->_create_piwigo_tag(@_) }, 
778            }
779        )   
780    );   
781
782   
783    $self->general_settings_panel->Show(0);
784
785    $self->image_preview(
786        Wx::HtmlWindow->new(
787            $self,
788            -1,
789            [-1,-1],
790            [-1,-1],
791        )
792    );
793
794
795    $self->image_prop_piwigo->Show(0);
796   
797    $self->image_prop_exif->Show(0);
798       
799}
800
801sub init_panels {
802    my ( $self ) = @_; 
803
804    my $file = sprintf(
805        "../locale/%s/gs.html",
806        wxTheApp->locale->GetCanonicalName
807    );
808
809    $self->htmlhome(
810        Uploader::GUI::wxHtmlWindow->new(
811            $self, -1, [-1, -1], [450, 450]
812        )
813    );
814   
815    $self->htmlhome->LoadPage($file) if -e $file ;
816   
817    $self->htmlhome->InitHrefCallbacks(
818        {
819            new_album => sub {$self->OnAddCategories(@_) },
820            add_photos => sub { $self->OnAddImages(@_) },
821            upload_photos => sub { $self->ProcessImageSelection(@_)},   
822        }
823    );
824   
825    $self->imageviewer(
826        Uploader::GUI::wxImageListCtrl->new( 
827            { 
828                parentwnd => $self,
829                imagelist => $self->imagelist,
830            }
831        )
832    );
833   
834    $self->_init_settings_panels;       
835}
836
837sub init_dnd_targets {
838    my ( $self ) = @_; 
839
840    $self->imageviewer->SetDropTarget( 
841        DNDImageListDropTarget->new(
842            $self->imageviewer
843        ) 
844    );
845
846    $self->tree->SetDropTarget( 
847        DNDCategoryTreeDropTarget->new(
848            $self->tree
849        )
850    );
851       
852}
853
854sub init_aui {
855    my ( $self ) = @_;
856
857    my $url = wxTheApp->site_url;
858   
859    $url = gettext("empty - work Offline") if wxTheApp->use_offline;
860
861    $self->manager->AddPane
862      ( $self->create_notebook_imagelist, Wx::AuiPaneInfo->new->Name( "ImageViewer" )
863        ->CenterPane->Resizable->CloseButton(0) );
864
865    $self->manager->AddPane( 
866        $self->create_tree, 
867        Wx::AuiPaneInfo->new->Name( "categories" )
868        ->Right->Position( 0 )->Resizable->CloseButton(0), 
869    );
870
871
872
873    $self->_init_aui_settings_panels;
874
875    $self->toolbar(
876        $self->create_toolbar
877    );
878
879    $self->manager->AddPane
880      ( $self->toolbar, Wx::AuiPaneInfo->new->Name( "tb1" )
881        ->ToolbarPane->Top->Row( 1 )->LeftDockable( 0 )->RightDockable( 0 ) ) if defined $self->toolbar;
882
883    $self->SetSize( 
884            $self->frameLayout->{pX}, 
885            $self->frameLayout->{pY}, 
886            $self->frameLayout->{W}, 
887            $self->frameLayout->{H}, 
888    );
889
890
891    if($self->perspective){
892        $self->manager->LoadPerspective($self->perspective);
893    }
894    else {
895        $self->manager->GetPane("categories")->MinSize(300,100);
896
897        $self->manager->GetPane("tb1")->Caption( gettext("Tools") );
898        $self->manager->GetPane("image_preview")->Caption(gettext("Preview"))->Show(0);
899        $self->manager->GetPane("getting_started")->Caption(gettext("Getting started"))->Float->Show(1);
900        $self->manager->GetPane("photo_properties")->Caption(gettext("Photo properties"))->Float->Show(0);
901        $self->manager->GetPane("global_settings")->Caption(gettext("Global settings"))->Float->Show(0);
902    }
903
904    $self->manager->GetPane("categories")->Caption(
905          sprintf("%s - %s", sprintf("Piwigo %s", wxTheApp->branding->{categories}), $url )
906    );
907   
908    $self->manager->Update;
909
910}
911
912
913sub _init_aui_settings_panels {
914    my ( $self ) = @_; 
915
916    $self->manager->AddPane
917      ( $self->image_preview, Wx::AuiPaneInfo->new->Name( "image_preview" )
918        ->Floatable(1)->Resizable->CloseButton(1));
919
920    $self->manager->AddPane
921      ( $self->htmlhome, Wx::AuiPaneInfo->new->Name( "getting_started" )
922       ->Floatable(1)->Resizable->CloseButton(1) );
923
924    $self->manager->AddPane
925      ( $self->create_notebook_image_properties, Wx::AuiPaneInfo->new->Name( "photo_properties" )
926        ->Floatable(1)->Resizable->CloseButton(1) );
927
928    $self->manager->AddPane
929      ( $self->create_notebook_global_settings, Wx::AuiPaneInfo->new->Name( "global_settings" )
930        ->Floatable(1)->Resizable->CloseButton(1) );
931
932}
933
934sub OnPhotoProperties {
935    my ( $self ) = @_;
936
937    $self->manager->GetPane("photo_properties")->Show(1);
938    $self->manager->Update();   
939       
940}
941
942sub OnPreview {
943    my ( $self ) = @_;
944
945    $self->manager->GetPane("image_preview")->Float->Show(1);
946    $self->manager->Update();   
947       
948}
949
950sub OnGettingStarted {
951    my ( $self ) = @_;
952
953    $self->toolbar->EnableTool(100, 0 );
954    $self->manager->GetPane("getting_started")->Float->Show(1);
955    $self->manager->Update();   
956       
957}
958
959sub OnGlobalSettings {
960    my ( $self ) = @_;
961
962    $self->toolbar->EnableTool(104, 0 );
963    $self->manager->GetPane("global_settings")->Float->Show(1);
964    $self->manager->Update();   
965}
966
967sub OnChooseLanguage {
968    my ( $self ) = @_; 
969
970  my $languages = wxTheApp->available_languages;
971
972
973  my $dialog = new Wx::SingleChoiceDialog( 
974    undef, 
975    gettext( "Choose a language" ), 
976    gettext( "Choose a language" ),
977    [ map { sprintf($_->[0], gettext($_->[2])) } @$languages ] 
978  );
979
980  if( $dialog->ShowModal() == wxID_OK ) {
981    wxTheApp->current_language(
982        $languages->[$dialog->GetSelection][1]
983    );
984
985    Wx::LogMessage(
986        sprintf(
987            "%s : %s", 
988            gettext("pLoader needs to be restarted to display the new selected language"),
989            gettext($languages->[$dialog->GetSelection][2])
990        )
991    );
992  }
993
994  $dialog->Destroy;
995
996}
997
998sub OnDefaultPhotoNameChanged {
999    my ( $self ) = @_;
1000   
1001    Wx::LogMessage("New default_photo_name %s", $self->imagelist->default_photo_name); 
1002}
1003
1004
1005sub create_notebook_imagelist {
1006    my( $self ) = @_;
1007    my $book = Wx::AuiNotebook->new( $self, -1, [-1, -1], [300, 450],
1008                                     wxBORDER_NONE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT);
1009
1010        my $imglistpage = [
1011            [
1012                $self->imageviewer, 
1013                gettext("Photo selection"),
1014                '../res/images.png', 
1015                wxBITMAP_TYPE_PNG,
1016            ],
1017        ];
1018
1019    $self->notebook($book);
1020    $self->_populate_notebook($self->notebook, $imglistpage, 0);
1021    return $book;
1022}
1023
1024sub create_notebook_image_properties {
1025    my( $self ) = @_;
1026    my $book = Wx::AuiNotebook->new( $self, -1, [-1, -1], [450, 450],
1027                                     wxBORDER_NONE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT);
1028    my $pages = [   
1029        [
1030            $self->image_prop_piwigo, 
1031            "Piwigo",
1032        ],
1033        [
1034            $self->image_prop_tags, 
1035            "Tags",
1036        ],
1037        [
1038            $self->image_prop_exif, 
1039            "Exif",
1040        ],
1041    ];
1042   
1043    $self->_populate_notebook( $book, $pages );
1044
1045    $self->notebook_image_properties($book);
1046
1047    return $book;
1048}
1049
1050sub create_notebook_global_settings {
1051    my( $self ) = @_;
1052    my $book = Wx::AuiNotebook->new( $self, -1, [-1, -1], [450, 450],
1053                                     wxBORDER_NONE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT);
1054    my $pages = [   
1055        [
1056            $self->general_settings_panel, 
1057            gettext("General"),
1058        ],
1059        [
1060            $self->resized_settings_panel, 
1061            gettext("Resized"),
1062        ],
1063        [
1064            $self->thumbnail_settings_panel, 
1065            gettext("Thumbnail"),
1066        ],
1067        [
1068            $self->preview_settings_panel, 
1069            gettext("Preview"),
1070        ],
1071        [
1072            $self->advanced_settings_panel, 
1073            gettext("Advanced"),
1074        ],
1075        [
1076            $self->watermark_settings_panel,
1077            gettext("Watermark"),
1078        ]   
1079    ];
1080   
1081    $self->_populate_notebook( $book, $pages );
1082
1083    $self->notebook_global_settings($book);
1084
1085    return $book;
1086}
1087
1088
1089
1090
1091sub create_tree {
1092    my ( $self ) = @_;
1093
1094    my $images = [
1095        map {
1096            Wx::Bitmap->new( $_, wxBITMAP_TYPE_PNG )
1097               
1098        }
1099        (
1100          '../res/tree_pwg.png',
1101          '../res/tree_folder.png',
1102        )   
1103    ];
1104
1105    $self->treeimglist( Wx::ImageList->new( 16, 16, 1 ) );
1106    map {
1107        $self->treeimglist->Add($_);
1108    }
1109    @$images;
1110
1111   
1112    $self->tree( 
1113        Wx::TreeCtrl->new( 
1114           $self, 
1115           -1, 
1116           wxDefaultPosition, 
1117           wxDefaultSize, 
1118           wxBORDER_NONE|
1119           wxCLIP_CHILDREN|
1120           wxTR_HAS_BUTTONS|
1121           wxTR_EDIT_LABELS
1122        ) 
1123    );
1124
1125    $self->tree->SetImageList( $self->treeimglist );
1126    $self->populate_tree_categories if !wxTheApp->use_offline;
1127    $self->tree ;
1128}
1129
1130
1131sub populate_tree_categories {
1132    my ( $self ) = @_;
1133
1134    $self->populate_tree(
1135        $self->tree,
1136        wxTheApp->pwg->categories,
1137    ) if defined wxTheApp->pwg ;
1138   
1139    #$self->tree->ExpandAll;
1140
1141}
1142
1143
1144# returns a valid itemData
1145sub itemData { Wx::TreeItemData->new( $_[0] ) }
1146
1147sub populate_tree {
1148    my ( $self, $tree, $tree_items ) = @_;
1149    my $root = shift @{$tree_items};
1150
1151    $self->tree_root(
1152        $tree->AddRoot( 
1153            $root->[0], 
1154            $root->[3], 
1155            $root->[4], 
1156            itemData( $root->[2] ) 
1157        )
1158    );
1159
1160  $self->populate_tree_helper( $tree, $self->tree_root, $tree_items );
1161 
1162  $tree->SelectItem( $self->tree_root );
1163  $tree->Expand( $self->tree_root );
1164}
1165
1166sub populate_tree_helper {
1167  my ( $self, $tree, $parent_id, $tree_items ) = @_;
1168
1169  my $id;
1170
1171  map {
1172      my $name = $_->[0];
1173
1174      $id = $tree->AppendItem( 
1175                                   $parent_id, 
1176                                   $name,
1177                                   defined($_->[3]) ? $_->[3] : 0, 
1178                                   defined($_->[4]) ? $_->[4] : 0, 
1179                                   itemData( $_->[2]) 
1180                              );
1181      $self->tree_item_default($id) if ! defined $self->tree_item_default;
1182      # current item has children
1183      if( ref( $_->[1] ) eq 'ARRAY' ) {
1184          $self->populate_tree_helper( $tree, $id, $_->[1] );
1185      } 
1186  }
1187  @{$tree_items};
1188
1189}
1190
1191
1192
1193
1194sub _populate_notebook {
1195    my ( $self, $book, $pages, $position ) = @_;       
1196
1197    my $i = 0;
1198    map {
1199        my $icon = Wx::Icon->new();
1200        eval { $icon->LoadFile($_->[2], $_->[3]) ; }
1201            if defined $_->[2];
1202        my $nb_icon = Wx::Bitmap->new( $icon );
1203        defined $position ?
1204            $book->InsertPage($position, $_->[0],
1205                    $_->[1], 1, $nb_icon )
1206                          :
1207            $book->AddPage($_->[0],
1208                    $_->[1], 0, $nb_icon );
1209
1210        $i++;
1211    } @$pages;
1212
1213}
1214
1215
1216sub _initMenus {
1217    my ( $self ) = @_ ;
1218
1219    $self->_tree_mnu;
1220    $self->_imageviewer_mnu;   
1221}
1222
1223
1224sub _tree_mnu {
1225    my ( $self ) = @_; 
1226
1227    my $ctx_mnu = Wx::Menu->new;
1228   
1229    map {
1230        $ctx_mnu->Append(
1231            @$_[0..2], wxITEM_NORMAL
1232        )->SetBitmap(Wx::Bitmap->new($_->[3],wxBITMAP_TYPE_PNG));
1233    }
1234    (
1235        # workaround : first item does not show bitmap
1236        [
1237            0, 
1238            "",
1239            "",
1240            '../res/mnu_folder_new.png',
1241        ],
1242        [
1243            1+$ID_TREE_CTX_MENU, 
1244            wxTheApp->branding->{'Add new category'},
1245            sprintf(
1246                "%s %s %s %s", 
1247                gettext("Add a new"), 
1248                wxTheApp->branding->{category},
1249                gettext("to the currently selected"),
1250                wxTheApp->branding->{category},
1251            ),
1252            '../res/mnu_folder_new.png',
1253        ],
1254        [
1255            2+$ID_TREE_CTX_MENU, 
1256            gettext("Refresh"),
1257            sprintf(
1258                "Refresh %s list.",
1259                wxTheApp->branding->{category},
1260            ),
1261            '../res/mnu_refresh.png',
1262        ],
1263        [
1264            3+$ID_TREE_CTX_MENU, 
1265            gettext("Expand all"),
1266            sprintf(
1267                "Expand %s list.",
1268                wxTheApp->branding->{category},
1269            ),
1270            '../res/mnu_expandall.png',
1271        ],
1272        [
1273            4+$ID_TREE_CTX_MENU, 
1274            gettext("Collapse all"),
1275            sprintf(
1276                "Collapse %s list.",
1277                wxTheApp->branding->{category},
1278            ),
1279            '../res/mnu_collapseall.png',
1280        ],
1281    );
1282
1283    $ctx_mnu->Delete(0);
1284    $self->tree_mnu(
1285         $ctx_mnu
1286    ); 
1287}       
1288
1289sub _imageviewer_mnu {
1290    my ( $self ) = @_; 
1291
1292    my $ctx_mnu = Wx::Menu->new;
1293   
1294    map {
1295        $ctx_mnu->Append(
1296            @$_[0..2]
1297        )->SetBitmap(Wx::Bitmap->new($_->[3],wxBITMAP_TYPE_PNG));
1298    }
1299    (
1300        # workaround : first item does not show bitmap
1301        [
1302            0, 
1303            "",
1304            "",
1305            '../res/mnu_properties.png',
1306        ],
1307        [
1308            1+$ID_IMAGEVIEWER_CTX_MENU, 
1309            gettext("Properties"),
1310            gettext("Modify photo properties"),
1311            '../res/mnu_properties.png',
1312        ],
1313        [
1314            2+$ID_IMAGEVIEWER_CTX_MENU, 
1315            gettext("Preview"),
1316            gettext("Display photo preview"),
1317            '../res/mnu_preview.png',
1318        ],
1319    );
1320       
1321    $ctx_mnu->Delete(0);
1322    $self->imageviewer_mnu(
1323         $ctx_mnu
1324    ); 
1325}
1326
1327sub _initEventHandlers {
1328    my ( $self ) = @_ ;
1329       
1330    Wx::Event::EVT_MENU( $self, 100, \&OnGettingStarted );
1331    Wx::Event::EVT_MENU( $self, 101, \&OnAddImages );
1332    Wx::Event::EVT_MENU( $self, 102, \&OnRemoveImages );
1333    Wx::Event::EVT_MENU( $self, 103, \&OnUploadImages );
1334    Wx::Event::EVT_MENU( $self, 104, \&OnGlobalSettings );
1335    Wx::Event::EVT_MENU( $self, 105, \&OnChooseLanguage );
1336    EVT_TREE_SEL_CHANGED( $self, $self->tree, \&OnTreeSelChanged );
1337    EVT_TREE_ITEM_RIGHT_CLICK( $self, $self->tree, \&OnTreeItemRightClick );
1338    EVT_TREE_END_LABEL_EDIT( $self, $self->tree, \&OnTreeEndLabelEdit );
1339
1340    EVT_LIST_END_LABEL_EDIT( $self, $self->imageviewer, \&OnImageViewerEndLabelEdit );
1341    EVT_LIST_ITEM_ACTIVATED( $self, $self->imageviewer, \&OnImageViewerItemActivated );
1342    EVT_LIST_ITEM_SELECTED($self, $self->imageviewer, \&OnImageViewerItemSelected) ;
1343    EVT_LIST_ITEM_RIGHT_CLICK($self, $self->imageviewer, \&OnImageViewerItemRightClick) ;
1344
1345    EVT_LIST_KEY_DOWN($self, $self->imageviewer, \&OnImageViewerKeyDown) ;
1346
1347    EVT_CLOSE( $self, \&OnClose );
1348    Wx::Event::EVT_UPDATE_UI( $self, $self, \&OnUpdateUI );
1349
1350
1351    Wx::Event::EVT_MENU( $self, 1+$ID_TREE_CTX_MENU, \&OnAddCategories );
1352    Wx::Event::EVT_MENU( $self, 2+$ID_TREE_CTX_MENU, \&OnRefreshCategories );
1353    Wx::Event::EVT_MENU( $self, 3+$ID_TREE_CTX_MENU, \&OnExpandCategories );
1354    Wx::Event::EVT_MENU( $self, 4+$ID_TREE_CTX_MENU, \&OnCollapseCategories );
1355
1356    Wx::Event::EVT_MENU( $self, 1+$ID_IMAGEVIEWER_CTX_MENU, \&OnPhotoProperties );
1357    Wx::Event::EVT_MENU( $self, 2+$ID_IMAGEVIEWER_CTX_MENU, \&OnPreview );
1358
1359
1360}
1361
1362{
1363  my $prevdir;
1364  my $prevfile;
1365
1366  sub OnAddImages {
1367    my( $self, $event ) = @_;
1368    my $dialog = Wx::FileDialog->new
1369      ( $self, gettext("Select photos for upload"), $prevfile, $prevdir,
1370        sprintf("%s (*.jpg)|*.jpg|All(*.*)|*.*", gettext("JPEG files")),
1371        wxFD_OPEN|wxFD_MULTIPLE );
1372
1373    my $file_paths = [];
1374    if( $dialog->ShowModal != wxID_CANCEL ) {
1375        @$file_paths = $dialog->GetPaths;
1376        $self->SetNewFiles($file_paths) ;
1377    }
1378    $dialog->Destroy;
1379#    $event->Skip;
1380  }
1381}
1382
1383sub OnUpdateUI {
1384    my( $self, $event ) = @_;
1385   
1386    if( $self->manager ){
1387        if($self->manager->GetPane("global_settings")->IsShown){
1388            $self->toolbar->EnableTool(104, 0);                 
1389        }
1390        else{
1391            $self->toolbar->EnableTool(104, 1);                 
1392        }
1393
1394        if($self->manager->GetPane("getting_started")->IsShown){
1395            $self->toolbar->EnableTool(100, 0);                 
1396        }
1397        else{
1398            $self->toolbar->EnableTool(100, 1);                 
1399        }
1400    }
1401
1402}
1403
1404sub OnRemoveImages {
1405    my( $self, $event ) = @_;
1406
1407   
1408    $self->imagelist->RemoveImageSelection;
1409    $self->imageviewer->Refresh;       
1410
1411    $self->image_preview->SetPage(
1412        "<html></html>"
1413    ) if !$self->imageviewer->GetItemCount;
1414
1415}
1416
1417sub SetNewFiles {
1418    my ( $self, $file_paths ) = @_;
1419
1420    $self->ShowImageViewer();
1421    $self->progressdlg( 
1422        Uploader::GUI::wxImageProcessingProgressDlg->new(
1423            { 
1424                title => gettext("Image processing progress information"),
1425                bt_label => gettext("Cancel image processing"), 
1426             }
1427        )       
1428    );
1429    $self->progressdlg->Show(1);
1430    Wx::Yield();
1431
1432   
1433    my $files = [
1434        map {
1435            # to make sure that unicode chars in filenames are supported
1436            {
1437                ANSIPathName => $^O =~ /MSWin32/ ? Win32::GetANSIPathName($_) : encode('iso-8859-1', $_),
1438                PathName => $_,
1439            },
1440        }@$file_paths   
1441    ];
1442
1443    @$files = sort { $a->{PathName} cmp $b->{PathName} } @$files;   
1444
1445    $self->imagelist->SetNewFiles(
1446        $files
1447    );
1448
1449   
1450}
1451
1452sub OnTreeSelChanged {
1453    my( $self, $event ) = @_;
1454 
1455    my @items = $self->tree->GetSelections;
1456
1457    $self->imagelist->categories(
1458        [
1459            map {
1460                my $category = $self->tree->GetPlData( $_ );
1461                $category->{id} if $category != -1;
1462            }
1463            @items
1464        ]
1465    );
1466}
1467
1468sub OnTreeItemRightClick {
1469    my( $self, $event ) = @_;
1470
1471
1472    $self->PopupMenu($self->tree_mnu, wxDefaultPosition);
1473       
1474}
1475
1476sub OnTreeEndLabelEdit {
1477    my( $self, $event ) = @_;
1478
1479    my $label = $event->GetLabel;
1480   
1481    $label =~ s/^\s+$//;
1482
1483    if(defined($label) and !( "" eq $label )){
1484        $self->_SetLabel($event)
1485    }
1486    else{
1487        $event->Veto;
1488    }
1489}
1490
1491sub _SetLabel {
1492    my( $self, $event ) = @_;
1493       
1494    my $category = $self->tree->GetPlData($event->GetItem);
1495    my $category_id;
1496   
1497    $category_id = $category->{id} if 'HASH' eq ref($category) ;
1498    my $comment;
1499    my ( $success, $status_msg, $content ) = $self->pwg->SetInfoCategories( 
1500        $event->GetLabel, 
1501        $comment, 
1502        $category_id
1503    );
1504
1505    my $ok = 1;
1506   
1507    if(!$success){
1508        $ok = 0;
1509    }
1510
1511    if('fail' eq $content->{stat}){
1512        $ok = 0;
1513    }
1514
1515    # method call failed
1516    if(!$ok){
1517        $event->Veto;
1518        Wx::MessageBox( 
1519            sprintf(
1520                "%s %s", 
1521                gettext("Update failed : "),
1522                $status_msg
1523            ),
1524            gettext("Piwigo update error"),
1525            wxOK | wxICON_EXCLAMATION, 
1526        );
1527        Wx::LogMessage("%s\n\n%s", Dumper($content), gettext("This function is not available. A Piwigo upgrade may resolve this issue."));
1528    }
1529}
1530
1531sub OnImageViewerItemRightClick {
1532    my( $self, $event ) = @_;
1533
1534   
1535    $self->PopupMenu($self->imageviewer_mnu, wxDefaultPosition);
1536       
1537       
1538}
1539
1540sub OnExpandCategories {
1541    my ( $self, $event ) = @_;
1542
1543    my $parent_item = $self->tree->GetSelection;
1544    $self->tree->ExpandAllChildren($parent_item);
1545    $self->tree->EnsureVisible($parent_item);
1546}
1547
1548sub OnCollapseCategories {
1549    my ( $self, $event ) = @_;
1550
1551    my $parent_item = $self->tree->GetSelection;
1552    $self->tree->CollapseAllChildren($parent_item);
1553    $self->tree->Expand($parent_item) if -1 == $self->tree->GetPlData($parent_item);
1554}
1555
1556sub OnAddCategories {
1557    my ( $self, $event ) = @_;
1558
1559    my $parent_item = $self->tree->GetSelection;
1560
1561    my $category = $self->tree->GetPlData($parent_item);
1562    my $category_id;
1563   
1564    $category_id = $category->{id} if 'HASH' eq ref($category) ;
1565
1566    my $dialog = Wx::TextEntryDialog->new( 
1567        $self, 
1568        wxTheApp->branding->{'Category name'}, 
1569        wxTheApp->branding->{'Add new category'},
1570        wxTheApp->branding->{'New category'}, 
1571    );
1572
1573    if( $dialog->ShowModal != wxID_CANCEL ) {
1574        my $name = $dialog->GetValue;
1575        my ( $success, $status_msg, $content ) = $self->pwg->AddCategories( $name, $category_id);
1576
1577        if($success){
1578            $self->_append_category($parent_item, $name, $content->{result}{id});
1579        }
1580    }
1581    $dialog->Destroy;
1582}
1583
1584sub OnRefreshCategories {
1585    my ( $self, $event ) = @_;
1586
1587    $self->_refresh_all_categories_helper;
1588}
1589
1590
1591sub _refresh_all_categories_helper {
1592    my ( $self ) = @_; 
1593
1594    my $busycursor = Wx::BusyCursor->new();
1595    $self->tree->CollapseAll;
1596    $self->tree->DeleteAllItems;
1597    $self->imagelist->categories([]);
1598    $self->pwg->RefreshCategories();
1599    $self->populate_tree_categories;
1600}
1601
1602sub _append_category {
1603    my ( $self, $parent_id, $name, $id ) = @_;
1604
1605    $self->tree->SelectItem(
1606        $self->tree->AppendItem(
1607            $parent_id, 
1608            $name, 
1609            1, 
1610            -1, 
1611            Wx::TreeItemData->new( { id => $id } )
1612        )
1613    );
1614}
1615
1616sub OnImageViewerEndLabelEdit {
1617    my( $self, $event ) = @_;
1618 
1619    my $image = $self->imagelist->GetImage($event->GetIndex);
1620    $image->site_name(
1621        $event->GetLabel
1622    );
1623       
1624    $self->image_prop_piwigo->Refresh;
1625}
1626
1627sub OnImageViewerItemActivated {
1628    my( $self, $event ) = @_;
1629   
1630    $self->current_imageviewer_index(
1631        $event->GetIndex
1632    );
1633
1634    $self->OnPhotoProperties;
1635}
1636
1637
1638sub OnImageViewerItemSelected {
1639    my( $self, $event ) = @_;
1640 
1641    my $indx = $event->GetIndex;
1642
1643    $self->_on_imageviewer_item_selected($indx);
1644
1645    $event->Skip;
1646}
1647
1648sub _on_imageviewer_item_selected {
1649    my ( $self, $index ) = @_; 
1650
1651    $self->current_imageviewer_index($index);
1652    $self->imagelist->SetCurrentImage($index);
1653   
1654    $self->imagelist->image_selection(
1655        $self->imageviewer->GetSelectedItems
1656    );
1657
1658    $self->_image_preview_refresh if @{$self->imagelist->image_selection} < 2;
1659   
1660    $self->manager->Update;
1661   
1662    $self->image_prop_piwigo->Refresh;
1663    $self->image_prop_exif->Refresh;
1664    $self->image_prop_tags->Refresh;
1665
1666}
1667
1668sub _image_preview_refresh {
1669    my ( $self ) = @_; 
1670
1671
1672    my $html_src = sprintf("
1673      <html>
1674         <body>
1675             <img src=\"%s\"/>
1676         </body>
1677      </html>
1678      ",
1679      $self->imagelist->current_image->preview_file, 
1680    );
1681       
1682    $self->image_preview->SetPage(
1683        $html_src
1684    );
1685
1686    my $bmp = Wx::Bitmap->new( 
1687            $self->imagelist->current_image->preview_file, 
1688            $self->GetWxBitmapType($self->imagelist->type), 
1689        );
1690
1691    my $size = [40+$bmp->GetWidth, 60+$bmp->GetHeight];
1692
1693    $self->manager->GetPane("image_preview")->FloatingSize($size);
1694   
1695}
1696
1697sub OnImageViewerKeyDown {
1698    my( $self, $event ) = @_;
1699
1700    if(WXK_DELETE == $event->GetKeyCode){
1701        $self->OnRemoveImages();
1702       
1703        my $index = $self->current_imageviewer_index < $self->imageviewer->GetItemCount ?
1704            $self->current_imageviewer_index : $self->imageviewer->GetItemCount -1 ;
1705        $self->imageviewer->SelectItem(
1706            $index
1707        );
1708    }   
1709
1710}
1711
1712sub OnUploadImages {
1713    my( $self, $event ) = @_;
1714
1715    eval {
1716        $self->ProcessImageSelection();   
1717    };
1718}
1719
1720# remove image from imagelist when uploaded
1721sub UploadImagesViewerRefresh {
1722    my ( $self ) = @_; 
1723
1724    $self->imageviewer->Refresh;
1725    Wx::Yield();
1726}
1727
1728sub UploadProgressMessageRefresh {
1729    my ( $self, $msg ) = @_;   
1730
1731    $self->upload_progressdlg->processing(
1732        $msg   
1733    ); 
1734
1735    Wx::Yield();
1736}
1737
1738sub UploadProgressThumbnailRefresh {
1739    my ( $self ) = @_; 
1740
1741    my $imagelist = $self->imagelist ;
1742
1743 
1744    $self->upload_progressdlg->image->SetBitmap(wxNullBitmap);
1745    $self->upload_progressdlg->image->SetBitmap(
1746        Wx::Bitmap->new( 
1747            $self->imagelist->current_image->wx_thumb_file, 
1748            $self->GetWxBitmapType($self->imagelist->type), 
1749        )
1750    );
1751
1752    Wx::Yield();
1753}
1754
1755sub UploadProgressBarRefresh {
1756    my ( $self, $ratio ) = @_; 
1757
1758    $ratio = $self->imagelist->count > 1 ? 1 : $ratio; 
1759    eval {
1760        $self->upload_progressdlg->progress(
1761            $ratio*$self->imagelist->count * ( 100/scalar @{$self->imagelist->image_selection} )
1762        );
1763        $self->upload_progressdlg->LogProgress();
1764    };
1765    croak gettext("Upload cancelled") if $@;
1766
1767    Wx::Yield();
1768}
1769
1770sub SetNewFilesDisplayEndInfo {
1771    my ( $self, $msg ) = @_;   
1772       
1773    $self->progressdlg->DisplayEndInfo($msg);
1774}
1775
1776sub UploadDisplayEndInfo {
1777    my ( $self, $msg ) = @_;   
1778   
1779    my $imagelist = $self->imagelist ;
1780   
1781    $self->upload_progressdlg->DisplayEndInfo($msg);
1782}
1783
1784sub ShowImageViewer {
1785    my ( $self ) = @_; 
1786
1787    if(!$self->imageviewer->IsShown){
1788        $self->imageviewer->Show(1);
1789    }
1790}
1791
1792
1793sub ActivateImageViewer {
1794    my ( $self ) = @_; 
1795       
1796}
1797
1798
1799sub SetNewFilesViewerRefresh {
1800
1801    my ( $self ) = @_; 
1802
1803    my $wximagelist = $self->imagelist->wx_thumb_imglist;
1804
1805    my $indx = $wximagelist->Add(
1806        Wx::Bitmap->new( 
1807            $self->imagelist->current_image->wx_thumb_file, 
1808            $self->GetWxBitmapType($self->imagelist->type), 
1809        )
1810    ) if defined $self->imagelist->current_image->wx_thumb_file;
1811    print $self->imagelist->current_image->wx_thumb_file, " added with index ", $indx, "\n";   
1812    $self->imageviewer->Refresh(
1813        $wximagelist
1814    );
1815
1816    Wx::Yield();
1817}
1818
1819
1820
1821# prepare and upload image_selection
1822sub ProcessImageSelection {
1823    my ( $self ) = @_;
1824
1825    return if !scalar @{$self->imagelist->sums};
1826
1827    if( scalar @{$self->imagelist->categories} ){
1828        # all selected is implicit
1829        if(!scalar @{$self->imageviewer->GetSelectedItems}){
1830       
1831            $self->imagelist->image_selection(
1832                $self->imageviewer->GetAllItems
1833            );
1834        }
1835       
1836        return if( !defined $self->imagelist->image_selection );
1837        return if( !scalar @{$self->imagelist->image_selection} );
1838       
1839        $self->upload_progressdlg(
1840            Uploader::GUI::wxImageProcessingProgressDlg->new(
1841                { 
1842                    title    => gettext("Image upload progress information"),
1843                    bt_label => gettext("Cancel upload"), 
1844                 }
1845            )       
1846        );
1847        # modeless dialog
1848        $self->upload_progressdlg->Show(1);
1849        Wx::Yield();
1850        eval {
1851            $self->imagelist->UploadSelection;
1852        };
1853        if($@){
1854            Wx::MessageBox( 
1855                sprintf(
1856                    gettext("Upload cancelled"),
1857                ),
1858                gettext("Piwigo upload information"),
1859                wxOK | wxICON_INFORMATION, 
1860            );
1861        }
1862    }
1863    else {
1864        Wx::MessageBox( 
1865            sprintf(
1866                "%s %s", 
1867                gettext("Please select a valid target"),
1868                wxTheApp->branding->{category}
1869            ),
1870            gettext("Piwigo upload error"),
1871            wxOK | wxICON_EXCLAMATION, 
1872        );
1873    }
1874}
1875
1876
1877sub SetNewFilesProgress {
1878    my ( $self ) = @_;
1879
1880    my $imagelist = $self->imagelist;
1881
1882    $self->progressdlg->processing(
1883        sprintf(
1884            $imagelist->progress_msg, 
1885            $imagelist->current_image->file,
1886        )
1887    );
1888
1889    eval {
1890        $self->progressdlg->image->SetSize([ $imagelist->wx_thumb_size, $imagelist->wx_thumb_size]);
1891        $self->progressdlg->image->SetBitmap(wxNullBitmap);
1892        $self->progressdlg->image->SetBitmap(
1893            Wx::Bitmap->new( 
1894                $imagelist->current_image->wx_thumb_file,
1895                $self->GetWxBitmapType( $imagelist->type )
1896            )
1897        );
1898        $self->progressdlg->progress(
1899            $imagelist->count * ( 100/scalar @{$imagelist->new_files} )
1900        );
1901        $self->progressdlg->LogProgress();
1902    };
1903    Wx::Yield();
1904}
1905
1906sub OnClose {
1907  my $self = shift;
1908
1909
1910    # Restaure previous log wnd
1911    Wx::Log::SetActiveTarget( $self->oldlogwnd );
1912
1913    # allways store
1914 
1915    wxTheApp->StoreConnectionProperties;
1916   
1917    $self->imagelist->Store;
1918    wxTheApp->login_dlg->Destroy;       
1919
1920    wxTheApp->perspective(
1921        $self->manager->SavePerspective
1922    );
1923   
1924    wxTheApp->imageviewerIndex(
1925        $self->current_imageviewer_index
1926    );
1927   
1928    my $frameLayout = {};
1929   
1930    ( $frameLayout->{pX}, $frameLayout->{pY}, $frameLayout->{W}, $frameLayout->{H} ) = ( $self->GetPositionXY, $self->GetSizeWH ) ; 
1931   
1932    wxTheApp->frameLayout(
1933        $frameLayout
1934    );
1935
1936    wxTheApp->StoreLayoutProperties;
1937
1938    $self->Destroy;
1939}
1940
1941
1942sub create_toolbar {
1943    my( $self ) = @_;
1944
1945    my $tb = Wx::ToolBar->new( $self, -1, wxDefaultPosition, wxDefaultSize, wxTB_FLAT );
1946    $tb->SetToolBitmapSize( wxSIZE( 32, 32 ) );
1947    map {
1948        my $icon1 = Wx::Icon->new();
1949        eval {
1950            $icon1->LoadFile($_->[2], $_->[3]);
1951        };
1952        my $tb_icon1 = Wx::Bitmap->new( $icon1 );
1953
1954        my $icon2 = Wx::Icon->new();
1955        eval {
1956            $icon2->LoadFile($_->[5], $_->[3]);
1957        };
1958        my $tb_icon2 = Wx::Bitmap->new( $icon2 );
1959
1960
1961        $tb->AddTool( $_->[0], $_->[1], $tb_icon1, $tb_icon2, wxITEM_NORMAL, $_->[1] );
1962        $tb->EnableTool( $_->[0], $_->[4]);
1963    }
1964    (
1965        [
1966            100, 
1967            gettext("Getting started"), 
1968            '../res/tb_getting_started.png', 
1969            wxBITMAP_TYPE_PNG, 
1970            1, 
1971            '../res/tb_getting_started.png', 
1972            gettext("Display getting started panel")
1973        ],
1974        [
1975            101, 
1976            gettext("Add photo to selection"), 
1977            '../res/tb_add.png', 
1978            wxBITMAP_TYPE_PNG, 
1979            1, 
1980            '../res/tb_add.png', 
1981            gettext("Add photo to selection for resizing and uploading")
1982        ],
1983        [
1984            102, 
1985            gettext("Remove photo from selection"), 
1986            '../res/tb_remove.png', 
1987            wxBITMAP_TYPE_PNG, 
1988            1, 
1989            '../res/tb_remove.png',
1990            gettext("Remove photo from selection. Files are not deleted ")
1991        ],
1992        [
1993            103, 
1994            gettext("Upload to Piwigo"), 
1995            '../res/tb_upload.png', 
1996            wxBITMAP_TYPE_PNG, 
1997            wxTheApp->use_offline ? 0 : 1, 
1998            '../res/tb_upload.png',
1999            gettext("Upload photos to Piwigo.")
2000        ],
2001        [
2002            104, 
2003            gettext("Global settings"), 
2004            '../res/tb_settings.png', 
2005            wxBITMAP_TYPE_PNG, 
2006            0, 
2007            '../res/tb_settings.png',
2008            gettext("Change global settings.")
2009        ],
2010        [
2011            105, 
2012            gettext("Language choice"), 
2013            '../res/tb_i18n.png', 
2014            wxBITMAP_TYPE_PNG, 
2015            1, 
2016            '../res/tb_i18n.png',
2017            gettext("Language choice")
2018        ],
2019   
2020    );
2021
2022    if($@){
2023        undef $tb;
2024    }
2025    else{
2026        $tb->Realize;
2027    }
2028
2029    return $tb;
2030}
2031
2032
2033sub _create_textctrl {
2034    my( $self, $parent, $text, $size ) = @_;
2035
2036    return Wx::TextCtrl->new( $parent, -1, $text, [0, 0], $size,
2037                              wxNO_BORDER | wxTE_MULTILINE | wxTE_READONLY  );
2038}
2039
2040sub create_textctrl {
2041    my( $self, $text, $size ) = @_;
2042
2043    return $self->_create_textctrl( $self, $text, $size );
2044}
2045
2046sub DESTROY {
2047    my( $self ) = @_;
2048
2049    $self->manager->UnInit;
2050}
2051
2052
2053
20541;
2055
2056
2057
2058
2059
2060package DNDImageListDropTarget;
2061use Wx qw/wxTheApp/;
2062use base qw(Wx::FileDropTarget Class::Accessor::Fast);
2063
2064__PACKAGE__->mk_accessors( 
2065    qw/
2066          imageviewer
2067      /
2068);
2069
2070sub new {
2071  my $class = shift;
2072  my $imageviewer = shift;
2073  my $self = $class->SUPER::new( @_ );
2074
2075  $self->imageviewer($imageviewer);
2076
2077  return $self;
2078}
2079
2080sub OnDropFiles {
2081  my( $self, $x, $y, $files ) = @_;
2082
2083  wxTheApp->frame->SetNewFiles($files) ;
2084}
2085
2086
2087
2088
20891;
2090
2091
2092package DNDCategoryTreeDropTarget;
2093
2094use base qw(Wx::TextDropTarget Class::Accessor::Fast);
2095use Data::Dumper;
2096use Wx qw/
2097              wxDragNone
2098              wxDragCopy
2099              wxDragMove
2100         /;
2101
2102__PACKAGE__->mk_accessors( 
2103    qw/
2104          tree
2105          frame
2106      /
2107);
2108
2109sub new {
2110  my ( $class, $tree ) = @_;
2111  my $self = $class->SUPER::new();
2112
2113  $self->tree($tree);
2114  $self->frame($tree->GetParent);
2115  return $self;
2116}
2117
2118
2119
2120sub OnDropText {
2121  my( $self, $x, $y, $textdata ) = @_;
2122
2123  # must be $VAR1 because $textdata is the result of Data::Dumper
2124  my $VAR1;
2125  eval $textdata;
2126  eval {
2127      if(scalar @$VAR1){
2128           my @items;
2129           if(scalar @items < 2) {
2130               my ($dropItem, $flag) = $self->tree->HitTest([$x, $y]);
2131                push @items, $dropItem;
2132           }
2133           else {
2134                @items = $self->tree->GetSelections;
2135           }
2136           
2137           # remove root item which is not a valid category
2138           @items = grep { $self->tree->GetPlData( $_ ) != -1 } @items;
2139           
2140           $self->frame->imagelist->categories(
2141               [
2142                   map {
2143                       $self->tree->GetPlData( $_ )->{id};
2144                   }
2145                   @items
2146               ]
2147           );
2148           
2149           $self->frame->imagelist->image_selection($VAR1);
2150           $self->frame->ProcessImageSelection ;
2151      } 
2152  };
2153}
2154
21551;
Note: See TracBrowser for help on using the repository browser.