]> git.saurik.com Git - wxWidgets.git/blob - wxPython/wx/lib/imagebrowser.py
Oops, DoLog and DoLogString are protected
[wxWidgets.git] / wxPython / wx / lib / imagebrowser.py
1 #----------------------------------------------------------------------------
2 # Name:         BrowseImage.py
3 # Purpose:      Display and Select Image Files
4 #
5 # Author:       Lorne White
6 #
7 # Version:      1.0
8 # Date:         January 29, 2002
9 # Licence:      wxWindows license
10 #----------------------------------------------------------------------------
11 # 1.0 Release
12 # Create list of all available image file types
13 # View "All Image" File Types as default filter
14 # Sort the file list
15 # Use newer "re" function for patterns
16 #
17 #----------------------------------------------------------------------------
18 #
19 # 12/08/2003 - Jeff Grimmett (grimmtooth@softhome.net)
20 #
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?
24
25
26 #---------------------------------------------------------------------------
27
28 import  os
29 import  sys
30
31 import  wx
32
33 dir_path = os.getcwd()
34
35 #---------------------------------------------------------------------------
36
37 def ConvertBMP(file_nm):
38     if file_nm is None:
39         return None
40
41     fl_fld = os.path.splitext(file_nm)
42     ext = fl_fld[1]
43     ext = ext[1:].lower()
44
45     image = wx.Image(file_nm, wx.BITMAP_TYPE_ANY)
46     return image
47
48
49 def GetSize(file_nm):       # for scaling image values
50     image = ConvertBMP(file_nm)
51     bmp = image.ConvertToBitmap()
52     size = bmp.GetWidth(), bmp.GetHeight()
53     return size
54
55
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)
59         self.win = parent
60         self.image = None
61         self.back_color = 'WHITE'
62         self.border_color = 'BLACK'
63
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)
70
71     def OnPaint(self, event):
72         dc = wx.PaintDC(self)
73         self.DrawImage(dc)
74
75
76     def SetValue(self, file_nm):    # display the selected file in the panel
77         image = ConvertBMP(file_nm)
78         self.image = image
79         self.Refresh()
80
81     def DrawBorder(self, dc):
82         brush = wx.Brush(wx.NamedColour(self.back_color), wx.SOLID)
83         dc.SetBrush(brush)
84         dc.SetPen(wx.Pen(wx.NamedColour(self.border_color), 1))
85         dc.DrawRectangle(0, 0, self.image_sizex, self.image_sizey)
86
87     def DrawImage(self, dc):
88         try:
89             image = self.image
90         except:
91             return
92
93         self.DrawBorder(dc)
94
95         if image is None:
96             return
97
98         bmp = image.ConvertToBitmap()
99
100         iwidth = bmp.GetWidth()   # dimensions of image file
101         iheight = bmp.GetHeight()
102
103         diffx = (self.image_sizex - iwidth)/2   # center calc
104         if iwidth >= self.image_sizex -10:      # if image width fits in window adjust
105             diffx = 5
106             iwidth = self.image_sizex - 10
107
108         diffy = (self.image_sizey - iheight)/2  # center calc
109         if iheight >= self.image_sizey - 10:    # if image height fits in window adjust
110             diffy = 5
111             iheight = self.image_sizey - 10
112
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
117
118
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))
122
123         self.x_pos = 30     # initial display positions
124         self.y_pos = 20
125         self.delta = 20
126
127         size = wx.Size(80, -1)
128
129         self.set_dir = os.getcwd()
130         self.set_file = None
131
132         if set_dir != None:
133             if os.path.exists(set_dir):     # set to working directory if nothing set
134                 self.set_dir = set_dir
135
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))
139
140         self.y_pos = self.y_pos + self.delta
141
142         btn = wx.Button(self, 12331, ' Set Directory ', (self.x_pos, self.y_pos))
143         self.Bind(wx.EVT_BUTTON, self.SetDirect, btn)
144
145         self.type_posy = self.y_pos     # save the y position for the image type combo
146
147         self.fl_ext = '*.bmp'   # initial setting for file filtering
148         self.GetFiles()     # get the file list
149
150         self.y_pos = self.y_pos + self.delta + 10
151         self.list_height = 150
152
153     # List of Labels
154         self.tb = tb = wx.ListBox(self, -1, (self.x_pos, self.y_pos), 
155                                   (160, self.list_height), self.fl_list, 
156                                   wx.LB_SINGLE )
157         self.Bind(wx.EVT_LISTBOX, self.OnListClick, tb)
158         self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnListDClick, tb)
159
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
163         image_sizex = 150
164         image_sizey = self.list_height
165
166         self.fl_types = [
167                     "All Images", "Bmp", "Gif", "Png", "Jpg", "Ico", "Pnm", 
168                     "Pcx", "Tif", "All Files"
169                     ]
170
171         self.fl_ext_types = {
172                 "All Images": "All", 
173                 "Bmp": "*.bmp", 
174                 "Gif": "*.gif", 
175                 "Png": "*.png", 
176                 "Jpg": "*.jpg",
177                 "Ico": "*.ico", 
178                 "Pnm": "*.pnm", 
179                 "Pcx": "*.pcx", 
180                 "Tif": "*.tif", 
181                 "All Files": "*.*" 
182                 }
183
184         self.set_type = self.fl_types[0]    # initial file filter setting
185         self.fl_ext = self.fl_ext_types[self.set_type]
186
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)
190
191         self.image_view = ImageView( self, pos=(image_posx, image_posy), 
192                                      size=(image_sizex, image_sizey))
193
194         self.y_pos = self.y_pos + height + 20
195
196         btn = wx.Button(self, -1, ' Select ', (100, self.y_pos), size)
197         self.Bind(wx.EVT_BUTTON, self.OnOk, btn)
198
199         wx.Button(self, wx.ID_CANCEL, 'Cancel', (250, self.y_pos), size)
200
201         self.y_pos = self.y_pos + self.delta
202         fsize = (400, self.y_pos + 50)    # resize dialog for final vertical position
203         self.SetSize(fsize)
204
205         self.ResetFiles()
206
207     def GetFiles(self):     # get the file list using directory and extension values
208         if self.fl_ext == "All":
209             all_files = []
210
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
216
217             self.fl_list = all_files
218         else:
219             self.fl_val = FindFiles(self, self.set_dir, self.fl_ext)
220             self.fl_list = self.fl_val.files
221
222         self.fl_list.sort()     # sort the file list
223
224     def DisplayDir(self):       # display the working directory
225         if self.dir:
226             self.dir.SetLabel(self.set_dir)
227
228     def OnSetType(self, event):
229         val = event.GetString()      # get file type value
230         self.fl_ext = self.fl_ext_types[val]
231         self.ResetFiles()
232
233     def OnListDClick(self, event):
234         self.OnOk(0)
235
236     def OnListClick(self, event):
237         val = event.GetSelection()
238         self.SetListValue(val)
239
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)
244
245     def SetDirect(self, event):     # set the new directory
246         dlg = wx.DirDialog(self)
247         dlg.SetPath(self.set_dir)
248
249         if dlg.ShowModal() == wx.ID_OK:
250             self.set_dir = dlg.GetPath()
251             self.ResetFiles()
252
253         dlg.Destroy()
254
255     def ResetFiles(self):   # refresh the display with files and initial image
256         self.DisplayDir()
257         self.GetFiles()
258
259         # Changed 12/8/03 jmg
260         #
261         # o Clear listbox first
262         # o THEN check to see if there are any valid files of the selected
263         #   type, 
264         # o THEN if we have any files to display, set the listbox up,
265         #
266         # OTHERWISE
267         #
268         # o Leave it cleared
269         # o Clear the image viewer.
270         #
271         # This avoids a nasty assert error.
272         #
273         self.tb.Clear()
274         
275         if len(self.fl_list):
276             self.tb.Set(self.fl_list)
277
278             try:
279                 self.tb.SetSelection(0)
280                 self.SetListValue(0)
281             except:
282                 self.image_view.SetValue(None)
283         else:
284             self.image_view.SetValue(None)
285
286     def GetFile(self):
287         return self.set_file
288
289     def GetDirectory(self):
290         return self.set_dir
291
292     def OnCancel(self, event):
293         self.result = None
294         self.EndModal(wx.ID_CANCEL)
295
296     def OnOk(self, event):
297         self.result = self.set_file
298         self.EndModal(wx.ID_OK)
299
300
301 def OnFileDlg(self):
302     dlg = wx.FileDialog(self, "Choose an Image File", ".", "", 
303                         "Bmp (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg", wx.OPEN)
304
305     if dlg.ShowModal() == wx.ID_OK:
306         path = dlg.GetPath()
307     else:
308         path = None
309
310     dlg.Destroy()
311     return path
312
313 class FindFiles:
314     def __init__(self, parent, dir, mask):
315         filelist = []
316         dirlist = [".."]
317         self.dir = dir
318         self.file = ""
319         mask = mask.upper()
320         pattern = self.MakeRegex(mask)
321
322         for i in os.listdir(dir):
323             if i == "." or i == "..":
324                 continue
325
326             path = os.path.join(dir, i)
327             path = path.upper()
328             value = i.upper()
329
330             if pattern.match(value) != None:
331                 filelist.append(i)
332
333             self.files = filelist
334
335     def MakeRegex(self, pattern):
336         import re
337         f = ""  # Set up a regex for file names
338
339         for ch in pattern:
340             if ch == "*":
341                 f = f + ".*"
342             elif ch == ".":
343                 f = f + "\."
344             elif ch == "?":
345                 f = f + "."
346             else:
347                 f = f + ch
348
349         return re.compile(f+'$')
350
351     def StripExt(self, file_nm):
352         fl_fld = os.path.splitext(file_nm)
353         fl_name = fl_fld[0]
354         ext = fl_fld[1]
355         return ext[1:]