Merged the wxPy_newswig branch into the HEAD branch (main trunk)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24541 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -1,8 +1,315 @@
 | 
			
		||||
#----------------------------------------------------------------------------
 | 
			
		||||
# Name:         BrowseImage.py
 | 
			
		||||
# Purpose:      Display and Select Image Files
 | 
			
		||||
#
 | 
			
		||||
# Author:       Lorne White
 | 
			
		||||
#
 | 
			
		||||
# Version:      1.0
 | 
			
		||||
# Date:         January 29, 2002
 | 
			
		||||
# Licence:      wxWindows license
 | 
			
		||||
#----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
"""Renamer stub: provides a way to drop the wx prefix from wxPython objects."""
 | 
			
		||||
# 1.0 Release
 | 
			
		||||
# Create list of all available image file types
 | 
			
		||||
# View "All Image" File Types as default filter
 | 
			
		||||
# Sort the file list
 | 
			
		||||
# Use newer "re" function for patterns
 | 
			
		||||
 | 
			
		||||
from wx import _rename
 | 
			
		||||
from wxPython.lib import imagebrowser
 | 
			
		||||
_rename(globals(), imagebrowser.__dict__, modulename='lib.imagebrowser')
 | 
			
		||||
del imagebrowser
 | 
			
		||||
del _rename
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import os, sys
 | 
			
		||||
from wxPython.wx import *
 | 
			
		||||
dir_path = os.getcwd()
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
def ConvertBMP(file_nm):
 | 
			
		||||
    if file_nm is None:
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    fl_fld = os.path.splitext(file_nm)
 | 
			
		||||
    ext = fl_fld[1]
 | 
			
		||||
    ext = ext[1:].lower()
 | 
			
		||||
    if ext == 'bmp':
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_BMP)
 | 
			
		||||
    elif ext == 'gif':
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_GIF)
 | 
			
		||||
    elif ext == 'png':
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_PNG)
 | 
			
		||||
    elif ext == 'jpg':
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_JPEG)
 | 
			
		||||
    elif ext == 'pcx':
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_PCX)
 | 
			
		||||
    elif ext == 'tif':
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_TIF)
 | 
			
		||||
    elif ext == 'pnm':
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_PNM)
 | 
			
		||||
    else:
 | 
			
		||||
        image = wxImage(file_nm, wxBITMAP_TYPE_ANY)
 | 
			
		||||
 | 
			
		||||
    return image
 | 
			
		||||
 | 
			
		||||
def GetSize(file_nm):       # for scaling image values
 | 
			
		||||
    image = ConvertBMP(file_nm)
 | 
			
		||||
    bmp = image.ConvertToBitmap()
 | 
			
		||||
    size = bmp.GetWidth(), bmp.GetHeight()
 | 
			
		||||
    return size
 | 
			
		||||
 | 
			
		||||
