]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxImageBrowserWdg.cxx
55048ce0daf7a1e484d398242438ad2c364a3515
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxImageBrowserWdg.cxx
1
2 #include "wxImageBrowserWdg.h"
3
4 #include <math.h>
5 //#include <gtmlib/math/mathdefs.h>
6 #include <mathdefs.h>
7
8 BEGIN_EVENT_TABLE( wxImageBrowserWdg, wxScrolledWindow )
9     EVT_LEFT_UP( wxImageBrowserWdg::OnMouseLeftClick )
10     EVT_RIGHT_UP( wxImageBrowserWdg::OnMouseRightClick )
11     EVT_SIZE( wxImageBrowserWdg::OnSize )
12     END_EVENT_TABLE( );
13
14 wxImageBrowserWdg::wxImageBrowserWdg(
15     wxWindow* parent,
16     wxWindowID id,
17     int sx,
18     int sy,
19     int gap,
20     const wxPoint& pos,
21     const wxSize& size,
22     long style,
23     const wxString& name
24     )
25     : wxScrolledWindow( parent, id, pos, size, style, name )
26 {
27     _sx = sx;
28     _sy = sy;
29     _gap = gap;
30     _first_selected = -1;
31     _last_selected = -1;
32     _ima_list.RemoveAll( );
33     _ima_list.Create( _sx, _sy );
34     _nrs_list.Clear( );
35
36 }
37
38 void wxImageBrowserWdg::SetVolume(
39                                    unsigned short*** volume,
40                                    wxArrayString& names,
41                                    int width,
42                                    int height,
43                                    int depth,
44                                    int min,
45                                    int max
46                                    )
47 {
48     wxImage tmpI;
49     unsigned char value;
50     unsigned char* data;  //pointeur sur mon image
51 //    int i, j, k;
52
53     tmpI.Create( width, height );
54     _nrs_list = names;
55
56     // Canvas creation
57     _ima_list.RemoveAll( );
58     _ima_list.Create( _sx, _sy );
59
60     for( int k = 0; k < depth; k++ )
61     {
62
63       data = tmpI.GetData();
64       data += 3*width*height;
65 //      unsigned short** voltemp = volume[k];
66       for ( int i = 0; i < width; i++ )
67       {
68         for ( int j = 0; j < height; j++ )
69         {
70           value = ( unsigned char )( 0x00ff*( volume[ k ][ i ][ height - j - 1] - min) / (max - min));
71           data -= 3;
72           data[0] = value;
73           data[1] = value;
74           data[2] = value;
75           //memset( data, value, 3);
76         } //rof
77       } //rof
78
79       //image is set, add it to the list
80       //another image is created so allocation is not a problem
81       _ima_list.Add( wxBitmap( tmpI.Scale( _sx, _sy ) ) );
82     } // rof
83
84 //FIXME:
85 #ifdef __WXMSW__
86     this->OnSize( wxSizeEvent( ) );
87 #else
88   wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
89   this->OnSize(myevent);
90   this->Show(true);
91 #endif
92 }
93
94
95
96 void wxImageBrowserWdg::SetScaleX( int sx )
97 {
98     _sx = sx;
99
100 }
101
102 void wxImageBrowserWdg::SetScaleY( int sy )
103 {
104     _sy = sy;
105
106 }
107
108 void wxImageBrowserWdg::SetGap( int gap )
109 {
110     _gap = gap;
111
112 }
113
114 int wxImageBrowserWdg::GetScaleX( )
115 {
116     return( _sx );
117
118 }
119
120 int wxImageBrowserWdg::GetScaleY( )
121 {
122     return( _sy );
123
124 }
125
126 int wxImageBrowserWdg::GetGap( )
127 {
128     return( _gap );
129
130 }
131
132 int wxImageBrowserWdg::GetFirst( )
133 {
134     return( GTM_MIN( _first_selected, _last_selected ) );
135
136 }
137
138 int wxImageBrowserWdg::GetLast( )
139 {
140     return( GTM_MAX( _first_selected, _last_selected ) );
141
142 }
143
144 void wxImageBrowserWdg::GetSizeParameters( int* n, int* c, int* r )
145 {
146     wxSize sz = this->GetClientSize( );
147
148     *n = _ima_list.GetImageCount( );
149     *c = ( int )floor( ( double )( sz.GetWidth( ) ) / ( double )( _gap + _sx ) );
150     *c = ( *c <= 0 )? 1: *c;
151     *r = ( int )ceil( ( double )( *n ) / ( double )( *c ) );
152
153 }
154
155 void wxImageBrowserWdg::OnDraw( wxDC& dc )
156 {
157     int r, c, i, x, y, n, rt;
158     wxSize sz = this->GetClientSize( );
159
160     dc.SetTextForeground( wxColour( 255, 255, 0 ) );
161     dc.SetBrush( *wxTRANSPARENT_BRUSH );
162
163     this->GetSizeParameters( &n, &c, &r );
164     for( i = 0; i < n; i++ )
165     {
166         rt = ( int )floor( ( double )i / ( double )c );
167         x = ( _sx * ( i % c ) ) + ( ( ( i % c ) + 1 ) * _gap );
168         y = ( _sy * ( rt % r ) ) + ( ( ( rt % r ) + 1 ) * _gap );
169         _ima_list.Draw( i, dc, x, y, wxIMAGELIST_DRAW_NORMAL, true );
170         dc.DrawText( _nrs_list[ i ], x, y );
171         if( _first_selected == i && _last_selected != i )
172         {
173             dc.SetPen( *wxRED_PEN );
174             dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
175
176         }
177         else if( _first_selected != i && _last_selected == i )
178         {
179             dc.SetPen( *wxGREEN_PEN );
180             dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
181
182         }
183         else if( _first_selected == i && _last_selected == i )
184         {
185             dc.SetPen( *wxCYAN_PEN );
186             dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
187
188         } // fi
189
190     } // rof
191
192 }
193
194 void wxImageBrowserWdg::OnSize( wxSizeEvent& event )
195 {
196     int r, c, n;
197     wxSize sz = this->GetClientSize( );
198
199     this->GetSizeParameters( &n, &c, &r );
200
201     // Scroll bars
202     this->SetScrollbars( _sx + _gap, _sy + ( _gap * 2 ), c, r );
203
204 }
205
206 int wxImageBrowserWdg::GetIndexClicked( wxMouseEvent& event )
207 {
208     double re;
209     int x, y, n, c, r, i;
210     wxClientDC dc( this );
211     this->PrepareDC( dc );
212     wxPoint pos = event.GetLogicalPosition( dc );
213
214     this->GetSizeParameters( &n, &c, &r );
215
216     // Image index calculation (Help!!, Mr. wizard!)
217     x = -1;
218     re = ( double )( pos.x ) / ( double )( _gap + _sx );
219     if( ( re - floor( re ) ) >= ( ( double )( _gap ) / ( double )( _gap + _sx ) ) ) x = ( int )floor( re );
220     x = ( x >= 0 && x < c )? x: -1;
221     y = -1;
222     re = ( double )( pos.y ) / ( double )( _gap + _sy );
223     if( ( re - floor( re ) ) >= ( ( double )( _gap ) / ( double )( _gap + _sy ) ) ) y = ( int )floor( re );
224     y = ( y >= 0 && y < r )? y: -1;
225     i = ( x != -1 && y != -1 )? x + ( y * c ): -1;
226     return( ( i < n )? i: -1 );
227
228 }
229
230 void wxImageBrowserWdg::OnMouseLeftClick( wxMouseEvent& event )
231 {
232     // Select!
233     _first_selected = this->GetIndexClicked( event );
234
235     // Drawing
236     this->Refresh( );
237
238 }
239
240 void wxImageBrowserWdg::OnMouseRightClick( wxMouseEvent& event )
241 {
242     // Select!
243     _last_selected = this->GetIndexClicked( event );
244
245     // Drawing
246     this->Refresh( );
247
248 }
249
250 /*
251 void wxImageBrowserWdg::Add( const wxImage& ima, const wxString& nrs )
252 {
253 _ima_list.Add( wxBitmap( ima.Scale( _sx, _sy ) ) );
254 _nrs_list.Add( nrs );
255 this->OnSize( wxSizeEvent( ) );
256 }
257 */