2 #include "wxImageBrowserWdg.h"
5 //#include <gtmlib/math/mathdefs.h>
8 BEGIN_EVENT_TABLE( wxImageBrowserWdg, wxScrolledWindow )
9 EVT_LEFT_UP( wxImageBrowserWdg::OnMouseLeftClick )
10 EVT_RIGHT_UP( wxImageBrowserWdg::OnMouseRightClick )
11 EVT_SIZE( wxImageBrowserWdg::OnSize )
14 wxImageBrowserWdg::wxImageBrowserWdg(
25 : wxScrolledWindow( parent, id, pos, size, style, name )
32 _ima_list.RemoveAll( );
33 _ima_list.Create( _sx, _sy );
38 void wxImageBrowserWdg::SetVolume(
39 unsigned short*** volume,
50 unsigned char* data; //pointeur sur mon image
53 tmpI.Create( width, height );
57 _ima_list.RemoveAll( );
58 _ima_list.Create( _sx, _sy );
60 for( int k = 0; k < depth; k++ )
63 data = tmpI.GetData();
64 data += 3*width*height;
65 // unsigned short** voltemp = volume[k];
66 for ( int i = 0; i < width; i++ )
68 for ( int j = 0; j < height; j++ )
70 value = ( unsigned char )( 0x00ff*( volume[ k ][ i ][ height - j - 1] - min) / (max - min));
75 //memset( data, value, 3);
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 ) ) );
86 this->OnSize( wxSizeEvent( ) );
88 wxSizeEvent myevent(wxSize(-1, -1), this->GetId());
89 this->OnSize(myevent);
96 void wxImageBrowserWdg::SetScaleX( int sx )
102 void wxImageBrowserWdg::SetScaleY( int sy )
108 void wxImageBrowserWdg::SetGap( int gap )
114 int wxImageBrowserWdg::GetScaleX( )
120 int wxImageBrowserWdg::GetScaleY( )
126 int wxImageBrowserWdg::GetGap( )
132 int wxImageBrowserWdg::GetFirst( )
134 return( GTM_MIN( _first_selected, _last_selected ) );
138 int wxImageBrowserWdg::GetLast( )
140 return( GTM_MAX( _first_selected, _last_selected ) );
144 void wxImageBrowserWdg::GetSizeParameters( int* n, int* c, int* r )
146 wxSize sz = this->GetClientSize( );
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 ) );
155 void wxImageBrowserWdg::OnDraw( wxDC& dc )
157 int r, c, i, x, y, n, rt;
158 wxSize sz = this->GetClientSize( );
160 dc.SetTextForeground( wxColour( 255, 255, 0 ) );
161 dc.SetBrush( *wxTRANSPARENT_BRUSH );
163 this->GetSizeParameters( &n, &c, &r );
164 for( i = 0; i < n; i++ )
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 )
173 dc.SetPen( *wxRED_PEN );
174 dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
177 else if( _first_selected != i && _last_selected == i )
179 dc.SetPen( *wxGREEN_PEN );
180 dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
183 else if( _first_selected == i && _last_selected == i )
185 dc.SetPen( *wxCYAN_PEN );
186 dc.DrawRectangle( x - ( _gap / 2 ), y - ( _gap / 2 ), _sx + _gap, _sy + _gap );
194 void wxImageBrowserWdg::OnSize( wxSizeEvent& event )
197 wxSize sz = this->GetClientSize( );
199 this->GetSizeParameters( &n, &c, &r );
202 this->SetScrollbars( _sx + _gap, _sy + ( _gap * 2 ), c, r );
206 int wxImageBrowserWdg::GetIndexClicked( wxMouseEvent& event )
209 int x, y, n, c, r, i;
210 wxClientDC dc( this );
211 this->PrepareDC( dc );
212 wxPoint pos = event.GetLogicalPosition( dc );
214 this->GetSizeParameters( &n, &c, &r );
216 // Image index calculation (Help!!, Mr. wizard!)
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;
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 );
230 void wxImageBrowserWdg::OnMouseLeftClick( wxMouseEvent& event )
233 _first_selected = this->GetIndexClicked( event );
240 void wxImageBrowserWdg::OnMouseRightClick( wxMouseEvent& event )
243 _last_selected = this->GetIndexClicked( event );
251 void wxImageBrowserWdg::Add( const wxImage& ima, const wxString& nrs )
253 _ima_list.Add( wxBitmap( ima.Scale( _sx, _sy ) ) );
254 _nrs_list.Add( nrs );
255 this->OnSize( wxSizeEvent( ) );