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):
98 bmp = image.ConvertToBitmap()
100 iwidth = bmp.GetWidth() # dimensions of image file
101 iheight = bmp.GetHeight()
103 diffx = (self.image_sizex - iwidth)/2 # center calc
104 if iwidth >= self.image_sizex -10: # if image width fits in window adjust
106 iwidth = self.image_sizex - 10
108 diffy = (self.image_sizey - iheight)/2 # center calc
109 if iheight >= self.image_sizey - 10: # if image height fits in window adjust
111 iheight = self.image_sizey - 10
113 image.Rescale(iwidth, iheight) # rescale to fit the window
114 image.ConvertToBitmap()
115 bmp = image.ConvertToBitmap()
116 dc.DrawBitmap(bmp, diffx, diffy) # draw the image to window
119 class ImageDialog(wx.Dialog):
120 def __init__(self, parent, set_dir = None):
121 wx.Dialog.__init__(self, parent, -1, "Image Browser", wx.DefaultPosition, (400, 400))
123 self.x_pos = 30 # initial display positions
127 size = wx.Size(80, -1)
129 self.set_dir = os.getcwd()
133 if os.path.exists(set_dir): # set to working directory if nothing set
134 self.set_dir = set_dir
136 self.dir_x = self.x_pos
137 self.dir_y = self.y_pos
138 self.dir = wx.StaticText(self, -1, self.set_dir, (self.dir_x, self.dir_y), (250, -1))
140 self.y_pos = self.y_pos + self.delta
142 btn = wx.Button(self, 12331, ' Set Directory ', (self.x_pos, self.y_pos))
143 self.Bind(wx.EVT_BUTTON, self.SetDirect, btn)
145 self.type_posy = self.y_pos # save the y position for the image type combo
147 self.fl_ext = '*.bmp' # initial setting for file filtering
148 self.GetFiles() # get the file list
150 self.y_pos = self.y_pos + self.delta + 10
151 self.list_height = 150
154 self.tb = tb = wx.ListBox(self, -1, (self.x_pos, self.y_pos),
155 (160, self.list_height), self.fl_list,
157 self.Bind(wx.EVT_LISTBOX, self.OnListClick, tb)
158 self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnListDClick, tb)
160 width, height = self.tb.GetSize()
161 image_posx = self.x_pos + width + 20 # positions for setting the image window
162 image_posy = self.y_pos
164 image_sizey = self.list_height
167 "All Images", "Bmp", "Gif", "Png", "Jpg", "Ico", "Pnm",
168 "Pcx", "Tif", "All Files"
171 self.fl_ext_types = {
184 self.set_type = self.fl_types[0] # initial file filter setting
185 self.fl_ext = self.fl_ext_types[self.set_type]
187 self.sel_type = wx.ComboBox(self, -1, self.set_type, (image_posx , self.type_posy),
188 (150, -1), self.fl_types, wx.CB_DROPDOWN)
189 self.Bind(wx.EVT_COMBOBOX, self.OnSetType, self.sel_type)
191 self.image_view = ImageView( self, pos=(image_posx, image_posy),
192 size=(image_sizex, image_sizey))
194 self.y_pos = self.y_pos + height + 20
196 btn = wx.Button(self, -1, ' Select ', (100, self.y_pos), size)
197 self.Bind(wx.EVT_BUTTON, self.OnOk, btn)
199 wx.Button(self, wx.ID_CANCEL, 'Cancel', (250, self.y_pos), size)
201 self.y_pos = self.y_pos + self.delta
202 fsize = (400, self.y_pos + 50) # resize dialog for final vertical position
207 def GetFiles(self): # get the file list using directory and extension values
208 if self.fl_ext == "All":
211 for ftypes in self.fl_types[1:-1]: # get list of all available image types
212 filter = self.fl_ext_types[ftypes]
213 #print "filter = ", filter
214 self.fl_val = FindFiles(self, self.set_dir, filter)
215 all_files = all_files + self.fl_val.files # add to list of files
217 self.fl_list = all_files
219 self.fl_val = FindFiles(self, self.set_dir, self.fl_ext)
220 self.fl_list = self.fl_val.files
222 self.fl_list.sort() # sort the file list
224 def DisplayDir(self): # display the working directory
226 self.dir.SetLabel(self.set_dir)
228 def OnSetType(self, event):
229 val = event.GetString() # get file type value
230 self.fl_ext = self.fl_ext_types[val]
233 def OnListDClick(self, event):
236 def OnListClick(self, event):
237 val = event.GetSelection()
238 self.SetListValue(val)
240 def SetListValue(self, val):
241 file_nm = self.fl_list[val]
242 self.set_file = file_val = os.path.join(self.set_dir, file_nm)
243 self.image_view.SetValue(file_val)
245 def SetDirect(self, event): # set the new directory
246 dlg = wx.DirDialog(self)
247 dlg.SetPath(self.set_dir)
249 if dlg.ShowModal() == wx.ID_OK:
250 self.set_dir = dlg.GetPath()
255 def ResetFiles(self): # refresh the display with files and initial image
259 # Changed 12/8/03 jmg
261 # o Clear listbox first
262 # o THEN check to see if there are any valid files of the selected
264 # o THEN if we have any files to display, set the listbox up,
269 # o Clear the image viewer.
271 # This avoids a nasty assert error.
275 if len(self.fl_list):
276 self.tb.Set(self.fl_list)
279 self.tb.SetSelection(0)
282 self.image_view.SetValue(None)
284 self.image_view.SetValue(None)
289 def GetDirectory(self):
292 def OnCancel(self, event):
294 self.EndModal(wx.ID_CANCEL)
296 def OnOk(self, event):
297 self.result = self.set_file
298 self.EndModal(wx.ID_OK)
302 dlg = wx.FileDialog(self, "Choose an Image File", ".", "",
303 "Bmp (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg", wx.OPEN)
305 if dlg.ShowModal() == wx.ID_OK:
314 def __init__(self, parent, dir, mask):
320 pattern = self.MakeRegex(mask)
322 for i in os.listdir(dir):
323 if i == "." or i == "..":
326 path = os.path.join(dir, i)
330 if pattern.match(value) != None:
333 self.files = filelist
335 def MakeRegex(self, pattern):
337 f = "" # Set up a regex for file names
349 return re.compile(f+'$')
351 def StripExt(self, file_nm):
352 fl_fld = os.path.splitext(file_nm)