📄 uicommon.py
字号:
#----------------------------------------------------------------------------# Name: UICommon.py# Purpose: Shared UI stuff## Author: Matt Fryer, Morgan Hua## Created: 3/10/05# CVS-ID: $Id: UICommon.py,v 1.7 2006/04/20 06:25:57 RD Exp $# Copyright: (c) 2005-2006 ActiveGrid, Inc.# License: wxWindows License#----------------------------------------------------------------------------import osimport os.pathimport wximport stringimport ProjectEditorimport activegrid.util.appdirs as appdirsimport activegrid.util.fileutils as fileutilsimport activegrid.util.strutils as strutilsimport activegrid.util.sysutils as sysutilsimport activegrid.util.xmlutils as xmlutils_ = wx.GetTranslationdef CreateDirectoryControl( parent, fileLabel=_("File Name:"), dirLabel=_("Directory:"), fileExtension="*", startingName="", startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False, returnAll=False, useDirDialog=False): if not choiceDirs: choiceDirs = [] projectDirs = [] if appDirDefaultStartDir: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT) else: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY) if appDirectory: choiceDirs.append(appDirectory) if appDirDefaultStartDir and not startingDirectory: startingDirectory = appDirectory projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: curProjectDoc = projectService.GetCurrentProject() if curProjectDoc: homeDir = curProjectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in choiceDirs): choiceDirs.append(homeDir) if not startingDirectory: startingDirectory = homeDir for projectDoc in projectService.GetOpenProjects(): if projectDoc == curProjectDoc: continue homeDir = projectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in projectDirs): projectDirs.append(homeDir) projectDirs.sort(CaseInsensitiveCompare) for projectDir in projectDirs: if projectDir not in choiceDirs: choiceDirs.append(projectDir) if startingDirectory and (startingDirectory not in choiceDirs): choiceDirs.insert(0, startingDirectory) if os.getcwd() not in choiceDirs: choiceDirs.append(os.getcwd()) if appdirs.getSystemDir() not in choiceDirs: choiceDirs.append(appdirs.getSystemDir()) if not startingDirectory: startingDirectory = os.getcwd() nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1)) nameLabelText = wx.StaticText(parent, -1, fileLabel) dirLabelText = wx.StaticText(parent, -1, dirLabel) dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs) dirControl.SetToolTipString(startingDirectory) button = wx.Button(parent, -1, _("Browse...")) allControls = [nameControl, nameLabelText, dirLabelText, dirControl, button] def OnFindDirClick(event): name = "" nameCtrlValue = nameControl.GetValue() if nameCtrlValue: root, ext = os.path.splitext( nameCtrlValue ) if ext == '.' + fileExtension: name = nameCtrlValue else: name = _("%s.%s") % (nameCtrlValue, fileExtension) if not useDirDialog: dlg = wx.FileDialog(parent, _("Choose a filename and directory"), defaultDir = dirControl.GetValue().strip(), defaultFile = name, wildcard= "*.%s" % fileExtension, style=wx.SAVE|wx.CHANGE_DIR) else: dlg = wx.DirDialog(wx.GetApp().GetTopWindow(), _("Choose a directory:"), defaultPath=dirControl.GetValue().strip(), style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON) if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() return path = dlg.GetPath() dlg.Destroy() if path: if not useDirDialog: dir, filename = os.path.split(path) if dirControl.FindString(dir) == wx.NOT_FOUND: dirControl.Insert(dir, 0) dirControl.SetValue(dir) dirControl.SetToolTipString(dir) nameControl.SetValue(filename) else: dirControl.SetValue(path) dirControl.SetToolTipString(path) parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button) def Validate(allowOverwriteOnPrompt=False, infoString='', validClassName=False, ignoreFileConflicts=False): projName = nameControl.GetValue().strip() if projName == "": wx.MessageBox(_("Please provide a %sfile name.") % infoString, _("Provide a File Name")) return False if projName.find(' ') != -1: wx.MessageBox(_("Please provide a %sfile name that does not contains spaces.") % infoString, _("Spaces in File Name")) return False if validClassName: if projName[0].isdigit(): wx.MessageBox(_("File name cannot start with a number. Please enter a different name."), _("Invalid File Name")) return False if projName.endswith(".agp"): projName2 = projName[:-4] else: projName2 = projName if not projName2.replace("_", "a").isalnum(): # [a-zA-Z0-9_] note '_' is allowed and ending '.agp'. wx.MessageBox(_("Name must be alphanumeric ('_' allowed). Please enter a valid name."), _("Project Name")) return False dirName = dirControl.GetValue().strip() if dirName == "": wx.MessageBox(_("No directory. Please provide a directory."), _("Provide a Directory")) return False if os.sep == "\\" and dirName.find("/") != -1: wx.MessageBox(_("Wrong delimiter '/' found in directory path. Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory")) return False if not os.path.exists(dirName): wx.MessageBox(_("That %sdirectory does not exist. Please choose an existing directory.") % infoString, _("Provide a Valid Directory")) return False if not ignoreFileConflicts: filePath = os.path.join(dirName, MakeNameEndInExtension(projName, "." + fileExtension)) if os.path.exists(filePath): if allowOverwriteOnPrompt: res = wx.MessageBox(_("That %sfile already exists. Would you like to overwrite it.") % infoString, "File Exists", style=wx.YES_NO|wx.NO_DEFAULT) return (res == wx.YES) else: wx.MessageBox(_("That %sfile already exists. Please choose a different name.") % infoString, "File Exists") return False return True HALF_SPACE = 5 flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE) flexGridSizer.AddGrowableCol(1,1) if not useDirDialog: flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE) flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0) else: flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0) flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE) if returnAll: return nameControl, dirControl, flexGridSizer, Validate, allControls else: return nameControl, dirControl, flexGridSizer, Validatedef CreateDirectoryOnlyControl( parent, dirLabel=_("Location:"), startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False): if not choiceDirs: choiceDirs = [] projectDirs = [] if appDirDefaultStartDir: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT) else: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY) if appDirectory: choiceDirs.append(appDirectory) if appDirDefaultStartDir and not startingDirectory: startingDirectory = appDirectory projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: curProjectDoc = projectService.GetCurrentProject() if curProjectDoc: homeDir = curProjectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in choiceDirs): choiceDirs.append(homeDir) if not startingDirectory: startingDirectory = homeDir for projectDoc in projectService.GetOpenProjects(): if projectDoc == curProjectDoc: continue homeDir = projectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in projectDirs): projectDirs.append(homeDir) projectDirs.sort(CaseInsensitiveCompare) for projectDir in projectDirs: if projectDir not in choiceDirs: choiceDirs.append(projectDir) if startingDirectory and (startingDirectory not in choiceDirs): choiceDirs.insert(0, startingDirectory) if os.getcwd() not in choiceDirs: choiceDirs.append(os.getcwd()) if appdirs.getSystemDir() not in choiceDirs: choiceDirs.append(appdirs.getSystemDir()) if not startingDirectory: startingDirectory = os.getcwd() dirLabelText = wx.StaticText(parent, -1, dirLabel) dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs) dirControl.SetToolTipString(startingDirectory) button = wx.Button(parent, -1, _("Browse...")) def OnFindDirClick(event): dlg = wx.DirDialog(wx.GetApp().GetTopWindow(), _("Choose a directory:"), defaultPath=dirControl.GetValue().strip(), style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON) dlg.CenterOnParent() if dlg.ShowModal() == wx.ID_OK: dir = dlg.GetPath() if dirControl.FindString(dir) == wx.NOT_FOUND: dirControl.Insert(dir, 0) dirControl.SetValue(dir) dirControl.SetToolTipString(dir) dlg.Destroy() parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button) def Validate(allowOverwriteOnPrompt=False): dirName = dirControl.GetValue().strip() if dirName == "": wx.MessageBox(_("Please provide a directory."), _("Provide a Directory")) return False if os.sep == "\\" and dirName.find("/") != -1: wx.MessageBox(_("Wrong delimiter '/' found in directory path. Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory")) return False if not os.path.exists(dirName): wx.MessageBox(_("That directory does not exist. Please choose an existing directory."), _("Provide a Valid Directory")) return False return True HALF_SPACE = 5 flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE) flexGridSizer.AddGrowableCol(1,1) flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.RIGHT, border=HALF_SPACE) flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE) flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE) return dirControl, flexGridSizer, Validatedef CreateNameOnlyControl( parent, fileLabel, startingName="", startingDirectoryControl=None): fileLabelText = wx.StaticText(parent, -1, fileLabel) nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1)) def Validate(allowOverwriteOnPrompt=False, validClassName=False): projName = nameControl.GetValue().strip() if projName == "": wx.MessageBox(_("Blank name. Please enter a valid name."), _("Project Name")) return False if projName.find(' ') != -1: wx.MessageBox(_("Spaces in name. Name cannot have spaces."), _("Project Name")) return False if validClassName: if projName[0].isdigit(): wx.MessageBox(_("Name cannot start with a number. Please enter a valid name."), _("Project Name")) return False if projName.endswith(".agp"): projName2 = projName[:-4] else: projName2 = projName if not projName2.replace("_", "a").isalnum(): # [a-zA-Z0-9_] note '_' is allowed and ending '.agp'. wx.MessageBox(_("Name must be alphanumeric ('_' allowed). Please enter a valid name."), _("Project Name")) return False path = os.path.join(startingDirectoryControl.GetValue().strip(), projName) if os.path.exists(path): if os.path.isdir(path): message = _("Project '%s' already exists. Would you like to overwrite the contents of the project?") % projName else: # os.path.isfile(path): message = _("'%s' already exists as a file. Would you like to replace it with the project?") % nameControl.GetValue().strip() yesNoMsg = wx.MessageDialog(wx.GetApp().GetTopWindow(), message, _("Project Directory Exists"), wx.YES_NO|wx.ICON_QUESTION ) yesNoMsg.CenterOnParent() status = yesNoMsg.ShowModal() yesNoMsg.Destroy() if status == wx.ID_NO: return False return True HALF_SPACE = 5 flexGridSizer = wx.FlexGridSizer(cols = 2, vgap = HALF_SPACE, hgap = HALF_SPACE) flexGridSizer.AddGrowableCol(1,1) flexGridSizer.Add(fileLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.TOP|wx.RIGHT, border=HALF_SPACE) flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE) return nameControl, flexGridSizer, Validate def ValidateName(name, ext=None, hint="name"): """ Returns an error string if there is something wrong with the name. Otherwise it returns None """ if name == "": return _("Blank %s. Please enter a valid %s.") % (hint, hint) if name.find(' ') != -1: return _("Spaces in %s. %s cannot have spaces.") % (hint, hint.title()) if name[0].isdigit(): return _("%s cannot start with a number. Please enter a valid %s.") % (hint.title(), hint) if ext and name.endswith(ext): # strip extension if provided lenExt = len(ext) name = name[:-lenExt] if not name.replace("_", "a").isalnum(): # [a-zA-Z0-9_] note '_' is allowed and ext ending. return _("%s must be alphanumeric ('_' allowed). Please enter a valid %s.") % (hint.title(), hint) return Nonedef GetCurrentProject(): projectDocument = None projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: projectDocument = projectService.GetCurrentProject() return projectDocumentdef AddFilesToCurrentProject(paths, folderPath=None, types=None, names=None, save=False): projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: projectDocument = projectService.GetCurrentProject() if projectDocument: files = projectDocument.GetFiles() for path in paths: if path in files:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -