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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
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()
Exemplo n.º 6
0
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()