]>
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
)