Changeset 5447


Ignore:
Timestamp:
Mar 29, 2010, 3:44:56 PM (10 years ago)
Author:
ronosman
Message:

Feature 1548 added : improved photo tags panel.

Location:
extensions/pLoader/trunk/src/Uploader/GUI
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • extensions/pLoader/trunk/src/Uploader/GUI/Frame.pm

    r5390 r5447  
    139139use Uploader::GUI::wxImageReuploadDlg;
    140140use Uploader::GUI::wxImageProcessingProgressDlg;
    141 use Uploader::GUI::wxChoiceFilteredPanel;
    142141use Uploader::GUI::wxDestinationCategoryDlg;
    143142use Uploader::GUI::wxCategoryTreeCtrl;
     
    14311430    $self->piwigo_photo_properties_dlg->SetProperties if defined $self->piwigo_photo_properties_dlg;
    14321431    $self->exif_dlg->Refresh;
    1433     $self->piwigo_photo_properties_tags->Refresh;
     1432    $self->piwigo_photo_properties_tags->RefreshChoices;
    14341433
    14351434}
  • extensions/pLoader/trunk/src/Uploader/GUI/wxChoiceFilteredPanel.pm

    r5041 r5447  
    4747        id_from_name
    4848        search
    49         listchoices
     49        choices_list
    5050        btn_show
    5151        show_method
     
    5757        autocomplete_to
    5858        autocomplete_set_selection
     59        current_show_mode
    5960      /
    6061);
     
    6667    my $class = ref($this) || $this;
    6768
    68 
    6969    my $self = $class->SUPER::new( $params->{parentwnd}, $params->{id}||-1, wxDefaultPosition, wxDefaultSize );
    70     $self->_init_panel;
    71     $self->_init_properties($params);
    72 
    73     $self->Refresh;
    74 
    75     Wx::Event::EVT_CHECKLISTBOX( $self, $self->listchoices, \&OnCheck );
    76     Wx::Event::EVT_LISTBOX( $self, $self->listchoices, \&OnSelected );
     70
     71    $self->init_panel;
     72    $self->init_properties($params);
     73    $self->init_event_handlers;
     74
     75    $self;
     76}
     77
     78
     79sub init_panel {
     80    my ( $self ) = @_;   
     81
     82    my( $vsizer ) = Wx::BoxSizer->new( wxVERTICAL );
     83   
     84    $self->search(
     85        Wx::SearchCtrl->new( $self, -1, "", wxDefaultPosition, [-1,-1],wxTE_PROCESS_ENTER )
     86    );
     87
     88    $self->search->ShowCancelButton( 1 );
     89    $vsizer->Add( $self->search, 0, wxEXPAND|wxALL, 2 );
     90
     91    $self->choices_list(
     92        Wx::CheckListBox->new( $self, -1, wxDefaultPosition, [-1,-1], [], 0 )
     93    );
     94    $vsizer->Add( $self->choices_list, 1, wxEXPAND|wxALL, 2 );
     95
     96    $self->btn_show(
     97        Wx::RadioBox->new( $self, -1, sprintf("%s :", gettext("Show")), wxDefaultPosition, [-1, -1],
     98            [gettext("All"),gettext("Selection")] , 1, wxRA_SPECIFY_ROWS )
     99    );
     100    $vsizer->Add( $self->btn_show, 0, wxEXPAND|wxALL, 2 );
     101
     102    $self->SetSizer( $vsizer );
     103    $vsizer->Fit( $self );
     104}
     105
     106
     107sub init_properties {
     108    my ( $self, $params ) = @_;   
     109   
     110    $self->choices(
     111        $params->{choices}|| sub { [] }
     112    );
     113
     114    $self->selection(
     115        $params->{selection}|| sub{ [] }
     116    );
     117
     118    $self->search_result(
     119        []
     120    );
     121   
     122    $self->is_selected({});
     123   
     124    $self->creation_callback(
     125        $params->{creation_callback}
     126    ) if 'CODE' eq ref($params->{creation_callback});
     127
     128    $self->show_method(
     129        {
     130            gettext("All") => sub { $self->show_all(@_) },
     131            gettext("Selection") => sub { $self->show_selected(@_) },
     132        }
     133    );
     134}
     135
     136
     137sub RefreshChoices {
     138    my ( $self ) = @_;
     139
     140    $self->refresh_lookups(
     141        $self->choices->()
     142    );
     143    $self->refresh_is_selected;
     144    my $show_mode = $self->current_show_mode||gettext("All");
     145    $self->show_method->{$show_mode}->();
     146}
     147
     148
     149sub refresh_lookups {
     150    my ( $self, $choices ) = @_;
     151
     152    $self->id_lookup({});
     153    $self->row_lookup({});
     154    $self->id_from_name({});
     155
     156    my $row = 0;
     157    #print Dumper $self->properties;
     158    map {
     159        $self->id_lookup->{$row} = $_->{id};
     160        $self->row_lookup->{$_->{id}} = $row;
     161        $self->id_from_name->{$_->{name}} = $_->{id};
     162        $row++;   
     163    }@{$choices};
     164
     165}
     166
     167
     168sub refresh_is_selected {
     169    my ( $self ) = @_;
     170
     171    my $selection = $self->selection->();
     172    $self->is_selected({});
     173
     174    map {
     175        $self->is_selected->{$_} = 1;
     176    } @$selection;
     177
     178}
     179
     180
     181sub show_all {
     182    my ( $self ) = @_;
     183
     184    my $choices = $self->choices->();
     185    $self->current_show_mode(
     186        gettext("All")
     187    );
     188    $self->refresh_choices_list(
     189        $self->choices->()
     190    );
     191}
     192
     193
     194sub show_selected {
     195    my ( $self ) = @_;   
     196
     197    $self->current_show_mode(
     198        gettext("Selection")
     199    );
     200
     201    $self->refresh_choices_list(
     202        $self->get_selected_choices()
     203    );
     204}
     205
     206
     207sub refresh_choices_list {
     208    my ( $self, $choices ) = @_;
     209
     210    $self->choices_list->Freeze;
     211    $self->choices_list->Clear;
     212
     213    #print Dumper $self->properties;
     214    my $i=0;
     215    map {
     216        $self->choices_list->Append(
     217            $_->{name},
     218        );
     219        $self->choices_list->Check(
     220            $i,
     221            $self->is_selected->{$_->{id}}
     222        );
     223        $i++;
     224    }@{$choices};
     225    $self->choices_list->Thaw;
     226}
     227
     228
     229sub get_selected_choices {
     230    my ( $self ) = @_;
     231
     232    my $choices = $self->choices->()||[];
     233    # each choice item is { id => $id,  name => $name, url_nam => $url_name }
     234    my $selected = [
     235        grep { $self->is_selected->{$_->{id}} } @$choices
     236    ];
     237
     238
     239    $selected;
     240}
     241
     242
     243sub ClearAllSelection {
     244    my ( $self ) = @_;
     245
     246    my $row = 0;
     247   
     248    my $choices = $self->choices->();
     249    $self->choices_list->Freeze;
     250    map {
     251        $self->choices_list->Check($row, 0) ;   
     252        $row++;
     253    }@$choices;
     254    $self->choices_list->Thaw;
     255}
     256
     257
     258sub init_event_handlers {
     259    my ( $self ) = @_;
     260
     261    Wx::Event::EVT_CHECKLISTBOX( $self, $self->choices_list, \&OnCheck );
     262    Wx::Event::EVT_LISTBOX( $self, $self->choices_list, \&OnSelected );
    77263    Wx::Event::EVT_SEARCHCTRL_SEARCH_BTN( $self, $self->search, \&OnSearch );
    78264    Wx::Event::EVT_SEARCHCTRL_CANCEL_BTN( $self, $self->search, \&OnCancel );
     
    93279        }
    94280    );
    95 
    96     $self;
    97 }
    98 
    99 sub _init_properties {
    100     my ( $self, $params ) = @_;   
    101    
    102     $self->choices(
    103         $params->{choices}|| sub { [] }
    104     );
    105 
    106     $self->selection(
    107         $params->{selection}|| sub{ [] }
    108     );
    109 
    110     my $choices = $self->choices->();
    111     $self->search_result(
    112         []
    113     );
    114    
    115    
    116    
    117     $self->is_selected({});
    118    
    119     $self->creation_callback(
    120         $params->{creation_callback}
    121     ) if 'CODE' eq ref($params->{creation_callback});
    122 
    123     $self->show_method(
    124         {
    125             gettext("All") => sub { $self->_show_all(@_) },
    126             gettext("Selected") => sub { $self->_show_selected(@_) },
    127             gettext("Not selected") => sub { $self->_show_notselected(@_) },
    128         }
    129     );
    130 }
    131 
    132 sub _init_panel {
    133     my ( $self ) = @_;   
    134 
    135     my( $vsizer ) = Wx::BoxSizer->new( wxVERTICAL );
    136    
    137     $self->search(
    138         Wx::SearchCtrl->new( $self, -1, "", wxDefaultPosition, [-1,-1],wxTE_PROCESS_ENTER )
    139     );
    140 
    141     $self->search->ShowCancelButton( 1 );
    142 
    143     $vsizer->AddWindow( $self->search, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 2 );
    144 
    145     $self->btn_show(
    146         Wx::RadioBox->new( $self, -1, sprintf("%s :", gettext("Show")), wxDefaultPosition, [-1, -1],
    147             [gettext("All"),gettext("Selected"),gettext("Not selected")] , 1, wxRA_SPECIFY_ROWS )
    148     );
    149     $vsizer->AddWindow( $self->btn_show, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 2 );
    150 
    151 
    152     $self->listchoices(
    153         Wx::CheckListBox->new( $self, -1, wxDefaultPosition, [-1,-1], [], 0 )
    154     );
    155     $vsizer->AddWindow( $self->listchoices, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 2 );
    156 
    157     $self->SetSizer( $vsizer );
    158     $vsizer->SetSizeHints( $self );
    159          
    160 }
    161 
    162 sub _init_choices {
    163     my ( $self, $choices ) = @_;
    164 
    165     $self->listchoices->Freeze;
    166     $self->listchoices->Clear;
    167     $self->id_lookup({});
    168     $self->row_lookup({});
    169     $self->id_from_name({});
    170     $self->is_selected({});
    171 
    172     my $row = 0;
    173     #print Dumper $self->properties;
    174     map {
    175         $self->listchoices->Append(
    176             $_->{name},
    177         );
    178         $self->id_lookup->{$row} = $_->{id};
    179         $self->row_lookup->{$_->{id}} = $row;
    180         $self->id_from_name->{$_->{name}} = $_->{id};
    181         $row++;   
    182     }@{$choices};
    183     $self->listchoices->Thaw;
    184 
    185 }
    186 
    187 sub Refresh {
    188     my ( $self, $choices, $selected ) = @_;
    189 
    190    
    191 
    192     if (!defined $choices){
    193         $self->btn_show->SetStringSelection(gettext("All"));
    194         $choices = $self->choices->();
    195     }
    196 
    197     $self->_init_choices($choices);
    198     $self->SetSelection($selected);
    199    
    200 }
    201 
    202 sub ClearAllSelection {
    203     my ( $self ) = @_;
    204 
    205     my $row = 0;
    206    
    207     my $choices = $self->choices->();
    208     $self->listchoices->Freeze;
    209     map {
    210         $self->listchoices->Check($row, 0) ;   
    211         $row++;
    212     }@$choices;
    213     $self->listchoices->Thaw;
    214 }
    215 
    216 sub SetSelection {
    217     my ( $self, $selected ) = @_;
    218 
    219     my $selection = $self->selection->()||[];
    220 
    221     push @$selection, $self->id_from_name->{$selected} if defined $selected;
    222 
    223     $self->listchoices->Freeze;
    224     map {
    225         $self->listchoices->Check(
    226             $self->row_lookup->{$_},
    227             exists $self->row_lookup->{$_},
    228         ) if defined $self->row_lookup->{$_};
    229         $self->is_selected->{$_} = 1;   
    230     }
    231     @{$selection};   
    232     $self->listchoices->Thaw;
    233 }
    234 
    235 sub GetSelection {
    236     my ( $self ) = @_;
    237 
    238     my $row = 0;
    239     my $selection = [];
    240    
    241     my $choices = $self->choices->();
    242     map {
    243            
    244         my $id = $self->id_lookup->{$row};
    245         $self->is_selected->{$id} = $self->listchoices->IsChecked($row) ;   
    246         $row++;
    247     }@$choices;
    248 
    249     [
    250         grep { $self->is_selected->{$_} } keys %{$self->is_selected}
    251     ];   
    252 }
    253 
    254 sub OnCheck {
    255     my ( $self ) = @_;
    256    
    257     $self->selection->(
    258         $self->GetSelection
    259     );   
    260 }
     281}
     282
    261283
    262284sub OnSelected {
    263285    my ( $self, $event ) = @_;
    264286
     287    my $list = $event->GetEventObject;
    265288    my $row = $event->GetInt;
    266     $self->listchoices->Check(
     289
     290    $list->Check(
    267291        $row,
    268         !$self->listchoices->IsChecked($row)   
    269     );
    270 
    271     $self->OnCheck;
    272 
    273     $event->Skip;   
    274 }
     292        !$list->IsChecked($row)   
     293    );
     294
     295    $self->OnCheck($event);
     296
     297}
     298
     299
     300sub OnCheck {
     301    my ( $self, $event ) = @_;
     302
     303    my $list = $event->GetEventObject;
     304    my $indx = $event->GetInt;
     305    my $item = $list->GetString($indx);
     306    if($list->IsChecked($indx)){
     307       $self->add_to_selection($item);
     308    }
     309    else{
     310        $self->remove_from_selection($item);
     311    }
     312   
     313}
     314
     315
     316sub add_to_selection {
     317    my ( $self, $item ) = @_;
     318
     319    return if !defined $item;
     320
     321    my $id = $self->id_from_name->{$item};
     322    return if !defined $id;
     323
     324    $self->is_selected->{$id} = 1;
     325    my $selection = $self->selection->();
     326
     327    $self->selection->(
     328        [
     329            $id,
     330            @$selection
     331        ]
     332    );
     333}
     334
     335
     336sub remove_from_selection {
     337    my ( $self, $item ) = @_;
     338
     339    my $id = $self->id_from_name->{$item};
     340    my $selection = $self->selection->();
     341    $self->selection->(
     342        [
     343            grep { $_ ne $id } @$selection
     344        ]
     345    );
     346    $self->refresh_is_selected;
     347}
     348
    275349
    276350sub OnShow {
    277351    my( $self, $event ) = @_;
    278352
    279     my $show = $event->GetString();
    280    
    281     $self->show_method->{$show}->();                               
    282 }
     353    my $show_mode = $event->GetString();
     354    $self->show_method->{$show_mode}->();
     355}
     356
    283357
    284358sub OnSearchEnter {
     
    286360
    287361    my $searched = $self->search->GetValue;
    288     $searched =~ s/\s+$//;
     362    eval { $searched =~ s/\s+$//; };
    289363    $searched = $searched eq "" ? undef : $searched ;
    290364
     
    299373            );
    300374   
    301             $self->_refresh_selected_searched($searched);
     375            $self->refresh_selected_searched($searched);
    302376            $cleanup = 1;
    303377        }
    304378   
    305379        if( 1 == scalar @{$self->search_result}){
    306             $self->_refresh_selected_searched($searched);
     380            $self->refresh_selected_searched($searched);
    307381            $cleanup = 1;
    308382        }
     
    319393}
    320394
    321 sub _refresh_selected_searched {
     395sub refresh_selected_searched {
    322396    my ( $self, $searched ) = @_;       
    323397
    324     $self->Refresh;
    325     $self->SetSelection($searched);
    326     $self->_show_selected;
    327     $self->btn_show->SetStringSelection(gettext("Selected"));
     398    $self->refresh_lookups(
     399        $self->choices->()
     400    );
     401    $self->add_to_selection($searched);
     402    $self->show_selected;
     403    $self->btn_show->SetStringSelection(gettext("Selection"));
    328404}
    329405
     
    336412
    337413    $self->search_result(
    338         $self->_filter_choices(
     414        $self->search_in_choices(
    339415            $searched
    340416        )
    341417    );
    342418
    343     $self->Refresh(
     419    $self->refresh_choices_list(
    344420        $self->search_result
    345421    );
     
    367443}
    368444
     445
     446sub search_in_choices {
     447    my ( $self, $searched ) = @_;
     448   
     449    my $choices = $self->choices->()||[];
     450   
     451    [
     452       grep { $_->{name} =~ /\b$searched/i} @$choices
     453    ];
     454}
     455
     456
    369457sub OnCancel {
    370458    my( $self, $event ) = @_;
    371459
    372     $self->Refresh(
     460    $self->init_choices_list(
    373461        $self->choices->()
    374462    );
     
    378466
    379467
    380 sub _filter_choices {
    381     my ( $self, $searched ) = @_;
    382    
    383     my $choices = $self->choices->()||[];
    384     [
    385        grep { $_->{name} =~ /$searched/i} @$choices
    386     ]
    387 }
    388 
    389 sub _show_notselected {
    390     my ( $self ) = @_;   
    391 
    392     $self->Refresh(
    393         $self->_filter_notselected()
    394     );
    395 }
    396 
    397 sub _show_selected {
    398     my ( $self ) = @_;   
    399 
    400     $self->Refresh(
    401         $self->_filter_selected()
    402     );
    403 }
    404 
    405 sub _show_all {
    406     my ( $self ) = @_;   
    407 
    408     $self->Refresh(
    409         $self->choices->()
    410     );
    411 }
    412 
    413 sub _filter_selected {
    414     my ( $self ) = @_;
    415 
    416     my $choices = $self->choices->()||[];
    417     [
    418         grep { $self->is_selected->{$_->{id}} } @$choices
    419     ]   
    420 }
    421 
    422 sub _filter_notselected {
    423     my ( $self ) = @_;
    424 
    425     my $choices = $self->choices->()||[];
    426     [
    427         grep { !$self->is_selected->{$_->{id}} } @$choices
    428     ]   
    429 }
    430 
    431 
    4324681;
Note: See TracChangeset for help on using the changeset viewer.