]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/wx/lib/imagebrowser.py
   1 #---------------------------------------------------------------------------- 
   3 # Purpose:      Display and Select Image Files 
   8 # Date:         January 29, 2002 
   9 # Licence:      wxWindows license 
  10 #---------------------------------------------------------------------------- 
  12 # Create list of all available image file types 
  13 # View "All Image" File Types as default filter 
  15 # Use newer "re" function for patterns 
  17 #---------------------------------------------------------------------------- 
  19 # 12/08/2003 - Jeff Grimmett (grimmtooth@softhome.net) 
  21 # o Updated for wx namespace 
  22 # o Corrected a nasty bug or two - see comments below. 
  23 # o There was a duplicate ImageView.DrawImage() method. Que? 
  26 #--------------------------------------------------------------------------- 
  33 dir_path 
= os
.getcwd() 
  35 #--------------------------------------------------------------------------- 
  37 def ConvertBMP(file_nm
): 
  41     fl_fld 
= os
.path
.splitext(file_nm
) 
  45     image 
= wx
.Image(file_nm
, wx
.BITMAP_TYPE_ANY
) 
  49 def GetSize(file_nm
):       # for scaling image values 
  50     image 
= ConvertBMP(file_nm
) 
  51     bmp 
= image
.ConvertToBitmap() 
  52     size 
= bmp
.GetWidth(), bmp
.GetHeight() 
  56 class ImageView(wx
.Window
): 
  57     def __init__(self
, parent
, id=-1, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
): 
  58         wx
.Window
.__init
__(self
, parent
, id, pos
, size
) 
  61         self
.back_color 
= 'WHITE' 
  62         self
.border_color 
= 'BLACK' 
  64         # Changed API of wx uses tuples for size and pos now. 
  65         self
.image_sizex 
= size
[0] 
  66         self
.image_sizey 
= size
[1] 
  67         self
.image_posx 
= pos
[0] 
  68         self
.image_posy 
= pos
[1] 
  69         self
.Bind(wx
.EVT_PAINT
, self
.OnPaint
) 
  71     def OnPaint(self
, event
): 
  76     def SetValue(self
, file_nm
):    # display the selected file in the panel 
  77         image 
= ConvertBMP(file_nm
) 
  81     def DrawBorder(self
, dc
): 
  82         brush 
= wx
.Brush(wx
.NamedColour(self
.back_color
), wx
.SOLID
) 
  84         dc
.SetPen(wx
.Pen(wx
.NamedColour(self
.border_color
), 1)) 
  85         dc
.DrawRectangle(0, 0, self
.image_sizex
, self
.image_sizey
) 
  87     def DrawImage(self
, dc
): 
  99             bmp 
= image
.ConvertToBitmap() 
 103         iwidth 
= bmp
.GetWidth()   # dimensions of image file 
 104         iheight 
= bmp
.GetHeight() 
 106         diffx 
= (self
.image_sizex 
- iwidth
)/2   # center calc 
 107         if iwidth 
>= self
.image_sizex 
-10:      # if image width fits in window adjust 
 109             iwidth 
= self
.image_sizex 
- 10 
 111         diffy 
= (self
.image_sizey 
- iheight
)/2  # center calc 
 112         if iheight 
>= self
.image_sizey 
- 10:    # if image height fits in window adjust 
 114             iheight 
= self
.image_sizey 
- 10 
 116         image
.Rescale(iwidth
, iheight
)      # rescale to fit the window 
 117         image
.ConvertToBitmap() 
 118         bmp 
= image
.ConvertToBitmap() 
 119         dc
.DrawBitmap(bmp
, diffx
, diffy
)        # draw the image to window 
 122 class ImageDialog(wx
.Dialog
): 
 123     def __init__(self
, parent
, set_dir 
= None): 
 124         wx
.Dialog
.__init
__(self
, parent
, -1, "Image Browser", wx
.DefaultPosition
, (400, 400)) 
 126         self
.x_pos 
= 30     # initial display positions 
 130         size 
= wx
.Size(80, -1) 
 132         self
.set_dir 
= os
.getcwd() 
 136             if os
.path
.exists(set_dir
):     # set to working directory if nothing set 
 137                 self
.set_dir 
= set_dir
 
 139         self
.dir_x 
= self
.x_pos
 
 140         self
.dir_y 
= self
.y_pos
 
 141         self
.dir = wx
.StaticText(self
, -1, self
.set_dir
, (self
.dir_x
, self
.dir_y
), (250, -1)) 
 143         self
.y_pos 
= self
.y_pos 
+ self
.delta
 
 145         btn 
= wx
.Button(self
, 12331, ' Set Directory ', (self
.x_pos
, self
.y_pos
)) 
 146         self
.Bind(wx
.EVT_BUTTON
, self
.SetDirect
, btn
) 
 148         self
.type_posy 
= self
.y_pos     
# save the y position for the image type combo 
 150         self
.fl_ext 
= '*.bmp'   # initial setting for file filtering 
 151         self
.GetFiles()     # get the file list 
 153         self
.y_pos 
= self
.y_pos 
+ self
.delta 
+ 10 
 154         self
.list_height 
= 150 
 157         self
