source: extensions/pLoader/trunk/src/Uploader/GUI/ListCtrlProgress.pm @ 6494

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

New progress dialog implementation using virtual listctrl. Fix scrolling issues with Wx::Gauge.

File size: 3.3 KB
Line 
1package Uploader::GUI::ListCtrlProgress;
2use strict;
3use Wx qw/
4    wxDefaultPosition
5    wxDefaultSize
6    wxGA_SMOOTH
7/;
8
9use base qw/Wx::ListCtrl Class::Accessor::Fast/;
10__PACKAGE__->mk_accessors(qw/
11        progress_column
12        progress_bars
13        items
14        column_item_data
15        item_data
16    /
17);
18use Data::Dumper;
19
20sub new {
21    # have to remove class name from @_ because we cannot have
22    # it in @_ when passed to SUPER::new
23    my $class  = shift ;
24
25    my ( $self ) = $class->SUPER::new(@_);
26
27    $self->progress_bars([]);
28    $self->item_data([]);
29
30    Wx::Event::EVT_PAINT(
31        $self,
32        sub {
33            my ( $self, $event ) = @_;
34
35            eval { $self->paint_progress_bars; };
36            $event->Skip;
37        }
38    );
39
40
41    $self;
42}
43
44
45sub replace_item_data {
46    my ( $self, $item, $data ) = @_;
47
48    $self->item_data->[$item] = $data;
49    $self->progress_bars->[$item] ||= Wx::Gauge->new(
50        $self,
51        -1,
52        100,
53        wxDefaultPosition,
54        wxDefaultSize, 
55        Wx::wxGA_SMOOTH
56    );
57
58    my $progress_bar = $self->progress_bars->[$item];
59    $self->paint_progress_bar($item, $progress_bar);
60    $self->RefreshItem($item);
61}
62
63
64sub add_progress_items {
65    my ( $self, $added_items ) = @_;
66
67    push @{$self->item_data}, @{$added_items};
68
69    $self->SetItemCount(scalar @{$self->item_data});
70}
71
72
73sub OnGetItemText {
74    my ( $self, $item, $column ) = @_;
75
76    my $value = $self->column_item_data->{$column}->(
77        $self->item_data->[$item]
78    );
79
80    # progress column
81    if( $column == $self->progress_column ){
82        $self->set_item_progress_value(
83            $item,
84            $value
85        );
86        $value = '';
87    }
88
89    return $value;
90}
91
92
93
94sub get_item_progress_rect {
95    my ( $self, $item, $subitem ) = @_;
96
97    my $rect = $self->GetItemRect($item);
98    #my $pos = $self->GetItemPosition($item);
99    # cumulate columns widths. If progress bar is column 4,
100    # cumulate columns widths 0, 1, 2, 3
101    my $x = $rect->GetX;
102
103    map { $x += $self->GetColumnWidth($_) } grep { $_ < $subitem } (0..$subitem);
104    $rect->SetX($x);
105    $rect->SetWidth(
106        $self->GetColumnWidth($subitem)
107    );
108
109    $rect;
110}
111
112
113sub set_item_progress_value {
114    my ( $self, $indx, $value ) = @_;
115
116    my $item = $self->progress_bars->[$indx];
117
118    return unless defined $item;
119
120    if( $value > -1 ){
121        $item->SetValue($value);
122    }
123    else{
124        $item->Pulse;
125    }
126}
127
128
129sub paint_progress_bars {
130    my ( $self ) = @_;
131
132    # re-paint progress bars at the right position and size
133    my $i=0;
134    map{
135        $self->paint_progress_bar($i, $_);
136        $i++;
137    }@{$self->progress_bars};
138}
139
140
141sub paint_progress_bar {
142    my ( $self, $item, $progress_bar ) = @_;
143
144    my $rect = $self->get_item_progress_rect($item, $self->progress_column);
145    # top most visible item
146    $self->{_y_top} ||= $rect->GetY;
147
148    # hidden
149    my $bar_pos = Wx::Point->new(-1000, -1000);
150
151    if(  $rect->GetY >=  $self->{_y_top}) {
152        $bar_pos = $rect->GetPosition;
153    }
154
155    $progress_bar->Move(
156        $bar_pos
157    );
158
159    $progress_bar->SetSize(
160        $rect->GetSize
161    );
162}
163
164
165
1661;
Note: See TracBrowser for help on using the repository browser.