class ImageView(wxWindow):
 | 
			
		||||
    def __init__(self, parent, id=-1, pos=wxDefaultPosition, size=wxDefaultSize):
 | 
			
		||||
        wxWindow.__init__(self, parent, id, pos, size)
 | 
			
		||||
        self.win = parent
 | 
			
		||||
        self.image = None
 | 
			
		||||
        self.back_color = 'WHITE'
 | 
			
		||||
        self.border_color = 'BLACK'
 | 
			
		||||
 | 
			
		||||
        self.image_sizex = size.width
 | 
			
		||||
        self.image_sizey = size.height
 | 
			
		||||
        self.image_posx = pos.x
 | 
			
		||||
        self.image_posy = pos.y
 | 
			
		||||
        EVT_PAINT(self, self.OnPaint)
 | 
			
		||||
 | 
			
		||||
        wxInitAllImageHandlers()
 | 
			
		||||
 | 
			
		||||
    def OnPaint(self, event):
 | 
			
		||||
        dc = wxPaintDC(self)
 | 
			
		||||
        self.DrawImage(dc)
 | 
			
		||||
 | 
			
		||||
    def DrawImage(self, dc):
 | 
			
		||||
        dc.BeginDrawing()
 | 
			
		||||
        self.DrawImage(dc)
 | 
			
		||||
        dc.EndDrawing()
 | 
			
		||||
 | 
			
		||||
    def SetValue(self, file_nm):    # display the selected file in the panel
 | 
			
		||||
        image = ConvertBMP(file_nm)
 | 
			
		||||
        self.image = image
 | 
			
		||||
        self.Refresh()
 | 
			
		||||
 | 
			
		||||
    def DrawBorder(self, dc):
 | 
			
		||||
        brush = wxBrush(wxNamedColour(self.back_color), wxSOLID)
 | 
			
		||||
        dc.SetBrush(brush)
 | 
			
		||||
        dc.SetPen(wxPen(wxNamedColour(self.border_color), 1))
 | 
			
		||||
        dc.DrawRectangle(0, 0, self.image_sizex, self.image_sizey)
 | 
			
		||||
 | 
			
		||||
    def DrawImage(self, dc):
 | 
			
		||||
        try:
 | 
			
		||||
            image = self.image
 | 
			
		||||
        except:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        self.DrawBorder(dc)
 | 
			
		||||
        if image is None:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        bmp = image.ConvertToBitmap()
 | 
			
		||||
 | 
			
		||||
        iwidth = bmp.GetWidth()   # dimensions of image file
 | 
			
		||||
        iheight = bmp.GetHeight()
 | 
			
		||||
 | 
			
		||||
        diffx = (self.image_sizex - iwidth)/2   # center calc
 | 
			
		||||
        if iwidth >= self.image_sizex -10:      # if image width fits in window adjust
 | 
			
		||||
            diffx = 5
 | 
			
		||||
            iwidth = self.image_sizex - 10
 | 
			
		||||
 | 
			
		||||
        diffy = (self.image_sizey - iheight)/2  # center calc
 | 
			
		||||
        if iheight >= self.image_sizey - 10:    # if image height fits in window adjust
 | 
			
		||||
            diffy = 5
 | 
			
		||||
            iheight = self.image_sizey - 10
 | 
			
		||||
 | 
			
		||||
        image.Rescale(iwidth, iheight)      # rescale to fit the window
 | 
			
		||||
        image.ConvertToBitmap()
 | 
			
		||||
        bmp = image.ConvertToBitmap()
 | 
			
		||||
        dc.DrawBitmap(bmp, diffx, diffy)        # draw the image to window
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ImageDialog(wxDialog):
 | 
			
		||||
    def __init__(self, parent, set_dir = None):
 | 
			
		||||
        wxDialog.__init__(self, parent, -1, "Image Browser", wxPyDefaultPosition, wxSize(400, 400))
 | 
			
		||||
 | 
			
		||||
        self.x_pos = 30     # initial display positions
 | 
			
		||||
        self.y_pos = 20
 | 
			
		||||
        self.delta = 20
 | 
			
		||||
 | 
			
		||||
        size = wxSize(80, 25)
 | 
			
		||||
 | 
			
		||||
        self.set_dir = os.getcwd()
 | 
			
		||||
        self.set_file = None
 | 
			
		||||
 | 
			
		||||
        if set_dir != None:
 | 
			
		||||
            if os.path.exists(set_dir):     # set to working directory if nothing set
 | 
			
		||||
                self.set_dir = set_dir
 | 
			
		||||
 | 
			
		||||
        self.dir_x = self.x_pos
 | 
			
		||||
        self.dir_y = self.y_pos
 | 
			
		||||
        self.DisplayDir()       # display the directory value
 | 
			
		||||
 | 
			
		||||
        self.y_pos = self.y_pos + self.delta
 | 
			
		||||
 | 
			
		||||
        mID = wxNewId()
 | 
			
		||||
        wxButton(self, mID, ' Set Directory ', wxPoint(self.x_pos, self.y_pos), size).SetDefault()
 | 
			
		||||
        EVT_BUTTON(self, mID, self.SetDirect)
 | 
			
		||||
 | 
			
		||||
        self.type_posy = self.y_pos     # save the y position for the image type combo
 | 
			
		||||
 | 
			
		||||
        self.fl_ext = '*.bmp'   # initial setting for file filtering
 | 
			
		||||
        self.GetFiles()     # get the file list
 | 
			
		||||
 | 
			
		||||
        self.y_pos = self.y_pos + self.delta + 10
 | 
			
		||||
 | 
			
		||||
        self.list_height = 150
 | 
			
		||||
 | 
			
		||||
    # List of Labels
 | 
			
		||||
        mID = wxNewId()
 | 
			
		||||
        self.tb = tb = wxListBox(self, mID, wxPoint(self.x_pos, self.y_pos), wxSize(160, self.list_height), self.fl_list, wxLB_SINGLE)
 | 
			
		||||
        EVT_LISTBOX(self, mID, self.OnListClick)
 | 
			
		||||
        EVT_LISTBOX_DCLICK(self, mID, self.OnListDClick)
 | 
			
		||||
 | 
			
		||||
        width, height = self.tb.GetSizeTuple()
 | 
			
		||||
        image_posx = self.x_pos + width + 20       # positions for setting the image window
 | 
			
		||||
        image_posy = self.y_pos
 | 
			
		||||
        image_sizex = 150
 | 
			
		||||
        image_sizey = self.list_height
 | 
			
		||||
 | 
			
		||||
        self.fl_types = ["All Images", "Bmp", "Gif", "Png", "Jpg", "Ico", "Pnm", "Pcx", "Tif", "All Files"]
 | 
			
		||||
        self.fl_ext_types = { "All Images": "All", "Bmp": "*.bmp", "Gif": "*.gif", "Png": "*.png", "Jpg": "*.jpg",
 | 
			
		||||
                        "Ico": "*.ico", "Pnm": "*.pnm", "Pcx": "*.pcx", "Tif": "*.tif", "All Files": "*.*" }
 | 
			
		||||
 | 
			
		||||
        self.set_type = self.fl_types[0]    # initial file filter setting
 | 
			
		||||
        self.fl_ext = self.fl_ext_types[self.set_type]
 | 
			
		||||
 | 
			
		||||
        mID = wxNewId()
 | 
			
		||||
        self.sel_type = wxComboBox(self, mID, self.set_type, wxPoint(image_posx , self.type_posy), wxSize(150, -1), self.fl_types, wxCB_DROPDOWN)
 | 
			
		||||
        EVT_COMBOBOX(self, mID, self.OnSetType)
 | 
			
		||||
 | 
			
		||||
        self.image_view = ImageView(self, pos=wxPoint(image_posx, image_posy), size=wxSize(image_sizex, image_sizey))
 | 
			
		||||
 | 
			
		||||
        self.y_pos = self.y_pos + height + 20
 | 
			
		||||
 | 
			
		||||
        mID = wxNewId()
 | 
			
		||||
        wxButton(self, mID, ' Select ', wxPoint(100, self.y_pos), size).SetDefault()
 | 
			
		||||
        EVT_BUTTON(self, mID, self.OnOk)
 | 
			
		||||
 | 
			
		||||
        wxButton(self, wxID_CANCEL, 'Cancel', wxPoint(250, self.y_pos), size)
 | 
			
		||||
 | 
			
		||||
        self.y_pos = self.y_pos + self.delta
 | 
			
		||||
        fsize = wxSize(400, self.y_pos + 50)    # resize dialog for final vertical position
 | 
			
		||||
        self.SetSize(fsize)
 | 
			
		||||
 | 
			
		||||
        self.ResetFiles()
 | 
			
		||||
 | 
			
		||||
    def GetFiles(self):     # get the file list using directory and extension values
 | 
			
		||||
        if self.fl_ext == "All":
 | 
			
		||||
            all_files = []
 | 
			
		||||
            for ftypes in self.fl_types[1:-1]:    # get list of all available image types
 | 
			
		||||
                filter = self.fl_ext_types[ftypes]
 | 
			
		||||
                print "filter = ", filter
 | 
			
		||||
                self.fl_val = FindFiles(self, self.set_dir, filter)
 | 
			
		||||
                all_files = all_files + self.fl_val.files   # add to list of files
 | 
			
		||||
            self.fl_list = all_files
 | 
			
		||||
        else:
 | 
			
		||||
            self.fl_val = FindFiles(self, self.set_dir, self.fl_ext)
 | 
			
		||||
            self.fl_list = self.fl_val.files
 | 
			
		||||
 | 
			
		||||
        self.fl_list.sort()     # sort the file list
 | 
			
		||||
 | 
			
		||||
    def DisplayDir(self):       # display the working directory
 | 
			
		||||
        wxStaticText(self, -1, self.set_dir, wxPoint(self.dir_x, self.dir_y), wxSize(250, -1))
 | 
			
		||||
 | 
			
		||||
    def OnSetType(self, event):
 | 
			
		||||
        val = event.GetString()      # get file type value
 | 
			
		||||
        self.fl_ext = self.fl_ext_types[val]
 | 
			
		||||
        self.ResetFiles()
 | 
			
		||||
 | 
			
		||||
    def OnListDClick(self, event):
 | 
			
		||||
        self.OnOk(0)
 | 
			
		||||
 | 
			
		||||
    def OnListClick(self, event):
 | 
			
		||||
        val = event.GetSelection()
 | 
			
		||||
        self.SetListValue(val)
 | 
			
		||||
 | 
			
		||||
    def SetListValue(self, val):
 | 
			
		||||
        file_nm = self.fl_list[val]
 | 
			
		||||
        self.set_file = file_val = os.path.join(self.set_dir, file_nm)
 | 
			
		||||
        self.image_view.SetValue(file_val)
 | 
			
		||||
 | 
			
		||||
    def SetDirect(self, event):     # set the new directory
 | 
			
		||||
        dlg = wxDirDialog(self)
 | 
			
		||||
        dlg.SetPath(self.set_dir)
 | 
			
		||||
        if dlg.ShowModal() == wxID_OK:
 | 
			
		||||
            self.set_dir = dlg.GetPath()
 | 
			
		||||
            self.ResetFiles()
 | 
			
		||||
        dlg.Destroy()
 | 
			
		||||
 | 
			
		||||
    def ResetFiles(self):   # refresh the display with files and initial image
 | 
			
		||||
        self.DisplayDir()
 | 
			
		||||
        self.GetFiles()
 | 
			
		||||
        self.tb.Set(self.fl_list)
 | 
			
		||||
        try:
 | 
			
		||||
            self.tb.SetSelection(0)
 | 
			
		||||
            self.SetListValue(0)
 | 
			
		||||
        except:
 | 
			
		||||
            self.image_view.SetValue(None)
 | 
			
		||||
 | 
			
		||||
    def GetFile(self):
 | 
			
		||||
        return self.set_file
 | 
			
		||||
 | 
			
		||||
    def GetDirectory(self):
 | 
			
		||||
        return self.set_dir
 | 
			
		||||
 | 
			
		||||
    def OnCancel(self, event):
 | 
			
		||||
        self.result = None
 | 
			
		||||
        self.EndModal(wxID_CANCEL)
 | 
			
		||||
 | 
			
		||||
    def OnOk(self, event):
 | 
			
		||||
        self.result = self.set_file
 | 
			
		||||
        self.EndModal(wxID_OK)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def OnFileDlg(self):
 | 
			
		||||
    dlg = wxFileDialog(self, "Choose an Image File", ".", "", "Bmp (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg", wxOPEN)
 | 
			
		||||
    if dlg.ShowModal() == wxID_OK:
 | 
			
		||||
        path = dlg.GetPath()
 | 
			
		||||
    else:
 | 
			
		||||
        path = None
 | 
			
		||||
    dlg.Destroy()
 | 
			
		||||
    return path
 | 
			
		||||
 | 
			
		||||