.tb 
= tb 
= wx
.ListBox(self
, -1, (self
.x_pos
, self
.y_pos
),  
 158                                   (160, self
.list_height
), self
.fl_list
,  
 160         self
.Bind(wx
.EVT_LISTBOX
, self
.OnListClick
, tb
) 
 161         self
.Bind(wx
.EVT_LISTBOX_DCLICK
, self
.OnListDClick
, tb
) 
 163         width
, height 
= self
.tb
.GetSize() 
 164         image_posx 
= self
.x_pos 
+ width 
+ 20       # positions for setting the image window 
 165         image_posy 
= self
.y_pos
 
 167         image_sizey 
= self
.list_height
 
 170                     "All Images", "Bmp", "Gif", "Png", "Jpg", "Ico", "Pnm",  
 171                     "Pcx", "Tif", "All Files" 
 174         self
.fl_ext_types 
= { 
 187         self
.set_type 
= self
.fl_types
[0]    # initial file filter setting 
 188         self
.fl_ext 
= self
.fl_ext_types
[self
.set_type
] 
 190         self
.sel_type 
= wx
.ComboBox(self
, -1, self
.set_type
, (image_posx 
, self
.type_posy
),  
 191                                     (150, -1), self
.fl_types
, wx
.CB_DROPDOWN
) 
 192         self
.Bind(wx
.EVT_COMBOBOX
, self
.OnSetType
, self
.sel_type
) 
 194         self
.image_view 
= ImageView( self
, pos
=(image_posx
, image_posy
),  
 195                                      size
=(image_sizex
, image_sizey
)) 
 197         self
.y_pos 
= self
.y_pos 
+ height 
+ 20 
 199         btn 
= wx
.Button(self
, -1, ' Select ', (100, self
.y_pos
), size
) 
 200         self
.Bind(wx
.EVT_BUTTON
, self
.OnOk
, btn
) 
 202         wx
.Button(self
, wx
.ID_CANCEL
, 'Cancel', (250, self
.y_pos
), size
) 
 204         self
.y_pos 
= self
.y_pos 
+ self
.delta
 
 205         fsize 
= (400, self
.y_pos 
+ 50)    # resize dialog for final vertical position 
 210     def GetFiles(self
):     # get the file list using directory and extension values 
 211         if self
.fl_ext 
== "All": 
 214             for ftypes 
in self
.fl_types
[1:-1]:    # get list of all available image types 
 215                 filter = self
.fl_ext_types
[ftypes
] 
 216                 #print "filter = ", filter 
 217                 self
.fl_val 
= FindFiles(self
, self
.set_dir
, filter) 
 218                 all_files 
= all_files 
+ self
.fl_val
.files   
# add to list of files 
 220             self
.fl_list 
= all_files
 
 222             self
.fl_val 
= FindFiles(self
, self
.set_dir
, self
.fl_ext
) 
 223             self
.fl_list 
= self
.fl_val
.files
 
 225         self
.fl_list
.sort()     # sort the file list 
 227     def DisplayDir(self
):       # display the working directory 
 229             self
.dir.SetLabel(self
.set_dir
) 
 231     def OnSetType(self
, event
): 
 232         val 
= event
.GetString()      # get file type value 
 233         self
.fl_ext 
= self
.fl_ext_types
[val
] 
 236     def OnListDClick(self
, event
): 
 239     def OnListClick(self
, event
): 
 240         val 
= event
.GetSelection() 
 241         self
.SetListValue(val
) 
 243     def SetListValue(self
, val
): 
 244         file_nm 
= self
.fl_list
[val
] 
 245         self
.set_file 
= file_val 
= os
.path
.join(self
.set_dir
, file_nm
) 
 246         self
.image_view
.SetValue(file_val
) 
 248     def SetDirect(self
, event
):     # set the new directory 
 249         dlg 
= wx
.DirDialog(self
) 
 250         dlg
.SetPath(self
.set_dir
) 
 252         if dlg
.ShowModal() == wx
.ID_OK
: 
 253             self
.set_dir 
= dlg
.GetPath() 
 258     def ResetFiles(self
):   # refresh the display with files and initial image 
 262         # Changed 12/8/03 jmg 
 264         # o Clear listbox first 
 265         # o THEN check to see if there are any valid files of the selected 
 267         # o THEN if we have any files to display, set the listbox up, 
 272         # o Clear the image viewer. 
 274         # This avoids a nasty assert error. 
 278         if len(self
.fl_list
): 
 279             self
.tb
.Set(self
.fl_list
) 
 282                 self
.tb
.SetSelection(0) 
 285                 self
.image_view
.SetValue(None) 
 287             self
.image_view
.SetValue(None) 
 292     def GetDirectory(self
): 
 295     def OnCancel(self
, event
): 
 297         self
.EndModal(wx
.ID_CANCEL
) 
 299     def OnOk(self
, event
): 
 300         self
.result 
= self
.set_file
 
 301         self
.EndModal(wx
.ID_OK
) 
 305     dlg 
= wx
.FileDialog(self
, "Choose an Image File", ".", "",  
 306                         "Bmp (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg", wx
.OPEN
) 
 308     if dlg
.ShowModal() == wx
.ID_OK
: 
 317     def __init__(self
, parent
, dir, mask
): 
 323         pattern 
= self
.MakeRegex(mask
) 
 325         for i 
in os
.listdir(dir): 
 326             if i 
== "." or i 
== "..": 
 329             path 
= os
.path
.join(dir, i
) 
 333             if pattern
.match(value
) != None: 
 336         self
.files 
= filelist
 
 338     def MakeRegex(self
, pattern
): 
 340         f 
= ""  # Set up a regex for file names 
 352         return re
.compile(f
+'$') 
 354     def StripExt(self
, file_nm
): 
 355         fl_fld 
= os
.path
.splitext(file_nm
)