1
#----------------------------------------------------------------------------
3
# Purpose: Display and Select Image Files
5
# Original Author: Lorne White
9
# Licence: wxWindows license
10
#----------------------------------------------------------------------------
11
# 2.0 Release - Bill Baxter (wbaxter@gmail.com)
13
# o Changed to use sizers instead of fixed placement.
14
# o Made dialog resizeable
15
# o Added a splitter between file list and view pane
16
# o Made directory path editable
17
# o Added an "up" button" to go to the parent dir
18
# o Changed to show directories in file list
19
# o Don't select images on double click any more
20
# o Added a 'broken image' display for files that wx fails to identify
21
# o Redesigned appearance -- using bitmap buttons now, and rearranged things
22
# o Fixed display of masked gifs
23
# o Fixed zooming logic to show shrunken images at correct aspect ratio
24
# o Added different background modes for preview (white/grey/dark/checkered)
25
# o Added framing modes for preview (no frame/box frame/tinted border)
27
#----------------------------------------------------------------------------
29
# 12/08/2003 - Jeff Grimmett (grimmtooth@softhome.net)
31
# o Updated for wx namespace
32
# o Corrected a nasty bug or two - see comments below.
33
# o There was a duplicate ImageView.DrawImage() method. Que?
35
#----------------------------------------------------------------------------
36
# 1.0 Release - Lorne White
37
# Date: January 29, 2002
38
# Create list of all available image file types
39
# View "All Image" File Types as default filter
41
# Use newer "re" function for patterns
44
#---------------------------------------------------------------------------
50
#---------------------------------------------------------------------------
53
ID_WHITE_BG = wx.NewId()
54
ID_BLACK_BG = wx.NewId()
55
ID_GREY_BG = wx.NewId()
56
ID_CHECK_BG = wx.NewId()
57
ID_NO_FRAME = wx.NewId()
58
ID_BOX_FRAME = wx.NewId()
59
ID_CROP_FRAME = wx.NewId()
61
def ConvertBMP(file_nm):
65
fl_fld = os.path.splitext(file_nm)
69
# Don't try to create it directly because wx throws up
70
# an annoying messasge dialog if the type isn't supported.
71
if wx.Image.CanRead(file_nm):
72
image = wx.Image(file_nm, wx.BITMAP_TYPE_ANY)
75
# BAD_IMAGE means a bad image, None just means no image (i.e. directory)
79
def GetCheckeredBitmap(blocksize=8,ntiles=4,rgb0='\xFF', rgb1='\xCC'):
80
"""Creates a square RGB checkered bitmap using the two specified colors.
84
- blocksize: the number of pixels in each solid color square
85
- ntiles: the number of tiles along width and height. Each tile is 2x2 blocks.
86
- rbg0, rgb1: the first and second colors, as 3-byte strings.
87
If only 1 byte is provided, it is treated as a grey value.
89
The bitmap returned will have width = height = blocksize*ntiles*2
91
size = blocksize*ntiles*2
98
strip0 = (rgb0*blocksize + rgb1*blocksize)*(ntiles*blocksize)
99
strip1 = (rgb1*blocksize + rgb0*blocksize)*(ntiles*blocksize)
100
band = strip0 + strip1
102
return wx.BitmapFromBuffer(size, size, data)
104
def GetNamedBitmap(name):
105
return IMG_CATALOG[name].getBitmap()
108
class ImageView(wx.Window):
109
def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize,
110
style=wx.BORDER_SUNKEN
112
wx.Window.__init__(self, parent, id, pos, size, style=style)
116
self.check_bmp = None
117
self.check_dim_bmp = None
119
# dark_bg is the brush/bitmap to use for painting in the whole background
120
# lite_bg is the brush/bitmap/pen to use for painting the image rectangle
124
self.border_mode = ID_CROP_FRAME
125
self.SetBackgroundMode( ID_WHITE_BG )
126
self.SetBorderMode( ID_NO_FRAME )
128
# Changed API of wx uses tuples for size and pos now.
129
self.Bind(wx.EVT_PAINT, self.OnPaint)
130
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
131
self.Bind(wx.EVT_SIZE, self.OnSize)
134
def SetValue(self, file_nm): # display the selected file in the panel
135
image = ConvertBMP(file_nm)
139
def SetBackgroundMode(self, mode):
143
def _updateBGInfo(self):
145
border = self.border_mode
150
if border == ID_BOX_FRAME:
151
self.lite_bg = wx.BLACK_PEN
153
if bg == ID_WHITE_BG:
154
if border == ID_CROP_FRAME:
155
self.SetBackgroundColour('LIGHT GREY')
156
self.lite_bg = wx.WHITE_BRUSH
158
self.SetBackgroundColour('WHITE')
160
elif bg == ID_GREY_BG:
161
if border == ID_CROP_FRAME:
162
self.SetBackgroundColour('GREY')
163
self.lite_bg = wx.LIGHT_GREY_BRUSH
165
self.SetBackgroundColour('LIGHT GREY')
167
elif bg == ID_BLACK_BG:
168
if border == ID_BOX_FRAME:
169
self.lite_bg = wx.WHITE_PEN
170
if border == ID_CROP_FRAME:
171
self.SetBackgroundColour('GREY')
172
self.lite_bg = wx.BLACK_BRUSH
174
self.SetBackgroundColour('BLACK')
177
if self.check_bmp is None:
178
self.check_bmp = GetCheckeredBitmap()
179
self.check_dim_bmp = GetCheckeredBitmap(rgb0='\x7F', rgb1='\x66')
180
if border == ID_CROP_FRAME:
181
self.dark_bg = self.check_dim_bmp
182
self.lite_bg = self.check_bmp
184
self.dark_bg = self.check_bmp
188
def SetBorderMode(self, mode):
189
self.border_mode = mode
192
def OnSize(self, event):
196
def OnPaint(self, event):
197
dc = wx.PaintDC(self)
200
def OnEraseBackground(self, evt):
201
if self.bg_mode != ID_CHECK_BG:
206
self.PaintBackground(dc, self.dark_bg)
208
def PaintBackground(self, dc, painter, rect=None):
212
pos = self.GetPosition()
218
if type(painter)==wx.Brush:
219
dc.SetPen(wx.TRANSPARENT_PEN)
221
dc.DrawRectangle(pos.x,pos.y,sz.width,sz.height)
222
elif type(painter)==wx.Pen:
224
dc.SetBrush(wx.TRANSPARENT_BRUSH)
225
dc.DrawRectangle(pos.x-1,pos.y-1,sz.width+2,sz.height+2)
227
self.TileBackground(dc, painter, pos.x,pos.y,sz.width,sz.height)
230
def TileBackground(self, dc, bmp, x,y,w,h):
231
"""Tile bmp into the specified rectangle"""
235
dc.SetClippingRegion(x,y,w,h)
237
# adjust so 0,0 so we always match with a tiling starting at 0,0
253
dc.DrawBitmap(bmp, tx, ty)
257
def DrawImage(self, dc):
259
if not hasattr(self,'image') or self.image is None:
262
wwidth,wheight = self.GetSize()
265
if image != BAD_IMAGE and image.IsOk():
266
iwidth = image.GetWidth() # dimensions of image file
267
iheight = image.GetHeight()
269
bmp = wx.ArtProvider.GetBitmap(wx.ART_MISSING_IMAGE, wx.ART_MESSAGE_BOX, (64,64))
270
iwidth = bmp.GetWidth()
271
iheight = bmp.GetHeight()
273
# squeeze iwidth x iheight image into window, preserving aspect ratio
275
xfactor = float(wwidth) / iwidth
276
yfactor = float(wheight) / iheight
278
if xfactor < 1.0 and xfactor < yfactor:
280
elif yfactor < 1.0 and yfactor < xfactor:
285
owidth = int(scale*iwidth)
286
oheight = int(scale*iheight)
288
diffx = (wwidth - owidth)/2 # center calc
289
diffy = (wheight - oheight)/2 # center calc
292
if owidth!=iwidth or oheight!=iheight:
293
sc_image = sc_image = image.Scale(owidth,oheight)
296
bmp = sc_image.ConvertToBitmap()
298
if image != BAD_IMAGE and image.IsOk():
299
self.PaintBackground(dc, self.lite_bg, wx.Rect(diffx,diffy,owidth,oheight))
301
dc.DrawBitmap(bmp, diffx, diffy, useMask=True) # draw the image to window
304
class ImagePanel(wx.Panel):
305
def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize,
308
wx.Panel.__init__(self, parent, id, pos, size, style=style)
310
vbox = wx.BoxSizer(wx.VERTICAL)
313
self.view = ImageView(self)
314
vbox.Add(self.view, 1, wx.GROW|wx.ALL, 0)
316
hbox_ctrls = wx.BoxSizer(wx.HORIZONTAL)
317
vbox.Add(hbox_ctrls, 0, wx.ALIGN_RIGHT|wx.TOP, 4)
319
bmp = GetNamedBitmap('White')
320
btn = wx.BitmapButton(self, ID_WHITE_BG, bmp, style=wx.BU_EXACTFIT)
321
self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
322
btn.SetToolTipString("Set background to white")
323
hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
325
bmp = GetNamedBitmap('Grey')
326
btn = wx.BitmapButton(self, ID_GREY_BG, bmp, style=wx.BU_EXACTFIT)
327
self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
328
btn.SetToolTipString("Set background to grey")
329
hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
331
bmp = GetNamedBitmap('Black')
332
btn = wx.BitmapButton(self, ID_BLACK_BG, bmp, style=wx.BU_EXACTFIT)
333
self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
334
btn.SetToolTipString("Set background to black")
335
hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
337
bmp = GetNamedBitmap('Checked')
338
btn = wx.BitmapButton(self, ID_CHECK_BG, bmp, style=wx.BU_EXACTFIT)
339
self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
340
btn.SetToolTipString("Set background to chekered pattern")
341
hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
344
hbox_ctrls.AddSpacer(7)
346
bmp = GetNamedBitmap('NoFrame')
347
btn = wx.BitmapButton(self, ID_NO_FRAME, bmp, style=wx.BU_EXACTFIT)
348
self.Bind(wx.EVT_BUTTON, self.OnSetBorderMode, btn)
349
btn.SetToolTipString("No framing around image")
350
hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
352
bmp = GetNamedBitmap('BoxFrame')
353
btn = wx.BitmapButton(self, ID_BOX_FRAME, bmp, style=wx.BU_EXACTFIT)
354
self.Bind(wx.EVT_BUTTON, self.OnSetBorderMode, btn)
355
btn.SetToolTipString("Frame image with a box")
356
hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
358
bmp = GetNamedBitmap('CropFrame')
359
btn = wx.BitmapButton(self, ID_CROP_FRAME, bmp, style=wx.BU_EXACTFIT|wx.BORDER_SIMPLE)
360
self.Bind(wx.EVT_BUTTON, self.OnSetBorderMode, btn)
361
btn.SetToolTipString("Frame image with a dimmed background")
362
hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
365
def SetValue(self, file_nm): # display the selected file in the panel
366
self.view.SetValue(file_nm)
368
def SetBackgroundMode(self, mode):
369
self.view.SetBackgroundMode(mode)
371
def SetBorderMode(self, mode):
372
self.view.SetBorderMode(mode)
374
def OnSetImgBackground(self, event):
376
self.SetBackgroundMode(mode)
378
def OnSetBorderMode(self, event):
380
self.SetBorderMode(mode)
384
class ImageDialog(wx.Dialog):
385
def __init__(self, parent, set_dir = None):
386
wx.Dialog.__init__(self, parent, -1, "Image Browser", wx.DefaultPosition, (400, 400),style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
388
self.set_dir = os.getcwd()
392
if os.path.exists(set_dir): # set to working directory if nothing set
393
self.set_dir = set_dir
395
vbox_top = wx.BoxSizer(wx.VERTICAL)
396
self.SetSizer(vbox_top)
398
hbox_loc = wx.BoxSizer(wx.HORIZONTAL)
399
vbox_top.Add(hbox_loc, 0, wx.GROW|wx.ALIGN_LEFT|wx.ALL, 0)
401
loc_label = wx.StaticText( self, -1, "Folder:")
402
hbox_loc.Add(loc_label, 0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.ADJUST_MINSIZE, 5)
404
self.dir = wx.TextCtrl( self, -1, self.set_dir, style=wx.TE_RICH|wx.TE_PROCESS_ENTER)
405
self.Bind(wx.EVT_TEXT_ENTER, self.OnDirectoryTextSet, self.dir)
406
hbox_loc.Add(self.dir, 1, wx.GROW|wx.ALIGN_LEFT|wx.ALL, 5)
408
up_bmp = wx.ArtProvider.GetBitmap(wx.ART_GO_DIR_UP, wx.ART_BUTTON, (16,16))
409
btn = wx.BitmapButton(self, -1, up_bmp)
410
btn.SetHelpText("Up one level")
411
btn.SetToolTipString("Up one level")
412
self.Bind(wx.EVT_BUTTON, self.OnUpDirectory, btn)
413
hbox_loc.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 2)
415
folder_bmp = wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN, wx.ART_BUTTON, (16,16))
416
btn = wx.BitmapButton(self, -1, folder_bmp)
417
btn.SetHelpText("Browse for a &folder...")
418
btn.SetToolTipString("Browse for a folder...")
419
self.Bind(wx.EVT_BUTTON, self.OnChooseDirectory, btn)
420
hbox_loc.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 5)
422
hbox_nav = wx.BoxSizer(wx.HORIZONTAL)
423
vbox_top.Add(hbox_nav, 0, wx.ALIGN_LEFT|wx.ALL, 0)
426
label = wx.StaticText( self, -1, "Files of type:")
427
hbox_nav.Add(label, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT, 5)
429
self.fl_ext = '*.bmp' # initial setting for file filtering
430
self.GetFiles() # get the file list
432
self.fl_ext_types = (
434
("All supported formats", "All"),
435
("BMP (*.bmp)", "*.bmp"),
436
("GIF (*.gif)", "*.gif"),
437
("PNG (*.png)", "*.png"),
438
("JPEG (*.jpg)", "*.jpg"),
439
("ICO (*.ico)", "*.ico"),
440
("PNM (*.pnm)", "*.pnm"),
441
("PCX (*.pcx)", "*.pcx"),
442
("TIFF (*.tif)", "*.tif"),
443
("All Files", "*.*"),
445
self.set_type,self.fl_ext = self.fl_ext_types[0] # initial file filter setting
446
self.fl_types = [ x[0] for x in self.fl_ext_types ]
447
self.sel_type = wx.ComboBox( self, -1, self.set_type,
448
wx.DefaultPosition, wx.DefaultSize, self.fl_types,
450
# after this we don't care about the order any more
451
self.fl_ext_types = dict(self.fl_ext_types)
453
self.Bind(wx.EVT_COMBOBOX, self.OnSetType, self.sel_type)
454
hbox_nav.Add(self.sel_type, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
456
splitter = wx.SplitterWindow( self, -1, wx.DefaultPosition, wx.Size(100, 100), 0 )
457
splitter.SetMinimumPaneSize(100)
459
split_left = wx.Panel( splitter, -1, wx.DefaultPosition, wx.DefaultSize,
460
wx.NO_BORDER|wx.TAB_TRAVERSAL )
461
vbox_left = wx.BoxSizer(wx.VERTICAL)
462
split_left.SetSizer(vbox_left)
465
self.tb = tb = wx.ListBox( split_left, -1, wx.DefaultPosition, wx.DefaultSize,
466
self.fl_list, wx.LB_SINGLE )
467
self.Bind(wx.EVT_LISTBOX, self.OnListClick, tb)
468
self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnListDClick, tb)
469
vbox_left.Add(self.tb, 1, wx.GROW|wx.ALL, 0)
471
width, height = self.tb.GetSize()
473
split_right = wx.Panel( splitter, -1, wx.DefaultPosition, wx.DefaultSize,
474
wx.NO_BORDER|wx.TAB_TRAVERSAL )
475
vbox_right = wx.BoxSizer(wx.VERTICAL)
476
split_right.SetSizer(vbox_right)
478
self.image_view = ImagePanel( split_right )
479
vbox_right.Add(self.image_view, 1, wx.GROW|wx.ALL, 0)
481
splitter.SplitVertically(split_left, split_right, 150)
482
vbox_top.Add(splitter, 1, wx.GROW|wx.ALL, 5)
484
hbox_btns = wx.BoxSizer(wx.HORIZONTAL)
485
vbox_top.Add(hbox_btns, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
487
ok_btn = wx.Button( self, wx.ID_OPEN, "", wx.DefaultPosition, wx.DefaultSize, 0 )
488
self.Bind(wx.EVT_BUTTON, self.OnOk, ok_btn)
490
hbox_btns.Add(ok_btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
492
cancel_btn = wx.Button( self, wx.ID_CANCEL, "",
493
wx.DefaultPosition, wx.DefaultSize, 0 )
494
hbox_btns.Add(cancel_btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
498
def ChangeFileTypes(self, ft_tuple):
499
# Change list of file types to be supported
500
self.fl_ext_types = ft_tuple
501
self.set_type, self.fl_ext = self.fl_ext_types[0] # initial file filter setting
502
self.fl_types = [ x[0] for x in self.fl_ext_types ]
503
self.sel_type.Clear()
504
self.sel_type.AppendItems(self.fl_types)
505
self.sel_type.SetSelection(0)
506
self.fl_ext_types = dict(self.fl_ext_types)
508
def GetFiles(self): # get the file list using directory and extension values
509
if self.fl_ext == "All":
512
if self.fl_types[-1] == 'All Files':
513
allTypes = self.fl_types[-1:]
515
allTypes = self.fl_types[1:]
516
for ftypes in allTypes: # get list of all
517
filter = self.fl_ext_types[ftypes]
518
#print "filter = ", filter
519
self.fl_val = FindFiles(self, self.set_dir, filter)
520
all_files = all_files + self.fl_val.files # add to list of files
522
self.fl_list = all_files
524
self.fl_val = FindFiles(self, self.set_dir, self.fl_ext)
525
self.fl_list = self.fl_val.files
528
self.fl_list.sort() # sort the file list
529
# prepend the directories
530
self.fl_ndirs = len(self.fl_val.dirs)
531
self.fl_list = sorted(self.fl_val.dirs) + self.fl_list
533
def DisplayDir(self): # display the working directory
535
ipt = self.dir.GetInsertionPoint()
536
self.dir.SetValue(self.set_dir)
537
self.dir.SetInsertionPoint(ipt)
539
def OnSetType(self, event):
540
val = event.GetString() # get file type value
541
self.fl_ext = self.fl_ext_types[val]
544
def OnListDClick(self, event):
547
def OnListClick(self, event):
548
val = event.GetSelection()
549
self.SetListValue(val)
551
def SetListValue(self, val):
552
file_nm = self.fl_list[val]
553
self.set_file = file_val = os.path.join(self.set_dir, file_nm)
554
if val>=self.fl_ndirs:
555
self.image_view.SetValue(file_val)
557
self.image_view.SetValue(None)
559
def OnDirectoryTextSet(self,event):
561
path = event.GetString()
562
if os.path.isdir(path):
567
if os.path.isfile(path):
568
dname,fname = os.path.split(path)
569
if os.path.isdir(dname):
571
# try to select fname in list
573
idx = self.fl_list.index(fname)
574
self.tb.SetSelection(idx)
575
self.SetListValue(idx)
582
def OnUpDirectory(self, event):
583
sdir = os.path.split(self.set_dir)[0]
587
def OnChooseDirectory(self, event): # set the new directory
588
dlg = wx.DirDialog(self)
589
dlg.SetPath(self.set_dir)
591
if dlg.ShowModal() == wx.ID_OK:
592
self.set_dir = dlg.GetPath()
597
def ResetFiles(self): # refresh the display with files and initial image
601
# Changed 12/8/03 jmg
603
# o Clear listbox first
604
# o THEN check to see if there are any valid files of the selected
606
# o THEN if we have any files to display, set the listbox up,
611
# o Clear the image viewer.
613
# This avoids a nasty assert error.
617
if len(self.fl_list):
618
self.tb.Set(self.fl_list)
620
for idir in xrange(self.fl_ndirs):
621
d = self.fl_list[idir]
622
# mark directories as 'True' with client data
623
self.tb.SetClientData(idir, True)
624
self.tb.SetString(idir,'['+d+']')
627
self.tb.SetSelection(0)
630
self.image_view.SetValue(None)
632
self.image_view.SetValue(None)
637
def GetDirectory(self):
640
def OnCancel(self, event):
642
self.EndModal(wx.ID_CANCEL)
644
def OnOk(self, event):
645
if os.path.isdir(self.set_file):
646
sdir = os.path.split(self.set_file)
649
if sdir and sdir[-1]=='..':
650
sdir = os.path.split(sdir[0])[0]
651
sdir = os.path.split(sdir)
652
self.set_dir = os.path.join(*sdir)
655
elif event != 'dclick':
656
self.result = self.set_file
657
self.EndModal(wx.ID_OK)
662
def __init__(self, parent, dir, mask, with_dirs=True):
668
pattern = self.MakeRegex(mask)
670
for i in os.listdir(dir):
671
if i == "." or i == "..":
674
path = os.path.join(dir, i)
676
if os.path.isdir(path):
683
if pattern.match(value) != None:
687
self.files = filelist
691
def MakeRegex(self, pattern):
693
f = "" # Set up a regex for file names
705
return re.compile(f+'$')
707
def StripExt(self, file_nm):
708
fl_fld = os.path.splitext(file_nm)
714
#----------------------------------------------------------------------
715
# This part of the file was generated by C:\Python25\Scripts\img2py
716
# then edited slightly.
718
from wx.lib.embeddedimage import PyEmbeddedImage
722
IMG_CATALOG['White'] = PyEmbeddedImage(
723
"iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAIUlE"
724
"QVQYlWNgIAIwMjAw/P//H58KRkYmYkwaVUScIqIAAMjRAxRV8+5MAAAAAElFTkSuQmCC")
726
IMG_CATALOG['Grey'] = PyEmbeddedImage(
727
"iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAIklE"
728
"QVQYlWNgIAIwMjAwnDlzBo8KExMTJmJMGlVEnCKiAAC24wMULFLZGAAAAABJRU5ErkJggg==")
730
IMG_CATALOG['Black'] = PyEmbeddedImage(
731
"iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAADklE"
732
"QVQYlWNgGAVDFQAAAbwAATN8mzYAAAAASUVORK5CYII=")
734
IMG_CATALOG['Checked'] = PyEmbeddedImage(
735
"iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAMUlE"
736
"QVQYlWNgIAIwMjAwnDlzBlnI2NgYRQUjIxMxJtFZEQsDhkvPnj07sG4iShFRAAAougYW+urT"
737
"ZwAAAABJRU5ErkJggg==")
739
IMG_CATALOG['NoFrame'] = PyEmbeddedImage(
740
"iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAANklE"
741
"QVQYla2PQQoAIBACnej/X7ZbUEQtkudhVKkQJNm+EdAqpggCgB+m44kFml1bY39q0k15Bsuc"
742
"CR/z8ajiAAAAAElFTkSuQmCC")
744
IMG_CATALOG['BoxFrame'] = PyEmbeddedImage(
745
"iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAQ0lE"
746
"QVQYlZ2O0QoAIAgDd9L//7I9CFEhJu1psmNOaghJ7l4RYJ0m1U0R2X4vevcHVOiG0tcHBABh"
747
"8nWpIhpPLtn0rwm4WyD966x3sgAAAABJRU5ErkJggg==")
749
IMG_CATALOG['CropFrame'] = PyEmbeddedImage(
750
"iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAASUlE"
751
"QVQYlb2QMQrAQAgEZ0P+q0/RF5tCuIMUh2myhcgyjCAMIiAiDoS7XxPTCLrXZmaAJKCqgMz8"
752
"YHpD7ThBkvpcz93z6wtGeQD/sQ8bfXs8NAAAAABJRU5ErkJggg==")