class FindFiles:
 | 
			
		||||
    def __init__(self, parent, dir, mask):
 | 
			
		||||
        filelist = []
 | 
			
		||||
        dirlist = [".."]
 | 
			
		||||
        self.dir = dir
 | 
			
		||||
        self.file = ""
 | 
			
		||||
        mask = mask.upper()
 | 
			
		||||
        pattern = self.MakeRegex(mask)
 | 
			
		||||
        for i in os.listdir(dir):
 | 
			
		||||
            if i == "." or i == "..":
 | 
			
		||||
                continue
 | 
			
		||||
            path = os.path.join(dir, i)
 | 
			
		||||
            path = path.upper()
 | 
			
		||||
            value = i.upper()
 | 
			
		||||
 | 
			
		||||
            if pattern.match(value) != None:
 | 
			
		||||
                filelist.append(i)
 | 
			
		||||
 | 
			
		||||
            self.files = filelist
 | 
			
		||||
 | 
			
		||||
    def MakeRegex(self, pattern):
 | 
			
		||||
        import re
 | 
			
		||||
        f = ""  # Set up a regex for file names
 | 
			
		||||
        for ch in pattern:
 | 
			
		||||
            if ch == "*":
 | 
			
		||||
                f = f + ".*"
 | 
			
		||||
            elif ch == ".":
 | 
			
		||||
                f = f + "\."
 | 
			
		||||
            elif ch == "?":
 | 
			
		||||
                f = f + "."
 | 
			
		||||
            else:
 | 
			
		||||
                f = f + ch
 | 
			
		||||
        return re.compile(f+'$')
 | 
			
		||||
 | 
			
		||||
    def StripExt(self, file_nm):
 | 
			
		||||
        fl_fld = os.path.splitext(file_nm)
 | 
			
		||||
        fl_name = fl_fld[0]
 | 
			
		||||
        ext = fl_fld[1]
 | 
			
		||||
        return ext[1:]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user