root/extras/pLoader/trunk/src/Uploader/GUI/wxFrameAUI.pm @ 2731

Revision 2731, 30.3 KB (checked in by ronosman, 5 years ago)

Feature added : delete image with keyboard.

  • Property svn:eol-style set to LF
Line 
1# +-----------------------------------------------------------------------+
2# | pLoader - a Perl photo uploader for Piwigo                            |
3# +-----------------------------------------------------------------------+
4# | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
5# +-----------------------------------------------------------------------+
6# | This program is free software; you can redistribute it and/or modify  |
7# | it under the terms of the GNU General Public License as published by  |
8# | the Free Software Foundation                                          |
9# |                                                                       |
10# | This program is distributed in the hope that it will be useful, but   |
11# | WITHOUT ANY WARRANTY; without even the implied warranty of            |
12# | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
13# | General Public License for more details.                              |
14# |                                                                       |
15# | You should have received a copy of the GNU General Public License     |
16# | along with this program; if not, write to the Free Software           |
17# | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
18# | USA.                                                                  |
19# +-----------------------------------------------------------------------+
20package Uploader::GUI::wxFrameAUI;
21use strict;
22use Carp;
23use Wx;
24use Wx::DND;
25use Wx qw/
26             wxDEFAULT_FRAME_STYLE
27             wxVERTICAL
28             wxGROW
29             wxBITMAP_TYPE_JPEG
30             wxBITMAP_TYPE_GIF
31             wxBITMAP_TYPE_PNG
32             wxTB_FLAT
33             wxSIZE
34             wxWHITE
35             wxBLACK
36             wxID_CANCEL
37             wxFD_OPEN
38             wxFD_MULTIPLE
39             wxLI_HORIZONTAL
40             wxALIGN_CENTER_VERTICAL
41             wxALL
42             wxDefaultPosition
43             wxDefaultSize
44             wxTheApp
45             wxIMAGE_LIST_NORMAL
46             wxAUI_NB_TAB_MOVE
47             wxAUI_NB_TAB_SPLIT
48             wxNO_BORDER
49             wxTE_MULTILINE
50             wxTE_READONLY
51             wxITEM_NORMAL
52             wxCLIP_CHILDREN
53             wxBORDER_NONE
54             wxNullBitmap
55             wxTR_MULTIPLE
56             wxTR_EXTENDED
57             wxTR_HIDE_ROOT
58             wxTR_HAS_BUTTONS
59             wxMAXIMIZE
60             wxOK
61             wxICON_EXCLAMATION
62             wxICON_INFORMATION
63             WXK_DELETE
64         /;
65use base qw/Wx::Frame Class::Accessor::Fast/;
66use File::Spec;
67
68my @properties = 
69    qw/
70          progressdlg
71          upload_progressdlg
72          imageviewer
73          tree
74          tree_root
75          treeimglist
76          tree_item_default
77          topsizer
78          pwg
79          manager
80          logwnd
81          oldlogwnd
82          htmlhome
83          notebook
84          categories
85          imagelist
86          image_prop_general
87          image_prop_exif
88          notebook_image_properties
89          global_settings_panel
90      /;
91__PACKAGE__->mk_accessors( @properties );
92
93use Wx::Event
94    qw/
95          EVT_MENU
96          EVT_TREE_SEL_CHANGED
97          EVT_CLOSE
98          EVT_LIST_END_LABEL_EDIT
99          EVT_LIST_ITEM_SELECTED
100          EVT_TREE_ITEM_RIGHT_CLICK
101          EVT_LIST_KEY_DOWN       
102      /;
103     
104use Uploader::GUI::wxImageListCtrl;
105use Uploader::GUI::wxImageProcessingProgressDlg;
106use Wx::Html;
107use Uploader::GUI::wxHtmlWindow;
108use Data::Dumper;
109use Wx::AUI;
110use Storable;
111use Uploader::GUI::wxPhotoPropertiesPanel;
112use Uploader::GUI::wxPhotoExifPanel;
113use Uploader::GUI::wxGlobalSettingsPanel;
114use Encode qw/encode decode is_utf8/;
115
116$|=1;
117
118my $ID_TREE_CTX_MENU = 20000 ;
119
120sub new {
121  my( $class, $params ) = @_;
122  my( $self ) = $class->SUPER::new( 
123                                      undef, 
124                                      -1, 
125                                      $params->{title}, 
126                                      [ $params->{x}, $params->{y} ],
127                                      [ $params->{width}, $params->{height} ],
128                                      wxDEFAULT_FRAME_STYLE|wxMAXIMIZE
129                                   );
130    $self->pwg( $params->{pwg} );
131    $self->imagelist( $params->{imagelist} );
132
133    # callback for GUI refresh : add thumbnail images to the imageviewer control
134    $self->imagelist->SetNewFilesViewerRefreshCallback(
135        sub { $self->SetNewFilesViewerRefresh(@_) }
136    );
137
138    # callback for GUI refresh : progress dialog display of thumbnail image being created
139    $self->imagelist->SetNewFilesProgressCallback(
140        sub { $self->SetNewFilesProgress(@_) }
141    );
142
143    $self->imagelist->SetNewFilesDisplayEndInfoCallback(
144        sub { $self->SetNewFilesDisplayEndInfo(@_) }
145    );
146
147
148    # callback for GUI refresh : remove thumbnail images from imageviewer control
149    $self->imagelist->UploadImagesViewerCallback(
150        sub { $self->UploadImagesViewerRefresh(@_) }
151    );
152
153
154
155    # callback for GUI refresh : progress dialog display current uploaded image
156    $self->imagelist->progress_thumbnail_refresh(
157        sub { $self->UploadProgressThumbnailRefresh(@_) }
158    );
159
160    $self->imagelist->progress_msg_refresh(
161        sub { $self->UploadProgressMessageRefresh(@_) }
162    );
163
164
165    $self->imagelist->progressbar_refresh(
166        sub { $self->UploadProgressBarRefresh(@_) }
167    );
168   
169    $self->imagelist->progress_endinfo_refresh(
170        sub { $self->UploadDisplayEndInfo(@_) }
171    );
172
173
174    $self->imagelist->pwg(
175        $self->pwg
176    );
177
178    $self->imagelist->categories(
179        []
180    );
181
182    $self->manager( Wx::AuiManager->new );
183    $self->manager->SetManagedWindow( $self );
184
185    $self->_initFrame;
186    $self->_InitEventHandlers;
187    $self->_initImgTypes;   
188   
189    $self;
190}
191
192sub _initImgTypes {
193    my ( $self ) = @_;
194
195    $self->{IMGTYPE} = {
196             'jpg' => wxBITMAP_TYPE_JPEG,
197             'gif' => wxBITMAP_TYPE_GIF,
198             'png' => wxBITMAP_TYPE_PNG,
199    };
200}
201
202
203sub GetWxBitmapType {
204    my ( $self, $type ) = @_;
205   
206    $self->{IMGTYPE}->{$type};
207}
208
209
210sub _initFrame {
211    my ( $self ) = @_;
212   
213    $self->CreateStatusBar(1);
214
215    $self->htmlhome(
216        Uploader::GUI::wxHtmlWindow->new(
217            $self, -1
218        )
219    );
220    $self->imageviewer(
221        Uploader::GUI::wxImageListCtrl->new( 
222            { 
223                parentwnd => $self,
224                imagelist => $self->imagelist,
225            }
226        )
227    );
228   
229    $self->global_settings_panel(
230        $self->create_global_settings_panel()
231    );   
232   
233    $self->image_prop_general(
234        Uploader::GUI::wxPhotoPropertiesPanel->new( 
235            { 
236                parentwnd => $self,
237                accessors => {
238                                  $main::ID_PHOTO =>
239                                      sub {
240                                            Wx::Bitmap->new( 
241                                                $self->imagelist->current_image->wx_thumb_file, 
242                                                $self->GetWxBitmapType($self->imagelist->type), 
243                                            );
244                                      }, 
245                                  $main::ID_PHOTO_NAME =>
246                                      sub { $self->imagelist->current_image->site_name(@_) }, 
247
248                                  $main::ID_PHOTO_CREATE_DATE =>
249                                      sub { $self->imagelist->current_image->create_date(@_) }, 
250                                 
251                                  $main::ID_PHOTO_COMMENT =>
252                                      sub { $self->imagelist->current_image->site_comment(@_) }, 
253                                 
254                                  $main::ID_PHOTO_AUTHOR =>
255                                      sub { $self->imagelist->current_image->site_author(@_) }, 
256                             },
257                frame_callbacks => { 
258                                      $main::ID_PHOTO_NAME =>
259                                          sub {
260                                              $self->imageviewer->Refresh();
261                                          },
262                                   },
263            }
264        )
265    );
266
267    $self->image_prop_exif(
268        Uploader::GUI::wxPhotoExifPanel->new( 
269            { 
270                parentwnd => $self,
271                frame_callback => sub { 
272                                      $self->imageviewer->Refresh();
273                                  },
274                accessors => {
275                                  $main::ID_EXIF_CREATE_DATE =>
276                                      sub { $self->imagelist->current_image->create_date }, 
277                                  $main::ID_EXIF_MODEL =>
278                                      sub { $self->imagelist->current_image->exif_tag('Model') }, 
279                                  $main::ID_EXIF_WIDTH =>
280                                      sub { $self->imagelist->current_image->exif_tag('ImageWidth') }, 
281                                  $main::ID_EXIF_HEIGHT =>
282                                      sub { $self->imagelist->current_image->exif_tag('ImageHeight') }, 
283                                  $main::ID_EXIF_ORIENTATION =>
284                                      sub { $self->imagelist->current_image->exif_tag('Orientation') }, 
285                                  $main::ID_EXIF_ISO =>
286                                      sub { $self->imagelist->current_image->exif_tag('ISO') }, 
287                                  $main::ID_EXIF_SHUTTER_SPEED =>
288                                      sub { $self->imagelist->current_image->exif_tag('ExposureTime') }, 
289                                  $main::ID_EXIF_APERTURE =>
290                                      sub { $self->imagelist->current_image->exif_tag('ApertureValue') }, 
291                                  $main::ID_EXIF_FOCAL_LENGTH =>
292                                      sub { $self->imagelist->current_image->exif_tag('FocalLength') }, 
293                                  $main::ID_EXIF_LENS =>
294                                      sub { $self->imagelist->current_image->exif_tag('Lens') }, 
295                             },
296            }
297        )
298    );
299
300
301    $self->imageviewer->Show(0);
302
303    $self->imageviewer->SetDropTarget( 
304        DNDImageListDropTarget->new(
305            $self->imageviewer
306        ) 
307    );
308    $self->htmlhome->SetDropTarget( 
309        DNDImageListDropTarget->new( 
310            $self->imageviewer
311        ) 
312    );
313
314    $self->manager->AddPane
315      ( $self->create_notebook_imagelist, Wx::AuiPaneInfo->new->Name( "ImageViewer" )
316        ->CenterPane->Resizable->CloseButton(0) );
317
318
319    $self->manager->AddPane
320      ( $self->create_tree, Wx::AuiPaneInfo->new->Name( "categories" )->Caption(
321          sprintf("Piwigo categories - %s", wxTheApp->site_url )
322      )
323        ->Right->Position( 0 )->Resizable->CloseButton(0) );
324
325    $self->tree->SetDropTarget( 
326        DNDCategoryTreeDropTarget->new(
327            $self->tree
328        )
329    );
330
331
332    $self->manager->AddPane
333      ( $self->create_notebook_image_properties, Wx::AuiPaneInfo->new->Name( "photo_properties" )->Caption("Photo properties")
334        ->Right->Position( 1 )->Resizable->CloseButton(0) );
335
336    $self->manager->AddPane
337      ( $self->create_notebook_global_settings, Wx::AuiPaneInfo->new->Name( "global_settings" )
338        ->Right->Position( 2 )->Resizable->CloseButton(1) );
339
340
341
342    my $tb = $self->create_toolbar;
343
344    $self->manager->AddPane
345      ( $tb, Wx::AuiPaneInfo->new->Name( "tb1" )->Caption( "Tools" )
346        ->ToolbarPane->Top->Row( 1 )->LeftDockable( 0 )->RightDockable( 0 ) ) if defined $tb;
347
348    $self->manager->Update;
349
350    if( $self->imagelist->wx_thumb_imglist->GetImageCount){
351        $self->ShowImageViewer;
352       
353        $self->imageviewer->Refresh(
354            $self->imagelist->wx_thumb_imglist
355        );
356    }
357
358}
359
360
361sub OnGlobalSettings {
362    my ( $self ) = @_;
363
364    $self->manager->GetPane("global_settings")->Show(1);
365    $self->manager->Update();   
366}
367
368
369sub create_notebook_imagelist {
370    my( $self ) = @_;
371    my $book = Wx::AuiNotebook->new( $self, -1, [-1, -1], [300, 450],
372                                     wxBORDER_NONE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT);
373    my $pages = [   
374        [
375            $self->htmlhome, 
376            "Photo selection",
377            '../res/images.png', 
378            wxBITMAP_TYPE_PNG,
379        ],
380        [
381            $self->logwnd( $self->_create_textctrl( $book, undef, [450, 450] )),
382            "Log",
383            '../res/nb_log.png', 
384            wxBITMAP_TYPE_PNG,
385        ]
386    ];
387   
388    $self->_populate_notebook( $book, $pages );
389
390    $self->logwnd(Wx::LogTextCtrl->new( $self->logwnd ));
391    $self->oldlogwnd( Wx::Log::SetActiveTarget( $self->logwnd ) );
392    $self->notebook($book);
393    return $book;
394}
395
396sub create_notebook_image_properties {
397    my( $self ) = @_;
398    my $book = Wx::AuiNotebook->new( $self, -1, [-1, -1], [450, 450],
399                                     wxBORDER_NONE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT);
400    my $pages = [   
401        [
402            $self->image_prop_general, 
403            "Piwigo",
404        ],
405        [
406            $self->image_prop_exif, 
407            "Exif",
408        ],
409    ];
410   
411    $self->_populate_notebook( $book, $pages );
412
413    $self->notebook_image_properties($book);
414
415    return $book;
416}
417
418sub create_notebook_global_settings {
419    my( $self ) = @_;
420    my $book = Wx::AuiNotebook->new( $self, -1, [-1, -1], [450, 450],
421                                     wxBORDER_NONE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT);
422    my $pages = [   
423        [
424            $self->global_settings_panel, 
425            "Global settings",
426        ],
427    ];
428   
429    $self->_populate_notebook( $book, $pages );
430
431    $self->notebook_image_properties($book);
432
433    return $book;
434}
435
436sub create_global_settings_panel {
437    my ( $self ) = @_;
438
439    Uploader::GUI::wxGlobalSettingsPanel->new( 
440            { 
441                parentwnd => $self,
442                accessors => {
443                                  $main::ID_GLOBAL_NAME_PREFIX =>
444                                      sub { $self->imagelist->default_name_prefix(@_) }, 
445                                  $main::ID_GLOBAL_AUTHOR =>
446                                      sub { $self->imagelist->author(@_) }, 
447                                  $main::ID_GLOBAL_THUMB_SIZE => 
448                                      sub { $self->imagelist->thumb_size(@_) }, 
449                                  $main::ID_GLOBAL_RESIZED_W =>
450                                      sub { $self->imagelist->resize_w(@_) }, 
451                                  $main::ID_GLOBAL_RESIZED_H =>
452                                      sub { $self->imagelist->resize_h(@_) },
453                                  $main::ID_GLOBAL_HIGH =>
454                                      sub { $self->imagelist->upload_high(@_)}, 
455                             },
456                frame_callbacks => { 
457                                   },
458            }
459        );
460}
461
462sub create_tree {
463    my ( $self ) = @_;
464
465    my $images = [
466        map {
467            Wx::Bitmap->new( $_, wxBITMAP_TYPE_PNG )
468               
469        }
470        (
471          '../res/tree_pwg.png',
472          '../res/tree_folder.png',
473        )   
474    ];
475
476    $self->treeimglist( Wx::ImageList->new( 16, 16, 1 ) );
477    map {
478        $self->treeimglist->Add($_);
479    }
480    @$images;
481
482   
483    $self->tree( 
484        Wx::TreeCtrl->new( 
485           $self, 
486           -1, 
487           wxDefaultPosition, 
488           wxDefaultSize, 
489           wxBORDER_NONE|
490           wxCLIP_CHILDREN|
491#           wxTR_MULTIPLE|
492#           wxTR_EXTENDED|
493           wxTR_HAS_BUTTONS
494#           wxTR_HIDE_ROOT   
495        ) 
496    );
497
498    $self->tree->SetImageList( $self->treeimglist );
499    $self->populate_tree_categories;
500    $self->tree ;
501}
502
503
504sub populate_tree_categories {
505    my ( $self ) = @_;
506
507    $self->populate_tree(
508        $self->tree,
509        wxTheApp->pwg->categories,
510    ) if defined wxTheApp->pwg ;
511   
512    $self->tree->ExpandAll;
513
514}
515
516#$tree_items is a list of anonymous arrays
517# [ itemLabel, undef, rootInfo, ImageIndex, SelImageIndex ] for the root
518
519# [ itemLabel,
520#       [ childItemLabel,
521#           [...],
522#           childItemdata,
523#           childImageIndex,
524#           childSelImageIndex
525#       ],
526#    Itemdata,
527#    ImageIndex,
528#    SelImageIndex
529# ]
530
531# returns a valid itemData
532sub itemData { Wx::TreeItemData->new( $_[0] ) }
533
534sub populate_tree {
535    my ( $self, $tree, $tree_items ) = @_;
536    my $root = shift @{$tree_items};
537    $self->tree_root(
538        $tree->AddRoot( 
539            $root->[0], 
540            $root->[3], 
541            $root->[4], 
542            itemData( $root->[2] ) 
543        )
544    );
545
546  $self->populate_tree_helper( $tree, $self->tree_root, $tree_items );
547
548  $tree->Expand( $self->tree_root );
549}
550
551sub populate_tree_helper {
552  my ( $self, $tree, $parent_id, $tree_items ) = @_;
553
554  my $id;
555
556  map {
557      my $name = $_->[0];
558      eval {
559        $name = is_utf8($name) ?  decode('UTF-8', $name) : $name;
560      };
561      if($@){
562          $name = $_->[0];
563      }
564       $id = $tree->AppendItem( 
565                                   $parent_id, 
566                                   $name,
567                                   defined($_->[3]) ? $_->[3] : 0, 
568                                   defined($_->[4]) ? $_->[4] : 0, 
569                                   itemData( $_->[2]) 
570                              );
571      $self->tree_item_default($id) if ! defined $self->tree_item_default;
572      # current item has children
573      if( ref( $_->[1] ) eq 'ARRAY' ) {
574          $self->populate_tree_helper( $tree, $id, $_->[1] );
575      } 
576  }
577  @{$tree_items};
578 
579
580}
581
582
583
584
585sub _populate_notebook {
586    my ( $self, $book, $pages, $position ) = @_;       
587
588    my $i = 0;
589    map {
590        my $icon = Wx::Icon->new();
591        eval { $icon->LoadFile($_->[2], $_->[3]) ; }
592            if defined $_->[2];
593        my $nb_icon = Wx::Bitmap->new( $icon );
594        defined $position ?
595            $book->InsertPage($position, $_->[0],
596                    $_->[1], 1, $nb_icon )
597                          :
598            $book->AddPage($_->[0],
599                    $_->[1], 0, $nb_icon );
600
601        $i++;
602    } @$pages;
603
604}
605
606
607
608sub _InitEventHandlers {
609    my ( $self ) = @_ ;
610       
611    Wx::Event::EVT_MENU( $self, 101, \&OnAddImages );
612    Wx::Event::EVT_MENU( $self, 102, \&OnRemoveImages );
613    Wx::Event::EVT_MENU( $self, 103, \&OnUploadImages );
614    Wx::Event::EVT_MENU( $self, 104, \&OnGlobalSettings );
615    EVT_TREE_SEL_CHANGED( $self, $self->tree, \&OnTreeSelChanged );
616    EVT_TREE_ITEM_RIGHT_CLICK( $self->tree, $self->tree, \&OnTreeItemRightClick );
617    EVT_LIST_END_LABEL_EDIT( $self, $self->imageviewer, \&OnImageViewerEndLabelEdit );
618    EVT_LIST_ITEM_SELECTED($self, $self->imageviewer, \&OnImageViewerItemSelected) ;
619    EVT_LIST_KEY_DOWN($self, $self->imageviewer, \&OnImageViewerKeyDown) ;
620    EVT_CLOSE( $self, \&OnClose );
621
622
623    Wx::Event::EVT_MENU( $self, 1+$ID_TREE_CTX_MENU, \&OnAddCategories );
624    Wx::Event::EVT_MENU( $self, 2+$ID_TREE_CTX_MENU, \&OnRefreshCategories );
625}
626
627{
628  my $prevdir;
629  my $prevfile;
630
631  sub OnAddImages {
632    my( $self, $event ) = @_;
633    my $dialog = Wx::FileDialog->new
634      ( $self, "Select photos to send", $prevfile, $prevdir,
635        "JPEG files (*.jpg)|*.jpg|All(*.*)|*.*",
636        wxFD_OPEN|wxFD_MULTIPLE );
637
638    my $file_paths = [];
639    if( $dialog->ShowModal != wxID_CANCEL ) {
640        @$file_paths = $dialog->GetPaths;
641        $self->SetNewFiles($file_paths) ;
642    }
643    $dialog->Destroy;
644    $event->Skip;
645  }
646}
647
648sub OnRemoveImages {
649    my( $self, $event ) = @_;
650
651   
652    $self->imagelist->RemoveImageSelection;
653    $self->imageviewer->Refresh;       
654}
655
656sub SetNewFiles {
657    my ( $self, $file_paths ) = @_;
658
659    $self->ShowImageViewer();
660    $self->progressdlg( 
661        Uploader::GUI::wxImageProcessingProgressDlg->new(
662            { 
663                title => "Image processing progress information",
664                bt_label => "Cancel image processing", 
665             }
666        )       
667    );
668    $self->progressdlg->Show(1);
669    Wx::Yield();
670
671    $self->imagelist->SetNewFiles(
672        $file_paths
673    );
674
675   
676}
677
678sub OnTreeSelChanged {
679    my( $self, $event ) = @_;
680 
681    my @items = $self->tree->GetSelections;
682
683    $self->imagelist->categories(
684        [
685            map {
686                my $category = $self->tree->GetPlData( $_ );
687                $category->{id} if $category != -1;
688            }
689            @items
690        ]
691    );
692}
693
694sub OnTreeItemRightClick {
695    my( $self, $event ) = @_;
696
697    my $point = $event->GetPoint ;
698    my $ctx_mnu = Wx::Menu->new;
699   
700    map {
701        $ctx_mnu->Append(
702            @$_
703        );
704    }
705    (
706        [1+$ID_TREE_CTX_MENU, "Add new category","Add a new category to the current selected category."],
707        [2+$ID_TREE_CTX_MENU, "Refresh","Refresh category list."],
708    );
709    $self->PopupMenu($ctx_mnu, $point);
710       
711}
712
713sub OnAddCategories {
714    my ( $self, $event ) = @_;
715
716    my $item = $self->tree->GetSelection;
717
718    my $category = $self->tree->GetPlData($item);
719    my $category_id;
720   
721    $category_id = $category->{id} if 'HASH' eq ref($category) ;
722
723    my $dialog = Wx::TextEntryDialog->new( 
724        $self, 
725        "Category name :", 
726        "Add new category",
727        "New category" 
728    );
729
730    if( $dialog->ShowModal != wxID_CANCEL ) {
731        my $name = $dialog->GetValue;
732        my ( $status, $status_msg ) = $self->pwg->AddCategories( $name, $category_id);
733        $self->_refresh_tree_categories_helper;
734    }
735    $dialog->Destroy;
736}
737
738sub OnRefreshCategories {
739    my ( $self, $event ) = @_;
740
741    $self->_refresh_tree_categories_helper;
742}
743
744sub _refresh_tree_categories_helper {
745    my ( $self ) = @_; 
746
747    my $busycursor = Wx::BusyCursor->new();
748    $self->tree->CollapseAll;
749    $self->tree->DeleteAllItems;
750    $self->imagelist->categories([]);
751    $self->pwg->RefreshCategories();
752    $self->populate_tree_categories;
753}
754
755sub OnImageViewerEndLabelEdit {
756    my( $self, $event ) = @_;
757 
758    my $image = $self->imagelist->images->[$event->GetIndex];
759    $image->site_name(
760        $event->GetLabel
761    );
762       
763    $self->image_prop_general->SetControlValues();
764}
765
766
767sub OnImageViewerItemSelected {
768    my( $self, $event ) = @_;
769 
770    my $indx = $event->GetIndex;
771
772    # retrieve photo info for the last selected photo
773    $self->imagelist->SetCurrentImage($indx);
774   
775    $self->imagelist->image_selection(
776        $self->imageviewer->GetSelectedItems
777    );
778
779    $self->image_prop_general->SetControlValues();
780    $self->image_prop_exif->SetControlValues();
781}
782
783sub OnImageViewerKeyDown {
784    my( $self, $event ) = @_;
785
786    if(WXK_DELETE == $event->GetKeyCode){
787        $self->OnRemoveImages();
788    }   
789}
790
791sub OnUploadImages {
792    my( $self, $event ) = @_;
793
794#    eval {
795        $self->ProcessImageSelection();   
796#    };
797}
798
799# remove image from imagelist when uploaded
800sub UploadImagesViewerRefresh {
801    my ( $self ) = @_; 
802
803    my $imagelist= $self->imagelist ;
804
805    Wx::Yield();
806}
807
808sub UploadProgressMessageRefresh {
809    my ( $self, $msg ) = @_;   
810
811    $self->upload_progressdlg->processing(
812        $msg   
813    ); 
814
815    Wx::Yield();
816}
817
818sub UploadProgressThumbnailRefresh {
819    my ( $self ) = @_; 
820
821    my $imagelist = $self->imagelist ;
822
823 
824    $self->upload_progressdlg->image->SetBitmap(wxNullBitmap);
825    $self->upload_progressdlg->image->SetBitmap(
826        Wx::Bitmap->new( 
827            $self->imagelist->current_image->wx_thumb_file, 
828            $self->GetWxBitmapType($self->imagelist->type), 
829        )
830    );
831
832    Wx::Yield();
833}
834
835sub UploadProgressBarRefresh {
836    my ( $self, $ratio ) = @_; 
837
838    eval {
839        $self->upload_progressdlg->progress(
840            $ratio*$self->imagelist->count * ( 100/scalar @{$self->imagelist->image_selection} )
841        );
842        $self->upload_progressdlg->LogProgress();
843    };
844    croak "Upload cancelled" if $@;
845
846    Wx::Yield();
847}
848
849sub SetNewFilesDisplayEndInfo {
850    my ( $self, $msg ) = @_;   
851       
852    $self->progressdlg->DisplayEndInfo($msg);
853}
854
855sub UploadDisplayEndInfo {
856    my ( $self, $msg ) = @_;   
857   
858    my $imagelist = $self->imagelist ;
859   
860    $self->upload_progressdlg->DisplayEndInfo($msg);
861}
862
863sub ShowImageViewer {
864    my ( $self ) = @_; 
865
866    if(!$self->imageviewer->IsShown){
867        my $imglistpage = [
868            [
869                $self->imageviewer, 
870                "Photo selection",
871                '../res/images.png', 
872                wxBITMAP_TYPE_PNG,
873            ],
874        ];
875        $self->notebook->DeletePage(0);
876   
877        $self->imageviewer->Show(1);
878        $self->_populate_notebook($self->notebook, $imglistpage, 0);
879        # load imagelist with loading.jpg
880    }
881       
882}
883
884
885
886
887sub SetNewFilesViewerRefresh {
888
889    my ( $self ) = @_; 
890
891    my $wximagelist = $self->imagelist->wx_thumb_imglist;
892
893    my $indx = $wximagelist->Add(
894        Wx::Bitmap->new( 
895            $self->imagelist->current_image->wx_thumb_file, 
896            $self->GetWxBitmapType($self->imagelist->type), 
897        )
898    ) if defined $self->imagelist->current_image->wx_thumb_file;
899   
900    $self->imageviewer->Refresh(
901        $wximagelist
902    );
903
904    Wx::Yield();
905}
906
907
908
909# prepare and upload image_selection
910sub ProcessImageSelection {
911    my ( $self ) = @_;
912
913    return if !scalar @{$self->imagelist->images};
914
915    if( scalar @{$self->imagelist->categories} ){
916        return if( !defined $self->imagelist->image_selection );
917        return if( !scalar @{$self->imagelist->image_selection} );
918       
919        $self->upload_progressdlg(
920            Uploader::GUI::wxImageProcessingProgressDlg->new(
921                { 
922                    title => "Image upload progress information",
923                    bt_label => "Cancel upload", 
924                 }
925            )       
926        );
927        # modeless dialog
928        $self->upload_progressdlg->Show(1);
929        Wx::Yield();
930        eval {
931            $self->imagelist->UploadSelection;
932        };
933        if($@){
934            Wx::MessageBox( 
935                sprintf(
936                    "Upload cancelled.",
937                ),
938                "Piwigo upload information",
939                wxOK | wxICON_INFORMATION, 
940            );
941        }
942    }
943    else {
944        Wx::MessageBox( 
945            sprintf(
946                "Please select a valid target category",
947            ),
948            "Piwigo upload error",
949            wxOK | wxICON_EXCLAMATION, 
950        );
951    }
952}
953
954
955sub SetNewFilesProgress {
956    my ( $self ) = @_;
957
958    my $imagelist = $self->imagelist;
959
960    $self->progressdlg->processing(
961        sprintf(
962            $imagelist->progress_msg, 
963            $imagelist->current_image->file,
964        )
965    );
966
967    eval {
968        $self->progressdlg->image->SetSize([ $imagelist->wx_thumb_size, $imagelist->wx_thumb_size]);
969        $self->progressdlg->image->SetBitmap(wxNullBitmap);
970        $self->progressdlg->image->SetBitmap(
971            Wx::Bitmap->new( 
972                $imagelist->current_image->wx_thumb_file,
973                $self->GetWxBitmapType( $imagelist->type )
974            )
975        );
976        $self->progressdlg->progress(
977            $imagelist->count * ( 100/scalar @{$imagelist->new_files} )
978        );
979        $self->progressdlg->LogProgress();
980    };
981    Wx::Yield();
982}
983
984sub OnClose {
985  my $self = shift;
986
987    # Restaure previous log wnd
988    Wx::Log::SetActiveTarget( $self->oldlogwnd );
989
990    # allways store
991   
992    wxTheApp->StoreConnectionProperties;
993   
994    $self->imagelist->Store;
995    $self->Destroy;
996}
997
998
999sub create_toolbar {
1000    my( $self ) = @_;
1001
1002    my $tb = Wx::ToolBar->new( $self, -1, wxDefaultPosition, wxDefaultSize, wxTB_FLAT );
1003    $tb->SetToolBitmapSize( wxSIZE( 32, 32 ) );
1004    map {
1005        my $icon1 = Wx::Icon->new();
1006        eval {
1007            $icon1->LoadFile($_->[2], $_->[3]);
1008        };
1009        my $tb_icon1 = Wx::Bitmap->new( $icon1 );
1010
1011        my $icon2 = Wx::Icon->new();
1012        eval {
1013            $icon2->LoadFile($_->[5], $_->[3]);
1014        };
1015        my $tb_icon2 = Wx::Bitmap->new( $icon2 );
1016
1017
1018        $tb->AddTool( $_->[0], $_->[1], $tb_icon1, $tb_icon2, wxITEM_NORMAL, $_->[1] );
1019        $tb->EnableTool( $_->[0], $_->[4]);
1020    }
1021    (
1022        [
1023            101, "Add photo to selection", '../res/tb_add.png', wxBITMAP_TYPE_PNG, 1, '../res/tb_add.png', "Add photo to selection for resizing and uploading"
1024        ],
1025        [
1026            102, "Remove photo from selection", '../res/tb_remove.png', wxBITMAP_TYPE_PNG, 1, '../res/tb_remove.png',"Remove photo from selection. Files are not deleted "
1027        ],
1028        [
1029            103, "Upload to Piwigo", '../res/tb_upload.png', wxBITMAP_TYPE_PNG, 1, '../res/tb_upload.png',"Upload photos to Piwigo."
1030        ],
1031        [
1032            104, "Global settings", '../res/tb_settings.png', wxBITMAP_TYPE_PNG, 1, '../res/tb_settings.png',"Change global settings."
1033        ],
1034   
1035    );
1036
1037    if($@){
1038        undef $tb;
1039    }
1040    else{
1041        $tb->Realize;
1042    }
1043
1044    return $tb;
1045}
1046
1047
1048sub _create_textctrl {
1049    my( $self, $parent, $text, $size ) = @_;
1050
1051    return Wx::TextCtrl->new( $parent, -1, $text, [0, 0], $size,
1052                              wxNO_BORDER | wxTE_MULTILINE | wxTE_READONLY  );
1053}
1054
1055sub create_textctrl {
1056    my( $self, $text, $size ) = @_;
1057
1058    return $self->_create_textctrl( $self, $text, $size );
1059}
1060
1061sub DESTROY {
1062    my( $self ) = @_;
1063
1064    $self->manager->UnInit;
1065}
1066
1067
1068
10691;
1070
1071
1072
1073
1074
1075package DNDImageListDropTarget;
1076
1077use base qw(Wx::FileDropTarget Class::Accessor::Fast);
1078
1079__PACKAGE__->mk_accessors( 
1080    qw/
1081          imageviewer
1082          frame
1083      /
1084);
1085
1086sub new {
1087  my $class = shift;
1088  my $imageviewer = shift;
1089  my $self = $class->SUPER::new( @_ );
1090
1091  $self->imageviewer($imageviewer);
1092  $self->frame($imageviewer->GetParent);
1093  return $self;
1094}
1095
1096sub OnDropFiles {
1097  my( $self, $x, $y, $files ) = @_;
1098
1099  $self->frame->SetNewFiles($files) ;
1100}
1101
11021;
1103
1104
1105package DNDCategoryTreeDropTarget;
1106
1107use base qw(Wx::TextDropTarget Class::Accessor::Fast);
1108use Data::Dumper;
1109use Wx qw/
1110              wxDragNone
1111              wxDragCopy
1112              wxDragMove
1113         /;
1114
1115__PACKAGE__->mk_accessors( 
1116    qw/
1117          tree
1118          frame
1119      /
1120);
1121
1122sub new {
1123  my ( $class, $tree ) = @_;
1124  my $self = $class->SUPER::new();
1125
1126  $self->tree($tree);
1127  $self->frame($tree->GetParent);
1128  return $self;
1129}
1130
1131
1132
1133sub OnDropText {
1134  my( $self, $x, $y, $textdata ) = @_;
1135
1136  # must be $VAR1 because $textdata is the result of Data::Dumper
1137  my $VAR1;
1138  eval $textdata;
1139  eval {
1140      if(scalar @$VAR1){
1141           my @items;
1142           if(scalar @items < 2) {
1143               my ($dropItem, $flag) = $self->tree->HitTest([$x, $y]);
1144                push @items, $dropItem;
1145           }
1146           else {
1147                @items = $self->tree->GetSelections;
1148           }
1149           
1150           # remove root item which is not a valid category
1151           @items = grep { $self->tree->GetPlData( $_ ) != -1 } @items;
1152           
1153           $self->frame->imagelist->categories(
1154               [
1155                   map {
1156                       $self->tree->GetPlData( $_ )->{id};
1157                   }
1158                   @items
1159               ]
1160           );
1161           
1162           $self->frame->imagelist->image_selection($VAR1);
1163           $self->frame->ProcessImageSelection ;
1164      } 
1165  };
1166}
1167
11681;
Note: See TracBrowser for help on using the browser.