"""
qtgui/mgFileViewer.py: CCP4MG Molecular Graphics Program
Copyright (C) 2001-2008 University of York, CCLRC
Copyright (C) 2009-2011 University of York
This library is free software: you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public License
version 3, modified in accordance with the provisions of the
license to address the requirements of UK law.
You should have received a copy of the modified GNU Lesser General
Public License along with this library. If not, copies may be
downloaded from http://www.ccp4.ac.uk/ccp4license.php
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
"""
'''
Functionality needed..
Scaling images
searching text
'''
import sys
import os
import functools
from PyQt4 import QtCore,QtGui
try:
if sys.platform == 'linux2':
from PyQt4 import phonon
havePhonon = True
except:
havePhonon = False
import MGSimpleDialog
from global_definitions import *
#-------------------------------------------------------------------
def addSupportedFormat(name,extensions=[],label='',viewer=''):
#-------------------------------------------------------------------
if mgFileViewer.supported_formats.has_key(name):
print "mgFileViewer redefining supported format",name
mgFileViewer.supported_formats[name] = {}
mgFileViewer.supported_formats[name]['ext_list'] = extensions
mgFileViewer.supported_formats[name]['viewer'] = viewer
mgFileViewer.supported_formats[name]['label'] = label
def addSupportedPlugin(name,extensions=[],label='',viewer='',arguments=''):
if mgFileViewer.supported_plugins.has_key(name):
print "mgFileViewer redefining supported format",name
mgFileViewer.supported_plugins[name] = {}
mgFileViewer.supported_plugins[name]['ext_list'] = extensions
mgFileViewer.supported_plugins[name]['viewer'] = viewer
mgFileViewer.supported_plugins[name]['label'] = label
mgFileViewer.supported_plugins[name]['arguments'] = arguments
#-------------------------------------------------------------------
def getParams():
#-------------------------------------------------------------------
plugins = {}
plugins.update(mgFileViewer.supported_plugins)
return { 'supported_plugins' : plugins }
#-------------------------------------------------------------------
def setParams(params):
#-------------------------------------------------------------------
if params.has_key( 'supported_plugins'):
for key,info in params['supported_plugins'].items():
addSupportedPlugin(key,info.get('ext_list',[]),
info.get('label',''),info.get('viewer',''))
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
class mgFileViewer(QtGui.QWidget):
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
supported_formats = {}
supported_plugins = {}
#-------------------------------------------------------------------
def __init__(self,parent=None,name='',title='CCP4mg file viewer'):
#-------------------------------------------------------------------
#if not parent: parent = MAINWINDOW()
QtGui.QWidget.__init__(self,parent)
self.setWindowTitle(title)
self.setWindowFlags(QtCore.Qt.Window)
self.menu='Windows'
if name: self.setObjectName(name)
if not mgFileViewer.supported_formats:
addSupportedFormat('text',['txt','text','log'],'Text files',mgTextViewer)
addSupportedFormat('coords',['pdb','cif','ent'],'Coordinate files',mgCoordsViewer)
addSupportedFormat('vector',['vector'],'Vector files',mgTextViewer)
addSupportedFormat('html',['html','htm'],'HTML files',mgHtmlViewer)
image_formats_c = QtGui.QMovie.supportedFormats()
image_formats = []
for im in image_formats_c:
if not image_formats.count(str(im).lower()):
image_formats.append(str(im))
# The QMovie widget supports animated gif and png
addSupportedFormat('movie',image_formats,'Movie files',mgMovieViewer)
addSupportedFormat('movie_phonon',['mpeg','mp4'],'Movie files (phonon)',mgMovieViewerPhonon)
#import image_info
#image_formats_c = image_info.image_info.GetSupportedWriteFormats()
image_formats_c = QtGui.QImageReader.supportedImageFormats()
image_formats = []
for im in image_formats_c:
if not image_formats.count(str(im).lower()):
image_formats.append(str(im))
addSupportedFormat('image',image_formats,'Image files',mgImageViewer)
self.saveWidget = None
self.editPluginsWidget = None
#self.CreateMenuEntry()
self.draw()
#-------------------------------------------------------------------
def draw(self):
#-------------------------------------------------------------------
import guiUtils
margin = 0
self.tab = None
self.menuWidget = {}
layout = QtGui.QVBoxLayout()
layout.setMargin(margin)
self.setContentsMargins(margin,margin,margin,margin)
self.menubar = QtGui.QMenuBar(self)
for menu_name,menu_title in self.getGuiDef('menus'):
self.menuWidget[menu_name] = self.menubar.addMenu(menu_title)
self.connect(self.menuWidget[menu_name],QtCore.SIGNAL("aboutToShow()"),guiUtils.partial(self.updateMenu,menu_name))
layout.addWidget(self.menubar)
self.tab = QtGui.QTabWidget(self)
pb = QtGui.QPushButton()
pb.setText(self.tr("Delete tab"))
self.tab.setCornerWidget(pb)
pb.setAutoDefault(False)
self.connect(pb,QtCore.SIGNAL("released()"),self.closeTab)
self.connect(self.tab,QtCore.SIGNAL('currentChanged(int)'),self.handleTabChanged)
layout.addWidget(self.tab)
self.setLayout(layout)
self.resize(QtCore.QSize(300,200))
#self.UnClose()
self.show()
self.raise_()
#-------------------------------------------------------------------
def updateMenu(self,menu_name):
#-------------------------------------------------------------------
import guiUtils
self.menuWidget[menu_name].clear()
guiUtils.populateMenu(self,self.menuWidget[menu_name],self.getGuiDef(menu_name),default_icon='')
#-------------------------------------------------------------------
def getGuiDef(self,name='',pickevent=None):
#-------------------------------------------------------------------
if name == 'menus':
return [['File','&File'],['Edit','&Edit']]
elif name == 'File':
return ['open','save','print','close_tab','close']
elif name == 'Edit':
return ['find','sep','edit_plugins']
#-------------------------------------------------------------------
def getActionDef(self,name,**info):
#-------------------------------------------------------------------
widget = self.currentWidget()
enabled = 0
import guiUtils
if name == 'close':
return dict (
text = 'Close file viewer',
tip = 'Close this file viewer',
slot = self.close )
if name == 'open':
return dict (
text = "Open file",
tip = "Open text, image or movie file",
slot = self.openFile,
icon = 'fileopen'
)
if name == 'save':
if widget: enabled = widget.isSaveable()
return dict (
text = "Save",
tip = "Save to file",
slot = self.handleSave,
enabled = enabled
)
if name == 'print':
if widget: enabled = widget.isPrintable()
return dict (
text = "Print",
tip = "Print file",
slot = self.handlePrint,
enabled = enabled
)
if name == 'find':
return dict (
text = "Find",
tip = "Find in file",
slot = self.openFind,
checkable = 1,
checked = self.isFindFrameOpen,
enabled = self.isCurrentWidgetText
)
if name == 'scale':
return dict (
text = "Scale image",
tip = "Scale image",
slot = self.openScale,
enabled = self.isCurrentWidgetImage,
checkable = 1,
checked = self.isScaleFrameOpen
)
if name == 'scale_to_fit':
return dict (
text = "Scale image to fit",
tip = "Scale image to fit the screen",
slot = self.scaleToFit,
enabled = self.isCurrentWidgetImage
)
if name == 'close_tab':
return dict (
text = "Close tab",
tip = "Close the currently displayed file",
slot = self.closeTab,
enabled = 1
)
if name == 'edit_plugins':
return dict (
text = "Edit plugin viewers",
tip = "Choose external programs to display data",
slot = self.editPlugins,
enabled = 1
)
return {}
#-------------------------------------------------------------------
def resizeEvent(self,event):
#-------------------------------------------------------------------
if self.isCurrentWidgetImage():
self.currentWidget().fitToWindow()
#-------------------------------------------------------------------
def isCurrentWidgetText(self):
#-------------------------------------------------------------------
widget = self.currentWidget()
if widget and isinstance(widget,mgTextViewer):
return 1
else:
return 0
#-------------------------------------------------------------------
def isCurrentWidgetImage(self):
#-------------------------------------------------------------------
widget = self.currentWidget()
if widget and isinstance(widget,mgImageViewer):
return 1
else:
return 0
#-------------------------------------------------------------------
def openFile(self):
#-------------------------------------------------------------------
import mgWidgets
win = self.findChild(mgWidgets.MGFileDialog,'win_open')
if not win:
win = MGSimpleDialog.MGSimpleDialog(self)
win.setObjectName('win_open')
win.setWindowTitle('CCP4mg file viewer')
win.setAttribute(QtCore.Qt.WA_DeleteOnClose)
layout = QtGui.QVBoxLayout()
open = mgWidgets.MGFileDialog(self)
open.setObjectName('open')
layout.addWidget(open)
win.setLayout(layout)
filedialog = open.getFileDialog()
filedialog.setFileMode(filedialog.ExistingFiles)
filter_list = []
for key,defn in mgFileViewer.supported_formats.items():
ext_text = ''
for ext in defn['ext_list']: ext_text = ext_text+'*.'+ext+' '
filter_list.append(defn['label']+' ('+ext_text+')')
#print "filter_list",filter_list
filedialog.setNameFilters(filter_list)
self.connect(filedialog, QtCore.SIGNAL('filesSelected (const QStringList&)'), self.handleSelection)
win.show()
#-------------------------------------------------------------------
def handleSelection(self,file_list):
#-------------------------------------------------------------------
import string
import mgWidgets
#print "handleSelection file_list",file_list
format = ''
filedialog = self.findChild(mgWidgets.MGFileDialog,'open')
if filedialog:
filter = str(filedialog.getFileDialog().selectedFilter())
if filter:
#print "handleSelection filter",filter
for name,defn in mgFileViewer.supported_formats.items():
if string.find(filter,defn['label'])>=0:
format = name
for file in file_list:
self.open(unicode(str(file.toUtf8()),'utf-8'),format=format)
win = filedialog.window()
if win: win.close()
#-------------------------------------------------------------------
def loadText(self,text='',title='',format='text'):
#-------------------------------------------------------------------
widget = mgTextViewer(self)
widget.loadText(text=text)
widget.setObjectName(title)
idx = self.tab.addTab(widget,title)
self.setTabIndex(idx)
widget.show()
self.mgResize()
return widget
#-------------------------------------------------------------------
def open(self,filename,format='',title=''):
#-------------------------------------------------------------------
ext = os.path.splitext(filename)
if ext[1]:
ext = ext[1][1:]
else:
ext = ''
print "mgFileViewer.open filename",filename,format,ext, mgFileViewer.supported_plugins.items()
# If format not recognised try if file extension is recognised
if not format or (format and not mgFileViewer.supported_formats.has_key(format) and
not mgFileViewer.supported_plugins.has_key(format)):
format = ''
for name,defn in mgFileViewer.supported_formats.items():
if defn['ext_list'].count(ext):
format = name
break
for name,defn in mgFileViewer.supported_plugins.items():
if defn['ext_list'].count(ext):
format = name
break
if not format:
format = 'text'
#print 'mgFileViewer.open',format
# Is the file already displayed - force a redraw
idx = self.fileOpenInTab(filename)
if idx>=0:
self.tab.setCurrentIndex(idx)
self.tab.widget(idx).open(self.tab.widget(idx).filename)
return self.tab.widget(idx)
# If its a plugin format launch the plugin
if mgFileViewer.supported_plugins.has_key(format):
self.launch(format,filename)
return None
else:
widget = mgFileViewer.supported_formats[format]['viewer'](self)
rv = widget.open(filename)
#print "mgFileViewer.open rv",rv
if rv[0]:
widget.close()
MGGUI().WarningMessage(rv[1])
return None
if not title: title = os.path.split(filename)[-1]
widget.setObjectName(title)
idx = self.tab.addTab(widget,title)
self.setTabIndex(idx)
widget.show()
self.mgResize()
return widget
#-------------------------------------------------------------------
def launch(self,format,filename):
#-------------------------------------------------------------------
info = mgFileViewer.supported_plugins.get(format,{})
viewer = info.get('viewer','')
#print 'mgFileViewer.launch',format,filename,viewer
if not viewer:
return [-1, 'No viewer listed for format: '+format]
# Create argent list for QProcess
arglist = []
for item in info.get('arguments','').split():
arglist.append(item)
arglist.append(filename)
l = []
for item in arglist: l.append(QtCore.QString(item))
process = QtCore.QProcess(self)
process.start(viewer,QtCore.QStringList(l))
self.Close()
#-------------------------------------------------------------------
def setTabIndex(self,index=-1,filename=''):
#-------------------------------------------------------------------
if index>=0 and index<=self.tab.count():
self.tab.setCurrentIndex(index)
self.setWindowTitle('CCP4mg file viewer: '+self.tab.widget(index).objectName())
#-------------------------------------------------------------------
def currentWidget(self):
#-------------------------------------------------------------------
if not self.tab: return None
idx = self.tab.currentIndex()
if idx<0: return None
return self.tab.widget(idx)
#-------------------------------------------------------------------
def handleTabChanged(self,index):
#-------------------------------------------------------------------
#print "handleTabChanged index",index
if index<0: return
widget = self.tab.widget(index)
if not widget: return
self.setWindowTitle('CCP4mg file viewer: '+widget.objectName())
#-------------------------------------------------------------------
def mgResize(self):
#-------------------------------------------------------------------
imagesize = self.tab.currentWidget().mgSize()
winsize = MGAPPLICATION().desktop().size()
#print 'mgFileViewer.mgResize',imagesize.width(),imagesize.height(),'desktop',winsize.width(),winsize.height()
reqwidth = min(imagesize.width(),winsize.width()-50)
reqheight = min(imagesize.height(),winsize.height()-50)
# Kludge - take 2x menubar height to allow for tabs on tab widget
self.tab.resize(QtCore.QSize(reqwidth,reqheight-2*self.menubar.height()))
self.resize(QtCore.QSize(reqwidth,reqheight))
#-------------------------------------------------------------------
def closeTab(self):
#-------------------------------------------------------------------
#print "closeTab",self.tab.currentIndex()
idx = self.tab.currentIndex()
if idx<0: return
widget = self.tab.widget(idx)
if widget: widget.close()
self.tab.removeTab(idx)
#-------------------------------------------------------------------
def fileOpenInTab(self,filename):
#-------------------------------------------------------------------
filename = os.path.abspath(filename)
for idx in range(0,self.tab.count()):
if self.tab.widget(idx).filename == filename:
return idx
return -1
#-------------------------------------------------------------------
def openFind(self):
#-------------------------------------------------------------------
# Bothersomeness. This slot gets called even if there is an openFind
# method in a subclass. Just make this one work safely
widget = self.currentWidget()
if widget:
findFrame = getattr(widget,'findFrame',None)
if findFrame:
if findFrame.isVisible():
findFrame.hide()
else:
findFrame.show()
#-------------------------------------------------------------------
def isFindFrameOpen(self):
#-------------------------------------------------------------------
widget = self.currentWidget()
if widget:
findFrame = getattr(widget,'findFrame',None)
if findFrame and findFrame.isVisible(): return 1
return 0
#-------------------------------------------------------------------
def isScaleFrameOpen(self):
#-------------------------------------------------------------------
widget = self.currentWidget()
if widget:
scaleFrame = getattr(widget,'scaleFrame',None)
if scaleFrame and scaleFrame.isVisible(): return 1
return 0
#-------------------------------------------------------------------
def openScale(self):
#-------------------------------------------------------------------
widget = self.currentWidget()
if widget:
scaleFrame = getattr(widget,'scaleFrame',None)
if scaleFrame:
if scaleFrame.isVisible():
scaleFrame.hide()
else:
scaleFrame.show()
#-------------------------------------------------------------------
def scaleToFit(self):
#-------------------------------------------------------------------
if not self.isCurrentWidgetImage(): return
self.currentWidget().fitToWindow()
#-------------------------------------------------------------------
def handlePrint(self):
#-------------------------------------------------------------------
idx = self.tab.currentIndex()
if idx<0: return
printer = QtGui.QPrinter()
pd = QtGui.QPrintDialog(printer)
pdret = pd.exec_()
if pdret == QtGui.QDialog.Accepted:
painter = QtGui.QPainter()
painter.begin(printer)
self.tab.widget(idx).Print(painter)
painter.end()
#-------------------------------------------------------------------
def handleSave(self):
#-------------------------------------------------------------------
widget = self.currentWidget()
if not widget: return
import mgWidgets
defaultSuffix = ''
filter_list = []
ext_list = widget.getFileExt()
if ext_list: defaultSuffix = ext_list[0]
ext_text = ''
for ext in widget.getFileExt() : ext_text = ext_text+'*.'+ext+' '
if ext_text: filter_list.append(widget.getLabel()+' ('+ext_text+')')
self.saveWidget = mgWidgets.MGSaveFileDialog(self,title='Save '+widget.objectName(),filters=filter_list,defaultSuffix=defaultSuffix)
self.connect(self.saveWidget,QtCore.SIGNAL('save'),self.currentWidget().Save)
self.saveWidget.show()
#-------------------------------------------------------------------
def editPlugins(self):
#-------------------------------------------------------------------
if not self.editPluginsWidget:
self.editPluginsWidget = EditPlugins(self)
self.editPluginsWidget.UnClose()
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#class mgAbstractViewer(QtGui.QWidget):
class mgAbstractViewer(QtGui.QScrollArea):
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
def __init__(self,parent,filename=''):
#-------------------------------------------------------------------
#QtGui.QWidget.__init__(self,parent)
QtGui.QScrollArea.__init__(self,parent)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setWidgetResizable(1)
self.filename=''
#-------------------------------------------------------------------
def open(self,filename):
#-------------------------------------------------------------------
pass
#-------------------------------------------------------------------
def mgSize(self):
#-------------------------------------------------------------------
return QtCore.QSize()
#-------------------------------------------------------------------
def Print(self,painter):
#-------------------------------------------------------------------
pass
#-------------------------------------------------------------------
def Save(self,filename):
#-------------------------------------------------------------------
pass
#-------------------------------------------------------------------
def isPrintable(self):
#-------------------------------------------------------------------
return 0
#-------------------------------------------------------------------
def isSaveable(self):
#-------------------------------------------------------------------
return 0
#-------------------------------------------------------------------
def getFileExt(self):
#-------------------------------------------------------------------
for formt,defn in mgFileViewer.supported_formats.items():
if isinstance(self,defn['viewer']):
return defn['ext_list']
return []
#-------------------------------------------------------------------
def getLabel(self):
#-------------------------------------------------------------------
for formt,defn in mgFileViewer.supported_formats.items():
if isinstance(self,defn['viewer']):
return defn['label']
return []
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
class mgImageViewer(mgAbstractViewer):
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
def __init__(self,parent,filename=''):
#-------------------------------------------------------------------
import mgWidgets
mgAbstractViewer.__init__(self,parent)
layout = QtGui.QVBoxLayout()
self.label = QtGui.QLabel(self)
layout.addWidget(self.label)
'''
self.scaleFrame = QtGui.QFrame(self)
scale_layout = QtGui.QHBoxLayout()
scale_layout.addWidget(QtGui.QLabel('Scale',self))
self.scaleWidget = mgWidgets.mgSlider(QtCore.Qt.Horizontal,self)
self.scaleWidget.setRange(0.0,10.0)
self.scaleWidget.setValue(1.0)
self.connect(self.scaleWidget,QtCore.SIGNAL('valueChanged(double)'),self.scale)
scale_layout.addWidget(self.scaleWidget)
fit_to_frame = QtGui.QPushButton('Fit to frame',self)
self.connect(fit_to_frame,QtCore.SIGNAL('released()'),self.fitToWindow)
scale_layout.addWidget(fit_to_frame)
close = QtGui.QPushButton('Close',self)
self.connect(close,QtCore.SIGNAL('released()'),self.closeScale)
scale_layout.addWidget(close)
self.scaleFrame.setLayout(scale_layout)
layout.addWidget(self.scaleFrame)
self.scaleFrame.hide()
'''
self.setLayout(layout)
self.filename = ''
self.pixmap = QtGui.QPixmap()
if filename: self.open(filename)
self.isZoomed = 0
#-------------------------------------------------------------------
def fitToWindow(self):
#-------------------------------------------------------------------
#print 'mgImageViewerfitToWindow'
#self.isZoomed = 1 - self.isZoomed
if not self.isZoomed:
if self.pixmap.width()>self.width() or self.pixmap.height()>self.height():
self.label.setPixmap(self.pixmap.scaled(self.size(),QtCore.Qt.KeepAspectRatio,QtCore.Qt.SmoothTransformation))
else:
self.label.setPixmap(self.pixmap)
#-------------------------------------------------------------------
def mousePressEvent(self,event):
#-------------------------------------------------------------------
if self.filename != '' and self.pixmap.width()>0 and self.pixmap.height()>0:
try:
drag = QtGui.QDrag(self)
mimeData = QtCore.QMimeData()
mimeData.setText(self.filename)
#mimeData.setImageData(QtGui.QImage(self.filename))
mimeData.setUrls([QtCore.QUrl.fromLocalFile(self.filename)])
drag.setMimeData(mimeData)
drag.setPixmap(self.pixmap.scaledToHeight(150))
drag.start()
except:
print "Drag and drop failed"
#-------------------------------------------------------------------
def open(self,filename):
#-------------------------------------------------------------------
try:
self.pixmap = QtGui.QPixmap(filename)
except:
return [1,'Unable to read image file']
#print "mgImageViewer pixmap",self.pixmap,self.pixmap.width(),self.pixmap.height()
w = int(self.pixmap.width())
if w<=0:
return [1,'Image file apparently zero size']
self.label.setPixmap(self.pixmap)
self.filename = os.path.abspath(filename)
self.setObjectName(os.path.split(self.filename)[-1])
self.label.show()
self.setWidget(self.label)
return [0]
#-------------------------------------------------------------------
def mgSize(self):
#-------------------------------------------------------------------
return self.pixmap.size()
#-------------------------------------------------------------------
def Print(self,painter):
#-------------------------------------------------------------------
painter.drawPixmap(0,0,self.pixmap)
#-------------------------------------------------------------------
def Save(self,filename):
#-------------------------------------------------------------------
pass
#-------------------------------------------------------------------
def isPrintable(self):
#-------------------------------------------------------------------
return 1
#-------------------------------------------------------------------
def isSaveable(self):
#-------------------------------------------------------------------
return 1
#-------------------------------------------------------------------
def openScale(self):
#-------------------------------------------------------------------
self.scaleFrame.show()
#-------------------------------------------------------------------
def closeScale(self):
#-------------------------------------------------------------------
self.scaleFrame.hide()
#-------------------------------------------------------------------
def scale(self,value):
#-------------------------------------------------------------------
print 'mgImageViewer.scale',value
if not self.pixmap or not self.filename: return
self.label.setPixmap(self.pixmap.scaled(self.pixmap.width()*value,self.pixmap.height()*value,QtCore.Qt.KeepAspectRatio,QtCore.Qt.SmoothTransformation))
class mgPickableText(QtGui.QTextBrowser):
def __init__(self,parent=None):
QtGui.QTextBrowser.__init__(self,parent)
def mouseReleaseEvent(self,event):
#print 'mgPickableText.mouseReleaseEvent'
pos = self.cursorRect().center()
self.emit(QtCore.SIGNAL('mouseRelease'),pos)
event.ignore()
def mouseDoubleClickEvent(self,event):
#print 'mgPickableText.mouseDoubleClickEvent'
pos = self.cursorRect().center()
self.emit(QtCore.SIGNAL('mouseDoubleClick'),pos)
event.ignore()
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
class mgTextViewer(mgAbstractViewer):
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
def __init__(self,parent,filename=''):
#-------------------------------------------------------------------
#print 'mgTextViewer.init',self,filename
import guiUtils
mgAbstractViewer.__init__(self,parent)
self.filename=''
layout = QtGui.QVBoxLayout()
layout.setSpacing(0)
layout.setContentsMargins(0,0,0,0)
#self.viewer = QtGui.QTextBrowser(self)
self.viewer = mgPickableText(self)
self.connect(self.viewer,QtCore.SIGNAL('mouseRelease'),self.handleMouseClick)
self.connect(self.viewer,QtCore.SIGNAL('mouseDoubleClick'),self.handleMouseDoubleClick)
layout.addWidget(self.viewer)
self.findFrame = QtGui.QFrame(self)
find_layout = QtGui.QHBoxLayout()
widget = QtGui.QPushButton('Close',self)
find_layout.addWidget(widget)
self.connect(widget,QtCore.SIGNAL('clicked(bool)'),self.closeFind)
find_layout.addWidget(QtGui.QLabel('Find:'))
self.findText = QtGui.QLineEdit(self)
find_layout.addWidget(self.findText)
#for label in [ 'Next','Previous','Highlight all']:
for label in [ 'Next','Previous']:
widget = QtGui.QPushButton(label,self)
setattr(self,'find'+label,widget)
find_layout.addWidget(widget)
self.connect(widget,QtCore.SIGNAL('clicked(bool)'),guiUtils.partial(self.find,label))
self.findCase = QtGui.QCheckBox('Match case',self)
find_layout.addWidget(self.findCase)
find_layout.addStretch(5)
self.findFrame.setLayout(find_layout)
layout.addWidget(self.findFrame)
self.findFrame.hide()
self.document = None
self.setLayout(layout)
if filename:
self.open(filename)
def handleMouseClick(self,pos):
text_cursor = self.viewer.cursorForPosition(pos)
text_position = text_cursor.position()
text_cursor.select(QtGui.QTextCursor.LineUnderCursor)
line = str(text_cursor.selectedText())
self.emit(QtCore.SIGNAL('lineClicked'),line)
word = self.getWord(text_position)
self.emit(QtCore.SIGNAL('wordClicked'),word)
def handleMouseDoubleClick(self,pos):
text_cursor = self.viewer.cursorForPosition(pos)
text_position = text_cursor.position()
text_cursor.select(QtGui.QTextCursor.LineUnderCursor)
line = str(text_cursor.selectedText())
self.emit(QtCore.SIGNAL('lineDoubleClicked'),line)
word = self.getWord(text_position)
self.emit(QtCore.SIGNAL('wordDoubleClicked'),word)
def getWord(self,position):
if not self.document: return ''
text = str(self.document.toPlainText())
fpos = position-1
lpos = position
while fpos>=0 and not [' ','\n'].count(text[fpos]):
fpos = fpos -1
while lpos'+line.strip('\n')+'\n'
output = output + '
' +line.strip('\n') + 'go to\n'
else:
output = output +'
' + line
print 'markupPDB',output
except:
return [1,'Error marking up file']
output = '\n' + output + '\ni\n'
return [0,output]
'''
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
class mgHtmlViewer(mgTextViewer):
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
def __init__(self,parent,filename=''):
#-------------------------------------------------------------------
mgTextViewer.__init__(self,parent,filename)
#-------------------------------------------------------------------
def open(self,filename):
#-------------------------------------------------------------------
try:
f = open(filename,'r')
text = f.read()
f.close()
except:
return [1,'Error reading file']
try:
self.document = QtGui.QTextDocument()
self.document.setHtml(text)
except:
return [1,'Error loading text into document']
self.viewer.setDocument(self.document)
self.filename = os.path.abspath(filename)
self.setObjectName(os.path.split(self.filename)[-1])
return [0]
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
class EditPlugins(MGSimpleDialog.MGSimpleDialog):
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#-------------------------------------------------------------------
def __init__(self,parent):
#-------------------------------------------------------------------
MGSimpleDialog.MGSimpleDialog.__init__(self,parent)
self.current = -1
self.setWindowTitle("CCP4mg File Browser Plugins")
layout = QtGui.QVBoxLayout(self)
layout.setSpacing(2)
layout.setContentsMargins(2,2,2,2)
self.selectPlugin= QtGui.QListWidget(self)
self.selectPlugin.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
self.loadSelectPlugin()
delete_button = QtGui.QPushButton('Delete selected plugin',self)
self.connect(delete_button,QtCore.SIGNAL('clicked()'),self.deletePlugin)
new_button = QtGui.QPushButton('Create new plugin',self)
self.connect(new_button,QtCore.SIGNAL('clicked()'),self.handleNew)
listLayout= QtGui.QGridLayout()
listLayout.addWidget(self.selectPlugin,0,0,2,1)
listLayout.addWidget(new_button,0,1)
listLayout.addWidget(delete_button,1,1)
layout.addLayout(listLayout)
editLayout= QtGui.QGridLayout()
editLayout.addWidget(QtGui.QLabel('Plugin name',self),0,0)
self.name = QtGui.QLineEdit(self)
self.name.setToolTip('A one word unique name for the plugin')
editLayout.addWidget(self.name,0,1)
editLayout.addWidget(QtGui.QLabel('File extensions',self),1,0)
self.extensions = QtGui.QLineEdit(self)
self.extensions.setToolTip('A comma separated list of file extensions supported by the plugin')
editLayout.addWidget(self.extensions)
editLayout.addWidget(QtGui.QLabel('Viewer',self),2,0)
self.viewer = QtGui.QLineEdit(self)
self.viewer.setToolTip('The command to run the viewer')
editLayout.addWidget(self.viewer,2,1)
editLayout.addWidget(QtGui.QLabel('Arguments to viewer',self),3,0)
self.arguments = QtGui.QLineEdit(self)
self.arguments.setToolTip('The arguments to the the viewer')
editLayout.addWidget(self.arguments,3,1)
editLayout.addWidget(QtGui.QLabel('Label',self),4,0)
self.plugin_label = QtGui.QLineEdit(self)
self.plugin_label.setToolTip('A label for the plugin to be used in the interface')
editLayout.addWidget(self.plugin_label,4,1)
layout.addLayout(editLayout)
dialog_buttons = QtGui.QDialogButtonBox()
apply_button = dialog_buttons.addButton('Save plugin',QtGui.QDialogButtonBox.ActionRole)
cancel_button = dialog_buttons.addButton('Close',QtGui.QDialogButtonBox.RejectRole)
ok_button = dialog_buttons.addButton('Save plugin and close',QtGui.QDialogButtonBox.AcceptRole)
for button in [apply_button,cancel_button,ok_button]:
button.setAutoDefault(0)
button.setDefault(0)
self.connect(cancel_button,QtCore.SIGNAL('clicked()'),self.Close)
self.connect(apply_button,QtCore.SIGNAL('clicked()'),self.Apply)
self.connect(ok_button,QtCore.SIGNAL('clicked()'),self.ApplyAndClose)
layout.addWidget(dialog_buttons)
self.setCurrent(-1)
#----------------------------------------------------------------------
def ApplyAndClose(self):
#----------------------------------------------------------------------
self.Apply(1)
#----------------------------------------------------------------------
def Apply(self,close=0):
#----------------------------------------------------------------------
#print 'editPlugins.Apply',close
name = str(self.name.text())
name_list = name.strip().split()
if not len(name_list):
return
name = name_list[0]
for item in name_list[1:]: name = name + '_' + item
extensions0 = (str(self.extensions.text())).split(',')
extensions = []
for item in extensions0:
extentions1 = item.split(' ')
for ext in extentions1:
extensions.append(ext.strip().strip('.'))
#print 'EditPlugins,Apply',extensions
if not len(extensions):
return
label = str(self.plugin_label.text())
viewer = str(self.viewer.text())
if not viewer:
return
arguments = str(self.arguments.text())
addSupportedPlugin(name,extensions,label,viewer,arguments)
self.loadSelectPlugin()
self.emit(QtCore.SIGNAL('changed'))
if close: self.Close()
def handleNew(self):
self.setCurrent(-1)
#----------------------------------------------------------------------
def deletePlugin(self):
#----------------------------------------------------------------------
name = self.getNameFromList(self.selectPlugin.currentRow())
if name and mgFileViewer.supported_plugins.has_key(name):
del mgFileViewer.supported_plugins[name]
self.loadSelectPlugin()
self.setCurrent(-1)
self.emit(QtCore.SIGNAL('changed'))
#----------------------------------------------------------------------
def loadSelectPlugin(self):
#----------------------------------------------------------------------
self.selectPlugin.blockSignals(True)
self.selectPlugin.clear()
for key,info in mgFileViewer.supported_plugins.items():
#text = key + ' ' + info.get('label',' ') + ' ' + info.get('viewer',' ')
text = key + ' ' + info.get('viewer',' ')
self.selectPlugin.addItem(text)
self.selectPlugin.addItem('New plugin..')
self.selectPlugin.blockSignals(False)
#----------------------------------------------------------------------
def setCurrent(self,vid):
#----------------------------------------------------------------------
name = self.getNameFromList(vid)
#print 'setCurrent vid',vid,name
if not name:
# Out of range so set to 'new' vector
self.setRow(self.selectPlugin.count()-1)
self.name.setText('')
self.extensions.setText('')
self.plugin_label.setText('')
self.viewer.setText('')
self.arguments.setText('')
self.current = -1
else:
self.setRow(vid)
info = mgFileViewer.supported_plugins.get(name,{})
self.name.setText(name)
ext_list = info.get('ext_list',[])
ext_text = ''
for item in ext_list: ext_text = ext_text+item+','
if ext_list: ext_text = ext_text[0:-1]
self.extensions.setText(ext_text)
self.plugin_label.setText(info.get('label',''))
self.viewer.setText(info.get('viewer',''))
self.arguments.setText(info.get('arguments',''))
self.current = vid
#----------------------------------------------------------------------
def setRow(self,irow):
#----------------------------------------------------------------------
if irow == self.selectPlugin.currentRow(): return
self.selectPlugin.blockSignals(True)
self.selectPlugin.setCurrentRow(irow)
self.selectPlugin.blockSignals(False)
#----------------------------------------------------------------------
def getNameFromList(self,irow):
#----------------------------------------------------------------------
#print 'getNameFromList',irow,self.selectPlugin.count()
if irow<0 or irow>=self.selectPlugin.count():
return ''
text = str(self.selectPlugin.item(irow).text())
#print 'getNameFromList text',text
if text == 'New plugin..':
return ''
else:
return text.split()[0]