class OrderedFileListOption(OrderedListOption): """OrderedFileListOption keeps track of an ordered list of file names""" def __init__(self, *args, **kw): self.__pathStyle = kw.pop('pathStyle') self.__addKw = kw.pop('addKw', {}) apply(OrderedListOption.__init__, (self,)+args, kw) def add(self): try: import OpenSave except ImportError: self._tkAdd() else: self._chimeraAdd() def _tkAdd(self): from tkFileDialog import askopenfilename filename = askopenfilename() if not filename: return if self.__pathStyle == 'normal': self.addItem(filename, filename) else: import os.path dir, name = os.path.split(filename) if not dir: dir = "(current directory)" self.addItem('%s - %s' % (name, dir), filename) def _chimeraAdd(self): from OpenSave import OpenModeless if not hasattr(self, "_addDialog"): self._addDialog = OpenModeless(command=self._addCB, default='Add', **self.__addKw) self._addDialog.enter() def _addCB(self, okayed, dialog): if not okayed: return for path in dialog.getPaths(): if self.__pathStyle == 'normal': self.addItem(path, path) else: import os.path dir, name = os.path.split(path) if not dir: dir = "(current directory)" self.addItem('%s - %s' % (name, dir), path)
class OrderedFileListOption(OrderedListOption): """OrderedFileListOption keeps track of an ordered list of file names""" def __init__(self, *args, **kw): self.__pathStyle = kw.pop('pathStyle') self.__addKw = kw.pop('addKw', {}) apply(OrderedListOption.__init__, (self, ) + args, kw) def add(self): try: import OpenSave except ImportError: self._tkAdd() else: self._chimeraAdd() def _tkAdd(self): from tkFileDialog import askopenfilename filename = askopenfilename() if not filename: return if self.__pathStyle == 'normal': self.addItem(filename, filename) else: import os.path dir, name = os.path.split(filename) if not dir: dir = "(current directory)" self.addItem('%s - %s' % (name, dir), filename) def _chimeraAdd(self): from OpenSave import OpenModeless if not hasattr(self, "_addDialog"): self._addDialog = OpenModeless(command=self._addCB, default='Add', **self.__addKw) self._addDialog.enter() def _addCB(self, okayed, dialog): if not okayed: return for path in dialog.getPaths(): if self.__pathStyle == 'normal': self.addItem(path, path) else: import os.path dir, name = os.path.split(path) if not dir: dir = "(current directory)" self.addItem('%s - %s' % (name, dir), path)
def startExtension(): filters = [] fileTypes = extensions.keys() fileTypes.sort(lambda a, b: cmp(a.lower(), b.lower())) for fileType in fileTypes: exts = extensions[fileType] filters.append((fileType, map(lambda x: '*' + x, exts))) global _openDialog if not _openDialog: from OpenSave import OpenModeless _openDialog = OpenModeless(title="Open Sequence Alignment File", help="ContributedSoftware/multalignviewer/framemav.html", command=_openFile, filters=filters, historyID="MultAlign open file") _openDialog.enter()
def startExtension(): filters = [] fileTypes = extensions.keys() fileTypes.sort(lambda a, b: cmp(a.lower(), b.lower())) for fileType in fileTypes: exts = extensions[fileType] filters.append((fileType, map(lambda x: '*' + x, exts))) global _openDialog if not _openDialog: from OpenSave import OpenModeless _openDialog = OpenModeless( title="Open Sequence Alignment File", help="ContributedSoftware/multalignviewer/framemav.html", command=_openFile, filters=filters, historyID="MultAlign open file") _openDialog.enter()
class TextureDialog(ModelessDialog): name = '2D Texture Editor' help = '2dTexture.html' buttons = ('New', 'Close') defaultTexture = None createdTextures = [] def __init__(self, master=None, *args, **kw): self.texture = None self.newPanel = None apply(ModelessDialog.__init__, (self, master) + args, kw) def fillInUI(self, master): # TextureEditor top = Tkinter.Frame(master) top.pack(side=Tkinter.TOP, anchor=Tkinter.W, fill=Tkinter.X, padx=2, pady=2) te = TextureEditor.TextureEditor(top, TextureMap=ChimeraTextureMap) te.map.panel = self te.pack(side=Tkinter.TOP, expand=1, fill=Tkinter.BOTH) self.editor = te # Texture option menu self.names = Tkinter.Menubutton(te, width=10, bd=2, indicatoron=1, relief=Tkinter.RAISED, anchor='c') self.names.pack(side=Tkinter.TOP, expand=1, fill=Tkinter.X) self.menu = Tkinter.Menu(self.names) self.names['menu'] = self.menu # Texture background b = Tkinter.Button(te, text='Load Background', command=self.__loadBackground) b.pack(side=Tkinter.TOP, fill=Tkinter.X) self.reloadTextures() self.monitorHandler = chimera.triggers.addHandler( 'Texture', self.__textureHandler, None) def __del__(self): chimera.triggers.deleteHandler('Texture', self.monitorHandler) def New(self): if not self.newPanel: self.newPanel = NewPanel(self.uiMaster()) if not self.newPanel.run(self.uiMaster()): return name, width, height = self.newPanel.values() if len(name) == 0: tkMessageBox.showerror(title='Error', message='No texture name specified') return if chimera.Texture.lookup(name): tkMessageBox.showerror(title='Error', message='Texture "%s" already exists' % name) return t = chimera.Texture(name, chimera.Texture.RGBA, chimera.Texture.UnsignedByte, width, height) t.editorState = {'size': (width, height), 'xFactor': 1, 'yFactor': 1} self.__selectTexture(name) TextureDialog.createdTextures.append(t) def __selectTexture(self, textureName): if self.texture: state = self.editor.map.saveState() if not hasattr(self.texture, 'editorState'): self.texture.editorState = state else: self.texture.editorState.update(state) self.texture = chimera.Texture.lookup(textureName) if self.texture is None: raise NameError, 'Cannot find texture named "%s"' \ % textureName self.editor.map.changeTexture() self.names.config(text=textureName) def __loadBackground(self): if not hasattr(self, '_loadBGDialog'): from OpenSave import OpenModeless self._loadBGDialog = OpenModeless(title='Load Background', command=self._loadBGCB) self._loadBGDialog.enter() def _loadBGCB(self, okayed, dialog): if not okayed: return for path in dialog.getPaths(): self.editor.map.setBackground(Image.open(path)) def reloadTextures(self): cursel = self.names['text'] tList = chimera.Texture.list().items() if tList: nList = [] for n, t in tList: if t.type() != t.UnsignedByte: continue w, h, depth, nc, nb = t.sizes() if w not in goodSizes or h not in goodSizes: continue if depth != 1 or nc < 3: continue nList.append(n) tList = nList tList.sort() if TextureDialog.defaultTexture is None: name = '2dTexture' x = chimera.Texture(name, chimera.Texture.RGBA, chimera.Texture.UnsignedByte, 128, 128) x.editorState = {'size': (128, 128), 'xFactor': 1, 'yFactor': 1} tList.append(name) TextureDialog.defaultTexture = x tList.sort() self.menu.delete(0, Tkinter.END) for t in tList: self.menu.add_command( label=t, command=lambda s=self, t=t: s.__selectTexture(t)) if cursel not in tList: cursel = None if not cursel: cursel = tList[0] self.__selectTexture(cursel) def updateTexture(self, image): if not self.texture: return w, h, depth, nc, nb = self.texture.sizes() if image.size[0] != w or image.size[1] != h: raise ValueError, 'image/texture size mismatch' self.texture.image = image def __textureHandler(self, trigger, closure, textures): if textures.created or textures.deleted: self.reloadTextures() return for t in textures.modified: if t == self.texture: self.editor.map.redrawIfNeeded()
class TextureDialog(ModelessDialog): name = '2D Texture Editor' help = '2dTexture.html' buttons = ('New', 'Close') defaultTexture = None createdTextures = [] def __init__(self, master=None, *args, **kw): self.texture = None self.newPanel = None apply(ModelessDialog.__init__, (self, master) + args, kw) def fillInUI(self, master): # TextureEditor top = Tkinter.Frame(master) top.pack(side=Tkinter.TOP, anchor=Tkinter.W, fill=Tkinter.X, padx=2, pady=2) te = TextureEditor.TextureEditor(top, TextureMap=ChimeraTextureMap) te.map.panel = self te.pack(side=Tkinter.TOP, expand=1, fill=Tkinter.BOTH) self.editor = te # Texture option menu self.names = Tkinter.Menubutton(te, width=10, bd=2, indicatoron=1, relief=Tkinter.RAISED, anchor='c') self.names.pack(side=Tkinter.TOP, expand=1, fill=Tkinter.X) self.menu = Tkinter.Menu(self.names) self.names['menu'] = self.menu # Texture background b = Tkinter.Button(te, text='Load Background', command=self.__loadBackground) b.pack(side=Tkinter.TOP, fill=Tkinter.X) self.reloadTextures() self.monitorHandler = chimera.triggers.addHandler( 'Texture', self.__textureHandler, None) def __del__(self): chimera.triggers.deleteHandler('Texture', self.monitorHandler) def New(self): if not self.newPanel: self.newPanel = NewPanel(self.uiMaster()) if not self.newPanel.run(self.uiMaster()): return name, width, height = self.newPanel.values() if len(name) == 0: tkMessageBox.showerror(title='Error', message='No texture name specified') return if chimera.Texture.lookup(name): tkMessageBox.showerror(title='Error', message='Texture "%s" already exists' % name) return t = chimera.Texture(name, chimera.Texture.RGBA, chimera.Texture.UnsignedByte, width, height) t.editorState = { 'size': (width, height), 'xFactor': 1, 'yFactor': 1 } self.__selectTexture(name) TextureDialog.createdTextures.append(t) def __selectTexture(self, textureName): if self.texture: state = self.editor.map.saveState() if not hasattr(self.texture, 'editorState'): self.texture.editorState = state else: self.texture.editorState.update(state) self.texture = chimera.Texture.lookup(textureName) if self.texture is None: raise NameError, 'Cannot find texture named "%s"' \ % textureName self.editor.map.changeTexture() self.names.config(text=textureName) def __loadBackground(self): if not hasattr(self, '_loadBGDialog'): from OpenSave import OpenModeless self._loadBGDialog = OpenModeless( title='Load Background', command=self._loadBGCB) self._loadBGDialog.enter() def _loadBGCB(self, okayed, dialog): if not okayed: return for path in dialog.getPaths(): self.editor.map.setBackground(Image.open(path)) def reloadTextures(self): cursel = self.names['text'] tList = chimera.Texture.list().items() if tList: nList = [] for n, t in tList: if t.type() != t.UnsignedByte: continue w, h, depth, nc, nb = t.sizes() if w not in goodSizes or h not in goodSizes: continue if depth != 1 or nc < 3: continue nList.append(n) tList = nList tList.sort() if TextureDialog.defaultTexture is None: name = '2dTexture' x = chimera.Texture(name, chimera.Texture.RGBA, chimera.Texture.UnsignedByte, 128, 128) x.editorState = { 'size': (128, 128), 'xFactor': 1, 'yFactor': 1 } tList.append(name) TextureDialog.defaultTexture = x tList.sort() self.menu.delete(0, Tkinter.END) for t in tList: self.menu.add_command(label=t, command=lambda s=self, t=t: s.__selectTexture(t)) if cursel not in tList: cursel = None if not cursel: cursel = tList[0] self.__selectTexture(cursel) def updateTexture(self, image): if not self.texture: return w, h, depth, nc, nb = self.texture.sizes() if image.size[0] != w or image.size[1] != h: raise ValueError, 'image/texture size mismatch' self.texture.image = image def __textureHandler(self, trigger, closure, textures): if textures.created or textures.deleted: self.reloadTextures() return for t in textures.modified: if t == self.texture: self.editor.map.redrawIfNeeded()