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

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

Feature 1204 added : only display languages with available translations.

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