#/*##########################################################################
#
# The PyMca X-Ray Fluorescence Toolkit
#
# Copyright (c) 2004-2014 European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "V. Armando Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
from PyMca5.PyMcaGui import PyMcaQt as qt
from PyMca5.PyMcaPhysics.xrf import ElementHtml
from PyMca5.PyMcaPhysics.xrf import Elements
from PyMca5.PyMcaGui.physics.xrf.QPeriodicTable import QPeriodicTable
__revision__ = "$Revision: 1.15 $"
DEBUG = 0
CLOSE_ICON =[
"16 16 18 1",
". c None",
"d c #000000",
"c c #080808",
"k c #080c08",
"b c #181818",
"a c #212021",
"# c #212421",
"j c #292829",
"e c #313031",
"f c #393839",
"i c #424542",
"m c #525152",
"h c #525552",
"g c #5a595a",
"l c #636163",
"p c #6b696b",
"n c #7b797b",
"o c #ffffff",
"................",
"................",
"......#abcd.....",
"....efghijkdd...",
"...elmgnliaddd..",
"...fmoopnhoodd..",
"..#ggooogoooddd.",
"..ahnpooooocddd.",
"..bilngoooadddd.",
"..cjihooooodddd.",
"..dkaoooaoooddd.",
"...ddoocddoodd..",
"...ddddddddddd..",
"....ddddddddd...",
"......ddddd.....",
"................"
]
[docs]class ElementsInfo(qt.QWidget):
def __init__(self, parent=None, name="Elements Info"):
qt.QWidget.__init__(self, parent)
self.setWindowTitle(name)
layout = qt.QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
self.energyValue = None
self.splitter = qt.QSplitter(self)
layout.addWidget(self.splitter)
self.splitter.setOrientation(qt.Qt.Horizontal)
self.table = QPeriodicTable(self.splitter)
self.html = ElementHtml.ElementHtml()
self.infoWidget = None
self.table.setMinimumSize(500,
400)
self.table.sigElementClicked.connect(self.elementClicked)
self.lastElement = None
Elements.registerUpdate(self._updateCallback)
[docs] def elementClicked(self, symbol):
if self.infoWidget is None:
self.__createInfoWidget(symbol)
else:
self.infoText.clear()
self.infoText.insertHtml(self.html.gethtml(symbol))
if self.infoWidget.isHidden():
self.infoWidget.show()
self.lastElement = symbol
self.infoWidget.setWindowTitle(symbol)
self.infoWidget.raise_()
def __createInfoWidget(self,symbol=""):
#Dock window like widget
frame = qt.QWidget(self.splitter)
layout = qt.QVBoxLayout(frame)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
#The dock functionnality
toolbar = qt.QWidget(frame)
layout.addWidget(toolbar)
layout1 = qt.QHBoxLayout(toolbar)
layout1.setContentsMargins(0, 0, 0, 0)
layout1.setSpacing(0)
# --- the line
self.line1 = Line(toolbar)
self.line1.setFrameShape(qt.QFrame.HLine)
self.line1.setFrameShadow(qt.QFrame.Sunken)
self.line1.setFrameShape(qt.QFrame.HLine)
layout1.addWidget(self.line1)
# --- the close button
self.closelabel = PixmapLabel(toolbar)
self.closelabel.setPixmap(qt.QPixmap(CLOSE_ICON))
layout1.addWidget(self.closelabel)
self.closelabel.setSizePolicy(qt.QSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed))
# --- connections
self.line1.sigLineDoubleClickEvent.connect(self.infoReparent)
self.closelabel.sigPixmapLabelMousePressEvent.connect(self.infoToggle)
# --- The text edit widget
w= qt.QWidget(frame)
layout.addWidget(w)
l=qt.QVBoxLayout(w)
l.setContentsMargins(0, 0, 0, 0)
l.setSpacing(0)
hbox = qt.QWidget(w)
hbox.layout = qt.QHBoxLayout(hbox)
hbox.layout.setContentsMargins(0, 0, 0, 0)
hbox.layout.setSpacing(0)
l.addWidget(hbox)
hbox.layout.addWidget(qt.HorizontalSpacer(hbox))
l1=qt.QLabel(hbox)
l1.setText('<b><nobr>Excitation Energy (keV)</nobr></b>')
self.energy=MyQLineEdit(hbox)
self.energy.setFixedWidth(self.energy.fontMetrics().width('#####.###'))
self.energy.setText("")
hbox.layout.addWidget(l1)
hbox.layout.addWidget(self.energy)
hbox.layout.addWidget(qt.HorizontalSpacer(hbox))
self.energy.editingFinished[()].connect(self._energySlot)
#if both signals are emitted and there is an error then we are in an
#endless loop
#self.connect(self.energy, qt.SIGNAL('focusOut'), self._energySlot)
self.infoText = qt.QTextEdit(w)
self.infoText.setReadOnly(1)
self.infoText.clear()
self.infoText.insertHtml(self.html.gethtml(symbol))
l.addWidget(self.infoText)
w.show()
self.infoWidget=frame
frame.show()
[docs] def infoReparent(self):
if self.infoWidget.parent() is not None:
self.infoWidget.setParent(None)
self.infoWidget.move(self.cursor().pos())
self.infoWidget.show()
#,self.cursor().pos(),1)
else:
self.infoWidget.setParent(self.splitter)
self.splitter.insertWidget(1,self.infoWidget)
#,qt.QPoint(),1)
#self.splitter.moveToFirst(self.sourceFrame)
self.infoWidget.setFocus()
[docs] def infoToggle(self,**kw):
if DEBUG:
print("toggleSource called")
if self.infoWidget.isHidden():
self.infoWidget.show()
self.infoWidget.raiseW()
else:
self.infoWidget.hide()
def _energySlot(self):
string = str(self.energy.text())
if len(string):
try:
value = float(string)
except:
msg=qt.QMessageBox(self.energy)
msg.setIcon(qt.QMessageBox.Critical)
msg.setText("Invalid Float")
msg.exec_()
self.energy.setFocus()
return
if self.energyValue is not None:
if value != self.energyValue:
self.energyValue = value
Elements.updateDict(energy=value)
else:
self.energyValue = value
Elements.updateDict(energy=value)
self.energy.setPaletteBackgroundColor(qt.QColor('white'))
self.infoWidget.setFocus()
else:
self.energyValue = None
self.energy.setText("")
def _updateCallback(self):
if self.lastElement is not None:
self.elementClicked(self.lastElement)
if Elements.Element[self.lastElement]['buildparameters']['energy'] is not None:
self.energy.setText("%.3f" % Elements.Element[self.lastElement]['buildparameters']['energy'])
else:
self.energy.setText("")
[docs]class Line(qt.QFrame):
sigLineDoubleClickEvent = qt.pyqtSignal(object)
[docs] def mouseDoubleClickEvent(self,event):
if DEBUG:
print("Double Click Event")
ddict={}
ddict['event']="DoubleClick"
ddict['data'] = event
self.sigLineDoubleClickEvent.emit(ddict)
[docs]class PixmapLabel(qt.QLabel):
sigPixmapLabelMousePressEvent = qt.pyqtSignal(object)
[docs] def mousePressEvent(self,event):
if DEBUG:
print("Mouse Press Event")
ddict={}
ddict['event']="MousePress"
ddict['data'] = event
self.sigPixmapLabelMousePressEvent.emit(ddict)
[docs]class MyQLineEdit(qt.QLineEdit):
sigFocusOut = qt.pyqtSignal()
def __init__(self,parent=None,name=None):
qt.QLineEdit.__init__(self,parent)
[docs] def setPaletteBackgroundColor(self, color):
palette = self.palette()
role = self.backgroundRole()
palette.setColor(role,color)
self.setPalette(palette)
[docs] def focusInEvent(self,event):
self.setPaletteBackgroundColor(qt.QColor('yellow'))
[docs] def focusOutEvent(self,event):
self.setPaletteBackgroundColor(qt.QColor('white'))
self.sigFocusOut.emit()
[docs]def main():
app = qt.QApplication([])
winpalette = qt.QPalette(qt.QColor(230,240,249),qt.QColor(238,234,238))
app.setPalette(winpalette)
w= ElementsInfo()
w.show()
app.exec_()
if __name__ == "__main__":
main()