[SCM] framework for TANGO control system client applications branch, master, updated. debian/3.0.0-2-27-gf14e774
Picca Frédéric-Emmanuel
picca at debian.org
Thu Jul 25 20:24:54 UTC 2013
The following commit has been merged in the master branch:
commit 0110f7def108658b193012aa4a0233cd9217fb62
Author: Picca Frédéric-Emmanuel <picca at debian.org>
Date: Thu Jul 25 21:09:35 2013 +0200
Imported Upstream version 3.1.0
diff --git a/PKG-INFO b/PKG-INFO
index 5f15af1..eef8eef 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,10 +1,10 @@
Metadata-Version: 1.1
Name: taurus
-Version: 3.0.1
+Version: 3.1.0
Summary: A library designed to provide an abstraction layer over PyTango.
Home-page: http://packages.python.org/taurus
-Author: Tiago Coutinho
-Author-email: tcoutinho at cells.es
+Author: Carlos Pascual-Izarra
+Author-email: cpascual at cells.es
License: LGPL
Download-URL: http://pypi.python.org/packages/source/t/taurus
Description: Taurus stands for TAngo User interface 'R' US. It
diff --git a/doc/auto_rst4api.py b/doc/auto_rst4api.py
index 9d885b2..0757dee 100644
--- a/doc/auto_rst4api.py
+++ b/doc/auto_rst4api.py
@@ -27,9 +27,14 @@
''' Creates a tree of dirs and restructured text stub files for documenting
the API of a python module with sphinx'''
-import sys, os, inspect, glob, re
+import sys, os
from jinja2 import Environment, FileSystemLoader
+#import ModuleExplorer from "../tests/modulexplorer.py"
+from imp import load_source
+mpath = os.path.abspath(os.path.join(os.path.dirname(__file__),os.path.pardir,'tests','moduleexplorer.py'))
+ModuleExplorer = load_source('moduleexplorer', mpath).ModuleExplorer
+
class Auto_rst4API_Creator(object):
AUTOGEN_SIGNATURE = '.. AUTO_RST4API'
@@ -42,49 +47,18 @@ class Auto_rst4API_Creator(object):
:param moduletemplate: (str) name of the template to be used for module pages
:param classtemplate: (str) name of the template to be used for class pages
:param classindextemplate: (str) name of the template to be used for class index page
- :param exclude_patterns: (seq<str>) sequence of strings containing regexp
- patterns. Each candidate to be documented will be
- matched against these patterns and will be excluded
- from documentation if it matches any of them.
:param verbose: (bool) If True (default) status messages will be printed to stdout
'''
+
+ self.verbose = verbose
+ self.exclude_patterns = exclude_patterns
+
self.env = Environment(loader=FileSystemLoader(templatespath))
self.moduletemplate = self.env.get_template(moduletemplate)
self.classtemplate = self.env.get_template(classtemplate)
self.classindextemplate = self.env.get_template(classindextemplate)
- self.exclude_patterns = [re.compile(p) for p in exclude_patterns]
- self.verbose = verbose
self.overwrite_old = overwrite_old
- def _matchesAnyPattern(self, name, paterns):
- for p in paterns:
- if re.match(p,name) is not None:
- if self.verbose: print 'excluding "%s"'%name
- return True
- return False
-
- def _getlocalmembernames(self, module, predicate=None):
- ret =[]
- modulepath, tail = os.path.split(inspect.getabsfile(module))
- for n,v in inspect.getmembers(module, predicate):
- if inspect.isbuiltin(v):
- continue #ignore builtin functions
- try:
- memberpath, tail = os.path.split(inspect.getabsfile(v))
- except TypeError:
- continue #ignore builtin modules
- if memberpath == modulepath:
- ret.append(n)
- return ret
-
- def _getSubmodulesFromPath(self, modulepath):
- g = glob.glob(os.path.join(modulepath,'*','__init__.py'))
- ret = [re.findall(r".+\/(.*)\/__init__.py", s)[0] for s in g]
- return ret
-
- def _isclass_with_init(self, obj):
- return inspect.isclass(obj) and hasattr(obj,'__init__')
-
def _isautogeneratedfile(self, fname):
ret = False
f = open(fname,'r')
@@ -97,10 +71,6 @@ class Auto_rst4API_Creator(object):
return ret
- def _isenumeration(self, obj):
-# return isinstance(obj, taurus.core.util)
- return False #@todo
-
def cleanAutogenerated(self, apipath):
'''Removes any previously autogenerated rst file in the given path
or its subdirectories
@@ -117,16 +87,6 @@ class Auto_rst4API_Creator(object):
os.remove(fullname)
except Exception, e:
print 'Error accessing %s:%s'%(fullname,repr(e))
-
- def getAll(self, info, key):
- mname = info['modulename']
- try:
- ret = [(mname,el) for el in info[key]]
- except KeyError:
- return []
- for sminfo in info['submodules'].itervalues():
- ret += self.getAll(sminfo,key)
- return ret
def createClassIndex(self, info, ofname ):
'''
@@ -137,7 +97,7 @@ class Auto_rst4API_Creator(object):
:meth:`exploreModule`
:param ofname: (str) output file name
'''
- classes = self.getAll(info, 'localclassnames') #this is a list of tuples of (modulename,class)
+ classes = ModuleExplorer.getAll(info, 'localclassnames') #this is a list of tuples of (modulename,class)
classes = sorted(classes, key=lambda item: item[1]) #sort it by class name
classes = ['.'.join((m,c)) for m,c in classes] # make a full classname
if self.verbose: print 'creating "%s" ...'%ofname,
@@ -149,68 +109,6 @@ class Auto_rst4API_Creator(object):
if self.verbose: print ' ok.'
else:
if self.verbose: print ' skipping (file already exists)'
-
-
- def exploreModule(self, modulename):
- '''Recursive function that gathers info on a module and all its submodules.
-
- :param modulename: the name of the module to explore
-
- :return: (dict<str,object>) a dictionary containing submodulenames,
- localclassnames, localfunctionnames, localenumerationnames,
- externalmembernames, submodules, warnings
- '''
- if self.verbose: print "Exploring %s..."%modulename
- warnings = []
- try:
- module = __import__(modulename, fromlist = [''])
- except Exception,e:
- msg = 'exploreModule: WARNING: skipping documentation for %s. Reason: %s'%(modulename,repr(e))
- warnings.append(msg)
- if self.verbose: print msg
- return dict(modulename = modulename,
- basemodulename = modulename.split('.')[-1],
- modulepath = None,
- submodulenames = [],
- localclassnames = [],
- localfunctionnames = [],
- localenumerationnames = [],
- externalmembernames = [],
- submodules = {},
- warnings = warnings)
- modulepath, tail = os.path.split(inspect.getabsfile(module))
-
- submodulenames = sorted(self._getSubmodulesFromPath(modulepath))
- localclassnames = sorted(self._getlocalmembernames(module, self._isclass_with_init))
- localfunctionnames = sorted(self._getlocalmembernames(module, inspect.isfunction))
- localenumerationnames = sorted([])#@todo
- externalmembernames = sorted([]) #@todo
-# localmembers = list(submodules) + localfunctionnames + localclassnames + localenumerationnames
-# externalmembers = [n for n,v in inspect.getmembers(object) if (n not in localmembers and not n.startswith('_'))]
-
- #filter out excluded members
- submodulenames = [n for n in submodulenames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
- localclassnames = [n for n in localclassnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
- localfunctionnames = [n for n in localfunctionnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
- localenumerationnames = [n for n in localenumerationnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
- externalmembernames = [n for n in externalmembernames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-
- #recurse
- submodules = {}
- for n in submodulenames:
- sm_name = '.'.join((modulename, n))
- submodules[n] = self.exploreModule(sm_name)
-
- return dict(modulename = modulename,
- basemodulename = modulename.split('.')[-1],
- modulepath = modulepath,
- submodulenames = submodulenames,
- localclassnames = localclassnames,
- localfunctionnames = localfunctionnames,
- localenumerationnames = localenumerationnames,
- externalmembernames = externalmembernames,
- submodules = submodules,
- warnings = warnings)
def createStubs(self, info, docparentpath):
'''creates rst stub files for modules and classes according to the
@@ -253,7 +151,7 @@ class Auto_rst4API_Creator(object):
for sminfo in info['submodules'].itervalues():
self.createStubs(sminfo, absdocpath)
- def documentModule(self, modulename, docparentpath):
+ def documentModule(self, modulename, docparentpath, exclude_patterns=()):
'''
recursive function that walks on the module structure and generates
documentation files for the given module and its submodules. It also
@@ -262,95 +160,20 @@ class Auto_rst4API_Creator(object):
:param modulename: (str) name of the module to document
:docparentpath: (str) path to the directory in which the documentation
files will be written
+ :param exclude_patterns: (seq<str>) sequence of strings containing regexp
+ patterns. Each candidate to be documented will be
+ matched against these patterns and will be excluded
+ if it matches any of them.
:return: (list<str>) list of warning messages
'''
- if self.verbose: print "\nDocumenting %s..."%modulename
- moduleinfo = self.exploreModule(modulename)
+ if self.verbose: print "\nDocumenting %s..."%modulename
+ moduleinfo, w = ModuleExplorer.explore(modulename, exclude_patterns=self.exclude_patterns, verbose=self.verbose)
self.createStubs(moduleinfo, docparentpath)
self.createClassIndex(moduleinfo, os.path.join(docparentpath,"%s_AllClasses.rst"%modulename))
- w=self.getAll(moduleinfo, 'warnings')
if len (w) == 0: return []
else: return zip(*w)[1]
-
-
-
-# def document_module_OLD(self, modulename, docparentpath):
-# '''
-# recursive function that walks on the module structure and generates
-# documentation files for the given module and its submodules
-#
-# :param modulename: (str) name of the module to document
-# :docparentpath: (str) path to the directory in which the documentation
-# files will be written
-#
-# :return: (list<str>) list of warning messages
-# '''
-# if self.verbose: print "\nDocumenting %s..."%modulename
-# try:
-# module = __import__(modulename, fromlist = [''])
-# except Exception,e:
-# msg = 'WARNING: skipping documentation for %s. Reason: %s'%(modulename,repr(e))
-# self.warnings.append(msg)
-# if self.verbose: print msg
-# return self.warnings
-# modulepath, tail = os.path.split(inspect.getabsfile(module))
-# basemodulename = modulename.split('.')[-1]
-# absdocpath = os.path.join(docparentpath, basemodulename)
-#
-# submodules = self._getSubmodulesFromPath(modulepath)
-# localclassnames = self._getlocalmembernames(module, self._isclass_with_init)
-# localfunctionnames = self._getlocalmembernames(module, inspect.isfunction)
-# localenumerationnames = []#@todo
-# externalmembers = [] #@todo
-## localmembers = list(submodules) + localfunctionnames + localclassnames + localenumerationnames
-## externalmembers = [n for n,v in inspect.getmembers(object) if (n not in localmembers and not n.startswith('_'))]
-#
-# #filter out excluded members
-# submodules = [n for n in submodules if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-# localclassnames = [n for n in localclassnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-# localfunctionnames = [n for n in localfunctionnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-# localenumerationnames = [n for n in localenumerationnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-# externalmembers = [n for n in externalmembers if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-#
-# #create the module doc dir if it didn't exist
-# if not os.path.exists(absdocpath):
-# os.makedirs(absdocpath, mode=0755)
-# #create module index stub in doc parent dir
-# text = self.moduletemplate.render(modulename=modulename,
-# basemodulename=basemodulename,
-# submodules=submodules,
-# localclassnames=localclassnames,
-# localfunctionnames=localfunctionnames,
-# localenumerationnames=localenumerationnames,
-# externalmembers = externalmembers
-# )
-# ofname = os.path.join(docparentpath,"%s.rst"%basemodulename)
-# if self.verbose: print 'creating "%s" ...'%ofname,
-# if os.path.exists(ofname) and self._isautogeneratedfile(ofname):
-# if self.verbose: print ' skipping (manually edited file already exists)'
-# else:
-# f = open(ofname, "w")
-# f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
-# f.close()
-# if self.verbose: print ' ok.'
-# #create class stubs
-# for name in localclassnames:
-# text = self.classtemplate.render(classname=name, modulename=modulename)
-# ofname = os.path.join(absdocpath,"_%s.rst"%name)
-# if self.verbose: print 'creating "%s" ...'%ofname,
-# if os.path.exists(ofname) and self._isautogeneratedfile(ofname):
-# if self.verbose: print ' skipping (manually edited file already exists)'
-# else:
-# f = open(ofname, "w")
-# f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
-# f.close()
-# if self.verbose: print ' ok.'
-# #recurse for submodules
-# for sm in submodules:
-# sm_name = '.'.join((modulename, sm))
-# self.documentModule(sm_name, absdocpath)
-# return self.warnings
+
def main():
import sys
@@ -358,12 +181,12 @@ def main():
print 'Usage:\n\t%s modulename docpreffix\n\n'%sys.argv[0]
sys.exit(1)
modulename, docparentpath = sys.argv[1:]
- creator = Auto_rst4API_Creator(exclude_patterns = ['.*/ui'], verbose=True)
- r = creator.documentModule(modulename, docparentpath)
+ creator = Auto_rst4API_Creator(verbose=True)
+ r = creator.documentModule(modulename, docparentpath, exclude_patterns = ['.*/ui'])
print '\n\n'+'*'*50
print "Auto Creation of API docs for %s Finished with %i warnings:"%(modulename,len(r))
print '\n'.join(r)
print '*'*50+'\n'
-if __name__ == "__main__":
+if __name__ == "__main__":
main()
\ No newline at end of file
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 6498c64..adc3fea 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -244,6 +244,6 @@ intersphinx_mapping = {
'http://docs.scipy.org/doc/scipy/reference' : None,
'http://docs.scipy.org/doc/numpy' : None,
'http://www.tango-controls.org/static/PyTango/latest/doc/html' : None,
- 'http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html' : None,
+ 'http://pyqt.sourceforge.net/Docs/PyQt4/' : None,
}
diff --git a/doc/source/devel/coding_guide.rst b/doc/source/devel/coding_guide.rst
index 2bfd2b1..f514bbc 100644
--- a/doc/source/devel/coding_guide.rst
+++ b/doc/source/devel/coding_guide.rst
@@ -14,21 +14,32 @@ development of taurus. So if you want to help out, read on!
How to contribute to taurus
----------------------------
-Taurus development is done using SVN. Because taurus is part of Tango_, it uses
-its `tango-cs sourceforge project <https://sourceforge.net/projects/tango-cs/>`_
-to host the source code. This makes it easy for people to contribute to the
-development of taurus.
+Taurus is part of Tango_ and, more specifically, part of Sardana_. Until release
+3.1 (included) the development of Taurus was managed within the `tango-cs
+sourceforge project <https://sourceforge.net/projects/tango-cs/>`_ and its
+source code was hosted in the Tango SVN repository. Starting from right after
+the Taurus 3.1 release, the source code hosting and general project management
+(tickets, mailing list, etc) will be managed within the Sardana `Sardana
+sourceforge project <https://sourceforge.net/projects/sardana/>`_. The Sardana
+project itself is in the process of migrating its source code hosting from SVN
+to Git and consequently, Taurus code will be hosted on a Git repository after
+the release of Taurus 3.1.
+
How to checkout taurus from SVN
-------------------------------
+.. warning:: These instructions will become obsolete as soon as Taurus 3.1
+ is released because the code development will be moved from SVN to
+ Git. Updated instructions for using Git will be posted ASAP.
+
**For read-only**::
- svn co https://tango-cs.svn.sourceforge.net/svnroot/tango-cs/taurus/trunk taurus
+ svn co https://svn.code.sf.net/p/tango-cs/code/gui/taurus/trunk taurus
**To being able to commit**::
- svn co https://<user name>@tango-cs.svn.sourceforge.net/svnroot/tango-cs/taurus/trunk taurus
+ svn co https://<user name>@svn.code.sf.net/p/tango-cs/code/gui/taurus/trunk taurus
.. note::
@@ -195,6 +206,7 @@ PyQt4/PySide versions.
:func:`~taurus.qt.Qt.from_qvariant`.)
.. _Tango: http://www.tango-controls.org/
+.. _Sardana: http://www.sardana-controls.org/
.. _tango_cs: https://sourceforge.net/projects/tango-cs/
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
.. _Sphinx: http://sphinx.pocoo.org/
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 07ef451..2354fd8 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -10,15 +10,16 @@ Welcome to Taurus's |version| documentation!
.. sidebar:: Latest news
+
+ 2013-07-25
+ Taurus 3.1.0 released!
+
2012-04-24
Taurus 3.0.0 released!
2011-03-23
Taurus 2.1.1 released!
- 2011-03-22:
- Taurus 2.1.0 released!
-
Taurus is a python framework for both CLI and GUI tango applications. It is
build on top of PyTango_ and PyQt_. Taurus stands for TAngo User interface 'R' US.
diff --git a/doc/source/users/getting_started.rst b/doc/source/users/getting_started.rst
index c8a953a..c4c7507 100644
--- a/doc/source/users/getting_started.rst
+++ b/doc/source/users/getting_started.rst
@@ -10,8 +10,21 @@ Getting started
Installing
----------
-Linux
-~~~~~
+Linux (Debian-based)
+~~~~~~~~~~~~~~~~~~~~
+
+Since v3.0, Taurus is part of the official repositories of Debian (and Ubuntu
+and other Debian-based distros). You can install it and all its dependencies by
+doing (as root)::
+
+ aptitude install python-taurus
+
+(see more detailed instructions in `this step-by-step howto
+<https://sourceforge.net/p/sardana/wiki/Howto-SardanaFromScratch/>`__)
+
+
+Linux (generic)
+~~~~~~~~~~~~~~~
#. Download the latest version of taurus from http://pypi.python.org/pypi/taurus
#. Extract the downloaded tar.gz into a temporary directory
@@ -56,9 +69,13 @@ necessary to run taurus on your windows machine
Working from SVN
----------------
+.. warning:: These instructions will become obsolete as soon as Taurus 3.1
+ is released because the code development will be moved from SVN to
+ Git. Updated instructions for using Git will be posted ASAP.
+
You can checkout taurus from SVN from the following location::
- svn co http://tango-cs.svn.sourceforge.net/svnroot/tango-cs/gui/taurus/trunk taurus
+ svn co https://svn.code.sf.net/p/tango-cs/code/gui/taurus/trunk taurus taurus
Afterward, if you decide to work directly from SVN code (without installing):
@@ -135,18 +152,17 @@ Optional packages
python -c 'import PyQt4.Qwt5; print PyQt4.Qwt5.QWT_VERSION_STR'
-- The image widgets are only available if you have Qub_. Qub_ is a graphical
- library provided by the BLISS group in ESRF_.
- You may already have Qub_ installed. You will need Qub for qt4.
- You can check it by doing::
-
- python -c 'import Qub'
+- The image widgets are provided by the guiqwt_ library. The widgets based on
+ this library replace the previously used Qub_-based image widget which is now
+ considered deprecated in Taurus
- The Gauge widgets are only available if you have the python extension of
qtcontrols. qtcontrols is part of QTango_.
- The JDraw synoptics widgets are only available if you have the :mod:`ply`
package installed.
+
+- The NeXus browser widget is only available if you have PyMca_ installed
.. _numpy: http://numpy.scipy.org/
@@ -159,6 +175,7 @@ Optional packages
.. _Qt: http://qt.nokia.com/products/
.. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/
.. _PyQwt: http://pyqwt.sourceforge.net/
+.. _guiqwt: http://code.google.com/p/guiqwt/
.. _IPython: http://ipython.scipy.org/
.. _Qub: http://www.blissgarden.org/projects/qub/
-.. _ESRF: http://www.esrf.eu/
+.. _PyMca: http://pymca.sourceforge.net/
diff --git a/doc/source/users/introduction.rst b/doc/source/users/introduction.rst
index 7a72cf6..df1536f 100644
--- a/doc/source/users/introduction.rst
+++ b/doc/source/users/introduction.rst
@@ -4,16 +4,31 @@
Introduction
============
-taurus is a library for connecting client side applications (CLIs and GUIs) to
-Tango_ device servers. It is built on top of PyTango_ which is a python binding
-for the Tango_ library. It provides an abstraction layer that allows Tango to
-be accessed in a pythonic, object oriented way. For the GUI part, taurus is built
+taurus was originally conceived as a library for connecting client side
+applications (CLIs and GUIs) to Tango_ device servers.
+
+.. note:: More recently, the scope of Taurus
+ has been broadened and it is moving towards supporting pluggins for
+ other control systems (e.g. Epics_, Spec_...). While many concepts of
+ Taurus Design are heavily influenced by the Tango philosophy, the goal
+ is to eventually provide a control-system agnostic API allowing
+ different control systems to be used even simultaneously.
+ Nevertheless, due to its Tango roots, this documentation may assume
+ that you are using Tango.
+
+Taurus is developed as a part of the Sardana_ project, which aims to provide an
+integrated SCADA, but it can be used independently of the rest of Sardana.
+
+For its Tango interface, Taurus uses PyTango_ which is a python binding
+for the Tango_ library. It provides an abstraction layer that allows Tango to be
+accessed in a pythonic, object oriented way. For the GUI part, taurus is built
on top of the graphical library PyQt_ which is a python binding for Qt_.
The goals of this library are:
- - provide a simple Tango API to the end-user application
- - speed up development of tango based applications
+ - provide a simple Tango (and other control systems) API to the end-user application
+ - speed up development of tango (and other control systems) based applications
- provide a standardized look-and-feel
+
For example, to display the values of four attributes (state, position, velocity, acceleration)
of a device (motor/icepap/01)::
@@ -51,7 +66,7 @@ Throughout the documentation we will assume that you have a basic knowledge of
Tango_/PyTango_ and Qt_/PyQt_.
Although taurus is written primarily in pure python, it makes heavy use of
-PyTango_, numpy_, Qub_, PyQt_ and PyQwt_ to provide good performance even when
+PyTango_, numpy_, PyQt_ and PyQwt_ to provide good performance even when
large amounts of data are involved.
taurus is designed with the philosophy that you should be able to create simple
@@ -67,12 +82,16 @@ find many concepts familiar.
:scale: 80
:align: center
-The taurus library is divided into two parts: the core module which handles all
-interaction with PyTango_ (:ref:`taurus-core-tutorial`) and the widget module which
-provides a collection of widgets that can be used inside any PyQt_ based GUI
-(:ref:`taurus-widget-tutorial`).
+The taurus library provides a core module that does not depend on PyQt and which
+is in charge of abstracting the lower level comunication with the control system
+(:ref:`taurus-core-tutorial`). On top of the core, the qt module provides a
+collection of widgets that can be used inside any PyQt_ based GUI
+(:ref:`examples`). Recently, the proof-of-concept web module is being
+implemented for providing web widgets.
+.. _Sardana: http://www.sardana-controls.org/
.. _Tango: http://www.tango-controls.org/
+.. _Epics: http://www.aps.anl.gov/epics/
.. _PyTango: http://packages.python.org/PyTango/
.. _QTango: http://www.tango-controls.org/download/index_html#qtango3
.. _`PyTango installation steps`: http://packages.python.org/PyTango/start.html#getting-started
diff --git a/doc/source/users/ui/experimentconfiguration.rst b/doc/source/users/ui/experimentconfiguration.rst
index 9e48153..a17af25 100644
--- a/doc/source/users/ui/experimentconfiguration.rst
+++ b/doc/source/users/ui/experimentconfiguration.rst
@@ -10,6 +10,6 @@ Experiment Configuration user interface
.. contents::
.. todo::
- Documentation to be written
+ Experiment Configuration documentation to be written
\ No newline at end of file
diff --git a/doc/source/users/ui/index.rst b/doc/source/users/ui/index.rst
index 8e87f7b..44b9111 100644
--- a/doc/source/users/ui/index.rst
+++ b/doc/source/users/ui/index.rst
@@ -19,6 +19,9 @@ User's Interface
Synoptics <synoptics>
Macros <macros/index>
TaurusGui <taurusgui>
+ Experiment Configuration <experimentconfiguration>
+ Sardana Editor <sardanaeditor>
+
This section explains some features that are common to most applications built
diff --git a/doc/source/users/ui/sardanaeditor.rst b/doc/source/users/ui/sardanaeditor.rst
index 26094b9..56873dc 100644
--- a/doc/source/users/ui/sardanaeditor.rst
+++ b/doc/source/users/ui/sardanaeditor.rst
@@ -10,6 +10,6 @@ Sardana Editor's interface
.. contents::
.. todo::
- Documentation to be written
+ Sardana Editor documentation to be written
\ No newline at end of file
diff --git a/lib/taurus/TaurusCustomSettings.py b/lib/taurus/TaurusCustomSettings.py
index d22dfdb..10f14e1 100644
--- a/lib/taurus/TaurusCustomSettings.py
+++ b/lib/taurus/TaurusCustomSettings.py
@@ -24,25 +24,6 @@
#############################################################################
"""
-This module contains some Taurus-wide default configurations.
-
-The idea is that the final user may edit the values here to customize certain
-aspects of Taurus.
+Deprecation Note: This module has been renamed to "tauruscustomsettings.py
"""
-
-# A map for using custom widgets for certain devices in TaurusForms. It is a
-# dictionary with the following structure:
-# device_class_name:(classname_with_full_module_path, args, kwargs)
-# where the args and kwargs will be passed to the constructor of the class
-T_FORM_CUSTOM_WIDGET_MAP = \
- {'SimuMotor':('taurus.qt.qtgui.extra_pool.PoolMotorTV',(),{}),
- 'Motor':('taurus.qt.qtgui.extra_pool.PoolMotorTV',(),{}),
- 'PseudoMotor':('taurus.qt.qtgui.extra_pool.PoolMotorTV',(),{}),
- 'PseudoCounter':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
- 'CTExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
- 'ZeroDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
- 'OneDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
- 'TwoDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
- 'IORegister':('taurus.qt.qtgui.extra_pool.PoolIORegisterTV',(),{})
- }
-
+raise DeprecationWarning('"TaurusCustomSettings" module has been renamed. Use "tauruscustomsettings" instead')
diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py
index 5412f5f..6862570 100644
--- a/lib/taurus/__init__.py
+++ b/lib/taurus/__init__.py
@@ -26,7 +26,7 @@
"""The main taurus module. It contains a reduced set of wrappers around the
real taurus model classes and information regarding the current release."""
-from .core import Release as __R
+from .core import release as __R
class Release:
pass
diff --git a/lib/taurus/console/enums.py b/lib/taurus/console/enums.py
index 4e0955b..4621895 100644
--- a/lib/taurus/console/enums.py
+++ b/lib/taurus/console/enums.py
@@ -29,7 +29,7 @@ __all__ = ["Alignment"]
__docformat__ = "restructuredtext"
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
#: Flaggable alignment for both horizontal and vertical text
#: Conflicting combinations of flags have undefined meanings.
diff --git a/lib/taurus/core/__init__.py b/lib/taurus/core/__init__.py
index 1010874..6677cbb 100644
--- a/lib/taurus/core/__init__.py
+++ b/lib/taurus/core/__init__.py
@@ -27,25 +27,11 @@
__docformat__ = "restructuredtext"
-import release as Release
-from .enums import *
-from .taurusbasetypes import *
-from .taurusexception import *
-from .taurusmodel import *
-from .tauruslistener import *
-from .taurusdevice import *
-from .taurusattribute import *
-from .taurusconfiguration import *
-from .taurusdatabase import *
-from .taurusfactory import *
-from .taurusmanager import *
-from .taurusoperation import *
-from .tauruspollingtimer import *
-from .taurusvalidator import *
+import taurus.tauruscustomsettings
-# enable compatibility code with tau V1 if tauv1 package is present
-try:
- from .tauv1 import *
-except:
- pass
+LIGHTWEIGHT_IMPORTS = getattr(taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False)
+if LIGHTWEIGHT_IMPORTS:
+ from init_lightweight import *
+else:
+ from init_bkcomp import *
\ No newline at end of file
diff --git a/lib/taurus/core/enums.py b/lib/taurus/core/enums.py
deleted file mode 100644
index c548893..0000000
--- a/lib/taurus/core/enums.py
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus, a Tango User Interface Library
-##
-## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## Taurus is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## Taurus 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.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
-##
-#############################################################################
-
-"""This module contains all basic taurus enumerations"""
-
-__all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode",
- "TaurusSerializationMode", "SubscriptionState", "TaurusEventType",
- "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat",
- "AttrQuality", "AttrAccess", "DisplayLevel", "ManagerState"]
-
-__docformat__ = "restructuredtext"
-
-import util
-
-TaurusSWDevState = util.Enumeration(
-'TaurusSWDevState', (
- 'Uninitialized',
- 'Running',
- 'Shutdown',
- 'Crash',
- 'EventSystemShutdown'
-))
-
-TaurusSWDevHealth = util.Enumeration(
-'TaurusSWDevHealth', (
- 'Exported', # device reported exported
- 'ExportedAlive', # device reported exported and confirmed connection
- 'ExportedNotAlive', # device reported exported but connection failed!!
- 'NotExported', # device didn't report exported
- 'NotExportedAlive', # device didn't report exported but connection confirmed!
- 'NotExportedNotAlive' # device didn't report exported and connection failed
-))
-
-OperationMode = util.Enumeration(
-'OperationMode', (
- 'OFFLINE',
- 'ONLINE'
-))
-
-TaurusSerializationMode = util.Enumeration(
-'TaurusSerializationMode', (
- 'Serial',
- 'Concurrent'
-))
-
-TaurusEventType = util.Enumeration(
-'TaurusEventType', (
- 'Change',
- 'Config',
- 'Periodic',
- 'Error'
-))
-
-MatchLevel = util.Enumeration(
-'MatchLevel', (
- 'ANY',
- 'SHORT',
- 'NORMAL',
- 'COMPLETE',
- 'SHORT_NORMAL',
- 'NORMAL_COMPLETE'
-))
-
-TaurusElementType = util.Enumeration(
-'TaurusElementType', (
- 'Unknown',
- 'Name',
- 'DeviceClass',
- 'Device',
- 'DeviceAlias',
- 'Domain',
- 'Family',
- 'Member',
- 'Server',
- 'ServerName',
- 'ServerInstance',
- 'Exported',
- 'Host',
- 'Attribute',
- 'AttributeAlias',
- 'Command',
- 'Property',
- 'Configuration',
- 'Database',
-))
-
-LockStatus = util.Enumeration(
-'LockStatus', (
- 'Unlocked',
- 'Locked',
- 'LockedMaster',
- 'Unknown',
-))
-
-DataFormat = util.Enumeration(
-'DataFormat', (
- '_0D',
- '_1D',
- '_2D'
-))
-
-DataType = util.Enumeration(
-'DataType', (
- 'Integer',
- 'Float',
- 'String',
- 'Boolean',
-))
-
-SubscriptionState = util.Enumeration(
-"SubscriptionState", (
- "Unsubscribed",
- "Subscribing",
- "Subscribed",
- "PendingSubscribe"
-))
-
-#################
-# Not in use yet:
-
-AttrQuality = util.Enumeration(
-'AttrQuality', (
- 'ATTR_VALID',
- 'ATTR_INVALID',
- 'ATTR_ALARM'
-))
-
-AttrAccess = util.Enumeration(
-'AttrAccess', (
- 'READ',
- 'READ_WITH_WRITE',
- 'WRITE',
- 'READ_WRITE'
-))
-
-DisplayLevel = util.Enumeration(
-'DisplayLevel', (
- 'OPERATOR',
- 'EXPERT',
- 'DEVELOPER'
-))
-
-ManagerState = util.Enumeration(
-'ManagerState', (
- 'UNINITIALIZED',
- 'INITED',
- 'CLEANED'
-))
-
-
diff --git a/lib/taurus/core/epics/__init__.py b/lib/taurus/core/epics/__init__.py
index 2480adf..56dd24a 100644
--- a/lib/taurus/core/epics/__init__.py
+++ b/lib/taurus/core/epics/__init__.py
@@ -38,8 +38,8 @@ The Epics extension implements :mod:`taurus.core` objects that connect to Epics
objects. The scheme prefix for epics objects is 'epics://'.
You should never create objects of epics classes directly. Instead you
-should use the :class:`taurus.core.TaurusManager` and :class:`taurus.core.TaurusFactory` APIs
-to access all elements.
+should use the :class:`taurus.core.taurusmanager.TaurusManager` and
+:class:`taurus.core.taurusmanager.TaurusFactory` APIs to access all elements.
For example, to get a reference to the epics process variable (PV) "my:example.RBV" you
should do something like::
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/epics/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/epics/__taurus_plugin__
diff --git a/lib/taurus/core/epics/epicsfactory.py b/lib/taurus/core/epics/epicsfactory.py
index 6d6a29f..b6922ea 100644
--- a/lib/taurus/core/epics/epicsfactory.py
+++ b/lib/taurus/core/epics/epicsfactory.py
@@ -34,17 +34,29 @@ __all__ = ['EpicsFactory', 'EpicsDatabase', 'EpicsDevice',
import time, re, weakref
import numpy
-import taurus.core
-from taurus.core.taurusexception import TaurusException
-import taurus.core.util
-from taurus.core import MatchLevel, TaurusSWDevState, SubscriptionState, TaurusEventType
+
+from taurus import Factory
+from taurus.core.taurusexception import TaurusException, DoubleRegistration
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.log import Logger
+from taurus.core.taurusbasetypes import MatchLevel, TaurusSWDevState, \
+ SubscriptionState, TaurusEventType, TaurusAttrValue, TaurusTimeVal, \
+ AttrQuality
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from taurus.core.tauruspollingtimer import TaurusPollingTimer
+
try:
import epics
except ImportError: #note that if epics is not installed the factory will not be available
- taurus.core.util.debug('cannot import epics module. Taurus will not support the "epics" scheme')
- raise
+ from taurus.core.util.log import debug
+ debug('cannot import epics module. Taurus will not support the "epics" scheme')
+ #raise
-class AbstractEpicsNameValidator(taurus.core.util.Singleton):
+class AbstractEpicsNameValidator(Singleton):
#@todo: provide a mechanism to make base_sep configurable at installation time.
base_sep = ':' #the following characters need to be escaped with "\": ^$()<>[{\|.*+?
name_pattern = ''
@@ -185,7 +197,7 @@ class EpicsConfigurationNameValidator(AbstractEpicsNameValidator):
return names[0].rsplit('?configuration')[0]#remove the "?configuration..." substring from the fullname
-class EpicsDatabase(taurus.core.TaurusDatabase):
+class EpicsDatabase(TaurusDatabase):
'''
Dummy database class for Epics (the Database concept is not used in the Epics scheme)
@@ -199,7 +211,7 @@ class EpicsDatabase(taurus.core.TaurusDatabase):
return "EpicsDatabase object calling %s" % name
-class EpicsDevice(taurus.core.TaurusDevice):
+class EpicsDevice(TaurusDevice):
'''
An Epics device object.
@todo: For the moment is a dummy object. Eventually we may map it to an epics record.
@@ -219,7 +231,7 @@ class EpicsDevice(taurus.core.TaurusDevice):
@classmethod
def factory(cls):
if cls._factory is None:
- cls._factory = taurus.Factory(scheme='epics')
+ cls._factory = Factory(scheme='epics')
return cls._factory
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -244,12 +256,12 @@ class EpicsDevice(taurus.core.TaurusDevice):
else:
self.info("Unexpected value to decode: %s" % str(event_value))
new_sw_state = TaurusSWDevState.Crash
- value = taurus.core.TaurusAttrValue()
+ value = TaurusAttrValue()
value.value = new_sw_state
return value
-class EpicsAttribute(taurus.core.TaurusAttribute):
+class EpicsAttribute(TaurusAttribute):
'''
A :class:`TaurusAttribute` that gives access to an Epics Process Variable.
@@ -260,7 +272,7 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
'''
def __init__(self, name, parent, storeCallback = None):
- self.call__init__(taurus.core.TaurusAttribute, name, parent, storeCallback=storeCallback)
+ self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback)
self.__attr_config = None
self.__pv = epics.PV(self.getNormalName(), callback=self.onEpicsEvent)
@@ -270,7 +282,7 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
self._value = self.decode_pv(self.__pv)
else:
self.info('connection to epics PV failed')
- self._value = taurus.core.TaurusAttrValue()
+ self._value = TaurusAttrValue()
#print "INIT",self.__pv, connected
@@ -322,37 +334,37 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
def decode_pv(self, pv):
"""Decodes an epics pv into the expected taurus representation"""
#@todo: This is a very basic implementation, and things like quality may not be correct
- attr_value = taurus.core.TaurusAttrValue()
+ attr_value = TaurusAttrValue()
attr_value.value = pv.value
if pv.write_access:
attr_value.w_value = pv.value
if pv.timestamp is None:
- attr_value.time = taurus.core.TaurusTimeVal.now()
+ attr_value.time = TaurusTimeVal.now()
else:
- attr_value.time = taurus.core.TaurusTimeVal.fromtimestamp(pv.timestamp)
+ attr_value.time = TaurusTimeVal.fromtimestamp(pv.timestamp)
if pv.severity > 0:
- attr_value.quality = taurus.core.AttrQuality.ATTR_ALARM
+ attr_value.quality = AttrQuality.ATTR_ALARM
else:
- attr_value.quality = taurus.core.AttrQuality.ATTR_VALID
+ attr_value.quality = AttrQuality.ATTR_VALID
attr_value.config.data_format = len(numpy.shape(attr_value.value))
return attr_value
def decode_epics_evt(self, evt):
"""Decodes an epics event (a callback keywords dict) into the expected taurus representation"""
#@todo: This is a very basic implementation, and things like quality may not be correct
- attr_value = taurus.core.TaurusAttrValue()
+ attr_value = TaurusAttrValue()
attr_value.value = evt.get('value')
if evt.get('write_access', False):
attr_value.w_value = attr_value.value
timestamp = evt.get('timestamp', None)
if timestamp is None:
- attr_value.time = taurus.core.TaurusTimeVal.now()
+ attr_value.time = TaurusTimeVal.now()
else:
- attr_value.time = taurus.core.TaurusTimeVal.fromtimestamp(timestamp)
+ attr_value.time = TaurusTimeVal.fromtimestamp(timestamp)
if evt.get('severity', 1) > 0:
- attr_value.quality = taurus.core.AttrQuality.ATTR_ALARM
+ attr_value.quality = AttrQuality.ATTR_ALARM
else:
- attr_value.quality = taurus.core.AttrQuality.ATTR_VALID
+ attr_value.quality = AttrQuality.ATTR_VALID
attr_value.config.data_format = len(numpy.shape(attr_value.value))
return attr_value
@@ -410,7 +422,7 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
-class EpicsConfiguration(taurus.core.TaurusConfiguration):
+class EpicsConfiguration(TaurusConfiguration):
'''
A :class:`TaurusConfiguration`
@@ -420,7 +432,7 @@ class EpicsConfiguration(taurus.core.TaurusConfiguration):
Instead it should be done via the :meth:`EpicsFactory.getConfig`
'''
def __init__(self, name, parent, storeCallback = None):
- self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback=storeCallback)
+ self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
#fill the attr info
i = parent.read().config
@@ -457,7 +469,7 @@ class EpicsConfiguration(taurus.core.TaurusConfiguration):
return self._attr_info
-class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+class EpicsFactory(Singleton, TaurusFactory, Logger):
"""
A Singleton class that provides Epics related objects.
"""
@@ -472,8 +484,8 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
def init(self, *args, **kwargs):
"""Singleton instance initialization."""
name = self.__class__.__name__
- self.call__init__(taurus.core.util.Logger, name)
- self.call__init__(taurus.core.TaurusFactory)
+ self.call__init__(Logger, name)
+ self.call__init__(TaurusFactory)
self.epics_attrs = weakref.WeakValueDictionary()
self.epics_devs = weakref.WeakValueDictionary()
self.epics_configs = weakref.WeakValueDictionary()
@@ -553,15 +565,15 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
return a
def getConfiguration(self, param):
- """getConfiguration(param) -> taurus.core.TaurusConfiguration
+ """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
Obtain the object corresponding to the given attribute or full name.
If the corresponding configuration already exists, the existing instance
is returned. Otherwise a new instance is stored and returned.
- @param[in] param taurus.core.TaurusAttribute object or full configuration name
+ @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
- @return a taurus.core.TaurusAttribute object
+ @return a taurus.core.taurusattribute.TaurusAttribute object
@throws TaurusException if the given name is invalid.
"""
if isinstance(param, str):
@@ -594,10 +606,10 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
if exists is not None:
if exists == dev:
self.debug("%s has already been registered before" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
else:
self.debug("%s has already been registered before with a different object!" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
self.epics_devs[name] = dev
def _storeAttr(self, attr):
@@ -606,10 +618,10 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
if exists is not None:
if exists == attr:
self.debug("%s has already been registered before" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
else:
self.debug("%s has already been registered before with a different object!" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
self.epics_attrs[name] = attr
def _storeConfig(self, fullname, config):
@@ -619,10 +631,10 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
if exists is not None:
if exists == config:
self.debug("%s has already been registered before" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
else:
self.debug("%s has already been registered before with a different object!" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
self.epics_configs[name] = config
def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
@@ -633,7 +645,7 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
:param period: (float) polling period (in seconds)
:param unsubscribe_evts: (bool) whether or not to unsubscribe from events
"""
- tmr = self.polling_timers.get(period,taurus.core.TaurusPollingTimer(period))
+ tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
self.polling_timers[period] = tmr
tmr.addAttribute(attribute, self.isPollingEnabled())
@@ -678,7 +690,8 @@ def test1():
def test2():
- a=taurus.Attribute('epics://mp49t:sim1.RBV')
+ from taurus import Attribute
+ a = Attribute('epics://mp49t:sim1.RBV')
class Dummy:
n=0
def eventReceived(self, s,t,v):
diff --git a/lib/taurus/core/evaluation/__init__.py b/lib/taurus/core/evaluation/__init__.py
index e4ed11d..baf1402 100644
--- a/lib/taurus/core/evaluation/__init__.py
+++ b/lib/taurus/core/evaluation/__init__.py
@@ -113,7 +113,7 @@ Some examples of valid evaluation models are:
`eval://2*{tango://a/b/c/d}`
- An attribute that adds two tango attributes together (note we can omit the `tango://` part
- because tango is the default schema in taurus)
+ because tango is the default scheme in taurus)
`eval://{a/b/c/d}+{f/g/h/i}`
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/evaluation/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/evaluation/__taurus_plugin__
diff --git a/lib/taurus/core/evaluation/dev_example.py b/lib/taurus/core/evaluation/dev_example.py
index 5e48bba..65773ff 100644
--- a/lib/taurus/core/evaluation/dev_example.py
+++ b/lib/taurus/core/evaluation/dev_example.py
@@ -57,7 +57,7 @@ class FreeSpaceDevice(EvaluationDevice):
#===============================================================================
def test1():
- import taurus.core
+ import taurus
a = taurus.Attribute('eval://dev=taurus.core.evaluation.dev_example.FreeSpaceDevice;getFreeSpace("/")/1024/1024') #calculates free space in Mb
print "Free space: %iMb"%a.read().value
diff --git a/lib/taurus/core/evaluation/evalfactory.py b/lib/taurus/core/evaluation/evalfactory.py
index 77844f6..f2e3636 100644
--- a/lib/taurus/core/evaluation/evalfactory.py
+++ b/lib/taurus/core/evaluation/evalfactory.py
@@ -35,10 +35,21 @@ __all__ = ['EvaluationFactory', 'EvaluationDatabase', 'EvaluationDevice',
import time, re, weakref
import numpy
+import taurus
from taurus.core.taurusexception import TaurusException
-import taurus.core
-from taurus.core import MatchLevel, TaurusSWDevState, SubscriptionState, TaurusEventType
-from taurus.core.util import SafeEvaluator, Singleton, Logger
+from taurus.core.tauruspollingtimer import TaurusPollingTimer
+from taurus.core.taurusbasetypes import MatchLevel, TaurusSWDevState, \
+ SubscriptionState, TaurusEventType, TaurusAttrValue, TaurusTimeVal, \
+ AttrQuality
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.safeeval import SafeEvaluator
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
+
class AbstractEvaluationNameValidator(Singleton):
#the object name class. *must* be implemented in subclasses
@@ -242,7 +253,7 @@ class EvaluationConfigurationNameValidator(AbstractEvaluationNameValidator):
transf = re.sub(k,v, transf)
return transf
-class EvaluationDatabase(taurus.core.TaurusDatabase):
+class EvaluationDatabase(TaurusDatabase):
'''
Dummy database class for Evaluation (the Database concept is not used in the Evaluation scheme)
@@ -256,7 +267,7 @@ class EvaluationDatabase(taurus.core.TaurusDatabase):
return "EvaluationDatabase object calling %s" % name
-class EvaluationDevice(taurus.core.TaurusDevice, SafeEvaluator):
+class EvaluationDevice(TaurusDevice, SafeEvaluator):
'''
The evaluator object. It is a :class:`TaurusDevice` and is used as the
parent of :class:`EvaluationAttribute` objects for which it performs the
@@ -271,7 +282,7 @@ class EvaluationDevice(taurus.core.TaurusDevice, SafeEvaluator):
def __init__(self, name, **kw):
"""Object initialization."""
- self.call__init__(taurus.core.TaurusDevice, name, **kw)
+ self.call__init__(TaurusDevice, name, **kw)
safedict = {}
for s in self._symbols:
if hasattr(self,s):
@@ -312,12 +323,12 @@ class EvaluationDevice(taurus.core.TaurusDevice, SafeEvaluator):
else:
self.info("Unexpected value to decode: %s" % str(event_value))
new_sw_state = TaurusSWDevState.Crash
- value = taurus.core.TaurusAttrValue()
+ value = TaurusAttrValue()
value.value = new_sw_state
return value
-class EvaluationAttribute(taurus.core.TaurusAttribute):
+class EvaluationAttribute(TaurusAttribute):
'''
A :class:`TaurusAttribute` that can be used to perform mathematical
operations involving other arbitrary Taurus attributes. The mathematical
@@ -335,15 +346,15 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
cref_RegExp = re.compile("\{(.+?)\}") #regexp for references to other taurus models within operation model names
def __init__(self, name, parent, storeCallback = None):
- self.call__init__(taurus.core.TaurusAttribute, name, parent, storeCallback=storeCallback)
+ self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback)
- self._value = taurus.core.TaurusAttrValue()
+ self._value = TaurusAttrValue()
self._value.config.writable = False #Evaluation Attributes are always read-only (at least for now)
self._references = []
self._validator= self.getNameValidator()
self._transformation = None
# reference to the configuration object
- self.__attr_config = None#taurus.core.TaurusConfiguration()
+ self.__attr_config = None#taurus.core.configuration.TaurusConfiguration()
self.__subscription_state = SubscriptionState.Unsubscribed
@@ -475,11 +486,11 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
try:
evaluator = self.getParentObj()
self._value.value = evaluator.eval(self._transformation)
- self._value.time = taurus.core.TaurusTimeVal.now()
- self._value.quality = taurus.core.AttrQuality.ATTR_VALID
+ self._value.time = TaurusTimeVal.now()
+ self._value.quality = AttrQuality.ATTR_VALID
self._value.config.data_format = len(numpy.shape(self._value.value))
except Exception, e:
- self._value.quality = taurus.core.AttrQuality.ATTR_INVALID
+ self._value.quality = AttrQuality.ATTR_INVALID
self.warning("the function '%s' could not be evaluated. Reason: %s"%(self._transformation, repr(e)))
#self.traceback(taurus.Warning)
@@ -566,7 +577,7 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
initial_subscription_state = self.__subscription_state
- ret = taurus.core.TaurusAttribute.addListener(self, listener)
+ ret = TaurusAttribute.addListener(self, listener)
if not ret:
return ret
@@ -586,7 +597,7 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
""" Remove a TaurusListener from the listeners list. If polling enabled
and it is the last element then stop the polling timer.
If the listener is not registered nothing happens."""
- ret = taurus.core.TaurusAttribute.removeListener(self, listener)
+ ret = TaurusAttribute.removeListener(self, listener)
cfg = self._getRealConfig()
cfg.removeListener(listener)
@@ -597,7 +608,7 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
return ret
-class EvaluationConfiguration(taurus.core.TaurusConfiguration):
+class EvaluationConfiguration(TaurusConfiguration):
'''
A :class:`TaurusConfiguration`
@@ -607,7 +618,7 @@ class EvaluationConfiguration(taurus.core.TaurusConfiguration):
Instead it should be done via the :meth:`EvaluationFactory.getConfig`
'''
def __init__(self, name, parent, storeCallback = None):
- self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback=storeCallback)
+ self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
#fill the attr info
i = parent.read().config
@@ -643,7 +654,7 @@ class EvaluationConfiguration(taurus.core.TaurusConfiguration):
""" Returns the current configuration for the attribute."""
return self._attr_info
-class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
+class EvaluationFactory(Singleton, TaurusFactory, Logger):
"""
A Singleton class that provides Evaluation related objects.
"""
@@ -659,7 +670,7 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
"""Singleton instance initialization."""
name = self.__class__.__name__
self.call__init__(Logger, name)
- self.call__init__(taurus.core.TaurusFactory)
+ self.call__init__(TaurusFactory)
self.eval_attrs = weakref.WeakValueDictionary()
self.eval_devs = weakref.WeakValueDictionary()
self.eval_configs = weakref.WeakValueDictionary()
@@ -752,15 +763,15 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
return a
def getConfiguration(self, param):
- """getConfiguration(param) -> taurus.core.TaurusConfiguration
+ """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
Obtain the object corresponding to the given attribute or full name.
If the corresponding configuration already exists, the existing instance
is returned. Otherwise a new instance is stored and returned.
- @param[in] param taurus.core.TaurusAttribute object or full configuration name
+ @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
- @return a taurus.core.TaurusAttribute object
+ @return a taurus.core.taurusattribute.TaurusAttribute object
@throws TaurusException if the given name is invalid.
"""
if isinstance(param, str):
@@ -793,10 +804,10 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
if exists is not None:
if exists == dev:
self.debug("%s has already been registered before" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
else:
self.debug("%s has already been registered before with a different object!" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
self.eval_devs[name] = dev
def _storeAttr(self, attr):
@@ -805,10 +816,10 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
if exists is not None:
if exists == attr:
self.debug("%s has already been registered before" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
else:
self.debug("%s has already been registered before with a different object!" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
self.eval_attrs[name] = attr
def _storeConfig(self, fullname, config):
@@ -818,10 +829,10 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
if exists is not None:
if exists == config:
self.debug("%s has already been registered before" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
else:
self.debug("%s has already been registered before with a different object!" % name)
- raise taurus.core.DoubleRegistration
+ raise DoubleRegistration
self.eval_configs[name] = config
def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
@@ -832,7 +843,7 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
:param period: (float) polling period (in seconds)
:param unsubscribe_evts: (bool) whether or not to unsubscribe from events
"""
- tmr = self.polling_timers.get(period,taurus.core.TaurusPollingTimer(period))
+ tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
self.polling_timers[period] = tmr
tmr.addAttribute(attribute, self.isPollingEnabled())
diff --git a/lib/taurus/core/__init__.py b/lib/taurus/core/init_bkcomp.py
similarity index 94%
copy from lib/taurus/core/__init__.py
copy to lib/taurus/core/init_bkcomp.py
index 1010874..cd6f900 100644
--- a/lib/taurus/core/__init__.py
+++ b/lib/taurus/core/init_bkcomp.py
@@ -28,7 +28,7 @@
__docformat__ = "restructuredtext"
import release as Release
-from .enums import *
+#from .enums import * #note: all the enums from enums.py were moved to taurusbasetypes.py
from .taurusbasetypes import *
from .taurusexception import *
from .taurusmodel import *
diff --git a/lib/taurus/console/enums.py b/lib/taurus/core/init_lightweight.py
similarity index 69%
copy from lib/taurus/console/enums.py
copy to lib/taurus/core/init_lightweight.py
index 4e0955b..994f2d4 100644
--- a/lib/taurus/console/enums.py
+++ b/lib/taurus/core/init_lightweight.py
@@ -23,21 +23,21 @@
##
#############################################################################
-""" """
-
-__all__ = ["Alignment"]
+"""The core module"""
__docformat__ = "restructuredtext"
-from taurus.core.util import Enumeration
-
-#: Flaggable alignment for both horizontal and vertical text
-#: Conflicting combinations of flags have undefined meanings.
-Alignment = Enumeration("Alignment", ( \
- ("Left", 0x0001),
- ("Right", 0x0002),
- ("HCenter", 0x0004),
- ("Top", 0x0020),
- ("Bottom", 0x0040),
- ("VCenter", 0x0080),
- ("Center", 0x0004 | 0x0080 ) ) )
\ No newline at end of file
+#import release as Release
+from .taurusbasetypes import *
+# from .taurusexception import *
+# from .taurusmodel import *
+# from .tauruslistener import *
+# from .taurusdevice import *
+# from .taurusattribute import *
+# from .taurusconfiguration import *
+# from .taurusdatabase import *
+# from .taurusfactory import *
+# from .taurusmanager import *
+# from .taurusoperation import *
+# from .tauruspollingtimer import *
+# from .taurusvalidator import *
diff --git a/lib/taurus/core/release.py b/lib/taurus/core/release.py
index aa12ca3..17cbea0 100644
--- a/lib/taurus/core/release.py
+++ b/lib/taurus/core/release.py
@@ -53,7 +53,7 @@ name = 'taurus'
# bdist_deb does not accept underscores (a Debian convention).
-version_info = (3,0,1,'dev',0)
+version_info = (3,1,0,'rc',0)
version = '.'.join(map(str, version_info[:3]))
revision = str(version_info[4])
@@ -65,7 +65,7 @@ It is build on top of PyTango and PyQt."""
license = 'LGPL'
-authors = {'Tiago' : ('Tiago Coutinho','tcoutinho at cells.es'),
+authors = {'Tiago' : ('Tiago Coutinho','tiago.coutinho at esrf.fr'),
'Pascual-Izarra' : ('Carlos Pascual-Izarra','cpascual at cells.es') }
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/resource/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/resource/__taurus_plugin__
diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py
index f2565d3..d815ebb 100644
--- a/lib/taurus/core/resource/resfactory.py
+++ b/lib/taurus/core/resource/resfactory.py
@@ -29,9 +29,17 @@ simfactory.py:
import os, imp, operator, types
-import taurus.core
-import taurus.core.util
-from taurus.core import OperationMode, MatchLevel
+from taurus import Factory, Database, Manager
+from taurus.core.taurusexception import TaurusException
+from taurus.core.taurusbasetypes import OperationMode, MatchLevel, \
+ TaurusAttrValue, TaurusEventType
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.log import Logger
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
class ModuleDict(dict):
def __init__(self, mod):
@@ -40,7 +48,7 @@ class ModuleDict(dict):
def __getitem__(self, name):
return self.__mod.__getattribute__(name)
-class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+class ResourcesFactory(Singleton, TaurusFactory, Logger):
"""A Singleton class designed to provide Simulation related objects."""
#: the list of schemes that this factory supports. For this factory: 'res'
@@ -61,8 +69,8 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
"""Singleton instance initialization.
**For internal usage only**"""
name = self.__class__.__name__
- self.call__init__(taurus.core.util.Logger, name)
- self.call__init__(taurus.core.TaurusFactory)
+ self.call__init__(Logger, name)
+ self.call__init__(TaurusFactory)
self._resource_map = {}
self._resource_priority = {}
@@ -159,7 +167,7 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
return i, c, alias.split(c, 1)
return None, '', [alias]
- def __splitSchema(self, alias):
+ def __splitScheme(self, alias):
try:
i = alias.index('://')
return alias[:i], alias[i+3:]
@@ -173,7 +181,7 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
:return: (str) the value for the given key
"""
- alias = self.__splitSchema(key)
+ alias = self.__splitScheme(key)
if alias[0] and not alias[0] in ResourcesFactory.schemes:
return None
i, c, alias = self.__splitResourceName(alias[1])
@@ -186,8 +194,8 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
:param absolute_name: (str) the object absolute name string
- :return: (taurus.core.TaurusModel) a class object that should be a subclass of a taurus.core.TaurusModel
- :raise: (taurus.core.TaurusException) if the given name is invalid.
+ :return: (taurus.core.taurusmodel.TaurusModel) a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
+ :raise: (taurus.core.taurusexception.TaurusException) if the given name is invalid.
"""
objType = None
@@ -203,18 +211,18 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
:param alias: (str) database name string alias. If None, the
default database is used
- :return: (taurus.core.TaurusDatabase) database object
+ :return: (taurus.core.taurusdatabase.TaurusDatabase) database object
:raise: (NameError) if the alias does not exist
- :raise: (taurus.core.TaurusException) if the given alias is invalid.
+ :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
"""
if alias is None:
- return taurus.Database()
+ return Database()
alias = self.getValue(alias)
if not alias:
raise NameError(alias)
- return taurus.Manager().getDatabase(alias)
+ return Manager().getDatabase(alias)
def getDevice(self, alias):
"""
@@ -224,14 +232,14 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
:param alias: device name string alias.
- :return: (taurus.core.TaurusDevice) device object
+ :return: (taurus.core.taurusdevice.TaurusDevice) device object
:raise: (NameError) if the alias does not exist
- :raise: (taurus.core.TaurusException) if the given alias is invalid.
+ :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
"""
alias = self.getValue(alias)
if not alias:
raise NameError(alias)
- return taurus.Manager().getDevice(alias)
+ return Manager().getDevice(alias)
def getAttribute(self, alias):
"""
@@ -241,14 +249,14 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
:param alias: (str) attribute name string alias
- :return: (taurus.core.TaurusAttribute) attribute object
+ :return: (taurus.core.taurusattribute.TaurusAttribute) attribute object
:raise: (NameError) if the alias does not exist
- :raise: (taurus.core.TaurusException) if the given alias is invalid.
+ :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
"""
alias = self.getValue(alias)
if not alias:
raise NameError(alias)
- return taurus.Manager().getAttribute(alias)
+ return Manager().getAttribute(alias)
def getConfiguration(self, alias):
"""
@@ -258,12 +266,12 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
:param alias: (str) configuration name string alias
- :return: (taurus.core.TaurusConfiguration) configuration object
+ :return: (taurus.core.taurusconfiguration.TaurusConfiguration) configuration object
:raise: (NameError) if the alias does not exist
- :raise: (taurus.core.TaurusException) if the given alias is invalid.
+ :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
"""
alias = self.getValue(alias)
if not alias:
raise NameError(alias)
- return taurus.Manager().getConfiguration(alias)
+ return Manager().getConfiguration(alias)
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/simulation/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/simulation/__taurus_plugin__
diff --git a/lib/taurus/core/simulation/simfactory.py b/lib/taurus/core/simulation/simfactory.py
index 1d534cf..ea62fca 100644
--- a/lib/taurus/core/simulation/simfactory.py
+++ b/lib/taurus/core/simulation/simfactory.py
@@ -36,14 +36,20 @@ scheme userinfo hostname port path filename extension parameter(s
authority
"""
-import os
-
-import taurus.core
-import taurus.core.util
-from taurus.core import OperationMode, MatchLevel
-
-
-class SimulationDatabase(taurus.core.TaurusDatabase):
+from taurus import Factory
+from taurus.core.taurusexception import TaurusException
+from taurus.core.taurusbasetypes import OperationMode, MatchLevel, \
+ TaurusAttrValue, TaurusEventType
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
+
+
+class SimulationDatabase(TaurusDatabase):
def factory(self):
return SimulationFactory()
@@ -54,13 +60,13 @@ class SimulationDatabase(taurus.core.TaurusDatabase):
return "a/b/c"
def cache(self):
- return taurus.Factory('tango').getDatabase().cache()
+ return Factory('tango').getDatabase().cache()
def __getattr__(self, name):
return "SimulationDatabase object calling %s" % name
-class SimulationDevice(taurus.core.TaurusDevice):
+class SimulationDevice(TaurusDevice):
def _createHWObject(self):
return "Simulation"
@@ -73,7 +79,7 @@ class SimulationDevice(taurus.core.TaurusDevice):
class D:
pass
-class SimulationConfiguration(taurus.core.TaurusConfiguration):
+class SimulationConfiguration(TaurusConfiguration):
def __init__(self, name, parent, storeCallback = None):
i = D()
@@ -116,7 +122,7 @@ class SimulationConfiguration(taurus.core.TaurusConfiguration):
i.attr_name = attr.getSimpleName()
i.attr_fullname = attr.getNormalName()
self.attr_info = i
- self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback=storeCallback)
+ self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
def factory(self):
return SimulationFactory()
@@ -159,16 +165,16 @@ class SimulationConfiguration(taurus.core.TaurusConfiguration):
return value
-class SimulationAttribute(taurus.core.TaurusAttribute):
+class SimulationAttribute(TaurusAttribute):
def __init__(self, name, parent, storeCallback = None):
- self._value = taurus.core.TaurusAttrValue()
+ self._value = TaurusAttrValue()
self._config = None
self._value.value = 123.45
self._value.w_value = 123.45
self._value.quality = "ATTR_VALID"
self._value.time_stamp = 1
- self.call__init__(taurus.core.TaurusAttribute, name, parent, storeCallback=storeCallback)
+ self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback)
def __getattr__(self,name):
return getattr(self.getConfig(), name)
@@ -218,18 +224,18 @@ class SimulationAttribute(taurus.core.TaurusAttribute):
If it is the first element and Polling is enabled starts the
polling mechanism.
If the listener is already registered nothing happens."""
- ret = taurus.core.TaurusAttribute.addListener(self, listener)
+ ret = TaurusAttribute.addListener(self, listener)
if not ret:
return ret
#fire a first configuration event
cfg_val, val = self.getConfig().getValueObj(), self.read()
- self.fireEvent(taurus.core.TaurusEventType.Config, cfg_val, listener)
+ self.fireEvent(TaurusEventType.Config, cfg_val, listener)
#fire a first change event
- self.fireEvent(taurus.core.TaurusEventType.Change, val, listener)
+ self.fireEvent(TaurusEventType.Change, val, listener)
return ret
-class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+class SimulationFactory(Singleton, TaurusFactory, Logger):
"""A Singleton class designed to provide Simulation related objects."""
schemes = ("simulation",)
@@ -241,17 +247,17 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
def init(self, *args, **kwargs):
"""Singleton instance initialization."""
name = self.__class__.__name__
- self.call__init__(taurus.core.util.Logger, name)
- self.call__init__(taurus.core.TaurusFactory)
+ self.call__init__(Logger, name)
+ self.call__init__(TaurusFactory)
def findObjectClass(self, absolute_name):
- """findObjectClass(string absolute_name) -> taurus.core.TaurusModel subclass
+ """findObjectClass(string absolute_name) -> taurus.core.taurusmodel.TaurusModel subclass
Obtain the class object corresponding to the given name.
@param[in] absolute_name the object absolute name string
- @return a class object that should be a subclass of a taurus.core.TaurusModel
+ @return a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
@throws TaurusException if the given name is invalid.
"""
objType = None
@@ -270,7 +276,7 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
return objType
def getDatabase(self, db_name=None):
- """getDatabase(string db_name) -> taurus.core.TaurusDatabase
+ """getDatabase(string db_name) -> taurus.core.taurusdatabase.TaurusDatabase
Obtain the object corresponding to the given database name or the
default database if db_name is None.
@@ -278,43 +284,43 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
instance is returned. Otherwise a new instance is stored and returned.
@param[in] db_name database name string. It should be formed like:
- <schema>://<authority>. If <schema> is ommited then
- it will use the default schema. if db_name is None,
+ <scheme>://<authority>. If <scheme> is ommited then
+ it will use the default scheme. if db_name is None,
the default database is used
- @return a taurus.core.TaurusDatabase object
+ @return a taurus.core.taurusdatabase.TaurusDatabase object
@throws TaurusException if the given name is invalid.
"""
if not db_name is None:
validator = SimulationDatabase.getNameValidator()
params = validator.getParams(db_name)
if params is None:
- raise taurus.core.TaurusException("Invalid database name %s." % db_name)
+ raise TaurusException("Invalid database name %s." % db_name)
if not hasattr(self, "_db"):
self._db = SimulationDatabase("sim:01")
return self._db
def getDevice(self, dev_name):
- """getDevice(string dev_name) -> taurus.core.TaurusDevice
+ """getDevice(string dev_name) -> taurus.core.taurusdevice.TaurusDevice
Obtain the object corresponding to the given device name. If the
corresponding device already exists, the existing instance is returned.
Otherwise a new instance is stored and returned.
@param[in] dev_name the device name string. It should be formed like:
- <schema>://<authority>/<device name>. If <schema>
- is ommited then it will use the default schema.
+ <scheme>://<authority>/<device name>. If <scheme>
+ is ommited then it will use the default scheme.
If authority is ommited then it will use the
- default authority for the schema.
+ default authority for the scheme.
- @return a taurus.core.TaurusDevice object
+ @return a taurus.core.taurusdevice.TaurusDevice object
@throws TaurusException if the given name is invalid.
"""
validator = SimulationDevice.getNameValidator()
params = validator.getParams(dev_name)
if params is None:
- raise taurus.core.TaurusException("Invalid device name %s." % dev_name)
+ raise TaurusException("Invalid device name %s." % dev_name)
if not hasattr(self, "_dev"):
db = self.getDatabase("sim:01")
@@ -322,7 +328,7 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
return self._dev
def getAttribute(self, attr_name):
- """getAttribute(string attr_name) -> taurus.core.TaurusAttribute
+ """getAttribute(string attr_name) -> taurus.core.taurusattribute.TaurusAttribute
Obtain the object corresponding to the given attribute name.
If the corresponding attribute already exists, the existing instance
@@ -330,14 +336,14 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
@param[in] attr_name string attribute name
- @return a taurus.core.TaurusAttribute object
+ @return a taurus.core.taurusattribute.TaurusAttribute object
@throws TaurusException if the given name is invalid.
"""
validator = SimulationAttribute.getNameValidator()
params = validator.getParams(attr_name)
if params is None:
- raise taurus.core.TaurusException("Invalid attribute name %s." % attr_name)
+ raise TaurusException("Invalid attribute name %s." % attr_name)
if not hasattr(self, "_attr"):
dev = self.getDevice("sim:01/a/b/c")
@@ -345,15 +351,15 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
return self._attr
def getConfiguration(self, param):
- """getConfiguration(param) -> taurus.core.TaurusConfiguration
+ """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
Obtain the object corresponding to the given attribute or full name.
If the corresponding configuration already exists, the existing instance
is returned. Otherwise a new instance is stored and returned.
- @param[in] param taurus.core.TaurusAttribute object or full configuration name
+ @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
- @return a taurus.core.TaurusAttribute object
+ @return a taurus.core.taurusattribute.TaurusAttribute object
@throws TaurusException if the given name is invalid.
"""
if isinstance(param, str):
@@ -365,7 +371,7 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
params = validator.getParams(name)
if params is None:
- raise taurus.core.TaurusException("Invalid configuration name %s." % name)
+ raise taurus.core.taurusexception.TaurusException("Invalid configuration name %s." % name)
if not hasattr(self, "_conf"):
name = "sim:01/a/b/c/d?configuration"
diff --git a/lib/taurus/core/tango/__init__.py b/lib/taurus/core/tango/__init__.py
index b2ec715..2938c66 100644
--- a/lib/taurus/core/tango/__init__.py
+++ b/lib/taurus/core/tango/__init__.py
@@ -31,7 +31,7 @@ taurus scheme, when specifing a tango model name, the scheme prefix ('tango://')
be omited.
You should never create objects of tango classes directly. Instead you
-should use the :class:`taurus.core.TaurusManager` and :class:`taurus.core.TaurusFactory` APIs
+should use the :class:`taurus.core.taurusmanager.TaurusManager` and :class:`taurus.core.taurusfactory.TaurusFactory` APIs
to access all elements.
For example, to get a reference to the Tango attribute my/tango/device/state you
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/tango/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/tango/__taurus_plugin__
diff --git a/lib/taurus/core/tango/enums.py b/lib/taurus/core/tango/enums.py
index d6c5a19..adcd55a 100644
--- a/lib/taurus/core/tango/enums.py
+++ b/lib/taurus/core/tango/enums.py
@@ -30,15 +30,14 @@ __all__ = ["TangoObjectType", "EVENT_TO_POLLING_EXCEPTIONS",
__docformat__ = "restructuredtext"
-import taurus.core.util
+from taurus.core.taurusbasetypes import SubscriptionState
+from taurus.core.util.enumeration import Enumeration
-TangoObjectType = taurus.core.util.Enumeration("TangoObjectType",
+TangoObjectType = Enumeration("TangoObjectType",
["Database", "Server", "Class", "Device",
"Attribute","Property","Configuration",
"Object"])
-SubscriptionState = taurus.core.SubscriptionState #moved from here to taurus.core. Copied here for backwards compatibility
-
import numpy
import PyTango
diff --git a/lib/taurus/core/tango/img/img.py b/lib/taurus/core/tango/img/img.py
index c643a86..1e30e0f 100644
--- a/lib/taurus/core/tango/img/img.py
+++ b/lib/taurus/core/tango/img/img.py
@@ -31,15 +31,16 @@ __all__ = ['ImageDevice', 'ImageCounterDevice', 'PyImageViewer', 'ImgGrabber',
__docformat__ = 'restructuredtext'
-import taurus.core
-import taurus.core.tango
-import taurus.core.util
-class ImageDevice(taurus.core.tango.TangoDevice):
+from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.tango import TangoDevice
+from taurus.core.util.containers import CaselessDict
+
+class ImageDevice(TangoDevice):
"""A class encapsulating a generic image device"""
def __init__(self, name, image_name='image', **kw):
- self.call__init__(taurus.core.tango.TangoDevice, name, **kw)
+ self.call__init__(TangoDevice, name, **kw)
self.setImageAttrName(image_name)
def addImageAttrName(self, attr_name):
@@ -48,7 +49,7 @@ class ImageDevice(taurus.core.tango.TangoDevice):
self._image_attr_names.append(attr_name)
def setImageAttrName(self, attr_name):
- self._image_attr_names = taurus.core.util.CaselessList()
+ self._image_attr_names = CaselessList()
self.addImageAttrName(attr_name)
def getImageAttrName(self, idx=0):
@@ -56,13 +57,14 @@ class ImageDevice(taurus.core.tango.TangoDevice):
def getImageAttrNames(self):
return self._image_attr_names
-
+
+
class ImageCounterDevice(ImageDevice):
"""A class encapsulating a generic image device that has an image counter
attribute"""
def __init__(self, name, image_name='image', **kw):
- self._image_data = taurus.core.util.CaselessDict()
+ self._image_data = CaselessDict()
self.call__init__(ImageDevice, name, **kw)
self._image_id_attr = self.getAttribute(self.getImageIDAttrName())
self._image_id_attr.addListener(self)
@@ -87,7 +89,7 @@ class ImageCounterDevice(ImageDevice):
def eventReceived(self, evt_src, evt_type, evt_value):
if evt_src == self._image_id_attr:
- if evt_type == taurus.core.TaurusEventType.Change:
+ if evt_type == TaurusEventType.Change:
self._setDirty()
self.fireEvent(evt_type, evt_value)
else:
@@ -123,7 +125,7 @@ class Falcon(ImageCounterDevice):
def eventReceived(self, evt_src, evt_type, evt_value):
if evt_src == self.getAttribute("imageformat"):
- if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+ if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
self._color = evt_value.value.lower() == "rgb24"
return
ImageCounterDevice.eventReceived(self, evt_src, evt_type, evt_value)
diff --git a/lib/taurus/core/tango/sardana/macro.py b/lib/taurus/core/tango/sardana/macro.py
index 93ed27a..12dbc47 100644
--- a/lib/taurus/core/tango/sardana/macro.py
+++ b/lib/taurus/core/tango/sardana/macro.py
@@ -38,7 +38,10 @@ import copy
import threading
import PyTango
-from taurus.core.util import etree, USER_NAME, CodecFactory
+from lxml import etree
+
+from taurus.core.util.user import USER_NAME
+from taurus.core.util.codecs import CodecFactory
class MacroRunException(Exception):
pass
diff --git a/lib/taurus/core/tango/sardana/macroserver.py b/lib/taurus/core/tango/sardana/macroserver.py
index 2ae5d3c..906057f 100644
--- a/lib/taurus/core/tango/sardana/macroserver.py
+++ b/lib/taurus/core/tango/sardana/macroserver.py
@@ -39,17 +39,25 @@ import os.path as osp
import PyTango
+from lxml import etree
+
from taurus import Device, Factory
-from taurus.core import TaurusManager, TaurusEventType, TaurusSWDevState, \
+from taurus.core.taurusmanager import TaurusManager
+from taurus.core.taurusbasetypes import TaurusEventType, TaurusSWDevState, \
TaurusSerializationMode
-from taurus.core.util import etree, CodecFactory, CaselessDict, Logger, \
- EventGenerator, AttributeEventWait
+
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.codecs import CodecFactory
+from taurus.core.util.event import EventGenerator, AttributeEventWait
from taurus.core.tango import TangoDevice
-from macro import MacroInfo, Macro, MacroNode, ParamFactory, RepeatNode, \
+from .macro import MacroInfo, Macro, MacroNode, ParamFactory, RepeatNode, \
RepeatParamNode, SingleParamNode, ParamNode
-from sardana import BaseSardanaElementContainer, BaseSardanaElement
-from pool import getChannelConfigs
+from .sardana import BaseSardanaElementContainer, BaseSardanaElement
+from .pool import getChannelConfigs
+
CHANGE_EVT_TYPES = TaurusEventType.Change, TaurusEventType.Periodic
diff --git a/lib/taurus/core/tango/sardana/motion.py b/lib/taurus/core/tango/sardana/motion.py
index 25c472e..db8fb9c 100644
--- a/lib/taurus/core/tango/sardana/motion.py
+++ b/lib/taurus/core/tango/sardana/motion.py
@@ -31,7 +31,7 @@ __docformat__ = 'restructuredtext'
import time
-from taurus.core.util import CaselessDict
+from taurus.core.util.containers import CaselessDict
class Moveable:
""" An item that can 'move'. In order to move it you need to provide a list
diff --git a/lib/taurus/core/tango/sardana/pool.py b/lib/taurus/core/tango/sardana/pool.py
index 5984683..7abd0a4 100644
--- a/lib/taurus/core/tango/sardana/pool.py
+++ b/lib/taurus/core/tango/sardana/pool.py
@@ -46,13 +46,19 @@ from PyTango import DevState, AttrDataFormat, AttrQuality, DevFailed, \
DeviceProxy
from taurus import Factory, Device
-from taurus.core import TaurusEventType, AttributeNameValidator
-from taurus.core.util import Logger, CaselessDict, CodecFactory, \
- EventGenerator, AttributeEventWait, AttributeEventIterator
+from taurus.core.taurusbasetypes import TaurusEventType, TaurusSWDevState, \
+ TaurusSerializationMode
+from taurus.core.taurusvalidator import AttributeNameValidator
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.codecs import CodecFactory
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.event import EventGenerator, AttributeEventWait, \
+ AttributeEventIterator
from taurus.core.tango import TangoDevice, FROM_TANGO_TO_STR_TYPE
-from sardana import BaseSardanaElementContainer, BaseSardanaElement
-from motion import Moveable, MoveableSource
+from .sardana import BaseSardanaElementContainer, BaseSardanaElement
+from .motion import Moveable, MoveableSource
Ready = Standby = DevState.ON
Counting = Acquiring = Moving = DevState.MOVING
@@ -378,7 +384,7 @@ class PoolElement(BaseElement, TangoDevice):
return self._attrEG.get(name)
def getAttrObj(self, name):
- """Returns the taurus.core.TangoAttribute object"""
+ """Returns the taurus.core.tangoattribute.TangoAttribute object"""
attrEG = self._attrEG.get(name)
if attrEG is None:
return None
@@ -931,12 +937,7 @@ class MotorGroup(PoolElement, Moveable):
#
def _start(self, *args, **kwargs):
- #+++ 25.2.2013, TK
- new_pos = []
- for elm in args[0]:
- new_pos.append(elm)
- #+++
- # new_pos = args[0]
+ new_pos = args[0]
try:
self.write_attribute('position', new_pos)
except DevFailed, df:
diff --git a/lib/taurus/core/tango/sardana/sardana.py b/lib/taurus/core/tango/sardana/sardana.py
index 2e2c576..86a644e 100644
--- a/lib/taurus/core/tango/sardana/sardana.py
+++ b/lib/taurus/core/tango/sardana/sardana.py
@@ -39,13 +39,13 @@ __all__ = ["BaseSardanaElement", "BaseSardanaElementContainer",
__docformat__ = 'restructuredtext'
-import socket
-
import PyTango
-import taurus
-from taurus.core.util import Enumeration, Singleton, Logger, CaselessDict, \
- CodecFactory
+from taurus.core.util.enumeration import Enumeration
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.codecs import CodecFactory
PoolElementType = Enumeration("PoolElementType",
("0D", "1D", "2D", "Communication", "CounterTimer", "IORegister",
@@ -665,6 +665,7 @@ class SardanaManager(Singleton, Logger):
def _get_db_sardana(self, db=None):
if db is None:
+ import taurus
db = taurus.Database()
db_sardana = self._db_sardanas.get(db)
if db_sardana is None:
@@ -690,6 +691,7 @@ class SardanaManager(Singleton, Logger):
return 1, 200
def has_localhost_starter(self):
+ import socket
return socket.gethostname() in self.get_hosts()
@classmethod
diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py
index 61309aa..b6b35d1 100644
--- a/lib/taurus/core/tango/tangoattribute.py
+++ b/lib/taurus/core/tango/tangoattribute.py
@@ -34,15 +34,17 @@ import time
import threading
import PyTango
-import taurus.core
-from taurus.core import TaurusEventType, TaurusSerializationMode, \
- SubscriptionState, WriteAttrOperation
-from taurus.core.util import EventListener
-from enums import EVENT_TO_POLLING_EXCEPTIONS
+from taurus import Factory, Manager
+from taurus.core.taurusattribute import TaurusAttribute, TaurusStateAttribute
+from taurus.core.taurusbasetypes import TaurusEventType, TaurusSerializationMode, \
+ SubscriptionState
+from taurus.core.taurusoperation import WriteAttrOperation
+from taurus.core.util.event import EventListener
+from .enums import EVENT_TO_POLLING_EXCEPTIONS
DataType = PyTango.CmdArgType
-class TangoAttribute(taurus.core.TaurusAttribute):
+class TangoAttribute(TaurusAttribute):
# helper class property that stores a reference to the corresponding factory
_factory = None
@@ -68,7 +70,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
self.__subscription_state = SubscriptionState.Unsubscribed
self.__subscription_event = threading.Event()
- self.call__init__(taurus.core.TaurusAttribute, name, parent, **kwargs)
+ self.call__init__(TaurusAttribute, name, parent, **kwargs)
def __getattr__(self,name):
return getattr(self._getRealConfig(), name)
@@ -88,7 +90,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
@classmethod
def factory(cls):
if cls._factory is None:
- cls._factory = taurus.Factory(scheme='tango')
+ cls._factory = Factory(scheme='tango')
return cls._factory
def getNewOperation(self, value):
@@ -332,7 +334,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
listeners = self._listeners
initial_subscription_state = self.__subscription_state
- ret = taurus.core.TaurusAttribute.addListener(self, listener)
+ ret = TaurusAttribute.addListener(self, listener)
if not ret:
return ret
@@ -345,7 +347,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
if len(listeners) > 1 and (initial_subscription_state == SubscriptionState.Subscribed or self.isPollingActive()):
sm = self.getSerializationMode()
if sm == TaurusSerializationMode.Concurrent:
- taurus.Manager().addJob(self.__fireRegisterEvent, None, (listener,))
+ Manager().addJob(self.__fireRegisterEvent, None, (listener,))
else:
self.__fireRegisterEvent((listener,))
return ret
@@ -354,7 +356,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
""" Remove a TaurusListener from the listeners list. If polling enabled
and it is the last element the stop the polling timer.
If the listener is not registered nothing happens."""
- ret = taurus.core.TaurusAttribute.removeListener(self, listener)
+ ret = TaurusAttribute.removeListener(self, listener)
cfg = self._getRealConfig()
cfg.removeListener(listener)
@@ -446,7 +448,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
Default implementation propagates the event to all listeners."""
curr_time = time.time()
- manager = taurus.Manager()
+ manager = Manager()
sm = self.getSerializationMode()
if not event.err:
self.__attr_value, self.__attr_err, self.__attr_timestamp = self.decode(event.attr_value), None, curr_time
@@ -483,10 +485,10 @@ class TangoAttribute(taurus.core.TaurusAttribute):
return False
-class TangoStateAttribute(TangoAttribute, taurus.core.TaurusStateAttribute):
+class TangoStateAttribute(TangoAttribute, TaurusStateAttribute):
def __init__(self, name, parent, **kwargs):
self.call__init__(TangoAttribute, name, parent, **kwargs)
- self.call__init__(taurus.core.TaurusStateAttribute, name, parent, **kwargs)
+ self.call__init__(TaurusStateAttribute, name, parent, **kwargs)
class TangoAttributeEventListener(EventListener):
@@ -510,7 +512,8 @@ class TangoAttributeEventListener(EventListener):
def test1():
import numpy
- a = taurus.Attribute('sys/tg_test/1/ulong64_scalar')
+ from taurus import Attribute
+ a = Attribute('sys/tg_test/1/ulong64_scalar')
a.write(numpy.uint64(88))
diff --git a/lib/taurus/core/tango/tangoconfiguration.py b/lib/taurus/core/tango/tangoconfiguration.py
index b36671b..0e96b8a 100644
--- a/lib/taurus/core/tango/tangoconfiguration.py
+++ b/lib/taurus/core/tango/tangoconfiguration.py
@@ -30,20 +30,22 @@ __all__ = ["TangoConfiguration"]
__docformat__ = "restructuredtext"
# -*- coding: utf-8 -*-
-import taurus.core
import threading
import weakref
import time
import PyTango
-from enums import EVENT_TO_POLLING_EXCEPTIONS
+from taurus import Factory, Manager
+from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from .enums import EVENT_TO_POLLING_EXCEPTIONS
-class TangoConfiguration(taurus.core.TaurusConfiguration):
+class TangoConfiguration(TaurusConfiguration):
def __init__(self, name, parent, storeCallback = None):
self._events_working = False
- self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback)
+ self.call__init__(TaurusConfiguration, name, parent, storeCallback)
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# TaurusModel necessary overwrite
@@ -55,7 +57,7 @@ class TangoConfiguration(taurus.core.TaurusConfiguration):
@classmethod
def factory(cls):
if cls._factory is None:
- cls._factory = taurus.Factory("tango")
+ cls._factory = Factory("tango")
return cls._factory
def __getattr__(self, name):
@@ -129,18 +131,18 @@ class TangoConfiguration(taurus.core.TaurusConfiguration):
def __fireRegisterEvent(self, listener):
value = self.getValueObj()
if value is not None:
- self.fireEvent(taurus.core.TaurusEventType.Config, value, listener)
+ self.fireEvent(TaurusEventType.Config, value, listener)
def addListener(self, listener):
""" Add a TaurusListener object in the listeners list.
If the listener is already registered nothing happens."""
- ret = taurus.core.TaurusConfiguration.addListener(self, listener)
+ ret = TaurusConfiguration.addListener(self, listener)
if not ret:
return ret
#fire a first configuration event
#if len(self._listeners) > 1 or not self._events_working:
- taurus.Manager().addJob(self.__fireRegisterEvent, None, (listener,))
+ Manager().addJob(self.__fireRegisterEvent, None, (listener,))
return ret
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -234,12 +236,12 @@ class TangoConfiguration(taurus.core.TaurusConfiguration):
self._attr_timestamp = time.time()
self._attr_info = self.decode(event.attr_conf)
listeners = tuple(self._listeners)
- #taurus.Manager().addJob(self._push_event, None, event)
- taurus.Manager().addJob(self.fireEvent, None, taurus.core.TaurusEventType.Config, self._attr_info, listeners=listeners)
+ #Manager().addJob(self._push_event, None, event)
+ Manager().addJob(self.fireEvent, None, TaurusEventType.Config, self._attr_info, listeners=listeners)
#def _push_event(self, event):
# """ Notify listeners when event received"""
- # self.fireEvent(taurus.core.TaurusEventType.Config, self._attr_info)
+ # self.fireEvent(TaurusEventType.Config, self._attr_info)
#===========================================================================
# Some methods reimplemented from TaurusConfiguration
diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py
index cfbd57a..a881040 100644
--- a/lib/taurus/core/tango/tangodatabase.py
+++ b/lib/taurus/core/tango/tangodatabase.py
@@ -34,13 +34,19 @@ import os
import PyTango
import PyTango.utils
-import taurus.core
-import taurus.core.util
+
+from taurus import Factory
+from taurus.core.taurusbasetypes import TaurusSWDevHealth
+from taurus.core.taurusdatabase import TaurusDatabaseCache, TaurusDevInfo, \
+ TaurusAttrInfo, TaurusServInfo, TaurusDevClassInfo, TaurusDevTree, \
+ TaurusServerTree
+from taurus.core.util.containers import CaselessDict
+from taurus.core.taurusdatabase import TaurusDatabase
InvalidAlias = "nada"
-class TangoDevInfo(taurus.core.TaurusDevInfo):
+class TangoDevInfo(TaurusDevInfo):
def __init__(self, container, name=None, full_name=None, alias=None, server=None, klass=None, exported=False, host=None):
super(TangoDevInfo, self).__init__(container, name=name, full_name=full_name, alias=alias, server=server, klass=klass, exported=exported, host=host)
@@ -84,9 +90,9 @@ class TangoDevInfo(taurus.core.TaurusDevInfo):
return self._health
exported = self.exported()
if exported:
- self._health = taurus.core.TaurusSWDevHealth.Exported
+ self._health = TaurusSWDevHealth.Exported
else:
- self._health = taurus.core.TaurusSWDevHealth.NotExported
+ self._health = TaurusSWDevHealth.NotExported
return self._health
def refreshAttributes(self):
@@ -98,18 +104,18 @@ class TangoDevInfo(taurus.core.TaurusDevInfo):
attr_info_list = dev.attribute_list_query_ex()
for attr_info in attr_info_list:
full_name = "%s/%s" % (self.fullName(), attr_info.name)
- attr_obj = taurus.core.TaurusAttrInfo(self.container(),
+ attr_obj = TaurusAttrInfo(self.container(),
name=attr_info.name.lower(), full_name=full_name.lower(),
device=self, info=attr_info)
attrs.append(attr_obj)
attrs = sorted(attrs, key=lambda attr : attr.name())
- except PyTango.DevFailed, df:
- if self.health() == taurus.core.TaurusSWDevHealth.Exported:
- self._health = taurus.core.TaurusSWDevHealth.ExportedNotAlive
+ except PyTango.DevFailed as df:
+ if self.health() == TaurusSWDevHealth.Exported:
+ self._health = TaurusSWDevHealth.ExportedNotAlive
self.setAttributes(attrs)
-class TangoServInfo(taurus.core.TaurusServInfo):
+class TangoServInfo(TaurusServInfo):
def __init__(self, container, name=None, full_name=None):
super(TangoServInfo, self).__init__(container, name=name, full_name=full_name)
@@ -134,7 +140,7 @@ class TangoServInfo(taurus.core.TaurusServInfo):
return self._alive
-class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
+class TangoDatabaseCache(TaurusDatabaseCache):
def refresh(self):
db = self.db
@@ -146,7 +152,7 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
results, data = r[0][:-2], r[1]
assert row_nb == len(data) / column_nb
- CD = taurus.core.util.CaselessDict
+ CD = CaselessDict
#CD = dict
dev_dict, serv_dict, klass_dict, alias_dict = CD(), {}, {}, CD()
@@ -157,13 +163,13 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
if not len(alias): alias = None
serv_dict[server] = si = serv_dict.get(server,
- TangoServInfo(self, name=server,
+ TangoServInfo(self, name=server,
full_name=server))
klass_dict[klass] = dc = klass_dict.get(klass,
- taurus.core.TaurusDevClassInfo(self,
- name=klass,
- full_name=klass))
+ TaurusDevClassInfo(self,
+ name=klass,
+ full_name=klass))
full_name = "tango://%s/%s" % (db.getFullName(), name)
dev_dict[name] = di = TangoDevInfo(self, name=name, full_name=full_name,
@@ -176,8 +182,8 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
alias_dict[alias] = di
self._devices = dev_dict
- self._device_tree = taurus.core.TaurusDevTree(dev_dict)
- self._server_tree = taurus.core.TaurusServerTree(serv_dict)
+ self._device_tree = TaurusDevTree(dev_dict)
+ self._server_tree = TaurusServerTree(serv_dict)
self._servers = serv_dict
self._klasses = klass_dict
self._aliases = alias_dict
@@ -196,13 +202,12 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
attr_info_list = dev.attribute_list_query_ex()
for attr_info in attr_info_list:
full_attr_name = "%s/%s" % (full_name, attr_info.name)
- attr_obj = taurus.core.TaurusAttrInfo(self, name=attr_info.name,
- full_name=full_attr_name,
- device=device,
- info=attr_info)
+ attr_obj = TaurusAttrInfo(self, name=attr_info.name,
+ full_name=full_attr_name,
+ device=device, info=attr_info)
attrs.append(attr_obj)
attrs = sorted(attrs, key=lambda attr : attr.name().lower())
- except PyTango.DevFailed, df:
+ except PyTango.DevFailed as df:
pass
device.setAttributes(attrs)
@@ -278,7 +283,7 @@ def get_env_var(env_var_name):
return val
-class TangoDatabase(taurus.core.TaurusDatabase):
+class TangoDatabase(TaurusDatabase):
def __init__(self,host=None,port=None,parent=None):
pars = ()
@@ -295,7 +300,7 @@ class TangoDatabase(taurus.core.TaurusDatabase):
self._dbCache = None
complete_name = "%s:%s" % (host, port)
- self.call__init__(taurus.core.TaurusDatabase, complete_name, parent)
+ self.call__init__(TaurusDatabase, complete_name, parent)
try:
self.get_class_for_device(self.dev_name())
@@ -343,7 +348,7 @@ class TangoDatabase(taurus.core.TaurusDatabase):
@classmethod
def factory(cls):
if cls._factory is None:
- cls._factory = taurus.Factory(scheme='tango')
+ cls._factory = Factory(scheme='tango')
return cls._factory
def getValueObj(self,cache=True):
diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py
index a41e439..fc867c8 100644
--- a/lib/taurus/core/tango/tangodevice.py
+++ b/lib/taurus/core/tango/tangodevice.py
@@ -32,8 +32,9 @@ __docformat__ = "restructuredtext"
import time
import PyTango
-import taurus.core
-from taurus.core import TaurusSWDevState, TaurusLockInfo, LockStatus
+from taurus import Factory
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusbasetypes import TaurusSWDevState, TaurusLockInfo, LockStatus
DFT_TANGO_DEVICE_DESCRIPTION = "A TANGO device"
@@ -46,10 +47,10 @@ class _TangoInfo(object):
self.server_id = 'Unknown'
self.server_version = 1
-class TangoDevice(taurus.core.TaurusDevice):
+class TangoDevice(TaurusDevice):
def __init__(self, name, **kw):
"""Object initialization."""
- self.call__init__(taurus.core.TaurusDevice, name, **kw)
+ self.call__init__(TaurusDevice, name, **kw)
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# TaurusModel necessary overwrite
@@ -60,7 +61,7 @@ class TangoDevice(taurus.core.TaurusDevice):
@classmethod
def factory(cls):
if cls._factory is None:
- cls._factory = taurus.Factory(scheme='tango')
+ cls._factory = Factory(scheme='tango')
return cls._factory
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py
index 9f5c621..f4ff7e6 100644
--- a/lib/taurus/core/tango/tangofactory.py
+++ b/lib/taurus/core/tango/tangofactory.py
@@ -34,24 +34,28 @@ import os
import threading
import PyTango
-import taurus.core
-import taurus.core.util
-from taurus.core import OperationMode, MatchLevel, TaurusException
-
-import tangodatabase
-import tangoattribute
-import tangodevice
-import tangoconfiguration
-
-_Database = tangodatabase.TangoDatabase
-_Attribute = tangoattribute.TangoAttribute
-_StateAttribute = tangoattribute.TangoStateAttribute
-_Device = tangodevice.TangoDevice
-_Configuration = tangoconfiguration.TangoConfiguration
-
-from taurus.core import DoubleRegistration
-
-class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusbasetypes import OperationMode, MatchLevel
+from taurus.core.taurusexception import TaurusException, DoubleRegistration
+from taurus.core.tauruspollingtimer import TaurusPollingTimer
+from taurus.core.util.enumeration import Enumeration
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessWeakValueDict, CaselessDict
+
+from .tangodatabase import TangoDatabase, InvalidAlias
+from .tangoattribute import TangoAttribute, TangoStateAttribute
+from .tangodevice import TangoDevice
+from .tangoconfiguration import TangoConfiguration
+
+_Database = TangoDatabase
+_Attribute = TangoAttribute
+_StateAttribute = TangoStateAttribute
+_Device = TangoDevice
+_Configuration = TangoConfiguration
+
+
+class TangoFactory(Singleton, TaurusFactory, Logger):
"""A Singleton class designed to provide Tango related objects.
The TangoFactory model containning the Factory for the Tango scheme
@@ -94,8 +98,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
"""Singleton instance initialization.
**For internal usage only**"""
name = self.__class__.__name__
- self.call__init__(taurus.core.util.Logger, name)
- self.call__init__(taurus.core.TaurusFactory)
+ self.call__init__(Logger, name)
+ self.call__init__(TaurusFactory)
self._polling_enabled = True
self.reInit()
@@ -104,20 +108,20 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
self._default_tango_host = None
self.operation_mode = OperationMode.ONLINE
self.dft_db = None
- self.tango_db = taurus.core.util.CaselessWeakValueDict()
- self.tango_db_queries = taurus.core.util.CaselessWeakValueDict()
- self.tango_configs = taurus.core.util.CaselessWeakValueDict()
- self.tango_attrs = taurus.core.util.CaselessWeakValueDict()
- self.tango_devs = taurus.core.util.CaselessWeakValueDict()
- self.tango_dev_queries = taurus.core.util.CaselessWeakValueDict()
- self.tango_alias_devs = taurus.core.util.CaselessWeakValueDict()
+ self.tango_db = CaselessWeakValueDict()
+ self.tango_db_queries = CaselessWeakValueDict()
+ self.tango_configs = CaselessWeakValueDict()
+ self.tango_attrs = CaselessWeakValueDict()
+ self.tango_devs = CaselessWeakValueDict()
+ self.tango_dev_queries = CaselessWeakValueDict()
+ self.tango_alias_devs = CaselessWeakValueDict()
self.polling_timers = {}
# Plugin device classes
self.tango_dev_klasses = {}
# Plugin attribute classes
- self.tango_attr_klasses = taurus.core.util.CaselessDict()
+ self.tango_attr_klasses = CaselessDict()
self.tango_attr_klasses["state"] = _StateAttribute
def cleanUp(self):
@@ -212,8 +216,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
:param absolute_name: (str) the object absolute name string
- :return: (taurus.core.TaurusModel) a class object that should be a subclass of a taurus.core.TaurusModel
- :raise: (taurus.core.TaurusException) if the given name is invalid.
+ :return: (taurus.core.taurusmodel.TaurusModel) a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
+ :raise: (taurus.core.taurusexception.TaurusException) if the given name is invalid.
"""
objType = None
try:
@@ -247,8 +251,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
:param db_name: (str) database name string alias. If None, the
default database is used
- :return: (taurus.core.TangoDatabase) database object
- :raise: (taurus.core.TaurusException) if the given alias is invalid.
+ :return: (taurus.core.tangodatabase.TangoDatabase) database object
+ :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
"""
ret = None
if db_name is None:
@@ -300,7 +304,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
(_/_/_) or a device alias.
:return: (taurus.core.tango.TangoDevice) a device object
- :raise: (taurus.core.TaurusException) if the given dev_name is invalid.
+ :raise: (taurus.core.taurusexception.TaurusException) if the given dev_name is invalid.
"""
d = self.tango_devs.get(dev_name)
if d is None:
@@ -333,7 +337,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
if dev_name:
try:
alias = db.get_alias(dev_name)
- if alias and alias.lower() == taurus.core.InvalidAlias:
+ if alias and alias.lower() == InvalidAlias:
alias = None
except:
alias = None
@@ -371,8 +375,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
:param attr_name: (str) attribute name
- :return: (taurus.core.TangoAttribute) attribute object
- :raise: (taurus.core.TaurusException) if the given alias is invalid.
+ :return: (taurus.core.tangoattribute.TangoAttribute) attribute object
+ :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
"""
attr = self.tango_attrs.get(attr_name)
@@ -455,7 +459,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
If the corresponding configuration already exists, the existing instance
is returned. Otherwise a new instance is stored and returned.
- :param param: (taurus.core.TaurusAttribute or str) attrubute object or full configuration name
+ :param param: (taurus.core.taurusattribute.TaurusAttribute or str) attrubute object or full configuration name
:return: (taurus.core.tango.TangoConfiguration) configuration object
"""
@@ -490,7 +494,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
params = validator.getParams(cfg_name)
if params is None:
- raise taurus.core.TaurusException("Invalid Tango configuration name %s" % cfg_name)
+ raise TaurusException("Invalid Tango configuration name %s" % cfg_name)
host,port = params.get('host'),params.get('port')
db = None
@@ -639,7 +643,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
if dev_name:
try:
alias = db.get_alias(dev_name)
- if alias and alias.lower() == taurus.core.InvalidAlias:
+ if alias and alias.lower() == InvalidAlias:
alias = None
except:
alias = None
@@ -698,7 +702,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
:param period: (float) polling period (in seconds)
:param unsubscribe_evts: (bool) wheater or not to unsubscribe from events
"""
- tmr = self.polling_timers.get(period,taurus.core.TaurusPollingTimer(period))
+ tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
self.polling_timers[period] = tmr
tmr.addAttribute(attribute, self.isPollingEnabled())
diff --git a/lib/taurus/core/taurusattribute.py b/lib/taurus/core/taurusattribute.py
index ebfde94..56e61d2 100644
--- a/lib/taurus/core/taurusattribute.py
+++ b/lib/taurus/core/taurusattribute.py
@@ -31,14 +31,14 @@ __docformat__ = "restructuredtext"
import weakref
-import taurusmodel
-import taurusconfiguration
-#from enums import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusElementType
+from .taurusmodel import TaurusModel
+from .taurusconfiguration import TaurusConfigurationProxy
-class TaurusAttribute(taurusmodel.TaurusModel):
+class TaurusAttribute(TaurusModel):
def __init__(self, name, parent, **kwargs):
- self.call__init__(taurusmodel.TaurusModel, name, parent)
+ self.call__init__(TaurusModel, name, parent)
self.__parentDevice = parent # just to keep it alive
@@ -65,22 +65,18 @@ class TaurusAttribute(taurusmodel.TaurusModel):
self._dev_hw_obj = parent.getHWObj()
- def __str__(self):
- return self.getFullName()
-
def cleanUp(self):
self.trace("[TaurusAttribute] cleanUp")
self._unsubscribeEvents()
self._dev_hw_obj = None
- taurusmodel.TaurusModel.cleanUp(self)
+ TaurusModel.cleanUp(self)
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# TaurusModel implementation
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getTaurusElementType(self):
- import taurus.core
- return taurus.core.TaurusElementType.Attribute
+ return TaurusElementType.Attribute
@classmethod
def buildModelName(cls, parent_model, relative_name):
@@ -314,9 +310,10 @@ class TaurusAttribute(taurusmodel.TaurusModel):
:param period: polling period (in miliseconds)
:type period: int
"""
- self.deprecated("use changePollingPeriod(). Not exactly the same functionality. Only activates polling if necessary")
- self.changePollingPeriod(period, force=force)
- self.enablePolling()
+ ## REENABLED, used to solve problems with ID GUI's and other systems where event independency is needed.
+ #self.deprecated("use changePollingPeriod(). Not exactly the same functionality. Only activates polling if necessary")
+ self.changePollingPeriod(period)
+ self.enablePolling(force=force)
def deactivatePolling(self, maintain_enabled=False):
"""unregister attribute from polling"""
@@ -342,7 +339,7 @@ class TaurusAttribute(taurusmodel.TaurusModel):
if ob is not None:
return ob
- ob = taurusconfiguration.TaurusConfigurationProxy(self)
+ ob = TaurusConfigurationProxy(self)
self.__weakFakeConfigObj = weakref.ref(ob)
return ob
@@ -371,4 +368,6 @@ class TaurusStateAttribute(TaurusAttribute):
def isInformDeviceOfErrors(self):
return True
-
+#del weakef
+#del TaurusModel
+#del TaurusConfigurationProxy
diff --git a/lib/taurus/core/taurusbasetypes.py b/lib/taurus/core/taurusbasetypes.py
index e7e7305..a94c348 100644
--- a/lib/taurus/core/taurusbasetypes.py
+++ b/lib/taurus/core/taurusbasetypes.py
@@ -26,10 +26,156 @@
a misc collection of basic types
'''
+__all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode",
+ "TaurusSerializationMode", "SubscriptionState", "TaurusEventType",
+ "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat",
+ "AttrQuality", "AttrAccess", "DisplayLevel", "ManagerState",
+ "TaurusTimeVal", "TaurusAttrValue", "TaurusConfigValue",
+ "TaurusLockInfo"]
+
+__docformat__ = "restructuredtext"
+
import time
import datetime
-from enums import AttrQuality, AttrAccess, DataFormat, LockStatus
+from .util.enumeration import Enumeration
+
+TaurusSWDevState = Enumeration(
+'TaurusSWDevState', (
+ 'Uninitialized',
+ 'Running',
+ 'Shutdown',
+ 'Crash',
+ 'EventSystemShutdown'
+))
+
+TaurusSWDevHealth = Enumeration(
+'TaurusSWDevHealth', (
+ 'Exported', # device reported exported
+ 'ExportedAlive', # device reported exported and confirmed connection
+ 'ExportedNotAlive', # device reported exported but connection failed!!
+ 'NotExported', # device didn't report exported
+ 'NotExportedAlive', # device didn't report exported but connection confirmed!
+ 'NotExportedNotAlive' # device didn't report exported and connection failed
+))
+
+OperationMode = Enumeration(
+'OperationMode', (
+ 'OFFLINE',
+ 'ONLINE'
+))
+
+TaurusSerializationMode = Enumeration(
+'TaurusSerializationMode', (
+ 'Serial',
+ 'Concurrent'
+))
+
+TaurusEventType = Enumeration(
+'TaurusEventType', (
+ 'Change',
+ 'Config',
+ 'Periodic',
+ 'Error'
+))
+
+MatchLevel = Enumeration(
+'MatchLevel', (
+ 'ANY',
+ 'SHORT',
+ 'NORMAL',
+ 'COMPLETE',
+ 'SHORT_NORMAL',
+ 'NORMAL_COMPLETE'
+))
+
+TaurusElementType = Enumeration(
+'TaurusElementType', (
+ 'Unknown',
+ 'Name',
+ 'DeviceClass',
+ 'Device',
+ 'DeviceAlias',
+ 'Domain',
+ 'Family',
+ 'Member',
+ 'Server',
+ 'ServerName',
+ 'ServerInstance',
+ 'Exported',
+ 'Host',
+ 'Attribute',
+ 'AttributeAlias',
+ 'Command',
+ 'Property',
+ 'Configuration',
+ 'Database',
+))
+
+LockStatus = Enumeration(
+'LockStatus', (
+ 'Unlocked',
+ 'Locked',
+ 'LockedMaster',
+ 'Unknown',
+))
+
+DataFormat = Enumeration(
+'DataFormat', (
+ '_0D',
+ '_1D',
+ '_2D'
+))
+
+DataType = Enumeration(
+'DataType', (
+ 'Integer',
+ 'Float',
+ 'String',
+ 'Boolean',
+))
+
+SubscriptionState = Enumeration(
+"SubscriptionState", (
+ "Unsubscribed",
+ "Subscribing",
+ "Subscribed",
+ "PendingSubscribe"
+))
+
+#################
+# Not in use yet:
+
+AttrQuality = Enumeration(
+'AttrQuality', (
+ 'ATTR_VALID',
+ 'ATTR_INVALID',
+ 'ATTR_ALARM'
+))
+
+AttrAccess = Enumeration(
+'AttrAccess', (
+ 'READ',
+ 'READ_WITH_WRITE',
+ 'WRITE',
+ 'READ_WRITE'
+))
+
+DisplayLevel = Enumeration(
+'DisplayLevel', (
+ 'OPERATOR',
+ 'EXPERT',
+ 'DEVELOPER'
+))
+
+ManagerState = Enumeration(
+'ManagerState', (
+ 'UNINITIALIZED',
+ 'INITED',
+ 'CLEANED'
+))
+
+
class TaurusTimeVal(object):
def __init__(self):
@@ -147,3 +293,8 @@ class TaurusLockInfo(object):
def __repr__(self):
return self.status_msg
+
+#del time
+#del datetime
+#del Enumeration
+#del AttrQuality, AttrAccess, DataFormat, LockStatus
\ No newline at end of file
diff --git a/lib/taurus/core/taurusconfiguration.py b/lib/taurus/core/taurusconfiguration.py
index 86392bf..301fe4a 100644
--- a/lib/taurus/core/taurusconfiguration.py
+++ b/lib/taurus/core/taurusconfiguration.py
@@ -1,4 +1,5 @@
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
#############################################################################
##
@@ -29,12 +30,9 @@ __all__ = ["TaurusConfigurationProxy", "TaurusConfiguration"]
__docformat__ = "restructuredtext"
-# -*- coding: utf-8 -*-
-
-import numpy
+from .taurusbasetypes import AttrAccess, TaurusElementType
+from .taurusmodel import TaurusModel
-from enums import AttrAccess
-import taurusmodel
class TaurusConfigurationProxy(object):
"""
@@ -53,7 +51,7 @@ class TaurusConfigurationProxy(object):
return getattr(self.__parent._getRealConfig(), name)
-class TaurusConfiguration(taurusmodel.TaurusModel):
+class TaurusConfiguration(TaurusModel):
no_cfg_value = '-----'
no_unit = 'No unit'
@@ -82,7 +80,7 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
# the configuration event identifier
self._cfg_evt_id = None
- self.call__init__(taurusmodel.TaurusModel, name, parent)
+ self.call__init__(TaurusModel, name, parent)
# Everything went ok so now we are sure we can store the object
if not storeCallback is None:
@@ -103,15 +101,14 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
self._unsubscribeEvents()
self._attr_info = None
self._dev_hw_obj = None
- taurusmodel.TaurusModel.cleanUp(self)
+ TaurusModel.cleanUp(self)
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# TaurusModel implementation
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getTaurusElementType(self):
- import taurus.core
- return taurus.core.TaurusElementType.Configuration
+ return TaurusElementType.Configuration
@classmethod
def buildModelName(cls, parent_model, relative_name):
@@ -201,7 +198,7 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
# def addListener(self, listener):
# """ Add a TaurusListener object in the listeners list.
# If the listener is already registered nothing happens."""
-# ret = taurusmodel.TaurusModel.addListener(self, listener)
+# ret = TaurusModel.addListener(self, listener)
# if not ret:
# return ret
@@ -465,18 +462,21 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
attr = self.getParentObj()
if attr is None: return False
v = attr.read(cache=cache)
+ import numpy
return numpy.isscalar(v.value)
def isSpectrum(self, cache=True):
attr = self.getParentObj()
if attr is None: return False
v = attr.read(cache=cache)
+ import numpy
return not numpy.isscalar(v.value) and numpy.array(v.value).ndim == 1
def isImage(self, cache=True):
attr = self.getParentObj()
if attr is None: return False
v = attr.read(cache=cache)
+ import numpy
return not numpy.isscalar(v.value) and numpy.array(v.value).ndim == 2
def isWrite(self, cache=True):
@@ -487,3 +487,6 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
def isReadWrite(self, cache=True):
return self.getWritable(cache) == AttrAccess.READ_WRITE
+
+#del AttrAccess
+#del TaurusModel
diff --git a/lib/taurus/core/taurusdatabase.py b/lib/taurus/core/taurusdatabase.py
index be83cea..7c63b06 100644
--- a/lib/taurus/core/taurusdatabase.py
+++ b/lib/taurus/core/taurusdatabase.py
@@ -34,9 +34,9 @@ __docformat__ = "restructuredtext"
import weakref
import operator
-from enums import TaurusEventType, TaurusSWDevHealth
-import taurusmodel
-import util
+from .taurusbasetypes import TaurusEventType, TaurusSWDevHealth, TaurusElementType
+from .taurusmodel import TaurusModel
+from .util.containers import CaselessDict
DFT_DATABASE_DESCRIPTION = "A database"
@@ -131,7 +131,7 @@ class TaurusDevInfo(TaurusInfo):
class TaurusServInfo(TaurusInfo):
def __init__(self, container, name=None, full_name=None):
super(TaurusServInfo, self).__init__(container, name=name, full_name=full_name)
- self._devices = util.CaselessDict()
+ self._devices = CaselessDict()
self._exported = False
self._alive = None
self._host = ""
@@ -187,7 +187,7 @@ class TaurusServInfo(TaurusInfo):
class TaurusDevClassInfo(TaurusInfo):
def __init__(self, container, name=None, full_name=None):
super(TaurusDevClassInfo, self).__init__(container, name=name, full_name=full_name)
- self._devices = util.CaselessDict()
+ self._devices = CaselessDict()
def devices(self):
return self._devices
@@ -217,11 +217,11 @@ class TaurusAttrInfo(TaurusInfo):
return getattr(self._info, name)
-class TaurusDevTree(util.CaselessDict):
+class TaurusDevTree(CaselessDict):
def __init__(self, other=None):
super(TaurusDevTree, self).__init__()
- self._devices = util.CaselessDict()
+ self._devices = CaselessDict()
if other is not None:
self._update(other)
@@ -240,11 +240,11 @@ class TaurusDevTree(util.CaselessDict):
def addDevice(self, dev_info):
domain, family, member = dev_info.domain(), dev_info.family(), dev_info.member()
- families = self[domain] = self.get(domain, util.CaselessDict())
- devs = self._devices[domain] = self._devices.get(domain, util.CaselessDict())
+ families = self[domain] = self.get(domain, CaselessDict())
+ devs = self._devices[domain] = self._devices.get(domain, CaselessDict())
devs[dev_info.name()] = dev_info
- families[family] = members = families.get(family, util.CaselessDict())
+ families[family] = members = families.get(family, CaselessDict())
members[member] = dev_info
@@ -321,7 +321,7 @@ class TaurusDatabaseCache(object):
raise RuntimeError("Must be implemented in subclass")
def getDevice(self, name):
- """Returns a :class:`taurus.core.TaurusDevInfo` object with information
+ """Returns a :class:`taurus.core.taurusdatabase.TaurusDevInfo` object with information
about the given device name
:param name: (str) the device name
@@ -406,22 +406,22 @@ class TaurusDatabaseCache(object):
return self.serverTree().getServerNameInstances(serverName)
-class TaurusDatabase(taurusmodel.TaurusModel):
+class TaurusDatabase(TaurusModel):
def __init__(self, complete_name, parent=None):
self._descr = None
- self.call__init__(taurusmodel.TaurusModel, complete_name, parent)
+ self.call__init__(TaurusModel, complete_name, parent)
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# TaurusModel implementation
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def cleanUp(self):
self.trace("[TaurusDatabase] cleanUp")
- taurusmodel.TaurusModel.cleanUp(self)
+ TaurusModel.cleanUp(self)
def getTaurusElementType(self):
- import taurus.core
- return taurus.core.TaurusElementType.Database
+
+ return TaurusElementType.Database
@classmethod
def buildModelName(cls, parent_model, relative_name):
@@ -432,8 +432,8 @@ class TaurusDatabase(taurusmodel.TaurusModel):
@classmethod
def getNameValidator(cls):
- import taurusvalidator
- return taurusvalidator.DatabaseNameValidator()
+ from .taurusvalidator import DatabaseNameValidator
+ return DatabaseNameValidator()
def getDescription(self,cache=True):
if self._descr is None or not cache:
@@ -457,7 +457,7 @@ class TaurusDatabase(taurusmodel.TaurusModel):
return obj
def addListener(self, listener):
- ret = taurusmodel.TaurusModel.addListener(self, listener)
+ ret = TaurusModel.addListener(self, listener)
if not ret:
return ret
self.fireEvent(TaurusEventType.Change, self.getDisplayValue(), listener)
diff --git a/lib/taurus/core/taurusdevice.py b/lib/taurus/core/taurusdevice.py
index a15b112..ede5174 100644
--- a/lib/taurus/core/taurusdevice.py
+++ b/lib/taurus/core/taurusdevice.py
@@ -29,16 +29,14 @@ __all__ = ["TaurusDevice"]
__docformat__ = "restructuredtext"
-import sys
-
-from enums import TaurusSWDevState, TaurusEventType
-from taurusbasetypes import TaurusLockInfo
-import taurusmodel
+from .taurusbasetypes import TaurusSWDevState, TaurusEventType, \
+ TaurusLockInfo, TaurusElementType
+from .taurusmodel import TaurusModel
DFT_DEVICE_DESCRIPTION = "A device"
-class TaurusDevice(taurusmodel.TaurusModel):
+class TaurusDevice(TaurusModel):
SHUTDOWNS = (TaurusSWDevState.Shutdown, TaurusSWDevState.Crash,
TaurusSWDevState.EventSystemShutdown)
@@ -51,7 +49,7 @@ class TaurusDevice(taurusmodel.TaurusModel):
parent = kw.pop('parent', None)
storeCallback = kw.pop('storeCallback', None)
self.__dict__.update(kw)
- self.call__init__(taurusmodel.TaurusModel, name, parent)
+ self.call__init__(TaurusModel, name, parent)
self._deviceObj = self._createHWObject()
self._deviceStateObj = None
@@ -70,7 +68,7 @@ class TaurusDevice(taurusmodel.TaurusModel):
if not self._deviceStateObj is None:
self._deviceStateObj.removeListener(self)
self._deviceStateObj = None
- taurusmodel.TaurusModel.cleanUp(self)
+ TaurusModel.cleanUp(self)
# Export the DeviceProxy interface into this object.
# This way we can call for example read_attribute on an object of this class
@@ -159,8 +157,7 @@ class TaurusDevice(taurusmodel.TaurusModel):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getTaurusElementType(self):
- import taurus.core
- return taurus.core.TaurusElementType.Device
+ return TaurusElementType.Device
@classmethod
def buildModelName(cls, parent_model, relative_name):
@@ -189,8 +186,8 @@ class TaurusDevice(taurusmodel.TaurusModel):
if not self.hasListeners() or not cache:
try:
v = self.getStateObj().read(cache=cache)
- except Exception:
- v = sys.exc_info()[1]
+ except Exception as e:
+ v = e
self._deviceSwState = self.decode(v)
return self._deviceSwState
@@ -216,22 +213,22 @@ class TaurusDevice(taurusmodel.TaurusModel):
return self._descr
def removeListener(self, listener):
- ret = taurusmodel.TaurusModel.removeListener(self, listener)
+ ret = TaurusModel.removeListener(self, listener)
if not ret or self.hasListeners():
return ret # False, None or True
return self.getStateObj().removeListener(self)
def addListener(self, listener):
weWereListening = self.hasListeners()
- ret = taurusmodel.TaurusModel.addListener(self, listener)
+ ret = TaurusModel.addListener(self, listener)
if not ret:
return ret
# We are only listening to State if someone is listening to us
if weWereListening:
# We were listening already, so we must fake an event to the new
- # subscrived listener with the current value
- self.fireEvent(taurusmodel.TaurusEventType.Change, self.getValueObj(), hasattr(listener,'__iter__') and listener or [listener])
+ # subscribed listener with the current value
+ self.fireEvent(TaurusEventType.Change, self.getValueObj(), hasattr(listener,'__iter__') and listener or [listener])
else:
# We were not listening to events, but now we have to
self.getStateObj().addListener(self)
diff --git a/lib/taurus/core/taurusfactory.py b/lib/taurus/core/taurusfactory.py
index 801aac8..19b627f 100644
--- a/lib/taurus/core/taurusfactory.py
+++ b/lib/taurus/core/taurusfactory.py
@@ -41,11 +41,11 @@ __all__ = ["TaurusFactory"]
__docformat__ = "restructuredtext"
-from enums import OperationMode
-import taurusdatabase
-import taurusdevice
-import taurusattribute
-import taurusconfiguration
+from .taurusbasetypes import OperationMode
+from .taurusdatabase import TaurusDatabase
+from .taurusdevice import TaurusDevice
+from .taurusattribute import TaurusAttribute
+from .taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy
class TaurusFactory(object):
"""The base class for valid Factories in Taurus."""
@@ -85,20 +85,20 @@ class TaurusFactory(object):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def findObjectClass(self, absolute_name):
- """findObjectClass(string absolute_name) -> taurus.core.TaurusModel subclass
+ """findObjectClass(string absolute_name) -> taurus.core.taurusmodel.TaurusModel subclass
Obtain the class object corresponding to the given name.
@param[in] absolute_name the object absolute name string
- @return a class object that should be a subclass of a taurus.core.TaurusModel
+ @return a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
@throws TaurusException if the given name is invalid.
"""
raise RuntimeError("findObjectClass cannot be called for abstract" \
" TaurusFactory")
def getDatabase(self, db_name=None):
- """getDatabase(string db_name) -> taurus.core.TaurusDatabase
+ """getDatabase(string db_name) -> taurus.core.taurusdatabase.TaurusDatabase
Obtain the object corresponding to the given database name or the
default database if db_name is None.
@@ -106,37 +106,37 @@ class TaurusFactory(object):
instance is returned. Otherwise a new instance is stored and returned.
@param[in] db_name database name string. It should be formed like:
- <schema>://<authority>. If <schema> is ommited then
- it will use the default schema. if db_name is None,
+ <scheme>://<authority>. If <scheme> is ommited then
+ it will use the default scheme. if db_name is None,
the default database is used
- @return a taurus.core.TaurusDatabase object
+ @return a taurus.core.taurusdatabase.TaurusDatabase object
@throws TaurusException if the given name is invalid.
"""
raise RuntimeError("getDatabase cannot be called for abstract" \
" TaurusFactory")
def getDevice(self, dev_name, **kw):
- """getDevice(string dev_name) -> taurus.core.TaurusDevice
+ """getDevice(string dev_name) -> taurus.core.taurusdevice.TaurusDevice
Obtain the object corresponding to the given device name. If the
corresponding device already exists, the existing instance is returned.
Otherwise a new instance is stored and returned.
@param[in] dev_name the device name string. It should be formed like:
- <schema>://<authority>/<device name>. If <schema>
- is ommited then it will use the default schema.
+ <scheme>://<authority>/<device name>. If <scheme>
+ is ommited then it will use the default scheme.
If authority is ommited then it will use the
- default authority for the schema.
+ default authority for the scheme.
- @return a taurus.core.TaurusDevice object
+ @return a taurus.core.taurusdevice.TaurusDevice object
@throws TaurusException if the given name is invalid.
"""
raise RuntimeError("getDevice cannot be called for abstract" \
" TaurusFactory")
def getAttribute(self, attr_name):
- """getAttribute(string attr_name) -> taurus.core.TaurusAttribute
+ """getAttribute(string attr_name) -> taurus.core.taurusattribute.TaurusAttribute
Obtain the object corresponding to the given attribute name.
If the corresponding attribute already exists, the existing instance
@@ -144,22 +144,22 @@ class TaurusFactory(object):
@param[in] attr_name string attribute name
- @return a taurus.core.TaurusAttribute object
+ @return a taurus.core.taurusattribute.TaurusAttribute object
@throws TaurusException if the given name is invalid.
"""
raise RuntimeError("getAttribute cannot be called for abstract" \
" TaurusFactory")
def getConfiguration(self, param):
- """getConfiguration(param) -> taurus.core.TaurusConfiguration
+ """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
Obtain the object corresponding to the given attribute or full name.
If the corresponding configuration already exists, the existing instance
is returned. Otherwise a new instance is stored and returned.
- @param[in] param taurus.core.TaurusAttribute object or full configuration name
+ @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
- @return a taurus.core.TaurusAttribute object
+ @return a taurus.core.taurusattribute.TaurusAttribute object
@throws TaurusException if the given name is invalid.
"""
raise RuntimeError("getConfiguration cannot be called for abstract" \
@@ -209,15 +209,15 @@ class TaurusFactory(object):
return obj
def getObject(self, cls, name):
- if issubclass(cls, taurusdatabase.TaurusDatabase):
+ if issubclass(cls, TaurusDatabase):
return self.getDatabase(name)
- elif issubclass(cls, taurusdevice.TaurusDevice):
+ elif issubclass(cls, TaurusDevice):
return self.getDevice(name)
- elif issubclass(cls, taurusattribute.TaurusAttribute):
+ elif issubclass(cls, TaurusAttribute):
return self.getAttribute(name)
- elif issubclass(cls, taurusconfiguration.TaurusConfiguration):
+ elif issubclass(cls, TaurusConfiguration):
return self.getConfiguration(name)
- elif issubclass(cls, taurusconfiguration.TaurusConfigurationProxy):
+ elif issubclass(cls, TaurusConfigurationProxy):
return self.getConfiguration(name)
else:
return None
@@ -271,3 +271,9 @@ class TaurusFactory(object):
"""
raise RuntimeError("removeAttributeFromPolling cannot be called for abstract" \
" TaurusFactory")
+
+ def __str__(self):
+ return '{0}()'.format(self.__class__.__name__)
+
+ def __repr__(self):
+ return '{0}(schemes={1})'.format(self.__class__.__name__, ", ".join(self.schemes))
diff --git a/lib/taurus/core/taurushelper.py b/lib/taurus/core/taurushelper.py
index 33da855..baaa86a 100644
--- a/lib/taurus/core/taurushelper.py
+++ b/lib/taurus/core/taurushelper.py
@@ -25,6 +25,16 @@
"""a list of helper methods"""
+__all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName',
+ 'Manager', 'Factory', 'Device', 'Attribute', 'Configuration',
+ 'Database', 'Object', 'Logger',
+ 'Critical', 'Error', 'Warning', 'Info', 'Debug', 'Trace',
+ 'setLogLevel', 'setLogFormat', 'getLogLevel', 'getLogFormat',
+ 'resetLogLevel', 'resetLogFormat',
+ 'enableLogOutput', 'disableLogOutput',
+ 'log', 'trace', 'debug', 'info', 'warning', 'error', 'critical',
+ 'changeDefaultPollingPeriod']
+
__docformat__ = "restructuredtext"
import sys
@@ -167,7 +177,7 @@ def check_dependencies():
print m
def log_dependencies():
- from taurus.core.util import Logger
+ from taurus.core.util.log import Logger
l = Logger("taurus")
for msg in _check_dependencies(forlog=True):
if msg[0] != -1:
@@ -295,32 +305,37 @@ def Manager():
It is a shortcut to::
import taurus.core
- manager = taurus.core.TaurusManager()
+ manager = taurus.core.taurusmanager.TaurusManager()
:return: the TaurusManager
- :rtype: :class:`taurus.core.TaurusManager`
+ :rtype: :class:`taurus.core.taurusmanager.TaurusManager`
- .. seealso:: :class:`taurus.core.TaurusManager`"""
- import taurusmanager
- return taurusmanager.TaurusManager()
+ .. seealso:: :class:`taurus.core.taurusmanager.TaurusManager`"""
+ from taurus.core.taurusmanager import TaurusManager
+ return TaurusManager()
def Factory(scheme=None):
"""Returns the one and only Factory for the given scheme
It is a shortcut to::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory(scheme)
:param scheme: a string representing the scheme. Default value is None meaning ``tango`` scheme
:type scheme: str
:return: a taurus factory
- :rtype: :class:`taurus.core.TaurusFactory`"""
- f = Manager().getFactory(scheme=scheme)
+ :rtype: :class:`taurus.core.taurusfactory.TaurusFactory`"""
+ manager = Manager()
+ f = manager.getFactory(scheme=scheme)
if f is None:
- import taurusexception
- raise taurusexception.TaurusException('Cannot create Factory for scheme %s'%repr(scheme))
+ from taurus.core.taurusexception import TaurusException
+ if scheme is None:
+ scheme = "default scheme '" + manager.default_scheme + "'"
+ else:
+ scheme = "'" + scheme + "'"
+ raise TaurusException('Cannot create Factory for %s' % scheme)
return f()
def Device(device_name):
@@ -328,15 +343,15 @@ def Device(device_name):
It is a shortcut to::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory()
device = factory.getDevice(device_name)
:param device_name: the device name
:type device_name: str
:return: a taurus device
- :rtype: :class:`taurus.core.TaurusDevice`"""
+ :rtype: :class:`taurus.core.taurusdevice.TaurusDevice`"""
return Factory(scheme=getSchemeFromName(device_name)).getDevice(device_name)
def Attribute(dev_or_attr_name, attr_name=None):
@@ -348,15 +363,15 @@ def Attribute(dev_or_attr_name, attr_name=None):
It is a shortcut to::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory()
attribute = factory.getAttribute(full_attribute_name)
or::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory()
device = factory.getDevice(device_name)
attribute = device.getAttribute(attribute_name)
@@ -366,7 +381,7 @@ def Attribute(dev_or_attr_name, attr_name=None):
:param attr_name: attribute name
:type attr_name: str
:return: a taurus attribute
- :rtype: :class:`taurus.core.TaurusAttribute`"""
+ :rtype: :class:`taurus.core.taurusattribute.TaurusAttribute`"""
import types
if attr_name is None:
@@ -387,15 +402,15 @@ def Configuration(attr_or_conf_name, conf_name=None):
It is a shortcut to::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory()
conf = factory.getConfiguration(attr_or_conf_name)
or::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory()
attribute = factory.getAttribute(attribute_name)
conf = attribute.getConfig(conf_name)
@@ -405,7 +420,7 @@ def Configuration(attr_or_conf_name, conf_name=None):
:param conf_name: conf name
:type conf_name: str or None
:return: a taurus configuration
- :rtype: :class:`taurus.core.TaurusConfiguration`"""
+ :rtype: :class:`taurus.core.taurusconfiguration.TaurusConfiguration`"""
if conf_name is None:
return Factory(scheme=getSchemeFromName(attr_or_conf_name)).getConfiguration(attr_or_conf_name)
else:
@@ -416,15 +431,15 @@ def Database(db_name=None):
It is a shortcut to::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory()
db = factory.getDatabase(db_name)
:param db_name: database name. If None (default) it will use the TANGO_HOST value
:type db_name: str or None
:return: a taurus database
- :rtype: :class:`taurus.core.TaurusDatabase`"""
+ :rtype: :class:`taurus.core.taurusdatabase.TaurusDatabase`"""
return Factory(getSchemeFromName(db_name)).getDatabase(db_name)
def Object(klass, name):
@@ -432,8 +447,8 @@ def Object(klass, name):
It is a shortcut to::
- import taurus.core
- manager = taurus.core.TaurusManager()
+ import taurus.core.taurusmanager
+ manager = taurus.core.taurusmanager.TaurusManager()
factory = manager.getFactory()
obj = factory.getObject(klass, name)
@@ -442,36 +457,39 @@ def Object(klass, name):
:param name: the full object name
:type name: str
:return: a taurus object
- :rtype: :class:`taurus.core.TaurusModel`"""
+ :rtype: :class:`taurus.core.taurusmodel.TaurusModel`"""
return Factory(getSchemeFromName(name)).getObject(klass, name)
-import util
-
-Critical = util.Logger.Critical
-Error = util.Logger.Error
-Warning = util.Logger.Warning
-Info = util.Logger.Info
-Debug = util.Logger.Debug
-Trace = util.Logger.Trace
-
-setLogLevel = util.Logger.setLogLevel
-setLogFormat = util.Logger.setLogFormat
-getLogLevel = util.Logger.getLogLevel
-getLogFormat = util.Logger.getLogFormat
-resetLogLevel = util.Logger.resetLogLevel
-resetLogFormat = util.Logger.resetLogFormat
-
-enableLogOutput = util.Logger.enableLogOutput
-disableLogOutput = util.Logger.disableLogOutput
-
-log = util._log
-trace = util.trace
-debug = util.debug
-info = util.info
-warning = util.warning
-error = util.error
-critical = util.critical
-
+from taurus.core.util import log as __log_mod
+
+Logger = __log_mod.Logger
+Critical = Logger.Critical
+Error = Logger.Error
+Warning = Logger.Warning
+Info = Logger.Info
+Debug = Logger.Debug
+Trace = Logger.Trace
+
+setLogLevel = Logger.setLogLevel
+setLogFormat = Logger.setLogFormat
+getLogLevel = Logger.getLogLevel
+getLogFormat = Logger.getLogFormat
+resetLogLevel = Logger.resetLogLevel
+resetLogFormat = Logger.resetLogFormat
+
+enableLogOutput = Logger.enableLogOutput
+disableLogOutput = Logger.disableLogOutput
+
+log = __log_mod._log
+trace = __log_mod.trace
+debug = __log_mod.debug
+info = __log_mod.info
+warning = __log_mod.warning
+error = __log_mod.error
+critical = __log_mod.critical
def changeDefaultPollingPeriod(period):
Manager().changeDefaultPollingPeriod(period)
+
+#del __log_mod
+#del __translate_version_str2int
\ No newline at end of file
diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py
index 60cbae8..f53baf1 100644
--- a/lib/taurus/core/tauruslistener.py
+++ b/lib/taurus/core/tauruslistener.py
@@ -29,15 +29,13 @@ __all__ = ["TaurusListener", "TaurusExceptionListener"]
__docformat__ = "restructuredtext"
-import PyTango
+from .util.log import Logger
-import util
-
-class TaurusListener(util.Logger):
+class TaurusListener(Logger):
""" TaurusListener Interface"""
def __init__(self, name, parent=None):
- self.call__init__(util.Logger, name, parent)
+ self.call__init__(Logger, name, parent)
def eventReceived(self, src, type, evt_value):
""" Method to implement the event notification"""
@@ -49,9 +47,7 @@ class TaurusListener(util.Logger):
class TaurusExceptionListener(object):
- """Class for handling ConnectionFailed, DevFailed and TaurusException exceptions.
-
- The TaurusExceptionListeners are invoked when the """
+ """Class for handling ConnectionFailed, DevFailed and TaurusException exceptions."""
def connectionFailed(self, ex):
self._printException(ex)
@@ -60,6 +56,7 @@ class TaurusExceptionListener(object):
self._printException(self)
def exceptionReceived(self, exception):
+ import PyTango
if isinstance(exception, PyTango.ConnectionFailed):
self.connectionFailed(exception)
@@ -67,7 +64,7 @@ class TaurusExceptionListener(object):
self.devFailed(exception)
else:
- self._printException(self, exception)
+ self._printException(exception)
def _printException(self, exception):
print self.__class__.__name__, "received", exception.__class__.__name__, str(exception)
diff --git a/lib/taurus/core/taurusmanager.py b/lib/taurus/core/taurusmanager.py
index 5067f8d..8d67544 100644
--- a/lib/taurus/core/taurusmanager.py
+++ b/lib/taurus/core/taurusmanager.py
@@ -29,23 +29,32 @@ __all__ = ["TaurusManager"]
__docformat__ = "restructuredtext"
-import os, imp, atexit
+import os
+import imp
+import atexit
-import util
-import taurus.core
-from enums import OperationMode, ManagerState, TaurusSerializationMode
-from taurus.core.taurusexception import TaurusException
+from .util.singleton import Singleton
+from .util.log import Logger
+from .util.threadpool import ThreadPool
-class TaurusManager(util.Singleton, util.Logger):
- """A :class:`taurus.core.util.Singleton` class designed to provide Taurus management.
+from .taurusbasetypes import OperationMode, ManagerState, TaurusSerializationMode
+from .taurusdatabase import TaurusDatabase
+from .taurusdevice import TaurusDevice
+from .taurusconfiguration import TaurusConfiguration
+from .taurusexception import TaurusException
+from .taurusfactory import TaurusFactory
+
+class TaurusManager(Singleton, Logger):
+ """A :class:`taurus.core.util.singleton.Singleton` class designed to provide Taurus management.
Example::
- >>> import taurus.core
- >>> manager = taurus.core.TaurusManager()
- >>> print manager == taurus.core.TaurusManager()
+ >>> import taurus.core.taurusmanager
+ >>> manager = taurus.core.taurusmanager.TaurusManager()
+ >>> print manager == taurus.core.taurusmanager.TaurusManager()
True
"""
+ PLUGIN_KEY = "__taurus_plugin__"
DefaultSerializationMode = TaurusSerializationMode.Concurrent
default_scheme = "tango"
@@ -58,7 +67,7 @@ class TaurusManager(util.Singleton, util.Logger):
"""Singleton instance initialization.
For internal usage only. Do **NOT** call this method directly"""
self._state = ManagerState.UNINITIALIZED
- self.call__init__(util.Logger)
+ self.call__init__(Logger)
self.reInit()
atexit.register(self.cleanUp)
@@ -73,16 +82,15 @@ class TaurusManager(util.Singleton, util.Logger):
self._operation_mode = OperationMode.ONLINE
self._serialization_mode = self.DefaultSerializationMode
if self._serialization_mode == TaurusSerializationMode.Concurrent:
- self._thread_pool = util.ThreadPool(name="TaurusTP",
- parent=self,
- Psize=5,
- Qsize=1000)
+ self._thread_pool = ThreadPool(name="TaurusTP",
+ parent=self,
+ Psize=5,
+ Qsize=1000)
else:
self._thread_pool = None
- self._plugins = self._build_plugins()
+ self._plugins = None
self._initial_default_scheme = self.default_scheme
- self._default_factory = self._plugins.get(self.default_scheme, None)
self._state = ManagerState.INITED
@@ -95,7 +103,7 @@ class TaurusManager(util.Singleton, util.Logger):
if self._plugins is None:
return
self.trace("[TaurusManager] cleanUp")
- for f_schema, f in self._plugins.items():
+ for f_scheme, f in self._plugins.items():
f().cleanUp()
self._plugins = None
@@ -144,10 +152,9 @@ class TaurusManager(util.Singleton, util.Logger):
self.default_scheme = "simulation"
else:
self.default_scheme = self._initial_default_scheme
- self._default_factory = self._plugins.get(self.default_scheme, None)
self._operation_mode = mode
- for plugin in self._plugins.values():
+ for plugin in self.getPlugins().values():
plugin().setOperationMode(mode)
def getOperationMode(self):
@@ -159,34 +166,36 @@ class TaurusManager(util.Singleton, util.Logger):
def getDefaultFactory(self):
"""Gives the default factory.
- :return: (taurus.core.TaurusFactory) the default taurus factory
+ :return: (taurus.core.taurusfactory.TaurusFactory) the default taurus factory
"""
- return self._default_factory
+ return self.getPlugins().get(self.default_scheme, None)
def getPlugins(self):
"""Gives the information about the existing plugins
- :return: (dict<str, class taurus.core.TaurusFactory>)the list of plugins
+ :return: (dict<str, class taurus.core.taurusfactory.TaurusFactory>)the list of plugins
"""
+ if self._plugins is None:
+ self._plugins = self._build_plugins()
return self._plugins
def getFactory(self, scheme=None):
"""Gives the factory class object supporting the given scheme
:param scheme: (str or None) the scheme. If None the default scheme is used
- :return: (taurus.core.TaurusFactory or None) the factory class object for the
+ :return: (taurus.core.taurusfactory.TaurusFactory or None) the factory class object for the
given scheme or None if a proper factory is not found
"""
if scheme is None:
return self.getDefaultFactory()
- return self._plugins.get(scheme)
+ return self.getPlugins().get(scheme)
def getObject(self, cls, name):
"""Gives the object for the given class with the given name
- :param cls: (taurus.core.TaurusModel) object class
+ :param cls: (taurus.core.taurusmodel.TaurusModel) object class
:param name: (str) the object name
- :return: (taurus.core.TaurusModel or None) a taurus model object
+ :return: (taurus.core.taurusmodel.TaurusModel or None) a taurus model object
"""
factory = self._get_factory(name)
if factory is None: return
@@ -196,7 +205,7 @@ class TaurusManager(util.Singleton, util.Logger):
"""Finds the object with the given name
:param absolute_name: (str) the object name
- :return: (taurus.core.TaurusModel or None) the taurus model object or None if
+ :return: (taurus.core.taurusmodel.TaurusModel or None) the taurus model object or None if
no suitable name found
"""
factory = self._get_factory(absolute_name)
@@ -207,7 +216,7 @@ class TaurusManager(util.Singleton, util.Logger):
"""Finds the object class for the given object name
:param absolute_name: (str) the object name
- :return: (class taurus.core.TaurusModel or None) the taurus model class object or
+ :return: (class taurus.core.taurusmodel.TaurusModel or None) the taurus model class object or
None if no suitable name found
"""
factory = self._get_factory(absolute_name)
@@ -218,50 +227,50 @@ class TaurusManager(util.Singleton, util.Logger):
"""Returns a database object for the given name
:param name: (str) database name
- :return: (taurus.core.TaurusDatabase) the database for the given name
+ :return: (taurus.core.taurusdatabase.TaurusDatabase) the database for the given name
"""
- return self.getObject(taurus.core.TaurusDatabase, name)
+ return self.getObject(TaurusDatabase, name)
def getDevice(self, name):
"""Returns a device object for the given name
:param name: (str) device name
- :return: (taurus.core.TaurusDevice) the device for the given name
+ :return: (taurus.core.taurusdevice.TaurusDevice) the device for the given name
"""
- return self.getObject(taurus.core.TaurusDevice, name)
+ return self.getObject(TaurusDevice, name)
def getAttribute(self, name):
"""Returns a attribute object for the given name
:param name: (str) attribute name
- :return: (taurus.core.TaurusAttribute) the attribute for the given name
+ :return: (taurus.core.taurusattribute.TaurusAttribute) the attribute for the given name
"""
- return self.getObject(taurus.core.TaurusAttribute, name)
+ return self.getObject(TaurusAttribute, name)
def getConfiguration(self, name):
"""Returns a configuration object for the given name
:param name: (str) configuration name
- :return: (taurus.core.TaurusConfiguration) the configuration for the given name
+ :return: (taurus.core.taurusconfiguration.TaurusConfiguration) the configuration for the given name
"""
- return self.getObject(taurus.core.TaurusConfiguration, name)
+ return self.getObject(TaurusConfiguration, name)
def _get_factory(self, name):
- scheme = self._get_schema(name)
+ scheme = self._get_scheme(name)
if scheme is None: return
try:
- return self._plugins[scheme]()
+ return self.getPlugins()[scheme]()
except:
raise TaurusException('Invalid scheme "%s"'%scheme)
- def _get_schema(self, name):
+ def _get_scheme(self, name):
try:
return name[:name.index('://')]
except ValueError, e:
- if self._default_factory is None:
- self.warning("scheme not found for %s" % name)
- return
return self.default_scheme
+
+ def _get_schema(self, name):
+ raise DeprecationWarning('_get_schema is deprecated. Use _get_scheme instead')
def _build_plugins(self):
plugin_classes = self._get_plugin_classes()
@@ -282,37 +291,43 @@ class TaurusManager(util.Singleton, util.Logger):
import taurusfactory
upgrade_classes = []
- files = os.listdir(self._this_path)
+ elems = os.listdir(self._this_path)
dirs = []
- for f in files:
- if f.startswith('.') or f == 'util':
+ for elem in elems:
+ if elem.startswith('.') or elem.startswith("_"):
continue
- f = os.path.join(self._this_path, f)
- if os.path.isdir(f):
- elems = os.listdir(f)
- if '__init__.py' in elems:
- dirs.append(f)
+ elem = os.path.join(self._this_path, elem)
+ if not os.path.isdir(elem):
+ continue
+ plugin_file = os.path.join(elem, self.PLUGIN_KEY)
+ if not os.path.exists(plugin_file):
+ continue
+ if not os.path.exists(os.path.join(elem, '__init__.py')):
+ continue
+ dirs.append(elem)
plugins = []
- for d in dirs:
- package_name = d.split(os.path.sep)[-1]
+ full_module_names = ['taurus.core.%s'%d.split(os.path.sep)[-1] for d in dirs]
+ from taurus import tauruscustomsettings
+ full_module_names.extend(getattr(tauruscustomsettings,'EXTRA_SCHEME_MODULES',[]))
+
+ for full_module_name in full_module_names:
try:
- full_module_name = 'taurus.core.%s' % package_name
m = __import__(full_module_name, fromlist=['*'], level=0)
except Exception, imp1:
# just in case we are in python 2.4
try:
m = __import__(full_module_name, globals(), locals(), ['*'])
except:
- self.debug('Failed to inspect %s' % (package_name))
+ self.debug('Failed to inspect %s' % (full_module_name))
self.debug('Details:', exc_info=1)
continue
for s in m.__dict__.values():
plugin = None
try:
- if issubclass(s, taurus.core.TaurusFactory) and \
- issubclass(s, util.Singleton):
+ if issubclass(s, TaurusFactory) and \
+ issubclass(s, Singleton):
if hasattr(s, 'schemes') :
schemes = getattr(s, 'schemes')
if len(schemes):
@@ -327,7 +342,6 @@ class TaurusManager(util.Singleton, util.Logger):
if not plugin is None:
self.debug('Found plugin %s' % plugin.__name__)
plugins.append(plugin)
-
return plugins
def _find_scheme(self, factory_class):
@@ -340,7 +354,7 @@ class TaurusManager(util.Singleton, util.Logger):
"""Executes the given operations
:param ops: the sequence of operations
- :type ops: sequence<taurus.core.TaurusOperation>"""
+ :type ops: sequence<taurus.core.taurusoperation.TaurusOperation>"""
for o in ops:
o.execute()
@@ -348,7 +362,16 @@ class TaurusManager(util.Singleton, util.Logger):
self.getFactory()().changeDefaultPollingPeriod(period)
# todo: go through all known plugin factories and change their polling
# period
+
+ def __str__name__(self, name):
+ return '{0}({1})'.format(self.__class__.__name__, name)
+ def __str__(self):
+ return self.__str__name__("")
+
+ def __repr__(self):
+ return self.__str__name__("")
+
if __name__ == '__main__':
manager = TaurusManager()
print manager.getPlugins()
diff --git a/lib/taurus/core/taurusmodel.py b/lib/taurus/core/taurusmodel.py
index 0914a56..cc03427 100644
--- a/lib/taurus/core/taurusmodel.py
+++ b/lib/taurus/core/taurusmodel.py
@@ -33,10 +33,11 @@ import weakref
import operator
import threading
-import util
-from enums import TaurusEventType, MatchLevel
+from .util.log import Logger
+from .util.event import CallableRef, BoundMethodWeakref
+from .taurusbasetypes import TaurusEventType, MatchLevel
-class TaurusModel(util.Logger):
+class TaurusModel(Logger):
RegularEvent = (TaurusEventType.Change, TaurusEventType.Config, TaurusEventType.Periodic)
@@ -48,7 +49,7 @@ class TaurusModel(util.Logger):
self.trace("invalid name")
name = self._simp_name or self._norm_name or self._full_name or 'TaurusModel'
- self.call__init__(util.Logger, name, parent)
+ self.call__init__(Logger, name, parent)
if serializationMode is None:
s_obj = parent
@@ -63,18 +64,20 @@ class TaurusModel(util.Logger):
self._parentObj = None
self._listeners = []
+ def __str__name__(self, name):
+ return '{0}({1})'.format(self.__class__.__name__, name)
+
def __str__(self):
- return '%s(%s)' % (self.__class__.__name__, self.getSimpleName())
+ return self.__str__name__(self.getNormalName())
def __repr__(self):
- return '%s(%s)' % (self.__class__.__name__, self.getFullName())
+ return self.__str__name__(self.getFullName())
-
def cleanUp(self):
self.trace("[TaurusModel] cleanUp")
#self._parentObj = None
self._listeners = None
- util.Logger.cleanUp(self)
+ Logger.cleanUp(self)
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# API for Factory access
@@ -184,7 +187,7 @@ class TaurusModel(util.Logger):
if meth is not None and operator.isCallable(meth):
return weakref.ref(listener, cb)
else:
- return util.CallableRef(listener, cb)
+ return CallableRef(listener, cb)
def addListener(self, listener):
if self._listeners is None or listener is None:
@@ -242,7 +245,7 @@ class TaurusModel(util.Logger):
listeners = listeners,
for listener in listeners:
- if isinstance(listener, weakref.ref) or isinstance(listener, util.BoundMethodWeakref):
+ if isinstance(listener, weakref.ref) or isinstance(listener, BoundMethodWeakref):
l = listener()
else:
l = listener
diff --git a/lib/taurus/core/taurusoperation.py b/lib/taurus/core/taurusoperation.py
index f5d8624..a4538d7 100644
--- a/lib/taurus/core/taurusoperation.py
+++ b/lib/taurus/core/taurusoperation.py
@@ -29,12 +29,12 @@ __all__ = ["TaurusOperation", "WriteAttrOperation"]
__docformat__ = "restructuredtext"
-import util
+from .util.log import Logger
-class TaurusOperation(util.Logger):
+class TaurusOperation(Logger):
def __init__(self, name='TaurusOperation', parent=None, callbacks = None):
- self.call__init__(util.Logger, name, parent)
+ self.call__init__(Logger, name, parent)
if callbacks is None: callbacks = []
self._callbacks = callbacks
self._dangerMessage = None
diff --git a/lib/taurus/core/tauruspollingtimer.py b/lib/taurus/core/tauruspollingtimer.py
index c7fbd21..3a49638 100644
--- a/lib/taurus/core/tauruspollingtimer.py
+++ b/lib/taurus/core/tauruspollingtimer.py
@@ -32,10 +32,12 @@ __docformat__ = "restructuredtext"
import time
import threading
-import util
-from util import DebugIt
+from .util.log import Logger, DebugIt
+from .util.containers import CaselessDict
+from .util.timer import Timer
-class TaurusPollingTimer(util.Logger):
+
+class TaurusPollingTimer(Logger):
""" Polling timer manages a list of attributes that have to be polled in
the same period """
@@ -43,13 +45,13 @@ class TaurusPollingTimer(util.Logger):
"""Constructor
:param period: (int) polling period (miliseconds)
- :param parent: (util.Logger) parent object (default is None)
+ :param parent: (Logger) parent object (default is None)
"""
name = "TaurusPollingTimer[%d]" % period
- self.call__init__(util.Logger, name, parent)
+ self.call__init__(Logger, name, parent)
self.dev_dict = {}
self.attr_nb = 0
- self.timer = util.Timer(period/1000.0, self._pollAttributes, self)
+ self.timer = Timer(period/1000.0, self._pollAttributes, self)
self.lock = threading.RLock()
def start(self):
@@ -63,7 +65,7 @@ class TaurusPollingTimer(util.Logger):
def containsAttribute(self,attribute):
"""Determines if the polling timer already contains this attribute
- :param attribute: (taurus.core.TaurusAttribute) the attribute
+ :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute
:return: (bool) True if the attribute is registered for polling or
False otherwise
@@ -86,7 +88,7 @@ class TaurusPollingTimer(util.Logger):
def addAttribute(self,attribute, auto_start=True):
"""Registers the attribute in this polling.
- :param attribute: (taurus.core.TaurusAttribute) the attribute to be added
+ :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute to be added
:param auto_start: (bool) if True (default) it tells the polling timer
that it should startup as soon as there is at least
one attribute registered.
@@ -96,7 +98,7 @@ class TaurusPollingTimer(util.Logger):
try:
attr_dict = self.dev_dict.get(dev)
if attr_dict is None:
- self.dev_dict[dev] = attr_dict = util.CaselessDict()
+ self.dev_dict[dev] = attr_dict = CaselessDict()
if not attr_dict.has_key(attr_name):
attr_dict[attr_name] = attribute
self.attr_nb += 1
@@ -113,7 +115,7 @@ class TaurusPollingTimer(util.Logger):
attributes decreses to 0 the polling is stopped automatically in order
to save resources.
- :param attribute: (taurus.core.TaurusAttribute) the attribute to be added
+ :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute to be added
"""
dev, attr_name = attribute.getParentObj(), attribute.getSimpleName()
self.lock.acquire()
diff --git a/lib/taurus/core/taurusvalidator.py b/lib/taurus/core/taurusvalidator.py
index bffcd7b..01a5baa 100644
--- a/lib/taurus/core/taurusvalidator.py
+++ b/lib/taurus/core/taurusvalidator.py
@@ -33,8 +33,8 @@ __docformat__ = "restructuredtext"
import re
-import util
-from enums import MatchLevel
+from .taurusbasetypes import MatchLevel
+from .util.singleton import Singleton
InvalidAlias = "nada"
@@ -89,7 +89,7 @@ class AbstractTangoValidator:
return None
-class DatabaseNameValidator(util.Singleton, AbstractTangoValidator):
+class DatabaseNameValidator(Singleton, AbstractTangoValidator):
protocol_prefix = '((?P<scheme>tango)://)?'
@@ -122,7 +122,7 @@ class DatabaseNameValidator(util.Singleton, AbstractTangoValidator):
return 3*('%s:%s' % (host,port),)
-class DatabaseQueryValidator(util.Singleton, AbstractTangoValidator):
+class DatabaseQueryValidator(Singleton, AbstractTangoValidator):
"""Deprecated"""
query = '\?query=(?P<query>[\w\-_]+)(?P<params>(\?param=[\w\*\?\%\-_]+)*)'
@@ -152,7 +152,7 @@ class DatabaseQueryValidator(util.Singleton, AbstractTangoValidator):
return str, normal, short
-class DeviceNameValidator(util.Singleton, AbstractTangoValidator):
+class DeviceNameValidator(Singleton, AbstractTangoValidator):
w = AbstractTangoValidator.tango_word
dev = '(?P<devicename>' + w + '/' + w + '/' + w + ')'
@@ -204,7 +204,7 @@ class DeviceNameValidator(util.Singleton, AbstractTangoValidator):
return complete, dev_name, alias
-class DeviceQueryValidator(util.Singleton, AbstractTangoValidator):
+class DeviceQueryValidator(Singleton, AbstractTangoValidator):
"""Deprecated"""
query = DatabaseQueryValidator.query
@@ -233,7 +233,7 @@ class DeviceQueryValidator(util.Singleton, AbstractTangoValidator):
return str,short
-class AttributeNameValidator(util.Singleton, AbstractTangoValidator):
+class AttributeNameValidator(Singleton, AbstractTangoValidator):
w = AbstractTangoValidator.tango_word
attr = '/(?P<attributename>' + w + ')'
@@ -270,7 +270,7 @@ class AttributeNameValidator(util.Singleton, AbstractTangoValidator):
return str, normal_name, attr_name
-class ConfigurationNameValidator(util.Singleton, AbstractTangoValidator):
+class ConfigurationNameValidator(Singleton, AbstractTangoValidator):
w = AbstractTangoValidator.tango_word
conf = "\?(?i)configuration(=(?P<configparam>" + w + "))*"
diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/__init__.py
index 69849d9..684c575 100644
--- a/lib/taurus/core/util/__init__.py
+++ b/lib/taurus/core/util/__init__.py
@@ -36,87 +36,11 @@ The json implementation follows the rule:
__docformat__ = "restructuredtext"
-import sys
-import os.path
+import taurus.tauruscustomsettings
-try:
- import json
-except:
- json = None
+LIGHTWEIGHT_IMPORTS = getattr(taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False)
-from .codecs import *
-from .colors import *
-from .constant import *
-from .containers import *
-from .enumeration import *
-from .event import *
-from .log import *
-from .object import *
-from .timer import *
-from .singleton import *
-from .safeeval import *
-from .prop import *
-from .threadpool import *
-from .user import *
-
-import eventfilters
-
-from lxml import etree
-
-def str_DevFailed(df):
- """Returns a string representation of a :class:`PyTango.DevFailed`.
-
- :param df: (PyTango.DevFailed) the PyTango exception object
- :return: (str) a string representation of the given exception"""
-
- ret = ""
- try:
- desc = df.message.desc.rstrip('\n').replace('\n'," \n")
-
- ret += " Severity = %s\n" % df.message.severity
- ret += " Reason = %s\n" % df.message.reason
- ret += "Description = %s\n" % desc
- ret += " Origin = %s\n" % df.message.origin
- except:
- ret = "Exception = %s" % str(df)
- return ret
-
-def print_DevFailed(df):
- """Prints the contents of the given :class:`PyTango.DevFailed`.
-
- :param df: (PyTango.DevFailed) the PyTango exception object"""
- import PyTango
- PyTango.Except.print_exception(df)
-
-def dictFromSequence(seq):
- """Translates a sequence into a dictionary by converting each to elements of
- the sequence (k,v) into a k:v pair in the dictionary
-
- :param seq: (sequence) any sequence object
- :return: (dict) dictionary built from the given sequence"""
- def _pairwise(iterable):
- """Utility method used by dictFromSequence"""
- itnext = iter(iterable).next
- while True:
- yield itnext(), itnext()
- return dict(_pairwise(seq))
-
-if sys.version_info < (2,6):
- def relpath(path, start=os.path.curdir):
- """Return a relative version of a path"""
-
- if not path:
- raise ValueError("no path specified")
-
- start_list = os.path.abspath(start).split(os.path.sep)
- path_list = os.path.abspath(path).split(os.path.sep)
-
- # Work out how much of the filepath is shared by start and path.
- i = len(os.path.commonprefix([start_list, path_list]))
-
- rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return os.path.curdir
- return os.path.join(*rel_list)
-
- os.path.relpath = relpath
+if LIGHTWEIGHT_IMPORTS:
+ from init_lightweight import *
+else:
+ from init_bkcomp import *
\ No newline at end of file
diff --git a/lib/taurus/core/util/argparse/taurusargparse.py b/lib/taurus/core/util/argparse/taurusargparse.py
index a1df355..c9ad402 100644
--- a/lib/taurus/core/util/argparse/taurusargparse.py
+++ b/lib/taurus/core/util/argparse/taurusargparse.py
@@ -175,10 +175,11 @@ def init_taurus_args(parser=None, args=None, values=None):
# initialize taurus serialization mode
if options.taurus_serialization_mode is not None:
- import taurus.core
+ import taurus.core.taurusbasetypes
+ SerMode = taurus.core.taurusbasetypes.TaurusSerializationMode
m = options.taurus_serialization_mode.capitalize()
- if hasattr(taurus.core.TaurusSerializationMode, m):
- m = getattr(taurus.core.TaurusSerializationMode, m)
+ if hasattr(SerMode, m):
+ m = getattr(SerMode, m)
taurus.Manager().setSerializationMode(m)
# initialize remote console port
diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py
index 91e447e..47bb4a1 100644
--- a/lib/taurus/core/util/codecs.py
+++ b/lib/taurus/core/util/codecs.py
@@ -38,7 +38,7 @@ sequence of codecs. This way you can have codecs 'inside' codecs.
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> cf = CodecFactory()
>>> json_codec = cf.getCodec('json')
>>> bz2_json_codec = cf.getCodec('bz2_json')
@@ -55,7 +55,7 @@ A Taurus related example::
>>> # this example shows how to automatically get the data from a DEV_ENCODED attribute
>>> import taurus
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> cf = CodecFactory()
>>> devenc_attr = taurus.Attribute('a/b/c/devenc_attr')
>>> v = devenc_attr.read()
@@ -141,7 +141,7 @@ class ZIPCodec(Codec):
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> # first encode something
>>> data = 100 * "Hello world\\n"
@@ -183,7 +183,7 @@ class BZ2Codec(Codec):
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> # first encode something
>>> data = 100 * "Hello world\\n"
@@ -226,7 +226,7 @@ class PickleCodec(Codec):
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> cf = CodecFactory()
>>> codec = cf.getCodec('pickle')
@@ -281,7 +281,7 @@ class JSONCodec(Codec):
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> cf = CodecFactory()
>>> codec = cf.getCodec('json')
@@ -364,7 +364,7 @@ class BSONCodec(Codec):
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> cf = CodecFactory()
>>> codec = cf.getCodec('bson')
@@ -463,7 +463,7 @@ class VideoImageCodec(Codec):
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> import PyTango
>>> #first get an image from a LImA device to decode
@@ -621,7 +621,7 @@ class CodecPipeline(Codec, list):
Example usage::
- >>> from taurus.core.util import CodecPipeline
+ >>> from taurus.core.util.codecs import CodecPipeline
>>> data = range(100000)
>>> codec = CodecPipeline('bz2_json')
@@ -676,7 +676,7 @@ class CodecFactory(Singleton, Logger):
To get the singleton object do::
- from taurus.core.util import CodecFactory
+ from taurus.core.util.codecs import CodecFactory
f = CodecFactory()
The :class:`CodecFactory` class allows you to get a codec object for a given
@@ -686,7 +686,7 @@ class CodecFactory(Singleton, Logger):
Example::
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> cf = CodecFactory()
>>> json_codec = cf.getCodec('json')
>>> bz2_json_codec = cf.getCodec('bz2_json')
@@ -703,7 +703,7 @@ class CodecFactory(Singleton, Logger):
>>> # this example shows how to automatically get the data from a DEV_ENCODED attribute
>>> import taurus
- >>> from taurus.core.util import CodecFactory
+ >>> from taurus.core.util.codecs import CodecFactory
>>> cf = CodecFactory()
>>> devenc_attr = taurus.Attribute('a/b/c/devenc_attr')
>>> v = devenc_attr.read()
diff --git a/lib/taurus/core/util/console.py b/lib/taurus/core/util/console.py
index 7aadf1e..4ae3db8 100644
--- a/lib/taurus/core/util/console.py
+++ b/lib/taurus/core/util/console.py
@@ -121,7 +121,7 @@ HTMLTangoColors = { PyTango.DevState.ON : HTMLColors.Green,
PyTango.DevState.UNKNOWN : HTMLColors.LightGray,
None : HTMLColors.DarkGray }
-from taurus.core import TaurusSWDevState
+from taurus.core.taurusbasetypes import TaurusSWDevState
NoTaurusSWDevStateColors = {
TaurusSWDevState.Uninitialized : NoColors.LightGray,
diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py
index 98e398c..5a9ddf9 100644
--- a/lib/taurus/core/util/enumeration.py
+++ b/lib/taurus/core/util/enumeration.py
@@ -51,7 +51,7 @@ class Enumeration(object):
as elements of a dictionary.
Usage::
- from taurus.core.util import Enumeration
+ from taurus.core.util.enumeration import Enumeration
Volkswagen = Enumeration("Volkswagen",
["JETTA",
diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py
index 99c29f2..b30dae3 100644
--- a/lib/taurus/core/util/event.py
+++ b/lib/taurus/core/util/event.py
@@ -381,7 +381,7 @@ class EventListener(object):
with this object's lock before calling this method and always unlock it
afterward, of course::
- from taurus.core.util import EventListener
+ from taurus.core.util.event import EventListener
class MyEvtListener(EventListener):
# Your specific listener code here
@@ -460,7 +460,7 @@ class ListEventGenerator(EventGenerator):
class AttributeEventWait(object):
- """Class designed to connect to a :class:`taurus.core.TaurusAttribute` and
+ """Class designed to connect to a :class:`taurus.core.taurusattribute.TaurusAttribute` and
fire events or wait for a certain event."""
def __init__(self, attr=None):
@@ -474,7 +474,7 @@ class AttributeEventWait(object):
def connect(self, attr):
"""Connect to the given attribute
:param attr: the attribute to connect to
- :type attr: taurus.core.TaurusAttribute"""
+ :type attr: taurus.core.taurusattribute.TaurusAttribute"""
needAdd = True
if self._attr is not None:
if attr == self._attr:
@@ -521,9 +521,9 @@ class AttributeEventWait(object):
"""Event listener method for the underlying attribute. Do not call this
method. It will be called internally when the attribute generates
an event."""
- if t == taurus.core.TaurusEventType.Config:
+ if t == taurus.core.taurusbasetypes.TaurusEventType.Config:
return
- elif t == taurus.core.TaurusEventType.Error:
+ elif t == taurus.core.taurusbasetypes.TaurusEventType.Error:
self.fireEvent(None)
else:
self.fireEvent(v.value)
@@ -662,7 +662,7 @@ class AttributeEventIterator(object):
"locked by thread %s" % (curr_th.name, th.name)
def eventReceived(self, s, t, v):
- if t not in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+ if t not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
return
self.fireEvent(s, v.value)
diff --git a/lib/taurus/core/util/eventfilters.py b/lib/taurus/core/util/eventfilters.py
index 7ac44d2..4414acd 100644
--- a/lib/taurus/core/util/eventfilters.py
+++ b/lib/taurus/core/util/eventfilters.py
@@ -34,32 +34,32 @@ def IGNORE_ALL(s, t, v):
def ONLY_CHANGE(s, t, v):
'''Only change events pass'''
- if t == taurus.core.TaurusEventType.Change: return s,t,v
+ if t == taurus.core.taurusbasetypes.TaurusEventType.Change: return s,t,v
else: return None
def IGNORE_CHANGE(s, t, v):
'''Config events are discarded'''
- if t != taurus.core.TaurusEventType.Change: return s,t,v
+ if t != taurus.core.taurusbasetypes.TaurusEventType.Change: return s,t,v
else: return None
def ONLY_CHANGE_AND_PERIODIC(s, t, v):
'''Only change events pass'''
- if t in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]: return s,t,v
+ if t in [taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic]: return s,t,v
else: return None
def IGNORE_CHANGE_AND_PERIODIC(s, t, v):
'''Config events are discarded'''
- if t not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]: return s,t,v
+ if t not in [taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic]: return s,t,v
else: return None
def ONLY_CONFIG(s, t, v):
'''Only config events pass'''
- if t == taurus.core.TaurusEventType.Config: return s,t,v
+ if t == taurus.core.taurusbasetypes.TaurusEventType.Config: return s,t,v
else: return None
def IGNORE_CONFIG(s, t, v):
'''Config events are discarded'''
- if t != taurus.core.TaurusEventType.Config: return s,t,v
+ if t != taurus.core.taurusbasetypes.TaurusEventType.Config: return s,t,v
else: return None
def ONLY_VALID(s, t, v):
@@ -95,7 +95,7 @@ class EventValueMap(dict):
}
def __call__(self, s, t, v):
- if not t in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+ if not t in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
return s, t, v
if v is None:
return s, t, v
diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/init_bkcomp.py
similarity index 60%
copy from lib/taurus/core/util/__init__.py
copy to lib/taurus/core/util/init_bkcomp.py
index 69849d9..dc56ecf 100644
--- a/lib/taurus/core/util/__init__.py
+++ b/lib/taurus/core/util/init_bkcomp.py
@@ -36,24 +36,26 @@ The json implementation follows the rule:
__docformat__ = "restructuredtext"
-import sys
-import os.path
+# taurus cannot work properly without the following modules so
+# they are promptly imported here has a facility (also for backward
+# compatibility)
+# However, new applications should in their code use the full import.
+# Example, use:
+# from taurus.core.util.log import Logger
+# instead of:
+# from taurus.core.util import Logger
-try:
- import json
-except:
- json = None
-
-from .codecs import *
-from .colors import *
-from .constant import *
from .containers import *
from .enumeration import *
from .event import *
from .log import *
from .object import *
-from .timer import *
from .singleton import *
+
+from .codecs import *
+from .colors import *
+from .constant import *
+from .timer import *
from .safeeval import *
from .prop import *
from .threadpool import *
@@ -61,32 +63,10 @@ from .user import *
import eventfilters
-from lxml import etree
-
-def str_DevFailed(df):
- """Returns a string representation of a :class:`PyTango.DevFailed`.
-
- :param df: (PyTango.DevFailed) the PyTango exception object
- :return: (str) a string representation of the given exception"""
-
- ret = ""
- try:
- desc = df.message.desc.rstrip('\n').replace('\n'," \n")
-
- ret += " Severity = %s\n" % df.message.severity
- ret += " Reason = %s\n" % df.message.reason
- ret += "Description = %s\n" % desc
- ret += " Origin = %s\n" % df.message.origin
- except:
- ret = "Exception = %s" % str(df)
- return ret
-
-def print_DevFailed(df):
- """Prints the contents of the given :class:`PyTango.DevFailed`.
-
- :param df: (PyTango.DevFailed) the PyTango exception object"""
- import PyTango
- PyTango.Except.print_exception(df)
+try:
+ from lxml import etree
+except:
+ etree = None
def dictFromSequence(seq):
"""Translates a sequence into a dictionary by converting each to elements of
@@ -100,23 +80,3 @@ def dictFromSequence(seq):
while True:
yield itnext(), itnext()
return dict(_pairwise(seq))
-
-if sys.version_info < (2,6):
- def relpath(path, start=os.path.curdir):
- """Return a relative version of a path"""
-
- if not path:
- raise ValueError("no path specified")
-
- start_list = os.path.abspath(start).split(os.path.sep)
- path_list = os.path.abspath(path).split(os.path.sep)
-
- # Work out how much of the filepath is shared by start and path.
- i = len(os.path.commonprefix([start_list, path_list]))
-
- rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return os.path.curdir
- return os.path.join(*rel_list)
-
- os.path.relpath = relpath
diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/init_lightweight.py
similarity index 54%
copy from lib/taurus/core/util/__init__.py
copy to lib/taurus/core/util/init_lightweight.py
index 69849d9..e12c7c7 100644
--- a/lib/taurus/core/util/__init__.py
+++ b/lib/taurus/core/util/init_lightweight.py
@@ -36,57 +36,37 @@ The json implementation follows the rule:
__docformat__ = "restructuredtext"
-import sys
-import os.path
+# taurus cannot work properly without the following modules so
+# they are promptly imported here has a facility (also for backward
+# compatibility)
+# However, new applications should in their code use the full import.
+# Example, use:
+# from taurus.core.util.log import Logger
+# instead of:
+# from taurus.core.util import Logger
-try:
- import json
-except:
- json = None
-
-from .codecs import *
-from .colors import *
-from .constant import *
from .containers import *
from .enumeration import *
from .event import *
from .log import *
from .object import *
-from .timer import *
from .singleton import *
-from .safeeval import *
-from .prop import *
-from .threadpool import *
-from .user import *
-
-import eventfilters
-from lxml import etree
+# from .codecs import *
+# from .colors import *
+# from .constant import *
+# from .timer import *
+# from .safeeval import *
+# from .prop import *
+# from .threadpool import *
+# from .user import *
-def str_DevFailed(df):
- """Returns a string representation of a :class:`PyTango.DevFailed`.
-
- :param df: (PyTango.DevFailed) the PyTango exception object
- :return: (str) a string representation of the given exception"""
-
- ret = ""
- try:
- desc = df.message.desc.rstrip('\n').replace('\n'," \n")
-
- ret += " Severity = %s\n" % df.message.severity
- ret += " Reason = %s\n" % df.message.reason
- ret += "Description = %s\n" % desc
- ret += " Origin = %s\n" % df.message.origin
- except:
- ret = "Exception = %s" % str(df)
- return ret
+# import eventfilters
-def print_DevFailed(df):
- """Prints the contents of the given :class:`PyTango.DevFailed`.
-
- :param df: (PyTango.DevFailed) the PyTango exception object"""
- import PyTango
- PyTango.Except.print_exception(df)
+# try:
+ # from lxml import etree
+# except:
+ # etree = None
def dictFromSequence(seq):
"""Translates a sequence into a dictionary by converting each to elements of
@@ -100,23 +80,3 @@ def dictFromSequence(seq):
while True:
yield itnext(), itnext()
return dict(_pairwise(seq))
-
-if sys.version_info < (2,6):
- def relpath(path, start=os.path.curdir):
- """Return a relative version of a path"""
-
- if not path:
- raise ValueError("no path specified")
-
- start_list = os.path.abspath(start).split(os.path.sep)
- path_list = os.path.abspath(path).split(os.path.sep)
-
- # Work out how much of the filepath is shared by start and path.
- i = len(os.path.commonprefix([start_list, path_list]))
-
- rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return os.path.curdir
- return os.path.join(*rel_list)
-
- os.path.relpath = relpath
diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py
index 2f63302..1dbd2bd 100644
--- a/lib/taurus/core/util/log.py
+++ b/lib/taurus/core/util/log.py
@@ -79,7 +79,7 @@ class LogIt(object):
subclass.
Example::
- from taurus.core.util import *
+ from taurus.core.util.log import Logger, LogIt
class Example(Logger):
@@ -98,7 +98,7 @@ class LogIt(object):
which are set to False by default. Enabling them will had verbose infomation
about the parameters and return value. The following example::
- from taurus.core.util import *
+ from taurus.core.uti.log import Logger, LogIt
class Example(Logger):
@@ -172,7 +172,7 @@ class TraceIt(LogIt):
"""Specialization of LogIt for trace level messages.
Example::
- from taurus.core.util import TraceIt
+ from taurus.core.util.log import Logger, TraceIt
class Example(Logger):
@TraceIt()
@@ -188,7 +188,7 @@ class DebugIt(LogIt):
"""Specialization of LogIt for debug level messages.
Example::
- from taurus.core.util import DebugIt
+ from taurus.core.util.log import Logger, DebugIt
class Example(Logger):
@DebugIt()
@@ -204,7 +204,7 @@ class InfoIt(LogIt):
"""Specialization of LogIt for info level messages.
Example::
- from taurus.core.util import InfoIt
+ from taurus.core.util.log import Logger, InfoIt
class Example(Logger):
@InfoIt()
@@ -220,7 +220,7 @@ class WarnIt(LogIt):
"""Specialization of LogIt for warn level messages.
Example::
- from taurus.core.util import WarnIt
+ from taurus.core.util.log import Logger, WarnIt
class Example(Logger):
@WarnIt()
@@ -236,7 +236,7 @@ class ErrorIt(LogIt):
"""Specialization of LogIt for error level messages.
Example::
- from taurus.core.util import ErrorIt
+ from taurus.core.util.log import Logger, ErrorIt
class Example(Logger):
@ErrorIt()
@@ -252,7 +252,7 @@ class CriticalIt(LogIt):
"""Specialization of LogIt for critical level messages.
Example::
- from taurus.core.util import CriticalIt
+ from taurus.core.util.log import Logger, CriticalIt
class Example(Logger):
@CriticalIt()
diff --git a/lib/taurus/core/util/property_parser.py b/lib/taurus/core/util/property_parser.py
index e8e4ce9..591316e 100644
--- a/lib/taurus/core/util/property_parser.py
+++ b/lib/taurus/core/util/property_parser.py
@@ -30,7 +30,8 @@ import os
import ply.lex as lex
import ply.yacc as yacc
-from taurus.core.util import CaselessDict
+from .containers import CaselessDict
+from .log import Logger
reserved = CaselessDict({
'true' : 'true',
@@ -171,13 +172,12 @@ def p_value_list_elems2(p):
'''value_list : value'''
p[0] = [p[1]]
-import taurus.core.util
-class PropertyParser(taurus.core.util.Logger):
+class PropertyParser(Logger):
def __init__(self, parent=None):
name = self.__class__.__name__
- self.call__init__(taurus.core.util.Logger, name, parent)
+ self.call__init__(Logger, name, parent)
self._last_filename = None
def parse_file(self, f, logger=None, debug=0, optimize=1):
diff --git a/lib/taurus/core/util/singleton.py b/lib/taurus/core/util/singleton.py
index 43a12b9..c76800d 100644
--- a/lib/taurus/core/util/singleton.py
+++ b/lib/taurus/core/util/singleton.py
@@ -36,7 +36,7 @@ class Singleton(object):
The Singleton is created for the lowest subclass.
Usage::
- from taurus.core.util import Singleton
+ from taurus.core.util.singleton import Singleton
class MyManager(Singleton):
diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py
index 56a640a..0b83a3f 100644
--- a/lib/taurus/qt/qtcore/configuration/configuration.py
+++ b/lib/taurus/qt/qtcore/configuration/configuration.py
@@ -328,6 +328,9 @@ class BaseConfigurableClass:
:param item: (object or str) The object that should be unregistered.
Alternatively, the name under which the object was registered
can be passed as a python string.
+ :param raiseOnError: (bool) If True (default), it raises a KeyError
+ exception if item was not registered. If False, it
+ just logs a debug message
.. seealso:: :meth:`registerConfigProperty`, :meth:`registerConfigDelegate`
'''
@@ -340,7 +343,7 @@ class BaseConfigurableClass:
elif raiseOnError:
raise KeyError('"%s" was not registered.'%name)
else:
- self.info('"%s" was not registered. Skipping'%name)
+ self.debug('"%s" was not registered. Skipping'%name)
return False
diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
index 710c63c..7cfbf0e 100644
--- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
+++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
@@ -39,13 +39,14 @@ __all__ = ["TaurusTreeDevicePartItem", "TaurusTreeDeviceDomainItem",
__docformat__ = 'restructuredtext'
from taurus.qt import Qt
-import taurus.core
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusSWDevHealth
+from taurus.core.taurusdatabase import TaurusInfo, TaurusDatabase
import taurus.qt.qtcore.mimetypes
-from taurusmodel import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
+from .taurusmodel import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
-ElemType = taurus.core.TaurusElementType
-DevHealth = taurus.core.TaurusSWDevHealth
+ElemType = TaurusElementType
+DevHealth = TaurusSWDevHealth
def getElementTypeIcon(*args, **kwargs):
"""Wrapper to prevent loading qtgui when this module is imported"""
@@ -74,7 +75,7 @@ def getSWDevHealthToolTip(*args, **kwargs):
class TaurusTreeDbBaseItem(TaurusBaseTreeItem):
- DisplayFunc = taurus.core.TaurusInfo.name
+ DisplayFunc = TaurusInfo.name
class TaurusTreeDevicePartItem(TaurusTreeDbBaseItem):
@@ -448,7 +449,7 @@ class TaurusDbBaseModel(TaurusBaseModel):
def setupModelData(self, data):
if data is None:
return
- if isinstance(data, taurus.core.TaurusDatabase):
+ if isinstance(data, TaurusDatabase):
data = data.cache()
devices = data.devices()
@@ -477,7 +478,7 @@ class TaurusDbSimpleDeviceAliasModel(TaurusDbBaseModel):
def setupModelData(self, data):
if data is None:
return
- if isinstance(data, taurus.core.TaurusDatabase):
+ if isinstance(data, TaurusDatabase):
data = data.cache()
devices = data.devices()
@@ -499,7 +500,7 @@ class TaurusDbPlainDeviceModel(TaurusDbBaseModel):
def setupModelData(self, data):
if data is None:
return
- if isinstance(data, taurus.core.TaurusDatabase):
+ if isinstance(data, TaurusDatabase):
data = data.cache()
devices = data.devices()
@@ -522,7 +523,7 @@ class TaurusDbDeviceModel(TaurusDbBaseModel):
def setupModelData(self, data):
if data is None:
return
- if isinstance(data, taurus.core.TaurusDatabase):
+ if isinstance(data, TaurusDatabase):
data = data.deviceTree()
rootItem = self._rootItem
@@ -548,7 +549,7 @@ class TaurusDbPlainServerModel(TaurusDbBaseModel):
if data is None:
return
- if isinstance(data, taurus.core.TaurusDatabase):
+ if isinstance(data, TaurusDatabase):
data = data.cache()
servers = data.servers()
@@ -576,7 +577,7 @@ class TaurusDbServerModel(TaurusDbBaseModel):
if data is None:
return
- if isinstance(data, taurus.core.TaurusDatabase):
+ if isinstance(data, TaurusDatabase):
data = data.cache()
servers, klasses, devices = data.servers(), data.klasses(), data.devices()
@@ -624,7 +625,7 @@ class TaurusDbDeviceClassModel(TaurusDbBaseModel):
if data is None:
return
- if isinstance(data, taurus.core.TaurusDatabase):
+ if isinstance(data, TaurusDatabase):
data = data.cache()
rootItem = self._rootItem
diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py
index 9216a4f..b4bcf79 100644
--- a/lib/taurus/qt/qtcore/model/taurusmodel.py
+++ b/lib/taurus/qt/qtcore/model/taurusmodel.py
@@ -29,9 +29,11 @@ __all__ = ["TaurusBaseTreeItem", "TaurusBaseModel", "TaurusBaseProxyModel"]
__docformat__ = 'restructuredtext'
-import taurus.core
from taurus.qt import Qt
-from taurus.core.util import Logger
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.util.log import Logger
+
+QtQt = Qt.Qt
class TaurusBaseTreeItem(object):
"""A generic node"""
@@ -152,13 +154,13 @@ class TaurusBaseTreeItem(object):
def role(self):
"""Returns the prefered role for the item.
- This implementation returns taurus.core.TaurusElementType.Unknown
+ This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
This method should be able to return any kind of python object as long
as the model that is used is compatible.
- :return: (taurus.core.TaurusElementType) the role in form of element type"""
- return taurus.core.TaurusElementType.Unknown
+ :return: (taurus.core.taurusbasetypes.TaurusElementType) the role in form of element type"""
+ return TaurusElementType.Unknown
def __str__(self):
return self.display()
@@ -248,35 +250,35 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
s = self.roleSize(role)
return s
- def pyData(self, index, role=Qt.Qt.DisplayRole):
+ def pyData(self, index, role=QtQt.DisplayRole):
if not index.isValid():
return None
item = index.internalPointer()
ret = None
- if role == Qt.Qt.DisplayRole or role == Qt.Qt.EditRole:
+ if role == QtQt.DisplayRole or role == QtQt.EditRole:
ret = item.data(index)
-# elif role == Qt.Qt.CheckStateRole:
+# elif role == QtQt.CheckStateRole:
# data = item.data(index)
# if type(data) != bool:
# data = str(data).lower() == 'true'
-# ret = Qt.Qt.Unchecked
+# ret = QtQt.Unchecked
# if data == True:
-# ret = Qt.Qt.Checked
- elif role == Qt.Qt.DecorationRole:
+# ret = QtQt.Checked
+ elif role == QtQt.DecorationRole:
ret = item.icon(index)
- elif role == Qt.Qt.ToolTipRole:
+ elif role == QtQt.ToolTipRole:
ret = item.toolTip(index)
- #elif role == Qt.Qt.SizeHintRole:
+ #elif role == QtQt.SizeHintRole:
# ret = self.columnSize(column)
- elif role == Qt.Qt.FontRole:
+ elif role == QtQt.FontRole:
ret = self.DftFont
- elif role == Qt.Qt.UserRole:
+ elif role == QtQt.UserRole:
ret = Qt.QVariant(item)
return ret
- def data(self, index, role=Qt.Qt.DisplayRole):
+ def data(self, index, role=QtQt.DisplayRole):
ret = self.pyData(index, role)
if ret is None:
ret = Qt.QVariant()
@@ -284,7 +286,7 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
ret = Qt.QVariant(ret)
return ret
- def _setData(self, index, qvalue, role=Qt.Qt.EditRole):
+ def _setData(self, index, qvalue, role=QtQt.EditRole):
item = index.internalPointer()
pyobj = Qt.from_qvariant(qvalue)
if pyobj is NotImplemented:
@@ -296,29 +298,29 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
if not index.isValid():
return 0
- ret = Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsDragEnabled
+ ret = QtQt.ItemIsEnabled | QtQt.ItemIsDragEnabled
item = index.internalPointer()
column, depth = index.column(), item.depth()
taurus_role = self.role(column, depth)
if taurus_role in self.selectables():
- ret |= Qt.Qt.ItemIsSelectable
+ ret |= QtQt.ItemIsSelectable
return ret
- def headerData(self, section, orientation, role=Qt.Qt.DisplayRole):
+ def headerData(self, section, orientation, role=QtQt.DisplayRole):
ret = None
- if orientation == Qt.Qt.Horizontal:
- if role == Qt.Qt.TextAlignmentRole:
- ret = int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter)
- elif role == Qt.Qt.DisplayRole:
+ if orientation == QtQt.Horizontal:
+ if role == QtQt.TextAlignmentRole:
+ ret = int(QtQt.AlignLeft | QtQt.AlignVCenter)
+ elif role == QtQt.DisplayRole:
ret = self.ColumnNames[section]
- elif role == Qt.Qt.SizeHintRole:
+ elif role == QtQt.SizeHintRole:
ret = Qt.QSize(self.columnSize(section))
ret.setHeight(24)
- elif role == Qt.Qt.ToolTipRole:
+ elif role == QtQt.ToolTipRole:
ret = self.columnToolTip(section)
- elif role == Qt.Qt.DecorationRole:
+ elif role == QtQt.DecorationRole:
ret = self.columnIcon(section)
return Qt.QVariant(ret)
@@ -379,16 +381,16 @@ class TaurusBaseProxyModel(Qt.QSortFilterProxyModel):
Qt.QSortFilterProxyModel.__init__(self, parent)
# filter configuration
- self.setFilterCaseSensitivity(Qt.Qt.CaseInsensitive)
+ self.setFilterCaseSensitivity(QtQt.CaseInsensitive)
self.setFilterKeyColumn(0)
- self.setFilterRole(Qt.Qt.DisplayRole)
+ self.setFilterRole(QtQt.DisplayRole)
# sort configuration
- self.setSortCaseSensitivity(Qt.Qt.CaseInsensitive)
- self.setSortRole(Qt.Qt.DisplayRole)
+ self.setSortCaseSensitivity(QtQt.CaseInsensitive)
+ self.setSortRole(QtQt.DisplayRole)
# general configuration
- self.sort(0, Qt.Qt.AscendingOrder)
+ self.sort(0, QtQt.AscendingOrder)
def __getattr__(self, name):
return getattr(self.sourceModel(), name)
diff --git a/lib/taurus/qt/qtcore/tango/sardana/macroserver.py b/lib/taurus/qt/qtcore/tango/sardana/macroserver.py
index 0fd4056..83c7a00 100644
--- a/lib/taurus/qt/qtcore/tango/sardana/macroserver.py
+++ b/lib/taurus/qt/qtcore/tango/sardana/macroserver.py
@@ -27,7 +27,7 @@
__all__ = ["QDoor", "QMacroServer", "MacroServerMessageErrorHandler", "registerExtensions"]
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
from taurus.core.tango.sardana.macroserver import BaseMacroServer, BaseDoor
from taurus.qt import Qt
diff --git a/lib/taurus/qt/qtcore/tango/sardana/model.py b/lib/taurus/qt/qtcore/tango/sardana/model.py
index f8db520..a4812d3 100644
--- a/lib/taurus/qt/qtcore/tango/sardana/model.py
+++ b/lib/taurus/qt/qtcore/tango/sardana/model.py
@@ -42,9 +42,9 @@ try:
except:
pygments = None
-from taurus.core import TaurusDevice
+from taurus.core.taurusdevice import TaurusDevice
from taurus.qt import Qt
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
from taurus.qt.qtcore.model import TaurusBaseTreeItem, TaurusBaseModel, \
TaurusBaseProxyModel
from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, \
@@ -103,7 +103,7 @@ class SardanaBaseTreeItem(TaurusBaseTreeItem):
def role(self):
"""Returns the prefered role for the item.
- This implementation returns taurus.core.TaurusElementType.Unknown
+ This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
This method should be able to return any kind of python object as long
as the model that is used is compatible.
diff --git a/lib/taurus/qt/qtcore/tango/sardana/pool.py b/lib/taurus/qt/qtcore/tango/sardana/pool.py
index 01db156..b492169 100644
--- a/lib/taurus/qt/qtcore/tango/sardana/pool.py
+++ b/lib/taurus/qt/qtcore/tango/sardana/pool.py
@@ -32,7 +32,7 @@ import json
from taurus.qt import Qt
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
from taurus.core.tango import TangoDevice
CHANGE_EVTS = TaurusEventType.Change, TaurusEventType.Periodic
diff --git a/lib/taurus/qt/qtcore/taurusqlistener.py b/lib/taurus/qt/qtcore/taurusqlistener.py
index 016dded..d412871 100644
--- a/lib/taurus/qt/qtcore/taurusqlistener.py
+++ b/lib/taurus/qt/qtcore/taurusqlistener.py
@@ -31,7 +31,7 @@ __all__ = ["QTaurusBaseListener", "QObjectTaurusListener"]
__docformat__ = 'restructuredtext'
-from taurus.core import TaurusListener
+from taurus.core.tauruslistener import TaurusListener
from taurus.qt import Qt
@@ -70,7 +70,7 @@ class QTaurusBaseListener(TaurusListener):
(i.e. reimplementing :meth:`handleEvent`)
:param evt_src: (object) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
:param evt_value: (object) event value
"""
self.fireEvent(evt_src, evt_type, evt_value)
@@ -83,7 +83,7 @@ class QTaurusBaseListener(TaurusListener):
or Qt threads, respectively
:param evt_src: (object or None) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType or None) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
:param evt_value: (object or None) event value
"""
try:
@@ -97,7 +97,7 @@ class QTaurusBaseListener(TaurusListener):
unless one of them returns None (in which case the event is discarded)
:param evt_src: (object) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
:param evt_value: (object) event value
"""
r = evt_src, evt_type, evt_value
@@ -122,7 +122,7 @@ class QTaurusBaseListener(TaurusListener):
Reimplement as necessary
:param evt_src: (object or None) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType or None) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
:param evt_value: (object or None) event value
"""
pass
@@ -179,11 +179,11 @@ class QObjectTaurusListener(Qt.QObject, QTaurusBaseListener):
class ListenerDemo(QObjectTaurusListener):
def eventReceived(self, evt_src, evt_type, evt_value):
- self.info("New %s event from %s", taurus.core.TaurusEventType[evt_type], evt_src)
+ self.info("New %s event from %s", taurus.core.taurusbasetypes.TaurusEventType[evt_type], evt_src)
return super(ListenerDemo, self).eventReceived(evt_src, evt_type, evt_value)
def handleEvent(self, evt_src, evt_type, evt_value):
- self.info("New %s event from %s", taurus.core.TaurusEventType[evt_type], evt_src)
+ self.info("New %s event from %s", taurus.core.taurusbasetypes.TaurusEventType[evt_type], evt_src)
if __name__ == "__main__":
diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py
index e91e942..8f66fa4 100644
--- a/lib/taurus/qt/qtcore/util/emitter.py
+++ b/lib/taurus/qt/qtcore/util/emitter.py
@@ -1,4 +1,3 @@
-
#!/usr/bin/env python
#############################################################################
@@ -30,7 +29,8 @@ emitter.py: This module provides a task scheduler used by TaurusGrid and TaurusD
from functools import partial
import taurus
from taurus.qt import Qt
-from taurus.core.util import Logger,Singleton
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
import Queue,traceback
###############################################################################
@@ -141,7 +141,6 @@ class TaurusEmitterThread(Qt.QThread):
self.name = name
self.log = Logger('TaurusEmitterThread(%s)'%self.name)
self.log.setLogLevel(self.log.Info)
- self.log.info('At TaurusEmitterThread.__init__(%s)'%self.name)
self.queue = queue or Queue.Queue()
self.todo = Queue.Queue()
self.method = method
diff --git a/lib/taurus/qt/qtcore/util/tauruslog.py b/lib/taurus/qt/qtcore/util/tauruslog.py
index 1cb3cb8..a4c9537 100644
--- a/lib/taurus/qt/qtcore/util/tauruslog.py
+++ b/lib/taurus/qt/qtcore/util/tauruslog.py
@@ -23,29 +23,29 @@
##
#############################################################################
-"""This module sets the taurus.core.util.Logger to be the Qt message handler"""
+"""This module sets the taurus.core.util.log.Logger to be the Qt message handler"""
__all__ = ['getQtLogger', 'initTaurusQtLogger']
__docformat__ = 'restructuredtext'
from taurus.qt import Qt
-import taurus.core.util
+from taurus import Logger
qtLogger = None
QT_LEVEL_MATCHER = {
- Qt.QtDebugMsg : taurus.core.util.Logger.debug,
- Qt.QtWarningMsg : taurus.core.util.Logger.warning,
- Qt.QtCriticalMsg : taurus.core.util.Logger.error,
- Qt.QtFatalMsg : taurus.core.util.Logger.error,
- Qt.QtSystemMsg : taurus.core.util.Logger.info
+ Qt.QtDebugMsg : Logger.debug,
+ Qt.QtWarningMsg : Logger.warning,
+ Qt.QtCriticalMsg : Logger.error,
+ Qt.QtFatalMsg : Logger.error,
+ Qt.QtSystemMsg : Logger.info
}
def getQtLogger():
global qtLogger
if qtLogger is None:
- qtLogger = taurus.core.util.Logger('QtLogger')
+ qtLogger = Logger('QtLogger')
return qtLogger
def qtTaurusMsgHandler(type, msg):
diff --git a/lib/taurus/qt/qtdesigner/containerplugin.py b/lib/taurus/qt/qtdesigner/containerplugin.py
new file mode 100644
index 0000000..ef9c2f7
--- /dev/null
+++ b/lib/taurus/qt/qtdesigner/containerplugin.py
@@ -0,0 +1,124 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+##
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+##
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## Taurus 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.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+""" Every TaurusWidget should have the following Qt Designer extended capabilities:
+
+ - Task menu:
+ it means when you right click on the widget in the designer, it will have
+ the following additional items:
+ - 'Edit model...' - opens a customized dialog for editing the widget model
+
+ - Property Sheet:
+ it means that in the Qt Designer property sheet it will have the following
+ properties customized:
+ - 'model' - will have a '...' button that will open a customized dialog for
+ editing the widget model (same has 'Edit model...' task menu item
+"""
+
+from taurus.core.util.log import Logger
+from taurus.qt import Qt
+from taurus.qt import QtDesigner
+
+from taurus.qt.qtgui.container.qcontainer import QGroupWidget
+
+#import sip
+
+Q_TYPEID = {'QPyDesignerContainerExtension': 'com.trolltech.Qt.Designer.Container',
+ 'QPyDesignerPropertySheetExtension': 'com.trolltech.Qt.Designer.PropertySheet',
+ 'QPyDesignerTaskMenuExtension': 'com.trolltech.Qt.Designer.TaskMenu',
+ 'QPyDesignerMemberSheetExtension': 'com.trolltech.Qt.Designer.MemberSheet'}
+
+
+class QGroupWidgetContainerExtension(QtDesigner.QPyDesignerContainerExtension):
+ def __init__(self, widget, parent=None):
+ super(QGroupWidgetContainerExtension, self).__init__(parent)
+ self._widget = widget
+ self._page_widget = None
+
+ def addWidget(self, widget):
+ if self.count() > 0:
+ raise Exception("Can only have at maximum one child")
+ self._layout().addWidget(widget)
+ self._page_widget = widget
+
+ def _content(self):
+ return self._widget.content()
+
+ def _layout(self):
+ return self._content().layout()
+
+ def count(self):
+ return self._layout().count()
+
+ def currentIndex(self):
+ if self.count() > 0:
+ return 0
+ return -1
+
+ def insertWidget(self, index, widget):
+ self.addWidget(widget)
+
+ def remove(self, index):
+ self._layout().removeWidget(self.widget(index))
+
+ def setCurrentIndex(self, index):
+ pass
+
+ def widget(self, index):
+ return self._page_widget
+
+
+class QGroupWidgetExtensionFactory(QtDesigner.QExtensionFactory):
+ def __init__(self, parent=None):
+ super(QGroupWidgetExtensionFactory, self).__init__(parent)
+
+ def createExtension(self, obj, iid, parent):
+ if iid != Q_TYPEID['QPyDesignerContainerExtension']:
+ return None
+ if isinstance(obj, QGroupWidget):
+ return QGroupWidgetContainerExtension(obj, parent)
+ return None
+
+def create_plugin():
+ from taurusplugin.taurusplugin import TaurusWidgetPlugin
+
+ class QGroupWidgetPlugin(TaurusWidgetPlugin):
+
+ WidgetClass = QGroupWidget
+
+ def initialize(self, formEditor):
+ if self.isInitialized():
+ return
+
+ manager = formEditor.extensionManager()
+ if manager:
+ self.factory = QGroupWidgetExtensionFactory(manager)
+ manager.registerExtensions(self.factory, Q_TYPEID['QPyDesignerContainerExtension'])
+ self.initialized = True
+ return QGroupWidgetPlugin
+
+QGroupWidgetPlugin = create_plugin()
+
+
\ No newline at end of file
diff --git a/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py b/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
index a20b79d..a4314eb 100644
--- a/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
+++ b/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
@@ -27,11 +27,13 @@
guiqwt widgets plugins for Qt Designer
"""
-from guiqwt.qtdesigner import create_qtdesigner_plugin
-
-PlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget",
- icon="curve.png")
-
-ImagePlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget",
- icon="image.png")
+try:
+ from guiqwt.qtdesigner import create_qtdesigner_plugin
+ PlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget",
+ icon="curve.png")
+ ImagePlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget",
+ icon="image.png")
+except ImportError:
+ from taurus.core.util.log import debug
+ debug("failed to load guiqwt designer plugin")
diff --git a/lib/taurus/qt/qtdesigner/taurusdesigner.py b/lib/taurus/qt/qtdesigner/taurusdesigner.py
new file mode 100644
index 0000000..e373ea1
--- /dev/null
+++ b/lib/taurus/qt/qtdesigner/taurusdesigner.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+##
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+##
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## Taurus 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.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+import sys
+import os.path
+import optparse
+
+import taurus
+from taurus.qt import Qt
+
+def env_index(env, env_name):
+ env_name = str(env_name)
+ for i, e in enumerate(env):
+ e = str(e)
+ if e.startswith(env_name):
+ return i
+ return -1
+
+def has_env(env, env_name):
+ return env_index(env, env_name) != -1
+
+def get_env(env, env_name):
+ env_name = str(env_name)
+ for i, e in enumerate(env):
+ e = str(e)
+ if e.startswith(env_name):
+ return e.split("=")[1]
+ return None
+
+def append_or_create_env(env, env_name, env_value, is_path_like=True):
+ i = env_index(env, env_name)
+ if i == -1:
+ env.append(env_name + "=" + env_value)
+ else:
+ if is_path_like:
+ e_n, e_v = env[i].split("=")
+ paths = e_v.split(os.path.pathsep)
+ if not env_value in paths:
+ env_value += os.path.pathsep + e_v
+ env[i] = env_name + "=" + env_value
+
+def append_or_create_env_list(env, env_name, env_value):
+ env_value = os.path.pathsep.join(env_value)
+ append_or_create_env(env, env_name, env_value)
+
+def get_qtdesigner_bin():
+ designer_bin = str(Qt.QLibraryInfo.location(Qt.QLibraryInfo.BinariesPath))
+
+ plat = sys.platform
+ if plat == "darwin":
+ designer_bin = os.path.join(designer_bin, "Designer.app", "Contents", "MacOS")
+ elif plat in ("win32", "nt"):
+ import PyQt4
+ designer_bin = os.path.abspath(os.path.dirname(PyQt4.__file__))
+
+ designer_bin = os.path.join(designer_bin, "designer")
+ return designer_bin
+
+def get_taurus_designer_path():
+ """Returns a list of directories containing taurus designer plugins"""
+ # Set PYQTDESIGNERPATH to look inside taurus for designer plugins
+ taurus_path = os.path.dirname(os.path.abspath(taurus.__file__))
+ taurus_qt_designer_path = os.path.join(taurus_path, 'qt', 'qtdesigner')
+ return [taurus_qt_designer_path]
+
+def qtdesigner_prepare_taurus(env=None, taurus_extra_path=None):
+
+ # Tell Qt Designer where it can find the directory containing the plugins
+ if env is None:
+ env = Qt.QProcess.systemEnvironment()
+
+ # Set PYQTDESIGNERPATH to look inside taurus for designer plugins
+ taurus_designer_path = get_taurus_designer_path()
+
+ append_or_create_env_list(env, "PYQTDESIGNERPATH", taurus_designer_path)
+
+ # Set TAURUSQTDESIGNERPATH
+ if taurus_extra_path is not None:
+ append_or_create_env(env, "TAURUSQTDESIGNERPATH", taurus_extra_path)
+ append_or_create_env(env, "PYTHONPATH", taurus_extra_path)
+
+ #print "PYTHONPATH=%s" % get_env(env, "PYTHONPATH")
+ #print "PYQTDESIGNERPATH=%s" % get_env(env, "PYQTDESIGNERPATH")
+ return env
+
+def qtdesigner_start(args, env=None):
+ # Start Designer.
+ designer_bin = get_qtdesigner_bin()
+
+ designer = Qt.QProcess()
+ designer.setProcessChannelMode(Qt.QProcess.ForwardedChannels)
+ designer.setEnvironment(env)
+ designer.start(designer_bin, args)
+ designer.waitForFinished(-1)
+
+ return designer.exitCode()
+
+def main(env=None):
+ version = "taurusdesigner %s" % (taurus.Release.version)
+ usage = "Usage: %prog [options] <ui file(s)>"
+ description = "The Qt designer application customized for taurus"
+ parser = optparse.OptionParser(version=version, usage=usage, description=description)
+ parser.add_option("--taurus-path", dest="tauruspath", default="",
+ help="additional directories to look for taurus widgets")
+ parser.add_option("--qt-designer-path", dest="pyqtdesignerpath", default="",
+ help="additional directories to look for python qt widgets")
+
+ options, args = parser.parse_args()
+
+ taurus_extra_path = None
+ # Set TAURUSQTDESIGNERPATH
+ if len(options.tauruspath) > 0:
+ taurus_extra_path = options.tauruspath
+
+ env = qtdesigner_prepare_taurus(env=env, taurus_extra_path=taurus_extra_path)
+
+ sys.exit(qtdesigner_start(args, env=env))
+
+if __name__ == "__main__":
+ main()
+
diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
index ddaf2e8..dbd05a0 100644
--- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
+++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
@@ -23,10 +23,6 @@
##
#############################################################################
-"""
-taurusplugin.py:
-"""
-
""" Every TaurusWidget should have the following Qt Designer extended capabilities:
- Task menu:
@@ -41,27 +37,23 @@ taurusplugin.py:
editing the widget model (same has 'Edit model...' task menu item
"""
-import os
-
from taurus.qt import Qt
-from PyQt4 import QtDesigner
+from taurus.qt import QtDesigner
-import taurus.core
-import taurus.core.util
-import logging
+from taurus.core.util.log import Logger
def Q_TYPEID(class_name):
""" Helper function to generate an IID for Qt. Returns a QString."""
return Qt.QString("com.trolltech.Qt.Designer.%s" % class_name)
-designer_logger = taurus.core.util.Logger("QtDesigner")
+designer_logger = Logger("PyQtDesigner")
class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
"""TaurusWidgetPlugin"""
def __init__(self, parent = None):
QtDesigner.QPyDesignerCustomWidgetPlugin.__init__(self)
- self._log = taurus.core.util.Logger(self._getWidgetClassName(), designer_logger)
+ self._log = Logger(self._getWidgetClassName(), designer_logger)
self.initialized = False
def initialize(self, formEditor):
@@ -95,10 +87,10 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
w = None
return w
- def getWidgetInfo(self, key):
+ def getWidgetInfo(self, key, dft=None):
if not hasattr(self, '_widgetInfo'):
self._widgetInfo = self.getWidgetClass().getQtDesignerPluginInfo()
- return self._widgetInfo.get(key)
+ return self._widgetInfo.get(key, dft)
# This method returns the name of the custom widget class that is provided
# by this plugin.
@@ -109,10 +101,7 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
""" Returns the name of the group in Qt Designer's widget box that this
widget belongs to.
It returns 'Taurus Widgets'. Overwrite if want another group."""
- group = self.getWidgetInfo('group')
- if group is None:
- group = 'Taurus Widgets'
- return group
+ return self.getWidgetInfo('group', 'Taurus Widgets')
def getIconName(self):
return self.getWidgetInfo('icon')
@@ -149,9 +138,4 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
return whatsthis
def isContainer(self):
- container = self.getWidgetInfo('container')
- if container is None:
- container = False
- return container
-
-
+ return self.getWidgetInfo('container', False)
diff --git a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
index 374c2bb..61adff6 100644
--- a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
+++ b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
@@ -39,28 +39,29 @@ def build_qtdesigner_widget_plugin(klass):
Plugin.__name__ = klass.__name__ + "QtDesignerPlugin"
return Plugin
-_SKIP = ["QLogo"]
+_SKIP = ["QLogo", "QGroupWidget", "TaurusGroupWidget"]
_plugins = {}
def main():
- import taurus
- import taurus.core.util
- import taurus.qt.qtgui.util
- taurus.setLogLevel(taurus.Debug)
- _log = taurus.core.util.Logger(__name__)
+ from taurus import Manager
+ from taurus.core.util.log import Logger
+ from taurus.core.taurusbasetypes import OperationMode
+ from taurus.qt.qtgui.util import TaurusWidgetFactory
+ Logger.setLogLevel(Logger.Debug)
+ _log = Logger(__name__)
- taurus.Manager().setOperationMode(taurus.core.OperationMode.OFFLINE)
+ Manager().setOperationMode(OperationMode.OFFLINE)
try:
- wf = taurus.qt.qtgui.util.TaurusWidgetFactory()
+ wf = TaurusWidgetFactory()
klasses = wf.getWidgetClasses()
ok_nb, skipped_nb, e1_nb, e2_nb, e3_nb, e4_nb = 0, 0, 0, 0, 0, 0
for widget_klass in klasses:
name = widget_klass.__name__
- _log.debug("Processing %s" % name)
+ #_log.debug("Processing %s" % name)
if name in _SKIP:
- _log.debug("Skipped %s" % name)
+ #_log.debug("Skipped %s" % name)
skipped_nb += 1
continue
# if getQtDesignerPluginInfo does not exist, returns None or raises
@@ -69,24 +70,24 @@ def main():
try:
qt_info = widget_klass.getQtDesignerPluginInfo()
if qt_info is None:
- _log.debug("E1: Canceled %s (getQtDesignerPluginInfo)" % name)
+ #_log.debug("E1: Canceled %s (getQtDesignerPluginInfo)" % name)
e1_nb += 1
cont = True
except AttributeError:
- _log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name)
+ #_log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name)
e2_nb += 1
cont = True
except Exception,e:
- _log.debug("E3: Canceled %s (%s)" % (name, str(e)))
+ #_log.debug("E3: Canceled %s (%s)" % (name, str(e)))
e3_nb += 1
cont = True
if cont: continue
for k in ('module', ):
if not qt_info.has_key(k):
- _log.debug("E4: Canceled %s (getQtDesignerPluginInfo doesn't have key %s)" % (name, k))
- e4_nb += 1
- cont=True
+ #_log.debug("E4: Canceled %s (getQtDesignerPluginInfo doesn't have key %s)" % (name, k))
+ e4_nb += 1
+ cont=True
if cont: continue
plugin_klass = build_qtdesigner_widget_plugin(widget_klass)
@@ -95,14 +96,16 @@ def main():
_plugins[plugin_klass_name] = plugin_klass
ok_nb += 1
- _log.debug("DONE processing %s" % name)
+ #_log.debug("DONE processing %s" % name)
_log.info("Inpected %d widgets. %d (OK), %d (Skipped), %d (E1), %d (E2), %d (E3), %d(E4)" % (len(klasses), ok_nb, skipped_nb, e1_nb, e2_nb, e3_nb, e4_nb))
_log.info("E1: getQtDesignerPluginInfo() returns None")
_log.info("E2: widget doesn't implement getQtDesignerPluginInfo()")
_log.info("E3: getQtDesignerPluginInfo() throws exception")
_log.info("E4: getQtDesignerPluginInfo() returns dictionary with missing key (probably 'module' key)")
- except Exception, e:
- print e
+ except Exception as e:
+ import traceback; traceback.print_exc()
+ #print e
+
class TaurusWidgets(QtDesigner.QPyDesignerCustomWidgetCollectionPlugin):
diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py
index 056e651..e285159 100644
--- a/lib/taurus/qt/qtgui/base/taurusbase.py
+++ b/lib/taurus/qt/qtgui/base/taurusbase.py
@@ -37,8 +37,14 @@ import PyTango
from taurus.qt import Qt
-import taurus.core
+import taurus
from taurus.core.util import eventfilters
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusEventType
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from taurus.core.tauruslistener import TaurusListener, TaurusExceptionListener
+from taurus.core.taurusoperation import WriteAttrOperation
from taurus.qt.qtcore.configuration import BaseConfigurableClass
from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE
from taurus.qt.qtgui.util import ActionFactory
@@ -78,7 +84,7 @@ TTANGO_TO_TQT = {
PyTango.ArgType.DevVarUShortArray : 'QList',
}
-class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
+class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
"""A generic Taurus component.
.. note::
@@ -97,7 +103,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
self.modelName = ''
self.noneValue = DefaultNoneValue
self._designMode = designMode
- self.call__init__(taurus.core.TaurusListener, name, parent)
+ self.call__init__(TaurusListener, name, parent)
BaseConfigurableClass.__init__(self)
@@ -121,7 +127,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
if parent != None and hasattr(parent, "_exception_listener"):
self._exception_listener = parent._exception_listener
else:
- self._exception_listener = set([taurus.core.TaurusExceptionListener()])
+ self._exception_listener = set([TaurusExceptionListener()])
#register configurable properties
self.registerConfigProperty(self.isModifiableByUser, self.setModifiableByUser, "modifiableByUser")
@@ -155,7 +161,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
import taurus
manager = taurus.Manager()
- :return: (taurus.core.TaurusManager) the TaurusManager
+ :return: (taurus.core.taurusmanager.TaurusManager) the TaurusManager
"""
return taurus.Manager()
@@ -168,7 +174,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
:param scheme: (str or None) the scheme. None defaults to 'tango'.
- :return: (taurus.core.TaurusFactory) the TaurusFactory
+ :return: (taurus.core.taurusfactory.TaurusFactory) the TaurusFactory
"""
return taurus.Factory(scheme)
@@ -199,7 +205,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
def getParentTaurusComponent(self):
""" Returns a parent Taurus component or None if no parent
- :class:`taurus.core.TaurusBaseComponent` is found.
+ :class:`taurus.qt.qtgui.base.TaurusBaseComponent` is found.
:raises: RuntimeError
"""
@@ -227,7 +233,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
(i.e. reimplementing :meth:`handleEvent`)
:param evt_src: (object) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
:param evt_value: (object) event value
"""
self.fireEvent(evt_src, evt_type, evt_value)
@@ -240,7 +246,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
or Qt threads, respectively
:param evt_src: (object or None) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType or None) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
:param evt_value: (object or None) event value
"""
try: self.getSignaller().emit(Qt.SIGNAL('taurusEvent'), evt_src, evt_type, evt_value)
@@ -251,7 +257,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
unless one of them returns None (in which case the event is discarded)
:param evt_src: (object) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
:param evt_value: (object) event value
"""
r = evt_src, evt_type, evt_value
@@ -276,7 +282,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
Reimplement as necessary
:param evt_src: (object or None) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType or None) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
:param evt_value: (object or None) event value
"""
pass
@@ -298,7 +304,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
value to be filtered as well. This can be done as in this example::
TaurusBaseComponent.fireEvent( TaurusBaseComponent.getModelObj(),
- taurus.core.TaurusEventType.Periodic,
+ taurus.core.taurusbasetypes.TaurusEventType.Periodic,
TaurusBaseComponent.getModelObj().getValueObj())
See also: insertEventFilter
@@ -447,7 +453,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
"""Returns the parent model object or None if the component has no
parent or if the parent's model is None
- :return: (taurus.core.TaurusModel or None) the parent taurus model object
+ :return: (taurus.core.taurusmodel.TaurusModel or None) the parent taurus model object
"""
try:
p = self.getParentTaurusComponent()
@@ -461,19 +467,19 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
"""Returns the taurus model obj associated with this component or None if
no taurus model is associated.
- :return: (taurus.core.TaurusModel or None) the taurus model object
+ :return: (taurus.core.taurusmodel.TaurusModel or None) the taurus model object
"""
return self.modelObj
def getModelType(self):
"""Returns the taurus model type associated with this component or
- taurus.core.TaurusElementType.Unknown if no taurus model is associated.
+ taurus.core.taurusbasetypes.TaurusElementType.Unknown if no taurus model is associated.
- :return: (taurus.core.TaurusElementType) the taurus model type
+ :return: (taurus.core.taurusbasetypes.TaurusElementType) the taurus model type
"""
model_obj = self.getModelObj()
if model_obj is None:
- return taurus.core.TaurusElementType.Unknown
+ return TaurusElementType.Unknown
return model_obj.getTaurusElementType()
def getModelValueObj(self,cache=True):
@@ -677,7 +683,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
self.changeLogName(new_log_name)
self.modelObj = None
self._attached = False
- self.fireEvent(m, taurus.core.TaurusEventType.Change, None)
+ self.fireEvent(m, TaurusEventType.Change, None)
self.postDetach()
@@ -721,7 +727,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
Use :meth:`TaurusBaseWidget.safeApplyOperation` if you want to warn the
user before applying
- :param ops: (sequence<taurus.core.TaurusOperation> or None) list of operations to apply.
+ :param ops: (sequence<taurus.core.taurusoperation.TaurusOperation> or None) list of operations to apply.
If None is given (default) the component fetches the pending operations
"""
self.debug("Apply changes")
@@ -747,7 +753,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
def getPendingOperations(self):
"""Returns the sequence of pending operations
- :return: (sequence<taurus.core.TaurusOperation>) a list of pending operations
+ :return: (sequence<taurus.core.taurusoperation.TaurusOperation>) a list of pending operations
"""
return self._operations
@@ -835,8 +841,8 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
self._localModelName = model
# # if in offline mode don't bother trying to register
-# opMode = taurus.core.TaurusManager().getOperationMode()
-# if opMode == taurus.core.OperationMode.OFFLINE:
+# opMode = taurus.core.taurusmanager.TaurusManager().getOperationMode()
+# if opMode == taurus.core.taurusbasetypes.OperationMode.OFFLINE:
# return
parent_widget = None
@@ -852,7 +858,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
if self.getUseParentModel():
parent_widget = self.getParentTaurusComponent()
self.setModelName(model, parent_widget)
- #self.fireEvent(self.getModelObj(), taurus.core.TaurusEventType.Change, self.getModelValueObj())
+ #self.fireEvent(self.getModelObj(), taurus.core.taurusbasetypes.TaurusEventType.Change, self.getModelValueObj())
def resetModel(self):
"""Sets the model name to the empty string"""
@@ -913,7 +919,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
if showText == self._showText:
return
self._showText = showText
- self.fireEvent(self.getModelObj(),taurus.core.TaurusEventType.Change, self.getModelValueObj())
+ self.fireEvent(self.getModelObj(), TaurusEventType.Change, self.getModelValueObj())
self.updateStyle()
def getShowText(self):
@@ -1147,19 +1153,19 @@ class TaurusBaseWidget(TaurusBaseComponent):
Override when necessary.
:param evt_src: (object or None) object that triggered the event
- :param evt_type: (taurus.core.TaurusEventType or None) type of event
+ :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
:param evt_value: (object or None) event value
"""
#Update the text shown by the widget
if self._setText:
text = ''
if self.getShowText():
- if isinstance(evt_src, taurus.core.TaurusAttribute):
- if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+ if isinstance(evt_src, TaurusAttribute):
+ if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
text = self.displayValue(evt_value.value)
- elif evt_type == taurus.core.TaurusEventType.Error:
+ elif evt_type == TaurusEventType.Error:
text = self.getNoneValue()
- elif evt_type == taurus.core.TaurusEventType.Config:
+ elif evt_type == TaurusEventType.Config:
text = self.getDisplayValue()
else:
text = self.getDisplayValue()
@@ -1316,9 +1322,9 @@ class TaurusBaseWidget(TaurusBaseComponent):
modelclass = self.getModelClass()
except:
return []
- if modelclass == taurus.core.TaurusDevice:
+ if modelclass == TaurusDevice:
return [TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE]
- elif modelclass == taurus.core.TaurusAttribute:
+ elif modelclass == TaurusAttribute:
return [TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE]
else:
return [TAURUS_MODEL_MIME_TYPE]
@@ -1400,9 +1406,9 @@ class TaurusBaseWidget(TaurusBaseComponent):
modelclass = self.getModelClass()
except:
modelclass = None
- if issubclass(modelclass, taurus.core.TaurusDevice):
+ if issubclass(modelclass, TaurusDevice):
mimeData.setData(TAURUS_DEV_MIME_TYPE, modelname)
- elif issubclass(modelclass, taurus.core.TaurusAttribute):
+ elif issubclass(modelclass, TaurusAttribute):
mimeData.setData(TAURUS_ATTR_MIME_TYPE, modelname)
return mimeData
@@ -1463,7 +1469,7 @@ class TaurusBaseWidget(TaurusBaseComponent):
def safeApplyOperations(self, ops = None):
"""Applies the given operations (or the pending operations if None passed)
- :param ops: (sequence<taurus.core.TaurusOperation> or None) list of operations to apply.
+ :param ops: (sequence<taurus.core.taurusoperation.TaurusOperation> or None) list of operations to apply.
If None is given (default) the component fetches the pending operations
"""
@@ -1557,7 +1563,7 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusAttribute
+ return TaurusAttribute
def isReadOnly(self):
return False
@@ -1613,8 +1619,8 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
that pending operations are properly created, not calling this method'''
try:
v = self.getValue()
- op = taurus.core.WriteAttrOperation(self.getModelObj(), v,
- self.getOperationCallbacks())
+ op = WriteAttrOperation(self.getModelObj(), v,
+ self.getOperationCallbacks())
op.setDangerMessage(self.getDangerMessage())
self.safeApplyOperations([op])
self.info('Force-Applied value = %s'%str(v))
@@ -1623,7 +1629,7 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
self.traceback()
def handleEvent(self, src, evt_type, evt_value):
- if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+ if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
self.emitValueChanged()
def postAttach(self):
@@ -1657,8 +1663,8 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
if model.areStrValuesEqual(model_value, wigdet_value):
self._operations = []
else:
- operation = taurus.core.WriteAttrOperation(model, wigdet_value,
- self.getOperationCallbacks())
+ operation = WriteAttrOperation(model, wigdet_value,
+ self.getOperationCallbacks())
operation.setDangerMessage(self.getDangerMessage())
self._operations = [operation]
except:
@@ -1690,15 +1696,15 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
if isinstance(v, Qt.QIntValidator):
bottom = evt_value.min_value
top = evt_value.max_value
- bottom = int(bottom) if bottom != taurus.core.TaurusConfiguration.no_min_value else -sys.maxint
- top = int(top) if top != taurus.core.TaurusConfiguration.no_max_value else sys.maxint
+ bottom = int(bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxint
+ top = int(top) if top != TaurusConfiguration.no_max_value else sys.maxint
v.setRange(bottom, top)
self.debug("Validator range set to %i-%i"%(bottom,top))
elif isinstance(v, Qt.QDoubleValidator):
bottom = evt_value.min_value
top = evt_value.max_value
- bottom = float(bottom) if bottom != taurus.core.TaurusConfiguration.no_min_value else -float("inf")
- top = float(top) if top != taurus.core.TaurusConfiguration.no_max_value else float("inf")
+ bottom = float(bottom) if bottom != TaurusConfiguration.no_min_value else -float("inf")
+ top = float(top) if top != TaurusConfiguration.no_max_value else float("inf")
v.setBottom(bottom)
v.setTop(top)
self.debug("Validator range set to %f-%f"%(bottom,top))
diff --git a/lib/taurus/qt/qtgui/base/tauruscontroller.py b/lib/taurus/qt/qtgui/base/tauruscontroller.py
index 7807d1f..7d5316d 100644
--- a/lib/taurus/qt/qtgui/base/tauruscontroller.py
+++ b/lib/taurus/qt/qtgui/base/tauruscontroller.py
@@ -37,7 +37,7 @@ import weakref
from taurus.qt import Qt
-from taurus.core import DataFormat, TaurusEventType
+from taurus.core.taurusbasetypes import DataFormat, TaurusEventType
from taurus.qt.qtgui.util import QT_ATTRIBUTE_QUALITY_PALETTE
from taurus.qt.qtgui.util import QT_DEVICE_STATE_PALETTE
@@ -105,17 +105,18 @@ class TaurusBaseController(object):
return self.widget().getDisplayValue()
def handleEvent(self, evt_src, evt_type, evt_value):
- if evt_type == TaurusEventType.Change or evt_type == TaurusEventType.Periodic:
- self._last_value = evt_value
- elif evt_type == TaurusEventType.Config:
- self._last_config_value = evt_value
- else:
- self._last_error_value = evt_value
- #In case of error, modify the last_value as well
- try:
- self._last_value = self.modelObj().getValueObj()
- except:
- pass
+ if evt_src == self.modelObj(): #update the "_last" values only if the event source is the model (it could be the background...)
+ if evt_type == TaurusEventType.Change or evt_type == TaurusEventType.Periodic:
+ self._last_value = evt_value
+ elif evt_type == TaurusEventType.Config:
+ self._last_config_value = evt_value
+ else:
+ self._last_error_value = evt_value
+ #In case of error, modify the last_value as well
+ try:
+ self._last_value = self.modelObj().getValueObj()
+ except:
+ pass
self.update()
def eventReceived(self, evt_src, evt_type, evt_value):
diff --git a/lib/taurus/qt/qtgui/base/taurusqattribute.py b/lib/taurus/qt/qtgui/base/taurusqattribute.py
index f94d5f3..6b839a2 100644
--- a/lib/taurus/qt/qtgui/base/taurusqattribute.py
+++ b/lib/taurus/qt/qtgui/base/taurusqattribute.py
@@ -30,10 +30,10 @@ import weakref
import re
import PyTango
-import taurus.core
+from taurus.core.taurusvalidator import AttributeNameValidator
from taurus.qt import Qt
from taurus.qt.qtgui.base import TaurusBaseComponent
-from taurus.core.util import SafeEvaluator
+from taurus.core.util.safeeval import SafeEvaluator
class TaurusQAttributeFactory(object): #@this probably needs to be ported to a proper TaurusFactory
'''A factory for TaurusQAttributes that ensures that only one
@@ -58,7 +58,7 @@ class TaurusQAttributeFactory(object): #@this probably needs to be ported to a p
taurusQAttributeFactory = TaurusQAttributeFactory()
-ATTRNAMEVALIDATOR = taurus.core.AttributeNameValidator()
+ATTRNAMEVALIDATOR = AttributeNameValidator()
class TaurusQAttribute(Qt.QObject, TaurusBaseComponent):
'''A listener for taurus attributes.
diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py
index 0343c03..6b49e56 100644
--- a/lib/taurus/qt/qtgui/button/taurusbutton.py
+++ b/lib/taurus/qt/qtgui/button/taurusbutton.py
@@ -33,10 +33,11 @@ __docformat__ = 'restructuredtext'
import PyTango
from taurus.qt import Qt
-from taurus.core import TaurusDevice, LockStatus, TaurusLockInfo
+from taurus.core.taurusbasetypes import LockStatus, TaurusLockInfo
+from taurus.core.taurusdevice import TaurusDevice
from taurus.qt.qtgui.base import TaurusBaseWidget
from taurus.core.util import eventfilters
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
from taurus.qt.qtgui.resource import getIcon
from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox
@@ -340,7 +341,7 @@ class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
passed, the currently set parameters are used.
:param command: (str) the command name. If None is passed, the currently
set command is used.
- :param dev: (taurus.core.TaurusDevice) the device on which the command is
+ :param dev: (taurus.core.taurusdevice.TaurusDevice) the device on which the command is
executed. If None is passed, the current model is used.
:return: (sequence or scalar) a sequence of parameters (or a scalar if only one parameter)
diff --git a/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py b/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
index a3308bd..f10edbd 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
@@ -30,7 +30,7 @@ __docformat__ = 'restructuredtext'
import weakref
from taurus import Device
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
from taurus.qt import Qt
from IPython.config.loader import Config
diff --git a/lib/taurus/qt/qtgui/console/taurusconsolefactory.py b/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
index 4f8c635..38b427c 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
@@ -33,7 +33,7 @@ __all__ = ["TaurusConsoleFactory"]
__docformat__ = 'restructuredtext'
-from taurus.core.util import Singleton
+from taurus.core.util.singleton import Singleton
from taurus.qt import Qt
from taurusconsolewidget import TaurusConsoleWidget
diff --git a/lib/taurus/qt/qtgui/container/qcontainer.py b/lib/taurus/qt/qtgui/container/qcontainer.py
index 7298323..daee76d 100644
--- a/lib/taurus/qt/qtgui/container/qcontainer.py
+++ b/lib/taurus/qt/qtgui/container/qcontainer.py
@@ -29,8 +29,8 @@ __all__ = ["QGroupWidget"]
__docformat__ = 'restructuredtext'
-import copy
import sys
+import json
from taurus.qt import Qt
from taurus.qt.qtgui.resource import getThemePixmap, getThemeIcon, getStandardIcon
@@ -61,7 +61,7 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
_TitleLabelStyle = """.QLabel {{ color : {font_color}; }}"""
-_ContentBarStyleWithTitle = """.QFrame {{
+_ContentBarStyleWithTitle = """ContentFrame {{
border-top-width: 0px;
border-left-width: 1px;
border-right-width: 1px;
@@ -79,7 +79,7 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0,
*/
}}"""
-_ContentBarStyleWithoutTitle = """.QFrame {{
+_ContentBarStyleWithoutTitle = """ContentFrame {{
border-width: 1px;
border-style: solid;
border-color: {border_color};
@@ -94,6 +94,10 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0,
*/
}}"""
+# Empty content QFrame to avoid frame style to be propagated
+# to child QFrame widgets
+class ContentFrame(Qt.QFrame):
+ pass
class QGroupWidget(Qt.QWidget):
"""An expandable/collapsible composite widget"""
@@ -104,7 +108,7 @@ class QGroupWidget(Qt.QWidget):
'start_color' : 'rgb(60, 150, 255)',
'stop_color' : 'rgb(0, 65, 200)',
'font_color' : 'white',
- 'border_radius': '4px',
+ 'border_radius': '5px',
}
DefaultContentVisible = True
@@ -112,7 +116,7 @@ class QGroupWidget(Qt.QWidget):
'start_color' : 'rgb(224, 224, 224)',
'stop_color' : 'rgb(255, 255, 255)',
'border_color' : 'rgb(0, 85, 227)',
- 'border_radius': '4px',
+ 'border_radius': '5px',
}
def __init__(self, parent=None, designMode=False):
@@ -126,7 +130,7 @@ class QGroupWidget(Qt.QWidget):
self.resetContentVisible()
self.resetTitleHeight()
self.resetTitleVisible()
-
+
def __init(self):
panelLayout = Qt.QVBoxLayout()
panelLayout.setSpacing(0)
@@ -156,7 +160,10 @@ class QGroupWidget(Qt.QWidget):
l.addWidget(self._titleLabel, 1)
l.addWidget(self._upDownButton, 0)
- self._content = content = Qt.QFrame()
+ self._content = content = ContentFrame()
+ l = Qt.QHBoxLayout()
+ l.setContentsMargins(0, 0, 0, 0)
+ content.setLayout(l)
panelLayout.addWidget(content, 1)
def _updateStyle(self):
@@ -186,11 +193,6 @@ class QGroupWidget(Qt.QWidget):
'icon' : ":/designer/groupwidget.png",
'container' : True }
- ret = TaurusBaseContainer.getQtDesignerPluginInfo()
- ret['icon'] = ":/designer/groupwidget.png"
- ret['container'] = cls is QGroupWidget
- return ret
-
def content(self):
"""Returns the contents widget
@@ -332,6 +334,28 @@ class QGroupWidget(Qt.QWidget):
"""Resets this widget's title style"""
self.setTitleStyle({})
+ def getTitleStyleStr(self):
+ """Returns this widget's title style
+
+ :return: (dict) this widget's title style"""
+ return json.dumps(self._titleBarStyle)
+
+ def setTitleStyleStr(self, style_map):
+ """Sets this widget's title style
+ Used key/values for style_map:
+ - 'start_color' : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+ - 'stop_color' : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+ - 'font_color' : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+ - 'border_radius': radius (Ex.: '5px', '5px,2px')
+
+ :param style_map: (dict) the new widget title style"""
+ style_map = json.loads(str(style_map))
+ self.setTitleStyle(style_map)
+
+ def resetTitleStyleStr(self):
+ """Resets this widget's title style"""
+ self.resetTitleStyle()
+
def getContentStyle(self):
"""Returns this widget's content style
@@ -353,6 +377,27 @@ class QGroupWidget(Qt.QWidget):
def resetContentStyle(self):
"""Resets this widget's content style"""
self.setContentStyle({})
+
+ def getContentStyleStr(self):
+ """Returns this widget's content style
+
+ :return: (dict) this widget's content style"""
+ return json.dumps(self._contentStyle)
+
+ def setContentStyleStr(self, style_map):
+ """Sets this widget's content style
+ Used key/values for style_map:
+ - 'start_color' : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+ - 'stop_color' : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+
+ :param style_map: (dict) the new widget content style"""
+ style_map = json.loads(str(style_map))
+ self.setContentStyle(style_map)
+
+ def resetContentStyleStr(self):
+ """Resets this widget's content style"""
+ self.resetContentStyle()
+
#: This property contains the widget's title
#:
@@ -387,15 +432,6 @@ class QGroupWidget(Qt.QWidget):
#: * :meth:`taurus.qt.qtgui.container.QGroupWidget.setTitleVisible`
titleVisible = Qt.pyqtProperty("bool", isTitleVisible, setTitleVisible)
- ##: This property contains the widget's title style
- ##:
- ##: **Access functions:**
- ##:
- ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.getTitleStyle`
- ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.setTitleStyle`
- ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetTitleStyle`
- #titleStyle = Qt.pyqtProperty("QMap", getTitleStyle, setTitleStyle, resetTitleStyle)
-
#: This property contains the widget's content's visibility
#:
#: **Access functions:**
@@ -406,14 +442,26 @@ class QGroupWidget(Qt.QWidget):
contentVisible = Qt.pyqtProperty("bool", isContentVisible, setContentVisible, resetContentVisible)
##: This property contains the widget's content style
- ##:
+ ##: The style must be a json dictionary
+ ##:
##: **Access functions:**
##:
- ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.getContentStyle`
- ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.setContentStyle`
- ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetContentStyle`
- #contentStyle = Qt.pyqtProperty("QMap", getContentStyle, setContentStyle, resetContentStyle)
+ ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.getContentStyleStr`
+ ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.setContentStyleStr`
+ ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetContentStyleStr`
+ contentStyle = Qt.pyqtProperty("QString", getContentStyleStr, setContentStyleStr,
+ resetContentStyleStr, doc="The style must be a json dictionary")
+ ##: This property contains the widget's title style
+ ##: The style must be a json dictionary
+ ##:
+ ##: **Access functions:**
+ ##:
+ ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.getTitleStyleStr`
+ ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.setTitleStyleStr`
+ ##: * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetTitleStyleStr`
+ titleStyle = Qt.pyqtProperty("QString", getTitleStyleStr, setTitleStyleStr,
+ resetTitleStyleStr, doc="The style must be a json dictionary")
def demo():
"QGroup Widget"
diff --git a/lib/taurus/qt/qtgui/container/taurusgroupbox.py b/lib/taurus/qt/qtgui/container/taurusgroupbox.py
index bf0df7d..02f5558 100644
--- a/lib/taurus/qt/qtgui/container/taurusgroupbox.py
+++ b/lib/taurus/qt/qtgui/container/taurusgroupbox.py
@@ -97,7 +97,7 @@ class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer):
def setPrefixText(self,prefix):
self._prefix = prefix
import taurus.core
- self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+ self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
def getSuffixText(self):
return self._suffix
@@ -106,7 +106,7 @@ class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer):
def setSuffixText(self,suffix):
self._suffix = suffix
import taurus.core
- self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+ self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
@classmethod
def getQtDesignerPluginInfo(cls):
diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py
index dfec696..69bf285 100644
--- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py
+++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py
@@ -679,9 +679,9 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
:param fname: (str) name of output file. If None given, a file dialog will be shown.
'''
if fname is None:
- fname = Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved',
- '', "Ini files (*.ini);;All files (*)")
- if fname.isNull():
+ fname = unicode(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved',
+ '', "Ini files (*.ini);;All files (*)"))
+ if not fname:
return
self.saveSettings()
ok = Qt.QFile.copy(self.getQSettings().fileName(), fname)
@@ -699,9 +699,9 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
:param fname: (str) name of ini file. If None given, a file dialog will be shown.
'''
if fname is None:
- fname = Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file',
- '', "Ini files (*.ini);;All files (*)")
- if fname.isNull():
+ fname = unicode(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file',
+ '', "Ini files (*.ini);;All files (*)"))
+ if not fname:
return
s = Qt.QSettings(fname, Qt.QSettings.IniFormat)
#clone the perspectives found in the "factory" settings
@@ -813,15 +813,15 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
return self.__helpManualURI
def resetHelpManualURI(self):
- from taurus.core import Release
- uri = getattr(self, 'MANUAL_URI',Release.url)
+ from taurus.core import release
+ uri = getattr(self, 'MANUAL_URI', release.url)
self.setHelpManualURI(uri)
def showHelpAbout(self):
appname = unicode(Qt.qApp.applicationName())
appversion = unicode(Qt.qApp.applicationVersion())
- from taurus.core import Release
- abouttext = "%s %s\n\nUsing %s %s"%(appname, appversion, Release.name, Release.version)
+ from taurus.core import release
+ abouttext = "%s %s\n\nUsing %s %s"%(appname, appversion, release.name, release.version)
Qt.QMessageBox.about(self, 'About', abouttext)
def onShowManual(self, anchor=None):
@@ -841,7 +841,7 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
it means that this application is not the only one
'''
if key is None:
- from taurus.core.util import getSystemUserName
+ from taurus.core.util.user import getSystemUserName
username = getSystemUserName()
appname = unicode(Qt.QApplication.applicationName())
key = "__socket_%s-%s__"%(username,appname)
diff --git a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
index 34fd64e..f6eace6 100644
--- a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
+++ b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
@@ -70,13 +70,11 @@ def get_input(input_data, parent=None, input_panel_klass=None):
allow more than one value to be selected (makes sence when data_type
is a sequence of possibilities)
- :param input_data:
- a dictionary with information on how to build the input dialog
+ :param input_data: a dictionary with information on how to build the input dialog
:type input_data: :py:obj:`dict`
:param parent: parent widget
:type parent: PyQt4.QtGui.QWidget
- :param input_panel_klass:
- python class to be used as input panel [default: :class:`~taurus.qt.qtgui.panel.TaurusInputPanel`]
+ :param input_panel_klass: python class to be used as input panel [default: :class:`~taurus.qt.qtgui.panel.TaurusInputPanel`]
:type input_panel_klass: :class:`~taurus.qt.qtgui.panel.TaurusInputPanel`
:return: a tuple containing value selected and boolean which is true if
@@ -101,11 +99,12 @@ def get_input(input_data, parent=None, input_panel_klass=None):
d7 = dict(prompt="Do you like bears?",
data_type='Boolean', key="Yes/No", default_value=True)
d8 = dict(prompt="Please write your memo",
- data_type='Text', key="Memo", default_value="By default a memo is\na long thing")
-
+ data_type='Text', key="Memo", default_value="By default a memo is a long thing")
for d in [d1, d2, d3, d4, d5, d6, d7, d8]:
- get_input(input_data=d, title=d['prompt'])
+ get_input(input_data=d, title=d['prompt'])
+
"""
+
if input_panel_klass is None:
from taurus.qt.qtgui.panel import TaurusInputPanel
input_panel_klass = TaurusInputPanel
diff --git a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
index b2c20b1..b90c37f 100644
--- a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
+++ b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
@@ -33,9 +33,12 @@ __docformat__ = 'restructuredtext'
import sys
from taurus.qt import Qt
+
from taurus.core.util.excepthook import BaseExceptHook
+from taurus.core.util.log import LogExceptHook
from taurus.core.util.wrap import wraps
+
class TaurusMessageBox(Qt.QDialog):
"""A panel intended to display a taurus error.
Example::
@@ -264,7 +267,7 @@ class TaurusExceptHookMessageBox(BaseExceptHook):
app = Qt.QApplication.instance()
if app is None:
import taurus.core.util
- taurus.core.util.LogExceptHook().report(*exc_info)
+ LogExceptHook().report(*exc_info)
return
msgbox = self._getMessageBox(*exc_info)
if msgbox is None:
diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py
index f0c8c05..0190b30 100644
--- a/lib/taurus/qt/qtgui/display/qled.py
+++ b/lib/taurus/qt/qtgui/display/qled.py
@@ -32,18 +32,16 @@ __docformat__ = 'restructuredtext'
import sys
from taurus.qt import Qt
-import taurus.core.util
-import taurus.qt.qtgui.resource
-import qpixmapwidget
+from taurus.core.util.enumeration import Enumeration
+from taurus.qt.qtgui.resource import getPixmap
+from .qpixmapwidget import QPixmapWidget
-getPixmap = taurus.qt.qtgui.resource.getPixmap
-
-LedColor = taurus.core.util.Enumeration("LedColor", ["BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "MAGENTA", "GRENOBLE", "BLACK", "WHITE"])
-LedStatus = taurus.core.util.Enumeration("LedStatus", ["ON", "OFF"])
-LedSize = taurus.core.util.Enumeration("LedSize", [("SMALL", 24), ("LARGE", 48)])
+LedColor = Enumeration("LedColor", ["BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "MAGENTA", "GRENOBLE", "BLACK", "WHITE"])
+LedStatus = Enumeration("LedStatus", ["ON", "OFF"])
+LedSize = Enumeration("LedSize", [("SMALL", 24), ("LARGE", 48)])
-class QLed(qpixmapwidget.QPixmapWidget):
+class QLed(QPixmapWidget):
"""A Led"""
DefaultLedPattern = ":leds/images256/led_{color}_{status}.png"
@@ -59,13 +57,13 @@ class QLed(qpixmapwidget.QPixmapWidget):
self._ledInverted = self.DefaultLedInverted
self._ledName = self.toLedName()
self._timer = None
- qpixmapwidget.QPixmapWidget.__init__(self, parent)
+ QPixmapWidget.__init__(self, parent)
self._refresh()
def sizeHint(self):
if self.layout() is None:
return Qt.QSize(24, 24)
- return qpixmapwidget.QPixmapWidget.sizeHint(self)
+ return QPixmapWidget.sizeHint(self)
def minimumSizeHint(self):
"""Overwrite the default minimum size hint (0,0) to be (16,16)
diff --git a/lib/taurus/qt/qtgui/display/taurusboolled.py b/lib/taurus/qt/qtgui/display/taurusboolled.py
index 3d3b350..944109d 100644
--- a/lib/taurus/qt/qtgui/display/taurusboolled.py
+++ b/lib/taurus/qt/qtgui/display/taurusboolled.py
@@ -74,7 +74,7 @@ class TaurusBoolLed(QLed, TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def isReadOnly(self):
return True
@@ -188,7 +188,7 @@ class TaurusBoolLed(QLed, TaurusBaseWidget):
def handleEvent(self, evt_src, evt_type, evt_value):
if evt_value is None:
return
- if evt_type == taurus.core.TaurusEventType.Error:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Error:
self._setProblemsBackground(True)
self.updateStyle()
return
diff --git a/lib/taurus/qt/qtgui/display/taurusconfiglabel.py b/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
index dd728c3..0fcfc5b 100644
--- a/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
+++ b/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
@@ -94,7 +94,7 @@ class TaurusConfigLabel(Qt.QLabel, TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusConfiguration
+ return taurus.core.taurusconfiguration.TaurusConfiguration
def getDisplayValue(self):
cfg_value = self.getConfigurationAttributeValue()
@@ -152,7 +152,7 @@ class TaurusConfigLabel(Qt.QLabel, TaurusBaseWidget):
@Qt.pyqtSignature("setPrefixText(QString)")
def setPrefixText(self,prefix):
self._prefix = prefix
- self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+ self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
def resetPrefixText(self):
self.setPrefixText('')
@@ -163,7 +163,7 @@ class TaurusConfigLabel(Qt.QLabel, TaurusBaseWidget):
@Qt.pyqtSignature("setSuffixText(QString)")
def setSuffixText(self,suffix):
self._suffix = suffix
- self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+ self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
def resetSuffixText(self):
self.setSuffixText('')
diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py
index 7602f85..365a78a 100644
--- a/lib/taurus/qt/qtgui/display/tauruslabel.py
+++ b/lib/taurus/qt/qtgui/display/tauruslabel.py
@@ -34,7 +34,7 @@ import operator
# shame of me for importing PyTango!
import PyTango
-from taurus.core import TaurusElementType, TaurusEventType
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusEventType
from taurus.qt import Qt
from taurus.qt.qtgui.base import TaurusBaseWidget
from taurus.qt.qtgui.base import TaurusBaseController
diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py
index 491fdee..3f6e90d 100644
--- a/lib/taurus/qt/qtgui/display/tauruslcd.py
+++ b/lib/taurus/qt/qtgui/display/tauruslcd.py
@@ -34,7 +34,7 @@ import operator
# shame of me for importing PyTango!
import PyTango
-from taurus.core import TaurusElementType, TaurusEventType
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusEventType
from taurus.qt import Qt
from taurus.qt.qtgui.base import TaurusBaseWidget
from taurus.qt.qtgui.base import TaurusBaseController
diff --git a/lib/taurus/qt/qtgui/display/tauruslcdvalue.py b/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
index e674b34..44caa62 100644
--- a/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
+++ b/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
@@ -74,7 +74,7 @@ class TaurusLCDValue(Qt.QLCDNumber, TaurusBaseWidget):
def getModelClass(self):
import taurus.core
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def isReadOnly(self):
return True
diff --git a/lib/taurus/qt/qtgui/display/taurusstateled.py b/lib/taurus/qt/qtgui/display/taurusstateled.py
index 604c9a7..7d46f25 100644
--- a/lib/taurus/qt/qtgui/display/taurusstateled.py
+++ b/lib/taurus/qt/qtgui/display/taurusstateled.py
@@ -33,7 +33,7 @@ __docformat__ = 'restructuredtext'
# ugly
import PyTango
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
from taurus.qt import Qt
from taurus.qt.qtgui.base import TaurusBaseWidget
from qled import LedStatus, LedColor
@@ -83,7 +83,7 @@ class TaurusStateLed(QLed, TaurusBaseWidget):
def getModelClass(self):
import taurus.core
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def isReadOnly(self):
return True
diff --git a/lib/taurus/qt/qtgui/display/taurusvaluelabel.py b/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
index b37f68b..5bf8ef2 100644
--- a/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
+++ b/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
@@ -168,7 +168,7 @@ class TaurusValueLabel(Qt.QLabel, TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def isReadOnly(self):
return True
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
index 8155726..e84ecba 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
@@ -33,7 +33,7 @@ import taurus
from guiqwt.curve import CurveItem
from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam, TaurusTrendParam
-from taurus.core.util import ArrayBuffer
+from taurus.core.util.containers import ArrayBuffer
import numpy
@@ -168,7 +168,7 @@ class TaurusTrendItem(CurveItem, TaurusBaseComponent):
#... and fire a fake event for initialization
try:
value = self.getModelObj().read()
- self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+ self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
except:
pass
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
index cb54333..e2b444d 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
@@ -31,16 +31,15 @@ __all__=['TaurusCurveItemTableModel','CurveItemConf', 'CurveItemConfDlg']
import copy
-from taurus.qt import Qt,Qwt5
+from taurus.qt import Qt, Qwt5
+from guiqwt.styles import CurveParam, AxesParam, update_style_attr
+from guiqwt.builder import make
+
import taurus
-from taurus.core import TaurusException
from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
from taurus.qt.qtgui.resource import getThemeIcon, getIcon
-from ui.ui_CurveItemConfDlg import Ui_CurveItemConfDlg
-from guiqwt.styles import CurveParam, AxesParam, update_style_attr
+from .ui.ui_CurveItemConfDlg import Ui_CurveItemConfDlg
from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam
-from guiqwt.builder import make
-
AXIS_ID2NAME = {Qwt5.QwtPlot.yLeft:'left', Qwt5.QwtPlot.yRight:'right',
Qwt5.QwtPlot.xBottom:'bottom', Qwt5.QwtPlot.xTop:'top'}
@@ -51,6 +50,7 @@ NUMCOLS = 3
X, Y, TITLE = range(NUMCOLS)
SRC_ROLE = Qt.Qt.UserRole + 1
+
class Component(object):
def __init__(self, src):
self.display = ''
@@ -314,8 +314,8 @@ class CurveItemConfDlg(Qt.QWidget):
nexusWidget = TaurusNeXusBrowser()
self.ui.tabWidget.addTab(nexusWidget,'NeXus')
except:
- import taurus.core.util
- _logger = taurus.core.util.Logger('CurveItemConfDlg')
+ import taurus.core.util.log
+ _logger = taurus.core.util.log.Logger('CurveItemConfDlg')
_logger.warning('TaurusNeXusBrowser not available')
self.traceback()
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/image.py b/lib/taurus/qt/qtgui/extra_guiqwt/image.py
index cd18132..3f2c7ad 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/image.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/image.py
@@ -32,7 +32,7 @@ __all__=["TaurusImageItem","TaurusRGBImageItem","TaurusTrend2DItem",
from taurus.qt import Qt
from taurus.qt.qtgui.base import TaurusBaseComponent
import taurus.core
-from taurus.core.util import ArrayBuffer
+from taurus.core.util.containers import ArrayBuffer
from guiqwt.image import ImageItem, RGBImageItem, XYImageItem, INTERP_NEAREST, INTERP_LINEAR
@@ -56,7 +56,7 @@ class TaurusBaseImageItem(TaurusBaseComponent):
#... and fire a fake event for initialization
try:
value = self.getModelObj().read()
- self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+ self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
except:
pass
@@ -106,7 +106,7 @@ class TaurusEncodedImageItem(TaurusImageItem):
#... and fire a fake event for initialization
try:
format,value = self.codec.decode(self.getModelObj().read())
- self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+ self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
except:
pass
@@ -114,7 +114,7 @@ class TaurusEncodedImageItem(TaurusImageItem):
'''reimplementation to decode data before passing it to
TaurusImageItem implementation'''
if type(data) == tuple:
- from taurus.core.util import CodecFactory
+ from taurus.core.util.codecs import CodecFactory
codec = CodecFactory().getCodec(data[0])
format,decoded_data = codec.decode(data)
TaurusImageItem.set_data(self, decoded_data, lut_range=lut_range)
@@ -179,7 +179,7 @@ class TaurusTrend2DItem(XYImageItem, TaurusBaseComponent):
#... and fire a fake event for initialization
try:
value = self.getModelObj().read()
- self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+ self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
except:
pass
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
index 10df1e9..b40ef50 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
@@ -35,7 +35,7 @@ from guiqwt.plot import ImageDialog, CurveDialog
import taurus.core
from taurus.qt import Qt
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
from taurus.qt.qtgui.base import TaurusBaseWidget
from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
from taurus.qt.qtgui.extra_guiqwt.builder import make
@@ -72,7 +72,7 @@ class TaurusCurveDialog(CurveDialog, TaurusBaseWidget):
def getModelClass(self):
'''reimplemented from :class:`TaurusBaseWidget`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def _splitModel(self, modelNames):
'''convert str to list if needed (commas and whitespace are considered as separators)'''
@@ -212,7 +212,7 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
def getModelClass(self):
'''reimplemented from :class:`TaurusBaseWidget`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def getTaurusTrendItems(self):
return [item for item in self.get_plot().get_public_items() if isinstance(item, TaurusTrendItem)]
@@ -439,7 +439,7 @@ class TaurusImageDialog(ImageDialog, TaurusBaseWidget):
def getModelClass(self):
'''reimplemented from :class:`TaurusBaseWidget`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def setModel(self, model):
'''reimplemented from :class:`TaurusBaseWidget`'''
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
index 0ce8b3c..1be1808 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
@@ -111,7 +111,7 @@ class TaurusTrend2DDialog(ImageDialog, TaurusBaseWidget):
def getModelClass(self):
'''reimplemented from :class:`TaurusBaseWidget`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def setModel(self, model):
'''reimplemented from :class:`TaurusBaseWidget`'''
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
index a6bb23b..1e6088b 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
@@ -34,15 +34,16 @@ from taurus.qt import Qt
from guiqwt.tools import CommandTool, ToggleTool, DefaultToolbarID, QActionGroup, add_actions
from guiqwt.signals import SIG_ITEMS_CHANGED
+from taurus.core.taurusbasetypes import TaurusElementType
from taurus.qt.qtgui.resource import getIcon
from taurus.qt.qtgui.extra_guiqwt.builder import make
from taurus.qt.qtgui.extra_guiqwt.curve import TaurusCurveItem,TaurusTrendItem
from taurus.qt.qtgui.extra_guiqwt.image import TaurusTrend2DItem
from taurus.qt.qtgui.extra_guiqwt.curvesmodel import CurveItemConfDlg
from taurus.qt.qtgui.panel import TaurusModelChooser
-from taurus.core import TaurusElementType
from taurus.qt.qtgui.plot import DateTimeScaleEngine
+
class TaurusCurveChooserTool(CommandTool):
"""
A tool that shows the Taurus Model Chooser to create/edit the taurus curves of a plot
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/common.py b/lib/taurus/qt/qtgui/extra_macroexecutor/common.py
index 51fbcc2..18aac7c 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/common.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/common.py
@@ -27,7 +27,7 @@ import PyTango
import taurus
from taurus.qt.qtgui.base import TaurusBaseWidget
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
from taurus.qt import Qt
from taurus.qt.qtgui.input import TaurusAttrListComboBox
from taurus.qt.qtgui.container import TaurusMainWindow
@@ -202,7 +202,7 @@ class TaurusMacroConfigurationDialog(Qt.QDialog):
def onMacroServerComboBoxChanged(self, macroServerName):
self.doorComboBox.setModel(macroServerName + "/doorList")
- self.doorComboBox.fireEvent(self.doorComboBox, taurus.core.TaurusEventType.Change, self.doorComboBox.getModelValueObj())#fake event
+ self.doorComboBox.fireEvent(self.doorComboBox, taurus.core.taurusbasetypes.TaurusEventType.Change, self.doorComboBox.getModelValueObj())#fake event
def onMacroServerNameChanged(self, macroServerName):
self.__selectMacroServer(macroServerName)
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py b/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py
index 42955da..a3b0aca 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py
@@ -187,8 +187,8 @@ class DoorAttrListener(Qt.QObject):
self.attrObj.addListener(self)
def eventReceived(self, src, type, value):
- if (type == taurus.core.TaurusEventType.Error or
- type == taurus.core.TaurusEventType.Config):
+ if (type == taurus.core.taurusbasetypes.TaurusEventType.Error or
+ type == taurus.core.taurusbasetypes.TaurusEventType.Config):
return
self.emit(Qt.SIGNAL('door%sChanged' % self.attrName), value.value)
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py b/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py
index 1219cdc..fc45642 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py
@@ -28,7 +28,7 @@ model.py:
"""
from taurus.qt import Qt
-from taurus.core.util import etree
+from lxml import etree
from taurus.core.tango.sardana import macro
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py b/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py
index bd7646c..5736955 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py
@@ -98,6 +98,7 @@ ALLOWS_HOOKS_FILTER = 'allowsHooks'
PARAM_REPEAT = "ParamRepeat"
+PARAM_OBJECT = "Object"
PARAM_MOTOR = "Moveable"
PARAM_CONTROLLER_CLASS = "ControllerClass"
PARAM_CONTROLLER = "Controller"
@@ -106,7 +107,11 @@ PARAM_MEASUREMENT_GROUP = "MeasurementGroup"
PARAM_IO_REGISTER = "IORegister"
PARAM_COMMUNICATION_CHANNEL = "ComChannel"
PARAM_EXPERIMENTAL_CHANNEL = "ExpChannel"
-PARAM_MACRO = "Macro"
+PARAM_MACRO_CODE = "MacroCode"
+PARAM_MACRO_CLASS = "MacroClass"
+PARAM_MACRO_FUNCTION = "MacroFunction"
+PARAM_MACRO_LIBRARY = "MacroLibrary"
+
PARAM_STRING = "String"
@@ -127,7 +132,8 @@ PARAM_BOOLEAN = "Boolean"
MAX_REPEATS = "max"
MIN_REPEATS = "min"
-EDITOR_COMBOBOX_PARAMS = [PARAM_MOTOR,
+EDITOR_COMBOBOX_PARAMS = [PARAM_OBJECT,
+ PARAM_MOTOR,
PARAM_CONTROLLER_CLASS,
PARAM_CONTROLLER,
PARAM_MOTOR_PARAM,
@@ -135,7 +141,10 @@ EDITOR_COMBOBOX_PARAMS = [PARAM_MOTOR,
PARAM_IO_REGISTER,
PARAM_COMMUNICATION_CHANNEL,
PARAM_EXPERIMENTAL_CHANNEL,
- PARAM_MACRO]
+ PARAM_MACRO_CODE,
+ PARAM_MACRO_CLASS,
+ PARAM_MACRO_FUNCTION,
+ PARAM_MACRO_LIBRARY]
EDITOR_LINEEDIT_PARAMS = [PARAM_STRING,
PARAM_FILENAME,
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py
index d41d916..3ca8e8c 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py
@@ -35,7 +35,7 @@ from taurus.qt import Qt
import taurus
from taurus.qt.qtgui.container import TaurusWidget
from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox
-from taurus.core.util import DEVICE_STATE_PALETTE
+from taurus.core.util.colors import DEVICE_STATE_PALETTE
import functools
@@ -46,7 +46,7 @@ class DoorStateListener(Qt.QObject):
__pyqtSignals__ = ["doorStateChanged"]
def eventReceived(self, evt_src, evt_type, evt_value):
- if evt_type not in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+ if evt_type not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
return
door_state = evt_value.value
self.emit(Qt.SIGNAL('doorStateChanged'), door_state)
@@ -222,6 +222,13 @@ class MacroButton(TaurusWidget):
else:
self.ui.button.setChecked(True)
self.door.ResumeMacro()
+
+ @classmethod
+ def getQtDesignerPluginInfo(cls):
+ return {'container': False,
+ 'group': 'Taurus Sardana',
+ 'module': 'taurus.qt.qtgui.extra_macroexecutor',
+ 'icon': ':/designer/pushbutton.png'}
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py
index 7ed246e..c03bcf5 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py
@@ -47,7 +47,7 @@ class TaurusMacroDescriptionViewer(Qt.QTextEdit, TaurusBaseWidget):
self.updateStyle()
def getModelClass(self):
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
def updateStyle(self):
self.update()
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py
index 2104b47..9a821e4 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py
@@ -854,6 +854,7 @@ class TaurusMacroExecutorWidget(TaurusWidget):
if macro is None: return
data = data[1][0]
state, range, step, id = data["state"], data["range"], data["step"], data["id"]
+ if id is None: return
id = int(id)
if id != self.macroId(): return
macroName = macro.name
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py
index e9d396d..d2fed9e 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py
@@ -24,10 +24,11 @@
#############################################################################
from taurus.qt import Qt
+from taurus import Database
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusdatabase import TaurusAttrInfo
from taurus.qt.qtgui.input import TaurusAttrListComboBox
from taurus.qt.qtgui.tree import TaurusDbTreeWidget
-from taurus import Database
-from taurus.core import TaurusElementType, TaurusAttrInfo
from taurus.qt.qtgui.resource import getThemeIcon
from taurus.qt.qtgui.extra_macroexecutor.macroparameterseditor.macroparameterseditor import MacroParametersEditor
from taurus.qt.qtgui.extra_macroexecutor.macroparameterseditor.parameditors import LineEditParam, ParamBase, ComboBoxParam, CheckBoxParam, DirPathParam, MSAttrListComboBoxParam
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py
index a711af5..527afba 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py
@@ -29,7 +29,7 @@ macroparameterseditor.py:
import sys, inspect, glob
from taurus.qt import Qt
-from taurus.core.util import Singleton
+from taurus.core.util.singleton import Singleton
from taurus.core.tango.sardana import macro
from taurus.qt.qtgui.extra_macroexecutor.macroparameterseditor.delegate import ParamEditorDelegate
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py
index 3fb375c..2728334 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py
@@ -27,7 +27,7 @@
model.py:
"""
from taurus.qt import Qt
-from taurus.core.util import etree
+from lxml import etree
from taurus.core.tango.sardana import macro
from taurus.qt.qtgui.extra_macroexecutor import globals
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py
index c132aa5..30cd17a 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py
@@ -207,7 +207,7 @@ class SpinBoxParam(ParamBase, Qt.QSpinBox):
def __init__(self, parent=None, paramModel=None):
ParamBase.__init__(self, paramModel)
Qt.QSpinBox.__init__(self,parent)
- self.setRange(-999999,999999)
+ self.setRange(-999999999,999999999)
self.setAccelerated(True)
# self.setToolTip(self.paramModel().description())
@@ -225,10 +225,10 @@ class DoubleSpinBoxParam(ParamBase, Qt.QDoubleSpinBox):
def __init__(self, parent=None, paramModel=None):
ParamBase.__init__(self, paramModel)
Qt.QDoubleSpinBox.__init__(self,parent)
- self.setRange(-999999.999,999999.999)
+ self.setRange(-999999999.999999,999999999.999999)
self.setAccelerated(True)
- self.setDecimals(3)
- self.setSingleStep(0.01)
+ self.setDecimals(6)
+ self.setSingleStep(0.000001)
# self.setToolTip(self.paramModel().description())
def getValue(self):
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py b/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py
index d644f97..c958b5b 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py
@@ -38,10 +38,11 @@ import taurus.core
from taurus.qt import QtGui, Qwt5
from taurus.qt.Qt import *
+from taurus.core.util import dictFromSequence
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.event import eventfilters
from taurus.qt.qtgui.plot import TaurusTrend
-from taurus.core.util import dictFromSequence, CaselessDict, eventfilters
-
class ScanPlotter(TaurusTrend):
def __init__(self, parent = None, designMode = False):
@@ -143,7 +144,7 @@ class ScanPlotter(TaurusTrend):
try:
for name in self.getTrendSetNames():
ts = self.getTrendSet(name)
- ts.fireEvent(None, taurus.core.TaurusEventType.Change, None)
+ ts.fireEvent(None, taurus.core.taurusbasetypes.TaurusEventType.Change, None)
finally:
self.curves_lock.release()
self.setEventFilters([eventfilters.ONLY_VALID], plotables)
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py
index 326acd6..dcb0d85 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py
@@ -28,7 +28,7 @@ model.py:
"""
from taurus.qt import Qt
-from taurus.core.util import etree
+from lxml import etree
from taurus.core.tango.sardana import macro
class MacroSequenceTreeModel(Qt.QAbstractItemModel):
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py
index 2a77bd8..ee24cfd 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py
@@ -31,7 +31,7 @@ import os, sys
from taurus.qt import Qt
import PyTango
-from taurus.core.util import etree
+from lxml import etree
from taurus.qt.qtgui.extra_macroexecutor.common import MacroExecutionWindow, MacroComboBox, standardPlotablesFilter
from taurus import Device
@@ -637,6 +637,7 @@ class TaurusSequencerWidget(TaurusWidget):
if macro is None: return
data = data[1][0]
state, range, step, id = str(data["state"]), data["range"], data["step"], data["id"]
+ if id is None: return
id = int(id)
if not id in self.macroIds(): return
macroName = macro.name
diff --git a/lib/taurus/qt/qtgui/extra_pool/poolmotor.py b/lib/taurus/qt/qtgui/extra_pool/poolmotor.py
index 318bca5..6263376 100644
--- a/lib/taurus/qt/qtgui/extra_pool/poolmotor.py
+++ b/lib/taurus/qt/qtgui/extra_pool/poolmotor.py
@@ -31,6 +31,9 @@ import numpy
from taurus.qt import Qt
import taurus
+from taurus.core.util.colors import DEVICE_STATE_PALETTE
+from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.taurusvalidator import DeviceNameValidator
import taurus.qt.qtcore.mimetypes
from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox
from taurus.qt.qtgui.base import TaurusBaseWidget
@@ -42,6 +45,8 @@ from taurus.qt.qtgui.input import TaurusValueSpinBox
from taurus.qt.qtgui.panel import DefaultLabelWidget
from taurus.qt.qtgui.panel import DefaultUnitsWidget
from taurus.qt.qtgui.panel import TaurusValue, TaurusAttrForm
+from taurus.qt.qtcore.mimetypes import TAURUS_DEV_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
+from taurus.qt.qtgui.resource import getIcon
from ui_poolmotorslim import Ui_PoolMotorSlim
@@ -55,7 +60,7 @@ class LimitsListener(Qt.QObject):
Qt.QObject.__init__(self)
def eventReceived(self, evt_src, evt_type, evt_value):
- if evt_type not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]:
+ if evt_type not in [TaurusEventType.Change, TaurusEventType.Periodic]:
return
limits = evt_value.value
self.emit(Qt.SIGNAL('updateLimits(PyQt_PyObject)'), limits.tolist())
@@ -78,7 +83,7 @@ class PoolMotorClient():
self.has_limits = hasattr(self.motor_dev, 'Limit_Switches')
self.has_encoder = hasattr(self.motor_dev, 'Encoder')
except Exception,e:
- print 'EXCEPTION CREATING MOTOR DEVICE...\n'+str(e)
+ taurus.warning('Exception Creating Motor Device %s', str(e))
def moveMotor(self, pos):
#self.motor_dev['position'] = pos
@@ -128,8 +133,8 @@ class LabelWidgetDragsDeviceAndAttribute(DefaultLabelWidget):
mimeData.setText(self.text())
attr_name = model
dev_name = model.rpartition('/')[0]
- mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE, dev_name)
- mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE, attr_name)
+ mimeData.setData(TAURUS_DEV_MIME_TYPE, dev_name)
+ mimeData.setData(TAURUS_ATTR_MIME_TYPE, attr_name)
drag = Qt.QDrag(self)
drag.setMimeData(mimeData)
@@ -296,6 +301,10 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
self.ui = Ui_PoolMotorSlim()
self.ui.setupUi(self)
+
+ if designMode:
+ self.__setTaurusIcons()
+ return
# CREATE THE TaurusValue that can not be configured in the Designer
self.taurus_value = TaurusValue(self.ui.taurusValueContainer)
@@ -321,7 +330,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
# ADD AN EVENT FILTER FOR THE STATUS LABEL IN ORDER TO PROVIDE JUST THE STRING FROM THE CONTROLLER (LAST LINE)
def just_ctrl_status_line(evt_src, evt_type, evt_value):
- if evt_type not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]:
+ if evt_type not in [TaurusEventType.Change, TaurusEventType.Periodic]:
return evt_src, evt_type, evt_value
try:
status = evt_value.value
@@ -345,36 +354,9 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
self.toggleMoveAbsolute(True)
self.toggleStopMove(True)
- #################################################################################################################
- ################
# SET TAURUS ICONS
- ################
- self.ui.btnMin.setText('')
- self.ui.btnMin.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-remove.svg'))
- self.ui.btnMax.setText('')
- self.ui.btnMax.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-add.svg'))
-
- self.ui.btnGoToNeg.setText('')
- self.ui.btnGoToNeg.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_backward.svg'))
- self.ui.btnGoToNegPress.setText('')
- self.ui.btnGoToNegPress.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_backward.svg'))
- self.ui.btnGoToNegInc.setText('')
- self.ui.btnGoToNegInc.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_backward.svg'))
- self.ui.btnGoToPos.setText('')
- self.ui.btnGoToPos.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_forward.svg'))
- self.ui.btnGoToPosPress.setText('')
- self.ui.btnGoToPosPress.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_forward.svg'))
- self.ui.btnGoToPosInc.setText('')
- self.ui.btnGoToPosInc.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_start.svg'))
- self.ui.btnStop.setText('')
- self.ui.btnStop.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_stop.svg'))
- self.ui.btnHome.setText('')
- self.ui.btnHome.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/go-home.svg'))
- self.ui.btnCfg.setText('')
- self.ui.btnCfg.setIcon(taurus.qt.qtgui.resource.getIcon(':/categories/preferences-system.svg'))
- #################################################################################################################
-
-
+ self.__setTaurusIcons()
+
self.ui.motorGroupBox.setContextMenuPolicy(Qt.Qt.CustomContextMenu)
self.connect(self.ui.motorGroupBox, Qt.SIGNAL('customContextMenuRequested(QPoint)'), self.buildContextMenu)
@@ -407,6 +389,34 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
self.registerConfigProperty(self.ui.lblStatus.isVisible, self.toggleStatus, 'Status')
#################################################################################################################
+ def __setTaurusIcons(self):
+ self.ui.btnMin.setText('')
+ self.ui.btnMin.setIcon(getIcon(':/actions/list-remove.svg'))
+ self.ui.btnMax.setText('')
+ self.ui.btnMax.setIcon(getIcon(':/actions/list-add.svg'))
+
+ self.ui.btnGoToNeg.setText('')
+ self.ui.btnGoToNeg.setIcon(getIcon(':/actions/media_skip_backward.svg'))
+ self.ui.btnGoToNegPress.setText('')
+ self.ui.btnGoToNegPress.setIcon(getIcon(':/actions/media_seek_backward.svg'))
+ self.ui.btnGoToNegInc.setText('')
+ self.ui.btnGoToNegInc.setIcon(getIcon(':/actions/media_playback_backward.svg'))
+ self.ui.btnGoToPos.setText('')
+ self.ui.btnGoToPos.setIcon(getIcon(':/actions/media_skip_forward.svg'))
+ self.ui.btnGoToPosPress.setText('')
+ self.ui.btnGoToPosPress.setIcon(getIcon(':/actions/media_seek_forward.svg'))
+ self.ui.btnGoToPosInc.setText('')
+ self.ui.btnGoToPosInc.setIcon(getIcon(':/actions/media_playback_start.svg'))
+ self.ui.btnStop.setText('')
+ self.ui.btnStop.setIcon(getIcon(':/actions/media_playback_stop.svg'))
+ self.ui.btnHome.setText('')
+ self.ui.btnHome.setIcon(getIcon(':/actions/go-home.svg'))
+ self.ui.btnCfg.setText('')
+ self.ui.btnCfg.setIcon(getIcon(':/categories/preferences-system.svg'))
+ #################################################################################################################
+
+
+
#@Qt.pyqtSlot(list)
def updateLimits(self, limits):
if isinstance(limits, dict): limits = limits["limits"]
@@ -414,7 +424,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
pos_btnstylesheet = ''
enabled = True
if pos_lim:
- pos_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+ pos_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
enabled = False
self.ui.btnMax.setStyleSheet(pos_btnstylesheet)
self.ui.btnGoToPos.setEnabled(enabled)
@@ -426,7 +436,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
neg_btnstylesheet = ''
enabled = True
if neg_lim:
- neg_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+ neg_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
enabled = False
self.ui.btnMin.setStyleSheet(neg_btnstylesheet)
self.ui.btnGoToNeg.setEnabled(enabled)
@@ -578,10 +588,10 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
def dropEvent(self, event):
mimeData = event.mimeData()
- if mimeData.hasFormat(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE):
- model = str(mimeData.data(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE))
- elif mimeData.hasFormat(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE):
- model = str(mimeData.data(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE))
+ if mimeData.hasFormat(TAURUS_DEV_MIME_TYPE):
+ model = str(mimeData.data(TAURUS_DEV_MIME_TYPE))
+ elif mimeData.hasFormat(TAURUS_ATTR_MIME_TYPE):
+ model = str(mimeData.data(TAURUS_ATTR_MIME_TYPE))
else:
model = str(mimeData.text())
self.setModel(model)
@@ -600,21 +610,27 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
@classmethod
def getQtDesignerPluginInfo(cls):
- return None
-# ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-# ret['module'] = 'taurus.qt.qtgui.extra_pool'
-# ret['group'] = 'Taurus Sardana'
-# ret['icon'] = ':/designer/extra_pool.png'
-# ret['container'] = False
-# return ret
+ ret = TaurusWidget.getQtDesignerPluginInfo()
+ ret['module'] = 'taurus.qt.qtgui.extra_pool'
+ ret['group'] = 'Taurus Sardana'
+ ret['icon'] = ':/designer/extra_motor.png'
+ ret['container'] = False
+ return ret
def showEvent(self, event):
TaurusWidget.showEvent(self, event)
- self.motor_dev.getAttribute('Position').enablePolling(force=True)
+ try:
+ self.motor_dev.getAttribute('Position').enablePolling(force=True)
+ except AttributeError, e:
+ self.debug('Error in showEvent: %s', repr(e))
+
def hideEvent(self, event):
TaurusWidget.hideEvent(self, event)
- self.motor_dev.getAttribute('Position').disablePolling()
+ try:
+ self.motor_dev.getAttribute('Position').disablePolling()
+ except AttributeError, e:
+ self.debug('Error in hideEvent: %s', repr(e))
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# QT properties
@@ -628,7 +644,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
# DUE TO A BUG IN TAUGROUPBOX, WE NEED THE FULL MODEL NAME
try:
# In case the model is an attribute of a motor, get the device name
- if not taurus.core.DeviceNameValidator().isValid(model):
+ if not DeviceNameValidator().isValid(model):
model = model.rpartition('/')[0]
model = taurus.Factory().getDevice(model).getFullName()
self.setMotor(model)
@@ -744,7 +760,7 @@ class TaurusAttributeListener(Qt.QObject):
Qt.QObject.__init__(self)
def eventReceived(self, evt_src, evt_type, evt_value):
- if evt_type not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]:
+ if evt_type not in [TaurusEventType.Change, TaurusEventType.Periodic]:
return
value = evt_value.value
self.emit(Qt.SIGNAL('eventReceived'), value)
@@ -840,7 +856,7 @@ class PoolMotorTVLabelWidget(TaurusWidget):
self.connect(action_expert_view, Qt.SIGNAL('toggled(bool)'), self.taurusValueBuddy().setExpertView)
action_tango_attributes = Qt.QAction(self)
- action_tango_attributes.setIcon(taurus.qt.qtgui.resource.getIcon(':/categories/preferences-system.svg'))
+ action_tango_attributes.setIcon(getIcon(':/categories/preferences-system.svg'))
action_tango_attributes.setText('Tango Attributes')
menu.addAction(action_tango_attributes)
self.connect(action_tango_attributes, Qt.SIGNAL('triggered()'), self.taurusValueBuddy().showTangoAttributes)
@@ -854,8 +870,8 @@ class PoolMotorTVLabelWidget(TaurusWidget):
mimeData.setText(self.lbl_alias.text())
dev_name = model.rpartition('/')[0]
attr_name = dev_name+'/Position'
- mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE, dev_name)
- mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE, attr_name)
+ mimeData.setData(TAURUS_DEV_MIME_TYPE, dev_name)
+ mimeData.setData(TAURUS_ATTR_MIME_TYPE, attr_name)
drag = Qt.QDrag(self)
drag.setMimeData(mimeData)
@@ -884,14 +900,14 @@ class PoolMotorTVReadWidget(TaurusWidget):
self.btn_lim_neg.setToolTip('Negative Limit')
#self.btn_lim_neg.setEnabled(False)
self.prepare_button(self.btn_lim_neg)
- self.btn_lim_neg.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-remove.svg'))
+ self.btn_lim_neg.setIcon(getIcon(':/actions/list-remove.svg'))
limits_layout.addWidget(self.btn_lim_neg)
self.btn_lim_pos = Qt.QPushButton()
self.btn_lim_pos.setToolTip('Positive Limit')
#self.btn_lim_pos.setEnabled(False)
self.prepare_button(self.btn_lim_pos)
- self.btn_lim_pos.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-add.svg'))
+ self.btn_lim_pos.setIcon(getIcon(':/actions/list-add.svg'))
limits_layout.addWidget(self.btn_lim_pos)
self.layout().addLayout(limits_layout,0, 0)
@@ -976,13 +992,13 @@ class PoolMotorTVWriteWidget(TaurusWidget):
self.btn_step_down = Qt.QPushButton()
self.btn_step_down.setToolTip('Decrements motor position')
self.prepare_button(self.btn_step_down)
- self.btn_step_down.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_backward.svg'))
+ self.btn_step_down.setIcon(getIcon(':/actions/media_playback_backward.svg'))
self.qw_write_relative.layout().addWidget(self.btn_step_down)
self.btn_step_up = Qt.QPushButton()
self.btn_step_up.setToolTip('Increments motor position')
self.prepare_button(self.btn_step_up)
- self.btn_step_up.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_start.svg'))
+ self.btn_step_up.setIcon(getIcon(':/actions/media_playback_start.svg'))
self.qw_write_relative.layout().addWidget(self.btn_step_up)
self.layout().addWidget(self.qw_write_relative, 0, 0)
@@ -995,7 +1011,7 @@ class PoolMotorTVWriteWidget(TaurusWidget):
self.btn_stop = Qt.QPushButton()
self.btn_stop.setToolTip('Stops the motor')
self.prepare_button(self.btn_stop)
- self.btn_stop.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_stop.svg'))
+ self.btn_stop.setIcon(getIcon(':/actions/media_playback_stop.svg'))
self.layout().addWidget(self.btn_stop, 0, 2)
btns_layout = Qt.QHBoxLayout()
@@ -1007,25 +1023,25 @@ class PoolMotorTVWriteWidget(TaurusWidget):
self.btn_to_neg = Qt.QPushButton()
self.btn_to_neg.setToolTip('Moves the motor towards the Negative Software Limit')
self.prepare_button(self.btn_to_neg)
- self.btn_to_neg.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_backward.svg'))
+ self.btn_to_neg.setIcon(getIcon(':/actions/media_skip_backward.svg'))
btns_layout.addWidget(self.btn_to_neg)
self.btn_to_neg_press = Qt.QPushButton()
self.btn_to_neg_press.setToolTip('Moves the motor (while pressed) towards the Negative Software Limit')
self.prepare_button(self.btn_to_neg_press)
- self.btn_to_neg_press.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_backward.svg'))
+ self.btn_to_neg_press.setIcon(getIcon(':/actions/media_seek_backward.svg'))
btns_layout.addWidget(self.btn_to_neg_press)
self.btn_to_pos_press = Qt.QPushButton()
self.prepare_button(self.btn_to_pos_press)
self.btn_to_pos_press.setToolTip('Moves the motor (while pressed) towards the Positive Software Limit')
- self.btn_to_pos_press.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_forward.svg'))
+ self.btn_to_pos_press.setIcon(getIcon(':/actions/media_seek_forward.svg'))
btns_layout.addWidget(self.btn_to_pos_press)
self.btn_to_pos = Qt.QPushButton()
self.btn_to_pos.setToolTip('Moves the motor towards the Positive Software Limit')
self.prepare_button(self.btn_to_pos)
- self.btn_to_pos.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_forward.svg'))
+ self.btn_to_pos.setIcon(getIcon(':/actions/media_skip_forward.svg'))
btns_layout.addWidget(self.btn_to_pos)
btns_layout.addItem(Qt.QSpacerItem(1, 1, Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Minimum))
@@ -1283,7 +1299,7 @@ class PoolMotorTV(TaurusValue):
pos_btnstylesheet = ''
enabled = True
if pos_lim:
- pos_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+ pos_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
enabled = False
self.readWidget().btn_lim_pos.setStyleSheet(pos_btnstylesheet)
@@ -1296,7 +1312,7 @@ class PoolMotorTV(TaurusValue):
neg_btnstylesheet = ''
enabled = True
if neg_lim:
- neg_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+ neg_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
enabled = False
self.readWidget().btn_lim_neg.setStyleSheet(neg_btnstylesheet)
@@ -1327,6 +1343,7 @@ class PoolMotorTV(TaurusValue):
limit_switches = [False, False, False]
if self.hasHwLimits():
limit_switches = self.motor_dev.getAttribute('Limit_switches').read().value
+ #print "update limits", limit_switches
self.updateLimits(limit_switches, position=position)
def hasEncoder(self):
@@ -1387,7 +1404,9 @@ def main():
app = taurus.qt.qtgui.application.TaurusApplication(cmd_line_parser=parser)
args = app.get_command_line_args()
- models = ['tango://controls02:10000/motor/gcipap10ctrl/8']
+ #models = ['tango://controls02:10000/motor/gcipap10ctrl/8']
+ models = ['motor/motctrl06/3']
+
if len(args)>0:
models = args
diff --git a/lib/taurus/qt/qtgui/extra_sardana/controllertree.py b/lib/taurus/qt/qtgui/extra_sardana/controllertree.py
index b760761..9a12ff7 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/controllertree.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/controllertree.py
@@ -36,7 +36,7 @@ from taurus.qt import Qt
import taurus.core
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
from taurus.qt.qtcore.model import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
from taurus.qt.qtgui.tree import TaurusBaseTreeWidget
@@ -74,7 +74,7 @@ class ControllerBaseTreeItem(TaurusBaseTreeItem):
def role(self):
"""Returns the prefered role for the item.
- This implementation returns taurus.core.TaurusElementType.Unknown
+ This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
This method should be able to return any kind of python object as long
as the model that is used is compatible.
@@ -266,7 +266,7 @@ class ControllerClassTreeWidget(TaurusBaseTreeWidget):
DftPerspective = PoolControllerView.ControllerModule
def getModelClass(self):
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
class ControllerClassSelectionDialog(Qt.QDialog):
diff --git a/lib/taurus/qt/qtgui/extra_sardana/elementtree.py b/lib/taurus/qt/qtgui/extra_sardana/elementtree.py
index 2759750..763651e 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/elementtree.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/elementtree.py
@@ -29,7 +29,7 @@ __all__ = ["SardanaElementTreeWidget"]
__docformat__ = 'restructuredtext'
-from taurus.core import TaurusDevice
+from taurus.core.taurusdevice import TaurusDevice
from taurus.qt.qtcore.tango.sardana.model import SardanaBaseProxyModel, \
SardanaElementTypeModel
from taurus.qt.qtgui.tree import TaurusBaseTreeWidget
diff --git a/lib/taurus/qt/qtgui/extra_sardana/environment.py b/lib/taurus/qt/qtgui/extra_sardana/environment.py
index 9550565..d5bf8dd 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/environment.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/environment.py
@@ -29,7 +29,7 @@ __all__ = ["SardanaEnvironmentTreeWidget"]
__docformat__ = 'restructuredtext'
-from taurus.core import TaurusDevice
+from taurus.core.taurusdevice import TaurusDevice
from taurus.qt import Qt
from taurus.qt.qtcore.tango.sardana.model import SardanaEnvironmentModel
from taurus.qt.qtgui.tree import TaurusBaseTreeWidget
diff --git a/lib/taurus/qt/qtgui/extra_sardana/expdescription.py b/lib/taurus/qt/qtgui/extra_sardana/expdescription.py
index c369964..21a4de3 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/expdescription.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/expdescription.py
@@ -30,6 +30,7 @@ __all__ = ["ExpDescriptionEditor"]
from taurus.qt import Qt
import copy
import taurus
+import taurus.core
from taurus.qt.qtgui.base import TaurusBaseWidget
from taurus.qt.qtcore.tango.sardana.model import SardanaBaseProxyModel, SardanaTypeTreeItem
@@ -45,8 +46,13 @@ class SardanaAcquirableProxyModel(SardanaBaseProxyModel):
# item = idx.internalPointer()
# return 'Acquirable' in item.itemData().interfaces
- ALLOWED_TYPES = ('Motor', 'CTExpChannel') #@todo: add IORegisters too!
-
+# ALLOWED_TYPES = ['Motor', 'CTExpChannel', 'ZeroDExpChannel', 'OneDExpChannel',
+# 'TwoDExpChannel', 'ComChannel', 'IORegister', 'PseudoMotor',
+# 'PseudoCounter']
+
+ from sardana.sardanadefs import ElementType, TYPE_ACQUIRABLE_ELEMENTS
+ ALLOWED_TYPES = [ElementType[t] for t in TYPE_ACQUIRABLE_ELEMENTS]
+
def filterAcceptsRow(self, sourceRow, sourceParent):
sourceModel = self.sourceModel()
idx = sourceModel.index(sourceRow, 0, sourceParent)
@@ -101,7 +107,7 @@ class ExpDescriptionEditor(Qt.QWidget, TaurusBaseWidget):
def getModelClass(self):
'''reimplemented from :class:`TaurusBaseWidget`'''
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
def onChooseScanDirButtonClicked(self):
ret = Qt.QFileDialog.getExistingDirectory ( self, 'Choose directory for saving files', self.ui.pathLE.text())
diff --git a/lib/taurus/qt/qtgui/extra_sardana/macrotree.py b/lib/taurus/qt/qtgui/extra_sardana/macrotree.py
index d6def91..4f6e6eb 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/macrotree.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/macrotree.py
@@ -36,7 +36,7 @@ from taurus.qt import Qt
import taurus.core
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
from taurus.core.tango.sardana.macro import MacroInfo
from taurus.qt.qtcore.model import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
@@ -76,7 +76,7 @@ class MacroTreeBaseItem(TaurusBaseTreeItem):
def role(self):
"""Returns the prefered role for the item.
- This implementation returns taurus.core.TaurusElementType.Unknown
+ This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
This method should be able to return any kind of python object as long
as the model that is used is compatible.
@@ -247,7 +247,7 @@ class MacroTreeWidget(TaurusBaseTreeWidget):
DftPerspective = MacroView.MacroModule
def getModelClass(self):
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
class MacroSelectionDialog(Qt.QDialog):
diff --git a/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py b/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py
index d480bc3..3b93cbf 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py
@@ -41,7 +41,7 @@ from taurus.qt.qtgui.table import TaurusBaseTableWidget
from taurus.qt.qtgui.panel import TaurusModelChooser
from taurus.core.tango.sardana import ChannelView, PlotType, Normalization, AcqTriggerType
from taurus.core.tango.sardana.pool import getChannelConfigs
-from taurus.core import TaurusElementType
+from taurus.core.taurusbasetypes import TaurusElementType
#===============================================================================
# some dummydict for developing the "Experimental Configuration widget"
@@ -326,7 +326,7 @@ class MntGrpChannelItem(BaseMntGrpChannelItem):
if not isinstance(data,(tuple,list)):
raise ValueError
except:
- from taurus.core.util import Logger
+ from taurus.core.util.log import Logger
Logger(self.__class__.__name__).error('Invalid shape %s',s )
data = ()
else:
@@ -900,7 +900,7 @@ class MntGrpChannelEditor(TaurusBaseTableWidget):
return ta
def getModelClass(self):
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
def addChannel(self, channel=None):
qmodel = self.getQModel()
diff --git a/lib/taurus/qt/qtgui/gauge/__init__.py b/lib/taurus/qt/qtgui/gauge/__init__.py
index 3b389a3..c5b4855 100644
--- a/lib/taurus/qt/qtgui/gauge/__init__.py
+++ b/lib/taurus/qt/qtgui/gauge/__init__.py
@@ -30,9 +30,8 @@ __docformat__ = 'restructuredtext'
try:
from .taurusgauge import *
except:
- import taurus.core.util
- _logger = taurus.core.util.Logger(__name__)
- _logger.debug("Gauge widgets could not be initialized")
+ from taurus.core.util.log import debug
+ debug("Gauge widgets could not be initialized")
from taurus.qt.qtgui.display import create_taurus_fallback as __create
TaurusLinearGauge = __create("TaurusLinearGauge")
TaurusCircularGauge = __create("TaurusCircularGauge")
diff --git a/lib/taurus/qt/qtgui/gauge/taurusgauge.py b/lib/taurus/qt/qtgui/gauge/taurusgauge.py
index c226c3a..df141f0 100644
--- a/lib/taurus/qt/qtgui/gauge/taurusgauge.py
+++ b/lib/taurus/qt/qtgui/gauge/taurusgauge.py
@@ -55,7 +55,7 @@ class TaurusLinearGauge(qtcontrols.ELinearGauge, TaurusBaseWidget):
def getModelClass(self):
import taurus.core
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def handleEvent(self, evt_src, evt_type, evt_value):
v, v_ref = None, None
@@ -147,7 +147,7 @@ class TaurusCircularGauge(qtcontrols.ECircularGauge, TaurusBaseWidget):
def getModelClass(self):
import taurus.core
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def handleEvent(self, evt_src, evt_type, evt_value):
v, v_ref = None, None
diff --git a/lib/taurus/qt/qtgui/graphic/__init__.py b/lib/taurus/qt/qtgui/graphic/__init__.py
index 7ae56db..a15f26b 100644
--- a/lib/taurus/qt/qtgui/graphic/__init__.py
+++ b/lib/taurus/qt/qtgui/graphic/__init__.py
@@ -33,7 +33,7 @@ from .taurusgraphicview import *
try:
from .jdraw import *
except:
- import taurus.core.util
- _logger = taurus.core.util.Logger(__name__)
+ import taurus.core.util.log
+ _logger = taurus.core.util.log.Logger(__name__)
_logger.debug("jdraw widgets could not be initialized")
_logger.traceback()
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
index 84d8707..b15984e 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
@@ -33,10 +33,12 @@ import os
import traceback
from taurus.qt import Qt
-
-import taurus.core
-import taurus.core.util
-from taurus.qt.qtgui.graphic import TaurusBaseGraphicsFactory, TaurusGraphicsScene, TaurusGraphicsItem, parseTangoUri,TaurusTextAttributeItem,TaurusTextStateItem
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessDict
+from taurus.qt.qtgui.graphic import TaurusBaseGraphicsFactory, \
+ TaurusGraphicsScene, TaurusGraphicsItem, parseTangoUri, \
+ TaurusTextAttributeItem,TaurusTextStateItem
LINESTYLE_JDW2QT = { 0: Qt.Qt.SolidLine,
@@ -58,7 +60,7 @@ FILLSTYLE_JDW2QT = { 0: Qt.Qt.NoBrush,
10:Qt.Qt.Dense4Pattern,
11:Qt.Qt.RadialGradientPattern }
-TEXTHINT_JDW2QT = taurus.core.util.CaselessDict({
+TEXTHINT_JDW2QT = CaselessDict({
'helvetica' : Qt.QFont.Helvetica,
'serif' : Qt.QFont.Serif,
'sansserif' : Qt.QFont.SansSerif,
@@ -68,7 +70,7 @@ TEXTHINT_JDW2QT = taurus.core.util.CaselessDict({
'' : Qt.QFont.AnyStyle,})
-class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsFactory, taurus.core.util.Logger):
+class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
def __init__(self,parent,alias = None, delayed = False):
""" Initialization. Nothing to be done here for now."""
@@ -80,7 +82,7 @@ class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsF
def init(self, *args, **kwargs):
"""Singleton instance initialization."""
- self.call__init__(taurus.core.util.Logger, self.__class__.__name__)
+ self.call__init__(Logger, self.__class__.__name__)
self.call__init__(TaurusBaseGraphicsFactory)
def getZBufferLevel(self):
@@ -106,7 +108,7 @@ class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsF
scene.addItem(item)
except:
self.warning("Unable to add item %s to scene" % str(item))
- self.warning(traceback.format_exc()) #self.traceback()
+ self.debug("Details:", exc_info=1)
return scene
def getObj(self,name,params):
@@ -117,7 +119,8 @@ class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsF
obj.setZValue(self.incZBufferLevel())
return obj
except:
- self.warning(traceback.format_exc())
+ self.warning("Error fetching object")
+ self.debug("Details:", exc_info=1)
pass
return None
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
index 95ff5ac..b7cc72a 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
@@ -33,7 +33,7 @@ import ply.lex as lex
import ply.yacc as yacc
from jdraw import *
-from taurus.core.util import Logger
+from taurus.core.util.log import Logger
tokens = ( 'NUMBER', 'SYMBOL', 'LBRACKET', 'RBRACKET', 'TWOP', 'COMMA',
'JDFILE', 'GLOBAL', 'JDLINE', 'JDRECTANGLE', 'JDROUNDRECTANGLE',
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
index f735d85..529b96f 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
@@ -34,8 +34,8 @@ import traceback
import subprocess
import taurus
from taurus.qt import Qt
-from taurus.core import DeviceNameValidator,AttributeNameValidator
-from taurus.qt.qtgui.graphic.taurusgraphic import parseTangoUri
+from taurus.core.taurusvalidator import DeviceNameValidator, AttributeNameValidator
+from taurus.qt.qtgui.graphic.taurusgraphic import parseTangoUri, TaurusGraphicsItem
from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE
from taurus.qt.qtgui.base import TaurusBaseWidget
import jdraw_parser
@@ -143,7 +143,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
@Qt.pyqtSignature("graphicItemSelected(QString)")
def graphicItemSelected(self,item_name):
- self.info(' => graphicItemSelected(QString)(%s)'%item_name)
+ self.debug(' => graphicItemSelected(QString)(%s)'%item_name)
self.emit(Qt.SIGNAL("graphicItemSelected(QString)"),item_name)
@Qt.pyqtSignature("graphicSceneClicked(QPoint)")
@@ -306,7 +306,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
if alias is not None: self.setAlias(alias)
ll = taurus.getLogLevel()
if trace: taurus.setLogLevel(taurus.Debug)
- self.info('setModel("%s")'%model)
+ #self.debug('setModel("%s")'%model)
if self._currF:
#filename = str(self._currFile.absoluteFilePath())
filename = self._currF
@@ -334,7 +334,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
self.fitting(True)
else:
self.setScene(None)
- self.info('out of setModel()')
+ #self.debug('out of setModel()')
taurus.setLogLevel(ll)
#def destroy(destroyWindow=True,destroySubWindows=True):
@@ -347,7 +347,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
def setModels(self):
""" This method triggers item.setModel(item._name) in all internal items. """
for item in self.scene().items():
- if item._name and isinstance(item, taurus.qt.qtgui.graphic.TaurusGraphicsItem):
+ if item._name and isinstance(item, TaurusGraphicsItem):
self.debug('TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)'%(item._name))
item.setModel(item._name)
diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
index 2724cea..1092e35 100644
--- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
+++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
@@ -30,11 +30,7 @@ taurusgraphic.py:
__docformat__ = 'restructuredtext'
-import time
-import sys
-import signal
import re
-from threading import Thread
import os
import subprocess
import traceback
@@ -43,17 +39,22 @@ import types
import Queue
+from taurus import Manager
+from taurus.core.util.containers import CaselessDefaultDict
+from taurus.core.util.log import Logger
+from taurus.core.taurusvalidator import DeviceNameValidator, AttributeNameValidator
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusattribute import TaurusAttribute
from taurus.qt import Qt
-import taurus.core
-from taurus.core import DeviceNameValidator,AttributeNameValidator
-import taurus.core.util
-
from taurus.qt.qtgui.base import TaurusBaseComponent
-from taurus.qt.qtgui.util import QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE
+from taurus.qt.qtgui.util import (QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE,
+ ExternalAppAction, TaurusWidgetFactory)
+
def parseTangoUri(name):
- from taurus.core import tango,AttributeNameValidator,DeviceNameValidator
- validator = {tango.TangoDevice:DeviceNameValidator,tango.TangoAttribute:AttributeNameValidator}
+ from taurus.core import tango
+ validator = {tango.TangoDevice : DeviceNameValidator,
+ tango.TangoAttribute : AttributeNameValidator }
try:
params = validator[tango.TangoFactory().findObjectClass(name)]().getParams(name)
return (params if 'devicename' in params else None)
@@ -68,7 +69,7 @@ class TaurusGraphicsUpdateThread(Qt.QThread):
raise RuntimeError("Illegal parent for TaurusGraphicsUpdateThread")
Qt.QThread.__init__(self, parent)
self.period = period
- self.log = taurus.core.util.Logger('TaurusGraphicsUpdateThread')
+ self.log = Logger('TaurusGraphicsUpdateThread')
def _updateView(self,v):
# The first one is the prefered one because it improves performance
@@ -104,7 +105,7 @@ class TaurusGraphicsUpdateThread(Qt.QThread):
item_rects = [ i.boundingRect() for i in item ]
for v in p.views():
- #p.info("emit('updateView')")
+ #p.debug("emit('updateView')")
emitter.emit(Qt.SIGNAL("updateView"), v)
self.sleep(self.period) #This sleep is needed to reduce CPU usage of the application!
#End of while
@@ -181,19 +182,19 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
def __init__(self, parent = None, strt = True):
name = self.__class__.__name__
- #self.call__init__(taurus.core.util.Logger, name, parent) #Inheriting from Logger caused exceptions in CONNECT
+ #self.call__init__(Logger, name, parent) #Inheriting from Logger caused exceptions in CONNECT
Qt.QGraphicsScene.__init__(self, parent)
self.updateQueue = None
self.updateThread = None
- self._itemnames = taurus.core.util.CaselessDefaultDict(lambda k:set())
+ self._itemnames = CaselessDefaultDict(lambda k:set())
self._selection = []
self._selectedItems = []
self.threads = []
self.pids = []
- self.panel_launcher = taurus.qt.qtgui.util.ExternalAppAction(parent.defaultPanelClass().split() if parent else ['taurusdevicepanel'])
+ self.panel_launcher = ExternalAppAction(parent.defaultPanelClass().split() if parent else ['taurusdevicepanel'])
try:
- self.logger = taurus.core.util.Logger(name)
+ self.logger = Logger(name)
#self.logger.setLogLevel(self.logger.Info)
if not self.TRACE_ALL:
self.debug = lambda l: self.logger.debug(l)
@@ -233,7 +234,10 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
def getItemByName(self,item_name,strict=None):
"""
Returns a list with all items matching a given name.
- :param: strict, controls wheter full_name (strict=True) or only device name (False) must match
+
+ :param strict: (bool or None) controls whether full_name (strict=True) or only device name (False) must match
+
+ :return: (list) items
"""
strict = (not self.ANY_ATTRIBUTE_SELECTS_DEVICE) if strict is None else strict
alnum = '(?:[a-zA-Z0-9-_\*]|(?:\.\*))(?:[a-zA-Z0-9-_\*]|(?:\.\*))*'
@@ -248,7 +252,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
result = []
for k in self._itemnames.keys():
if re.match(target.lower(),k.lower()):
- #self.info('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k]))
+ #self.debug('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k]))
result.extend(self._itemnames[k])
return result
@@ -277,11 +281,11 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
x,y = pos.x(),pos.y()
self.emit(Qt.SIGNAL("graphicSceneClicked(QPoint)"),Qt.QPoint(x,y))
obj = self.getItemByPosition(x,y)
- self.info('mouse clicked on %s(%s) at (%s,%s)'%(type(obj).__name__,getattr(obj,'_name',''),x,y))
+ #self.debug('mouse clicked on %s(%s) at (%s,%s)'%(type(obj).__name__,getattr(obj,'_name',''),x,y))
return obj
def mousePressEvent(self,mouseEvent):
- self.info('In TaurusGraphicsScene.mousePressEvent(%s,%s))'%(str(type(mouseEvent)),str(mouseEvent.button())))
+ #self.debug('In TaurusGraphicsScene.mousePressEvent(%s,%s))'%(str(type(mouseEvent)),str(mouseEvent.button())))
try:
obj = self.getItemClicked(mouseEvent)
obj_name = getattr(obj,'_name', '')
@@ -366,19 +370,19 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
A blue circle is drawn around the matching item name.
If the item_name is empty, or it is a reserved keyword, or it has the "noSelect" extension, then the blue circle is removed from the synoptic.
"""
- self.debug('In TaurusGraphicsScene.selectGraphicItem(%s))'%item_name)
+ #self.debug('In TaurusGraphicsScene.selectGraphicItem(%s))'%item_name)
retval = False
selected = [str(getattr(item,'_name',item)) for item in self._selectedItems if item]
if selected:
iname = str(getattr(item_name,'_name',item_name))
- #self.info('In TauGraphicsScene.selectGraphicItem(%s): already selected: %s'%(iname,selected))
+ #self.debug('In TauGraphicsScene.selectGraphicItem(%s): already selected: %s'%(iname,selected))
if not iname.strip():
self.clearSelection()
return False
elif any(iname not in i for i in selected):
self.clearSelection()
else:
- self.info('In TauGraphicsScene.selectGraphicItem(%s): already selected!'%item_name)
+ self.debug('In TauGraphicsScene.selectGraphicItem(%s): already selected!'%item_name)
return True
if any(isinstance(item_name,t) for t in (TaurusGraphicsItem,Qt.QGraphicsItem)):
if not getattr(item_name,'_name', ''):
@@ -425,7 +429,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
return retval
def clearSelection(self):
- self.debug('In clearSelection([%d])'%len(self._selectedItems))
+ #self.debug('In clearSelection([%d])'%len(self._selectedItems))
for i in self._selection:
i.hide()
self.removeItem(i)
@@ -441,7 +445,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
If no picture is provided, a blue ellipse will be drawn around the selected object.
h/w will be used for height/width of the drawn object.
"""
- self.debug('In setSelectionMark(%s,%d,%d)'%(picture,w,h))
+ #self.debug('In setSelectionMark(%s,%d,%d)'%(picture,w,h))
if picture is None: self.SelectionMark = None #Reset of previous icon generators
else: self.SelectionMark = (lambda p=picture,x=w,y=h:self.getSelectionMark(p,x,y))
return self.SelectionMark
@@ -488,7 +492,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
If h or w has a value the mark is drawn in the center of the region ((x,y)(x+w,y+h))
"""
#self.debug('%s has parent %s' % (item_name,getattr(item.parentItem(),'_name','ung') if item.parentItem() else 'None'))
- self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
+ #self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
mark = self.getSelectionMark()
self._selection.append(mark)
@@ -514,7 +518,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
x,y = x-.5*w,y-.5*h
else:
w,h = [.5*t for t in MAX_CIRCLE_SIZE]
- self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
+ #self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
mark.setRect(*bound((x,y,w*2,h*2)))
#mark.setRect(x,y,w*2,h*2)
elif isinstance(mark,Qt.QGraphicsPixmapItem):
@@ -561,7 +565,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
return
def getClass(self,clName,clParam,objName,standAlone=False):
- #self.info('getClass(%s,%s,%s)'%(clName,clParam,objName))
+ #self.debug('getClass(%s,%s,%s)'%(clName,clParam,objName))
if clName in globals():
myclass = globals()[clName]
elif clName in locals():
@@ -571,7 +575,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
myclass = getattr(Qt,clName)
except:
try:
- wf = taurus.qt.qtgui.util.TaurusWidgetFactory()
+ wf = TaurusWidgetFactory()
myclass = wf.getTaurusWidgetClass(clName)
except:
self.warning( "The class ",clName, "can not be found!\n" + '-'*80)
@@ -726,9 +730,10 @@ class TaurusGraphicsItem(TaurusBaseComponent):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def setModel(self,model):
- #self.info('In %s.setModel(%s)'%(type(self).__name__,model))
+ #self.debug('In %s.setModel(%s)'%(type(self).__name__,model))
self.setName(model)
- if taurus.core.TaurusManager().findObjectClass(self._name) == taurus.core.tango.TangoDevice:
+
+ if issubclass(Manager().findObjectClass(self._name), TaurusDevice):
model = self._name+'/state'
TaurusBaseComponent.setModel(self, model)
@@ -765,7 +770,7 @@ class TaurusGraphicsItem(TaurusBaseComponent):
return self.log_name + "(" + self.modelName + ")"
def getModelClass(self):
- return taurus.core.TaurusAttribute
+ return TaurusAttribute
class TaurusGraphicsAttributeItem(TaurusGraphicsItem):
"""
@@ -861,7 +866,7 @@ class TaurusGraphicsStateItem(TaurusGraphicsItem):
}
#Parsing _map to manage visibility (a list of values for which the item is visible or not)
if v and not self._map is None and self._currText in states:
- #self.info('In TaurusGraphicsStateItem.updateStyle(): mapping %s'%self._currText)
+ #self.debug('In TaurusGraphicsStateItem.updateStyle(): mapping %s'%self._currText)
if states[self._currText] == self._map[1]:
self.setVisible(self._map[2])
self._visible = self._map[2]
@@ -962,7 +967,7 @@ class TaurusTextAttributeItem(Qt.QGraphicsTextItem, TaurusGraphicsAttributeItem,
self.call__init__(TaurusGraphicsAttributeItem, name, parent)
def paint(self,painter,option,widget):
- self.debug('TaurusTextAttributeItem(%s,%s,%s)'%(self.getName(),self._currText,self._currHtmlText))
+ #self.debug('TaurusTextAttributeItem(%s,%s,%s)'%(self.getName(),self._currText,self._currHtmlText))
if self._currHtmlText:
self.setHtml(self._currHtmlText)
else:
@@ -970,8 +975,6 @@ class TaurusTextAttributeItem(Qt.QGraphicsTextItem, TaurusGraphicsAttributeItem,
Qt.QGraphicsTextItem.paint(self,painter,option,widget)
-import taurus.core
-
TYPE_TO_GRAPHICS = {
None : { "Rectangle" : Qt.QGraphicsRectItem,
"RoundRectangle" : Qt.QGraphicsRectItem,
@@ -983,7 +986,7 @@ TYPE_TO_GRAPHICS = {
"SwingObject" : Qt.QGraphicsRectItem,
"Image" : Qt.QGraphicsPixmapItem, },
- taurus.core.TaurusDevice : { "Rectangle" : TaurusRectStateItem,
+ TaurusDevice : { "Rectangle" : TaurusRectStateItem,
"RoundRectangle" : TaurusRectStateItem,
"Ellipse" : TaurusEllipseStateItem,
"Polyline" : TaurusPolygonStateItem,
@@ -993,7 +996,7 @@ TYPE_TO_GRAPHICS = {
"SwingObject" : TaurusTextAttributeItem,
"Image" : Qt.QGraphicsPixmapItem, },
- taurus.core.TaurusAttribute : { "Rectangle" : TaurusRectStateItem,
+ TaurusAttribute : { "Rectangle" : TaurusRectStateItem,
"RoundRectangle" : TaurusRectStateItem,
"Ellipse" : TaurusEllipseStateItem,
"Polyline" : TaurusPolygonStateItem,
@@ -1046,8 +1049,8 @@ class TaurusBaseGraphicsFactory:
def getGraphicsClassItem(self,cls,type_):
ncls = cls
try:
- if issubclass(cls, taurus.core.TaurusDevice): ncls = taurus.core.TaurusDevice
- elif issubclass(cls, taurus.core.TaurusAttribute): ncls = taurus.core.TaurusAttribute
+ if issubclass(cls, TaurusDevice): ncls = TaurusDevice
+ elif issubclass(cls, TaurusAttribute): ncls = TaurusAttribute
except:
pass
ncls = TYPE_TO_GRAPHICS.get(ncls,TYPE_TO_GRAPHICS.get(None)).get(type_)
@@ -1067,7 +1070,7 @@ class TaurusBaseGraphicsFactory:
nname = name.split(':',1)[-1]
params[self.getNameParam()] = name = nname
if name.lower().endswith('/state'): name = name.rsplit('/',1)[0]
- cls = taurus.core.TaurusManager().findObjectClass(name)
+ cls = Manager().findObjectClass(name)
else:
if name: self.debug('%s does not match a tango name'%name)
klass = self.getGraphicsClassItem(cls, type_)
diff --git a/lib/taurus/qt/qtgui/image/__init__.py b/lib/taurus/qt/qtgui/image/__init__.py
index 12d5763..b0e9035 100644
--- a/lib/taurus/qt/qtgui/image/__init__.py
+++ b/lib/taurus/qt/qtgui/image/__init__.py
@@ -32,6 +32,6 @@ try:
except:
from taurus.qt.qtgui.display import create_fallback as __create
TaurusQubDataImageDisplay = __create("TaurusQubDataImageDisplay")
- import taurus.core.util
- _logger = taurus.core.util.Logger(__name__)
+ import taurus.core.util.log
+ _logger = taurus.core.util.log.Logger(__name__)
_logger.debug("Qub widgets could not be initialized", exc_info=1)
diff --git a/lib/taurus/qt/qtgui/image/taurusqub.py b/lib/taurus/qt/qtgui/image/taurusqub.py
index 01384e8..ca33f92 100644
--- a/lib/taurus/qt/qtgui/image/taurusqub.py
+++ b/lib/taurus/qt/qtgui/image/taurusqub.py
@@ -119,11 +119,11 @@ class TaurusQubDataImageDisplay(QubDataImageDisplay, TaurusBaseWidget):
return True
def getModelClass(self):
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
def handleEvent(self, evt_src, evt_type, evt_value):
if self._updateAction.state():
- if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+ if evt_type in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
data = self.getModelObj().getImageData()
if data:
data = data[self._image_attr_name][1]
@@ -190,7 +190,7 @@ def main():
panel.setLayout(l)
if not models:
from taurus.qt.qtgui.panel import TaurusModelChooser
- models, ok = TaurusModelChooser.modelChooserDlg(panel, [taurus.core.TaurusElementType.Attribute])
+ models, ok = TaurusModelChooser.modelChooserDlg(panel, [taurus.core.taurusbasetypes.TaurusElementType.Attribute])
if not ok:
models = []
for model in models:
diff --git a/lib/taurus/qt/qtgui/input/tauruscombobox.py b/lib/taurus/qt/qtgui/input/tauruscombobox.py
index d393876..f7dbe31 100644
--- a/lib/taurus/qt/qtgui/input/tauruscombobox.py
+++ b/lib/taurus/qt/qtgui/input/tauruscombobox.py
@@ -197,7 +197,7 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
model = widget.getModelObj()
if model:
widget.fireEvent( model,
- taurus.core.TaurusEventType.Periodic,
+ taurus.core.taurusbasetypes.TaurusEventType.Periodic,
model.getValueObj()
)
@@ -262,11 +262,11 @@ class TaurusAttrListComboBox(Qt.QComboBox, TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def handleEvent(self, evt_src, evt_type, evt_value):
self.clear()
- if evt_type == taurus.core.TaurusEventType.Error:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Error:
return
if not (evt_src is None or evt_value is None) :
attrList = list(evt_value.value)
diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py
index 4509a0e..5a40862 100644
--- a/lib/taurus/qt/qtgui/input/tauruslineedit.py
+++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py
@@ -110,20 +110,20 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
self.emitValueChanged()
def handleEvent(self, evt_src, evt_type, evt_value):
- if evt_type == taurus.core.TaurusEventType.Config:
- if evt_value.min_alarm != taurus.core.TaurusConfiguration.no_min_alarm:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
+ if evt_value.min_alarm != taurus.core.taurusconfiguration.TaurusConfiguration.no_min_alarm:
self.__minAlarm = float(evt_value.min_alarm)
else:
self.__minAlarm = -float("inf")
- if evt_value.max_alarm != taurus.core.TaurusConfiguration.no_max_alarm:
+ if evt_value.max_alarm != taurus.core.taurusconfiguration.TaurusConfiguration.no_max_alarm:
self.__maxAlarm = float(evt_value.max_alarm)
else:
self.__maxAlarm = float("inf")
- if evt_value.min_value != taurus.core.TaurusConfiguration.no_min_value:
+ if evt_value.min_value != taurus.core.taurusconfiguration.TaurusConfiguration.no_min_value:
self.__minLimit = float(evt_value.min_value)
else:
self.__minLimit = -float("inf")
- if evt_value.max_value != taurus.core.TaurusConfiguration.no_max_value:
+ if evt_value.max_value != taurus.core.taurusconfiguration.TaurusConfiguration.no_max_value:
self.__maxLimit = float(evt_value.max_value)
else:
self.__maxLimit = float("inf")
@@ -276,7 +276,7 @@ class TaurusConfigLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
self.valueChanged()
def getModelClass(self):
- return taurus.core.TaurusConfiguration
+ return taurus.core.taurusconfiguration.TaurusConfiguration
def setValue(self, v):
model = self.getModelObj()
diff --git a/lib/taurus/qt/qtgui/input/tauruswheel.py b/lib/taurus/qt/qtgui/input/tauruswheel.py
index b3acab0..326e7d0 100644
--- a/lib/taurus/qt/qtgui/input/tauruswheel.py
+++ b/lib/taurus/qt/qtgui/input/tauruswheel.py
@@ -51,7 +51,7 @@ class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def handleEvent(self, evt_src, evt_type, evt_value):
- if evt_type == taurus.core.TaurusEventType.Config and not evt_value is None:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config and not evt_value is None:
f = evt_value.format.lower()
if f[-1] not in ('d', 'f', 'g'):
raise ValueError("'%s' format unsupported" % f)
diff --git a/lib/taurus/qt/qtgui/model/qbasemodel.py b/lib/taurus/qt/qtgui/model/qbasemodel.py
index eee5cef..3b17192 100644
--- a/lib/taurus/qt/qtgui/model/qbasemodel.py
+++ b/lib/taurus/qt/qtgui/model/qbasemodel.py
@@ -293,7 +293,7 @@ class QBaseModelWidget(Qt.QMainWindow):
statusbar = self.createStatusBar()
for toolBar in toolBars:
- toolBar.addSeparator()
+ #toolBar.addSeparator()
self.addToolBar(toolBar)
self.setContentsMargins(0, 0, 0, 0)
self.setCentralWidget(self._viewWidget)
diff --git a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
index 2975e54..8714f26 100644
--- a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
+++ b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
@@ -27,14 +27,13 @@
RawDataChooser.py: widget for importing RawData (from file or from a function)
"""
-import sys
import numpy
from taurus.qt import Qt
+from taurus.core.util.safeeval import SafeEvaluator
-from taurus.core.util import SafeEvaluator
+from .ui import ui_RawDataChooser
-from ui import ui_RawDataChooser
class QRawDataWidget(Qt.QWidget, ui_RawDataChooser.Ui_RawDataChooser):
diff --git a/lib/taurus/qt/qtgui/panel/taurusattributechooser.py b/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
index 0c8d288..96e67f8 100644
--- a/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
+++ b/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
@@ -31,13 +31,12 @@ __all__ = ["TaurusAttributeChooser"]
__docformat__ = 'restructuredtext'
-import sys
from taurus.qt import Qt
from taurus.qt.qtgui.base import TaurusBaseWidget
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
-from ui.ui_AttributeChooser import *
+from .ui.ui_AttributeChooser import *
class TaurusAttributeChooser(Qt.QWidget, TaurusBaseWidget):
@@ -209,7 +208,8 @@ def main(args):
win.show()
app.connect(app, Qt.SIGNAL("lastWindowClosed()"),app,Qt.SLOT("quit()"))
- sys.exit(app.exec_())
+ return app.exec_()
if __name__=="__main__":
- main(sys.argv)
+ import sys
+ sys.exit(main(sys.argv))
diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
index 8cc3c48..a545c3f 100644
--- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
@@ -34,11 +34,11 @@ __docformat__ = 'restructuredtext'
import re,traceback
from taurus.qt import Qt
-import taurus.core
-#from taurus.qt.qtgui.container import TaurusMainWindow
-
import taurus.qt.qtgui.resource
-
+from taurus.core.taurusbasetypes import TaurusSWDevState, TaurusElementType
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDevInfo
from taurus.qt.qtgui.container import TaurusWidget, TaurusMainWindow
from taurus.qt.qtgui.display import TaurusValueLabel as LABEL_CLASS #@todo: TaurusValueLabel is deprecated. Use TaurusLabel instead
from taurus.qt.qtgui.display import TaurusStateLed as LED_CLASS #@todo: TaurusStateLed is deprecated. Use TaurusLed instead
@@ -151,11 +151,14 @@ class TaurusDevicePanel(TaurusWidget):
"""
It will set the command filters
filters will be like: {device_regexp:[command_regexps]}
- example: {'.*/IPCT-.*': (
- ('setmode',('SERIAL','LOCAL','STEP','FIXED','START','PROTECT')),
- ('onhv1',()), ('offhv1',()), ('onhv2',()), ('offhv2',()),
- ('sendcommand',())
- ),}
+ example::
+
+ {'.*/IPCT-.*': (
+ ('setmode',('SERIAL','LOCAL','STEP','FIXED','START','PROTECT')),
+ ('onhv1',()), ('offhv1',()), ('onhv2',()), ('offhv2',()),
+ ('sendcommand',())
+ ),}
+
"""
klass._command_filter.update(filters)
@@ -264,10 +267,10 @@ class TaurusDevicePanel(TaurusWidget):
elif raw is None or not model or not modelclass:
if self.getModel(): self.detach()
return
- elif issubclass(modelclass,taurus.core.TaurusAttribute):
+ elif issubclass(modelclass, TaurusAttribute):
#if model.lower().endswith('/state'):
model = model.rsplit('/',1)[0]
- elif not issubclass(modelclass,taurus.core.TaurusDevice):
+ elif not issubclass(modelclass, TaurusDevice):
self.warning('TaurusDevicePanel accepts only Device models')
return
try:
@@ -396,7 +399,7 @@ class TaurusDevicePanel(TaurusWidget):
def filterNonExported(obj):
- if not isinstance(obj,taurus.core.TaurusDevInfo) or obj.exported():
+ if not isinstance(obj, TaurusDevInfo) or obj.exported():
return obj
return None
@@ -420,8 +423,8 @@ class TaurusDevPanel(TaurusMainWindow):
import taurus.qt.qtgui.tree
TaurusDbTreeWidget = taurus.qt.qtgui.tree.TaurusDbTreeWidget
- self.deviceTree = TaurusDbTreeWidget(perspective=taurus.core.TaurusElementType.Device)
- self.deviceTree.getQModel().setSelectables([taurus.core.TaurusElementType.Member])
+ self.deviceTree = TaurusDbTreeWidget(perspective=TaurusElementType.Device)
+ self.deviceTree.getQModel().setSelectables([TaurusElementType.Member])
#self.deviceTree.insertFilter(filterNonExported)
self.setCentralWidget(self.deviceTree)
@@ -467,7 +470,7 @@ class TaurusDevPanel(TaurusMainWindow):
def onItemSelectionChanged(self, current, previous):
itemData = current.itemData()
- if isinstance(itemData, taurus.core.TaurusDevInfo):
+ if isinstance(itemData, TaurusDevInfo):
self.onDeviceSelected(itemData)
def onDeviceSelected(self, devinfo):
@@ -491,14 +494,14 @@ class TaurusDevPanel(TaurusMainWindow):
dev.state()
state = dev.getSWState()
#test the connection
- if state == taurus.core.TaurusSWDevState.Running:
+ if state == TaurusSWDevState.Running:
msg = 'Connected to "%s"'%devname
self.statusBar().showMessage(msg)
self._ui.attrDW.setWindowTitle('Attributes - %s'%devname)
self._ui.commandsDW.setWindowTitle('Commands - %s'%devname)
else:
#reset the model if the connection failed
- msg = 'Connection to "%s" failed (state = %s)'%(devname, taurus.core.TaurusSWDevState.whatis(state))
+ msg = 'Connection to "%s" failed (state = %s)' % (devname, TaurusSWDevState.whatis(state))
self.statusBar().showMessage(msg)
self.info(msg)
Qt.QMessageBox.warning(self, "Device unreachable", msg)
diff --git a/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py b/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
index b45e99d..9fcc877 100644
--- a/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
@@ -36,7 +36,7 @@ import taurus.core.util
import taurus.qt.qtgui.base
import taurus.qt.qtgui.resource
-ElemType = taurus.core.TaurusElementType
+ElemType = taurus.core.taurusbasetypes.TaurusElementType
getElementTypeIcon = taurus.qt.qtgui.resource.getElementTypeIcon
getPixmap = taurus.qt.qtgui.resource.getPixmap
getThemeIcon = taurus.qt.qtgui.resource.getThemeIcon
@@ -73,25 +73,25 @@ class BaseElementFilter(BaseFilter):
class DeviceFilter(BaseElementFilter):
- def __init__(self, re_expr, func=taurus.core.TaurusDevInfo.name):
+ def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusDevInfo.name):
super(DeviceFilter, self).__init__(re_expr, func=func)
class DeviceClassFilter(BaseElementFilter):
- def __init__(self, re_expr, func=taurus.core.TaurusDevClassInfo.name):
+ def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusDevInfo.name):
super(DeviceClassFilter, self).__init__(re_expr, func=func)
class ServerFilter(BaseElementFilter):
- def __init__(self, re_expr, func=taurus.core.TaurusServInfo.name):
+ def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusServInfo.name):
super(ServerFilter, self).__init__(re_expr, func=func)
class AttributeFilter(BaseElementFilter):
- def __init__(self, re_expr, func=taurus.core.TaurusAttrInfo.name):
+ def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusAttrInfo.name):
super(AttributeFilter, self).__init__(re_expr, func=func)
@@ -110,27 +110,27 @@ class KlassFilter(BaseFilter):
def getFilter(type, re_expr=None):
if re_expr is None:
if type == ElemType.Device:
- return KlassFilter(taurus.core.TaurusDevInfo)
+ return KlassFilter(taurus.core.taurusdatabase.TaurusDevInfo)
elif type == ElemType.Server:
- return KlassFilter(taurus.core.TaurusServInfo)
+ return KlassFilter(taurus.core.taurusdatabase.TaurusServInfo)
elif type == ElemType.DeviceClass:
- return KlassFilter(taurus.core.TaurusDevClassInfo)
+ return KlassFilter(taurus.core.taurusdatabase.TaurusDevInfo)
return None
if type == ElemType.Device:
return DeviceFilter(re_expr)
elif type == ElemType.Domain:
- return DeviceFilter(re_expr, taurus.core.TaurusDevInfo.domain)
+ return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.domain)
elif type == ElemType.Family:
- return DeviceFilter(re_expr, taurus.core.TaurusDevInfo.family)
+ return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.family)
elif type == ElemType.Member:
- return DeviceFilter(re_expr, taurus.core.TaurusDevInfo.member)
+ return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.member)
elif type == ElemType.Server:
return ServerFilter(re_expr)
elif type == ElemType.ServerName:
- return ServerFilter(re_expr, taurus.core.TaurusServInfo.serverName)
+ return ServerFilter(re_expr, taurus.core.taurusdatabase.TaurusServInfo.serverName)
elif type == ElemType.ServerInstance:
- return ServerFilter(re_expr, taurus.core.TaurusServInfo.serverInstance)
+ return ServerFilter(re_expr, taurus.core.taurusdatabase.TaurusServInfo.serverInstance)
elif type == ElemType.DeviceClass:
return DeviceClassFilter(re_expr)
elif type == ElemType.Attribute:
@@ -284,7 +284,7 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusDatabase
+ return taurus.core.taurusdatabase.TaurusDatabase
#: This property holds the unique URI string representing the model name
#: with which this widget will get its data from. The convention used for
@@ -367,7 +367,7 @@ class TaurusFilterPanelOld2(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusDatabase
+ return taurus.core.taurusdatabase.TaurusDatabase
def setModel(self, m):
taurus.qt.qtgui.base.TaurusBaseWidget.setModel(self, m)
@@ -655,7 +655,7 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusDatabase
+ return taurus.core.taurusdatabase.TaurusDatabase
def setModel(self, m):
taurus.qt.qtgui.base.TaurusBaseWidget.setModel(self, m)
diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py
index 16f1e38..8cd7bb0 100644
--- a/lib/taurus/qt/qtgui/panel/taurusform.py
+++ b/lib/taurus/qt/qtgui/panel/taurusform.py
@@ -554,7 +554,7 @@ class TaurusCommandsForm(TaurusWidget):
def getModelClass(self):
'''see :meth:`TaurusBaseComponent.getModelClass`'''
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
def _updateCommandWidgets(self, *args):
'''
@@ -563,7 +563,7 @@ class TaurusCommandsForm(TaurusWidget):
'''
#self.debug('In TaurusCommandsForm._updateCommandWidgets())')
dev = self.getModelObj()
- if dev is None or dev.getSWState() != taurus.core.TaurusSWDevState.Running:
+ if dev is None or dev.getSWState() != taurus.core.taurusbasetypes.TaurusSWDevState.Running:
self.debug('Cannot connect to device')
self._clearFrame()
return
@@ -732,13 +732,13 @@ class TaurusAttrForm(TaurusWidget):
def getModelClass(self):
'''see :meth:`TaurusBaseComponent.getModelClass`'''
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
def _updateAttrWidgets(self):
'''Populates the form with an item for each of the attributes shown
'''
dev = self.getModelObj()
- if dev is None or dev.getSWState() != taurus.core.TaurusSWDevState.Running:
+ if dev is None or dev.getSWState() != taurus.core.taurusbasetypes.TaurusSWDevState.Running:
self.debug('Cannot connect to device')
self._form.setModel([])
return
@@ -934,8 +934,8 @@ def taurusFormMain():
dialog.addActions ((saveConfigAction, loadConfigAction, quitApplicationAction) )
#set the default map for this installation
- from taurus.TaurusCustomSettings import T_FORM_CUSTOM_WIDGET_MAP
- dialog.setCustomWidgetMap(T_FORM_CUSTOM_WIDGET_MAP)
+ from taurus import tauruscustomsettings
+ dialog.setCustomWidgetMap(getattr(tauruscustomsettings,'T_FORM_CUSTOM_WIDGET_MAP',{}))
#set a model list from the command line or launch the chooser
if options.config_file is not None:
diff --git a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
index 50008d6..dc6d898 100644
--- a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
+++ b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
@@ -33,7 +33,7 @@ from taurus.qt import Qt
import taurus.core
from taurus.qt.qtgui.container import TaurusWidget
from taurus.qt.qtgui.tree import TaurusDbTreeWidget
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
from taurusmodellist import TaurusModelList
import taurus.qt.qtgui.resource
@@ -41,12 +41,12 @@ import taurus.qt.qtgui.resource
class TaurusModelSelectorTree(TaurusWidget):
def __init__(self, parent = None, selectables=None, buttonsPos=None, designMode = None):
TaurusWidget.__init__(self, parent)
- if selectables is None: selectables = [taurus.core.TaurusElementType.Attribute, taurus.core.TaurusElementType.Member,
- taurus.core.TaurusElementType.Device]
+ if selectables is None: selectables = [taurus.core.taurusbasetypes.TaurusElementType.Attribute, taurus.core.taurusbasetypes.TaurusElementType.Member,
+ taurus.core.taurusbasetypes.TaurusElementType.Device]
self._selectables = selectables
#tree
- self._deviceTree = TaurusDbTreeWidget(perspective=taurus.core.TaurusElementType.Device)
+ self._deviceTree = TaurusDbTreeWidget(perspective=taurus.core.taurusbasetypes.TaurusElementType.Device)
self._deviceTree.getQModel().setSelectables(self._selectables)
self._deviceTree.setUseParentModel(True)
@@ -99,9 +99,9 @@ class TaurusModelSelectorTree(TaurusWidget):
selected = []
for item in self._deviceTree.selectedItems():
nfo = item.itemData()
- if isinstance(nfo, taurus.core.TaurusDevInfo):
+ if isinstance(nfo, taurus.core.taurusdatabase.TaurusDevInfo):
selected.append(nfo.fullName())
- elif isinstance(nfo, taurus.core.TaurusAttrInfo):
+ elif isinstance(nfo, taurus.core.taurusdatabase.TaurusAttrInfo):
selected.append( "%s/%s"%(nfo.device().fullName(),nfo.name()) )
else:
self.info("Unknown item '%s' in selection"%repr(nfo))
@@ -248,7 +248,7 @@ class TaurusModelChooser(TaurusWidget):
def _onUpdateModels(self):
models = self.getListedModels()
self.emit(Qt.SIGNAL("updateModels"), models)
- if taurus.core.TaurusElementType.Attribute in self.tree._selectables:
+ if taurus.core.taurusbasetypes.TaurusElementType.Attribute in self.tree._selectables:
self.emit(Qt.SIGNAL("UpdateAttrs"), models) #for backwards compatibility with the old AttributeChooser
def setSingleModelMode(self, single):
diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py
index 1a3b4a8..9780691 100644
--- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py
+++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py
@@ -33,7 +33,8 @@ import copy
from taurus.qt import Qt
import taurus
-from taurus.core import TaurusException, TaurusElementType
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusexception import TaurusException
from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE
from taurus.qt.qtgui.resource import getThemeIcon, getElementTypeIcon, getIcon
diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py
index 47ef841..f29c30a 100644
--- a/lib/taurus/qt/qtgui/panel/taurusvalue.py
+++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py
@@ -64,8 +64,8 @@ class DefaultLabelWidget(TaurusLabel):
The base class used by default for showing the label of a TaurusValue.
.. note:: It only makes sense to use this class as a part of a TaurusValue,
- since it assumes that it can get a reference to a TaurusValue via the
- :meth:`getTaurusValueBuddy` member
+ since it assumes that it can get a reference to a TaurusValue via
+ the :meth:`getTaurusValueBuddy` member
'''
_dragEnabled=True
@@ -83,10 +83,10 @@ class DefaultLabelWidget(TaurusLabel):
return TaurusLabel.setModel(self, None)
try: config = self.taurusValueBuddy().getLabelConfig()
except Exception: config = 'label'
- if self.taurusValueBuddy().getModelClass() == taurus.core.TaurusAttribute:
+ if self.taurusValueBuddy().getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
config = self.taurusValueBuddy().getLabelConfig()
TaurusLabel.setModel(self, model + "?configuration=%s"%config)
- elif self.taurusValueBuddy().getModelClass() == taurus.core.TaurusDevice:
+ elif self.taurusValueBuddy().getModelClass() == taurus.core.taurusdevice.TaurusDevice:
TaurusLabel.setModel(self, model + "/state?configuration=dev_alias")
def sizeHint(self):
@@ -114,9 +114,9 @@ class DefaultLabelWidget(TaurusLabel):
'''reimplemented to use the taurusValueBuddy model instead of its own model'''
mimeData = TaurusLabel.getModelMimeData(self)
mimeData.setData(TAURUS_MODEL_MIME_TYPE, self.taurusValueBuddy().getModelName())
- if self.taurusValueBuddy().getModelClass() == taurus.core.TaurusDevice:
+ if self.taurusValueBuddy().getModelClass() == taurus.core.taurusdevice.TaurusDevice:
mimeData.setData(TAURUS_DEV_MIME_TYPE, self.taurusValueBuddy().getModelName())
- elif self.taurusValueBuddy().getModelClass() == taurus.core.TaurusAttribute:
+ elif self.taurusValueBuddy().getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
mimeData.setData(TAURUS_ATTR_MIME_TYPE, self.taurusValueBuddy().getModelName())
return mimeData
@@ -387,7 +387,7 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
if returnAll: return [ExpandingLabel]
else: return ExpandingLabel
- if self.getModelClass() == taurus.core.TaurusAttribute:
+ if self.getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
##The model is an attribute
config = modelobj.getConfig()
#print "---------ATTRIBUTE OBJECT:----------\n",modelobj.read()
@@ -446,7 +446,7 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
default one.
'''
# if self._customWidget is not None: return None
- if self.isReadOnly() or self.getModelClass() != taurus.core.TaurusAttribute:
+ if self.isReadOnly() or self.getModelClass() != taurus.core.taurusattribute.TaurusAttribute:
if returnAll: return []
else: return None
modelobj = self.getModelObj()
@@ -483,12 +483,12 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
def getDefaultUnitsWidgetClass(self):
## if self._customWidget is not None: return None
-# if self.getModelClass() != taurus.core.TaurusAttribute:
+# if self.getModelClass() != taurus.core.taurusattribute.TaurusAttribute:
# return DefaultUnitsWidget
return DefaultUnitsWidget
def getDefaultCustomWidgetClass(self):
- if self.getModelClass() == taurus.core.TaurusAttribute:
+ if self.getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
return None
try:
key = self.getModelObj().getHWObj().info().dev_class
@@ -572,41 +572,41 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
def labelWidgetClassFactory(self, classID):
if self._customWidget is not None: return None
- if classID is None or classID is 'None': return None
+ if classID is None or classID == 'None': return None
if isinstance(classID, type): return classID
elif str(classID) == 'Auto': return self.getDefaultLabelWidgetClass()
else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
def readWidgetClassFactory(self, classID):
if self._customWidget is not None: return None
- if classID is None or classID is 'None': return None
+ if classID is None or classID == 'None': return None
if isinstance(classID, type): return classID
elif str(classID) == 'Auto': return self.getDefaultReadWidgetClass()
else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
def writeWidgetClassFactory(self, classID):
if self._customWidget is not None: return None
- if classID is None or classID is 'None': return None
+ if classID is None or classID == 'None': return None
if isinstance(classID, type): return classID
elif str(classID) == 'Auto': return self.getDefaultWriteWidgetClass()
else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
def unitsWidgetClassFactory(self, classID):
if self._customWidget is not None: return None
- if classID is None or classID is 'None': return None
+ if classID is None or classID == 'None': return None
if isinstance(classID, type): return classID
elif str(classID) == 'Auto': return self.getDefaultUnitsWidgetClass()
else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
def customWidgetClassFactory(self, classID):
- if classID is None or classID is 'None': return None
+ if classID is None or classID == 'None': return None
if isinstance(classID, type): return classID
elif str(classID) == 'Auto': return self.getDefaultCustomWidgetClass()
else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
def extraWidgetClassFactory(self, classID):
if self._customWidget is not None: return None
- if classID is None or classID is 'None': return None
+ if classID is None or classID == 'None': return None
if isinstance(classID, type): return classID
elif str(classID) == 'Auto': return self.getDefaultExtraWidgetClass()
else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
@@ -920,9 +920,9 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
def setModel(self, model):
try:
taurus.Attribute(model)
- self.__modelClass = taurus.core.TaurusAttribute
+ self.__modelClass = taurus.core.taurusattribute.TaurusAttribute
except:
- self.__modelClass = taurus.core.TaurusDevice
+ self.__modelClass = taurus.core.taurusdevice.TaurusDevice
TaurusBaseWidget.setModel(self,model)
if not self._designMode: #in design mode, no subwidgets are created
self.updateCustomWidget()
@@ -936,7 +936,7 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
"""Reimplemented from :meth:`TaurusBaseWidget.handleEvent`
to update subwidgets on config events
"""
- if evt_type == taurus.core.TaurusEventType.Config and not self._designMode:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config and not self._designMode:
self.updateCustomWidget()
self.updateLabelWidget()
self.updateReadWidget()
@@ -1100,13 +1100,14 @@ if __name__ == "__main__":
#models=['bl97/pc/dummy-01/CurrentSetpoint','bl97/pc/dummy-02/RemoteMode']
#models=['sys/tg_test/1/state','sys/tg_test/1/status','sys/tg_test/1/short_scalar','sys/tg_test/1']
#models = ['sys/tg_test/1']+['sys/tg_test/1/%s_scalar'%s for s in ('float','short','string','long','boolean') ]
- #models = ['sys/tg_test/1/float_scalar','sys/tg_test/1/double_scalar']
+ #models = ['sys/tg_test/1/float_scalar','sys/tg#_test/1/double_scalar']
container.setModel(models)
- #container.getTaurusValueByIndex(0).writeWidget().setDangerMessage('BOOO') #uncomment to test the dangerous operation support
- #container.getTaurusValueByIndex(0).readWidget().setShowState(True)
- #container.getTaurusValueByIndex(0).setWriteWidgetClass(TaurusValueLineEdit)
+ #container.getItemByIndex(0).writeWidget().setDangerMessage('BOOO') #uncomment to test the dangerous operation support
+ #container.getItemByIndex(0).readWidget().setShowState(True)
+ #container.getItemByIndex(0).setWriteWidgetClass(TaurusValueLineEdit)
+ #container[0].setWriteWidgetClass('None')
#container.setModel(models)
container.setModifiableByUser(True)
diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py
index 14d5183..6211e2a 100644
--- a/lib/taurus/qt/qtgui/plot/curveprops.py
+++ b/lib/taurus/qt/qtgui/plot/curveprops.py
@@ -69,7 +69,7 @@ X, Y, TITLE, VIS = range(NUMCOLS)
SRC_ROLE = Qt.Qt.UserRole + 1
PROPS_ROLE = Qt.Qt.UserRole + 2
-ATTRNAMEVALIDATOR = taurus.core.AttributeNameValidator()
+ATTRNAMEVALIDATOR = taurus.core.taurusvalidator.AttributeNameValidator()
class Component(object):
def __init__(self, src):
diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
index 40f58b1..f37d063 100644
--- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
+++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
@@ -32,7 +32,7 @@ curvesAppearanceChooserDlg.py:
from taurus.qt import Qt, Qwt5
from ui import ui_curvesAppearanceChooser
from taurus.qt.qtgui.resource import getIcon
-from taurus.core.util import CaselessDict
+from taurus.core.util.containers import CaselessDict
import copy
NamedLineStyles={None:"",
diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py
index 6c7ba0b..95023d3 100644
--- a/lib/taurus/qt/qtgui/plot/taurusplot.py
+++ b/lib/taurus/qt/qtgui/plot/taurusplot.py
@@ -38,7 +38,8 @@ from taurus.qt import Qt, Qwt5
import PyTango
import taurus.core
-from taurus.core.util import SafeEvaluator, LoopList, CaselessDict, CaselessList
+from taurus.core.util.containers import LoopList, CaselessDict, CaselessList
+from taurus.core.util.safeeval import SafeEvaluator
from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
from taurus.qt.qtgui.plot import TaurusPlotConfigDialog, FancyScaleDraw,\
@@ -63,7 +64,7 @@ class DummyLock(object):
pass
##for debugging. Comment out in production
-#from taurus.core.util import TraceIt, DebugIt, InfoIt, WarnIt
+#from taurus.core.util.log import TraceIt, DebugIt, InfoIt, WarnIt
DFT_CURVE_PENS = [Qt.QPen(Qt.Qt.red, 2),
@@ -152,7 +153,7 @@ class TaurusXValues(TaurusBaseComponent):
def getModelClass(self):
'''see :meth:`TaurusBaseComponent.getModelClass`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def eventHandle(self, src, evt_type, val):
'''see :meth:`TaurusBaseComponent.eventHandle`'''
@@ -236,7 +237,8 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
information about which TaurusCurves are attached. Therefore the programmer
should never attach/detach a TaurusCurve manually.
'''
- droppedEventsWarning = 3 #number of dropped events before issuing a warning
+ consecutiveDroppedEventsWarning = 3 #number consecutive of dropped events before issuing a warning (-1 for disabling)
+ droppedEventsWarning = -1 #absolute number of dropped events before issuing a warning (-1 for disabling)
def __init__(self, name, xname=None, parent = None, rawData=None, optimized=False):
Qwt5.QwtPlotCurve.__init__(self)
@@ -257,6 +259,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
self.__curveName = name
self.isRawData= not(rawData is None)
self.droppedEventsCount = 0
+ self.consecutiveDroppedEventsCount = 0
if optimized:
self.setPaintAttribute(self.PaintFiltered, True)
self.setPaintAttribute(self.ClipPolygons, True)
@@ -479,7 +482,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
def getModelClass(self):
'''See :meth:`TaurusBaseComponent.getModelClass`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def getRawData(self):
'''Returns the rawData
@@ -546,7 +549,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
self._signalGen.emit(Qt.SIGNAL("dataChanged(const QString &)"), str(self.getModel()))
return
- if evt_type == taurus.core.TaurusEventType.Config:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
self.updateTitle()
value = val if isinstance(val, (PyTango.DeviceAttribute, taurus.core.taurusbasetypes.TaurusAttrValue)) else self.getModelValueObj()
@@ -568,13 +571,39 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
'''
self.debug("Droping event. Reason %s", reason)
self.droppedEventsCount += 1
+ self.consecutiveDroppedEventsCount += 1
+ mustwarn = False
if self.droppedEventsCount == self.droppedEventsWarning:
+ mustwarn = True
msg = ('At least %i events from model "%s" have being dropped. This attribute may have problems\n' +
'Future occurrences will be silently ignored')%(self.droppedEventsWarning, self.modelName)
+ self.consecutiveDroppedEventsWarning = -1 #disable the consecutive Dropped events warning (we do not want it if we got this one)
+ if self.consecutiveDroppedEventsCount == self.consecutiveDroppedEventsWarning:
+ mustwarn = True
+ msg = ('At least %i consecutive events from model "%s" have being dropped. This attribute may have problems\n' +
+ 'Future occurrences will be silently ignored')%(self.consecutiveDroppedEventsWarning, self.modelName)
+ self.consecutiveDroppedEventsWarning = -1 #disable the consecutive Dropped events warning
+ if mustwarn:
self.warning(msg)
- p = self.plot()
+ p = self.plot()
if p:
- Qt.QMessageBox.warning(p, "Errors in curve %s"%self.titleText(compiled=True), msg, Qt.QMessageBox.Ok)
+ c = p.canvas()
+ msg2 = "Errors reading %s (%s)"%(self.titleText(compiled=True), self.modelName)
+ Qt.QToolTip.showText(c.mapToGlobal(c.pos()), msg2, c)
+ #Qt.QMessageBox.warning(p, "Errors in curve %s"%self.titleText(compiled=True), msg, Qt.QMessageBox.Ok)
+
+
+ if self.droppedEventsCount == self.droppedEventsWarning:
+ mustwarn = True
+ msg = ('At least %i events from model "%s" have being dropped. This attribute may have problems\n' +
+ 'Future occurrences will be silently ignored')%(self.droppedEventsWarning, self.modelName)
+ self.warning(msg)
+ p = self.plot()
+ if p:
+ c = p.canvas()
+ msg = ''
+ Qt.QToolTip.showText(c.pos(), msg, c)
+ #Qt.QMessageBox.warning(p, "Errors in curve %s"%self.titleText(compiled=True), msg, Qt.QMessageBox.Ok)
def _updateMarkers(self):
'''updates min & max markers if needed'''
@@ -788,7 +817,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
'''see :meth:`TaurusBaseComponent.isReadOnly`'''
return True
- def getStats(self, limits=None, inclusive=(True,True), imin=None, imax=None):
+ def getStats(self, limits=None, inclusive=(True,True), imin=None, imax=None, ignorenans=True):
'''
returns a dict containing several descriptive statistics of a region of
the curve defined by the limits given by the keyword arguments. It also
@@ -806,6 +835,8 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
Note that some of the values may be None if that cannot be computed.
+ Also,
+
:param limits: (None or tuple<float,float>) tuple containing (min,max) limits.
Points of the curve whose abscisa value is outside of
these limits are ignored. If None is passed, the limit is not enforced
@@ -816,6 +847,8 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
the limit is not enforced
:param imax: (int) higest index to be considered. If None is given,
the limit is not enforced
+ :param ignorenans: (bool) if True (defaul), the points with NaN values are stripped
+ before calculating the stats
:return: (dict) A dict containing the stats.
'''
@@ -833,10 +866,15 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
if inclusive:
mask = (x>=xmin) * (x<=xmax)
else:
- mask = (x>xmin) * (x<xmax)
+ mask = (x>xmin) * (x<xmax)
x = x[mask]
- y = y[mask]
+ y = y[mask]
+ if ignorenans:
+ mask = numpy.invert(numpy.isnan(x+y)) #we remove points where either x or y are Nan
+ x = x[mask]
+ y = y[mask]
+
ret = {'x' : x,
'y' : y,
'points': x.size,
@@ -866,7 +904,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
:param show: (bool)
"""
self._showMaxPeak = show
- #self.fireEvent(taurus.core.TaurusEventType.Change) #force re-reading attribute to update peak values
+ #self.fireEvent(taurus.core.taurusbasetypes.TaurusEventType.Change) #force re-reading attribute to update peak values
def showMinPeak(self,show):
"""Specififes if we want to show or not the min peak of the curve.
@@ -874,7 +912,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
:param show: (bool)
"""
self._showMinPeak = show
- #self.fireEvent(taurus.core.TaurusEventType.Change) #force re-reading attribute to update peak values
+ #self.fireEvent(taurus.core.taurusbasetypes.TaurusEventType.Change) #force re-reading attribute to update peak values
def getYAxisStatus(self):
'''returns either None (if the curve is not visible) or its yAxis (if it
@@ -1057,6 +1095,14 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
def __initActions(self):
'''Create and attach TaurusPlot actions'''
+
+ #=======================================================================
+ ## This action is for debug only. Comment out when not debugging
+ #self._debugAction = Qt.QAction("Calculate statistics", None)
+ #self._debugAction.setShortcut(Qt.Qt.Key_D)
+ #self.connect(self._debugAction, Qt.SIGNAL("triggered()"), self.__debug)
+ #self.canvas().addAction(self._debugAction)
+ #=======================================================================
self._dataInspectorAction = Qt.QAction("Data &Inspector mode", None)
self._dataInspectorAction.setShortcut(Qt.Qt.Key_I)
@@ -1293,13 +1339,9 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
def __debug(self, *args, **kwargs):
'''put code here that you want to debug'''
- #print '--------------'
- ##self.setAxisCustomLabels(Qwt5.QwtPlot.xBottom , [[-2.4,"one position"],[-2.,"another"],[-1,"yet another"]], rotation = -45)
- ##self.setAxisCustomLabels(Qwt5.QwtPlot.yLeft , [[0.5,"shorty"],[2.,"normalLbl"],[3,"looooooong Label"]])
- #for i,z in enumerate((self._zoomer1,self._zoomer2)):
- # print i,'STACK:',z.zoomStack()
- # print i,'BRECT:',z.zoomRect()
- #print '--------------'
+ print "!!!!!!!!!!!!!!!1",self.pos()
+ Qt.QToolTip.showText(self.mapToGlobal(self.pos()), "ASDASDASDASD DASDAS ASDA", self)
+
return
def getDefaultAxisLabelsAlignment(self, axis, rotation):
@@ -2545,7 +2587,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
from taurus.qt.qtgui.panel import TaurusModelChooser
self.DataImportDlg = Qt.QDialog(self)
self.DataImportDlg.setWindowTitle("%s - Import Data"%(str(self.windowTitle())))
- self.DataImportDlg.modelChooser = TaurusModelChooser(selectables=[taurus.core.TaurusElementType.Attribute])
+ self.DataImportDlg.modelChooser = TaurusModelChooser(selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute])
from taurus.qt.qtgui.panel import QRawDataWidget
self.DataImportDlg.rawDataChooser = QRawDataWidget()
@@ -3421,6 +3463,7 @@ def main():
#if no models are passed, show the data import dialog
if len(models) == 0 and options.config_file is None:
w.showDataImportDlg()
+
sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/plot/taurusplotconf.py b/lib/taurus/qt/qtgui/plot/taurusplotconf.py
index 1c8b549..f849a71 100644
--- a/lib/taurus/qt/qtgui/plot/taurusplotconf.py
+++ b/lib/taurus/qt/qtgui/plot/taurusplotconf.py
@@ -73,7 +73,7 @@ class TaurusPlotConfDlg(Qt.QWidget):
self.ui.propView = self.__replaceWidget(curveprops.CurvePropertiesView(), self.ui.propView)
from taurus.qt.qtgui.panel import TaurusModelSelectorTree
tangoTree = TaurusModelSelectorTree(parent = None,
- selectables=[taurus.core.TaurusElementType.Attribute],
+ selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute],
buttonsPos=Qt.Qt.RightToolBarArea)
self.ui.tangoTree = self.__replaceWidget(tangoTree, self.ui.tangoTree)
# l=self.ui.propView.parent().layout()
@@ -82,7 +82,7 @@ class TaurusPlotConfDlg(Qt.QWidget):
# l=self.ui.tangoTree.parent().layout()
# from taurus.qt.qtgui.panel import TaurusModelSelectorTree
# self.ui.tangoTree = TaurusModelSelectorTree(parent = None,
-# selectables=[taurus.core.TaurusElementType.Attribute],
+# selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute],
# buttonsPos=Qt.Qt.RightToolBarArea)
# l.insertWidget(0, self.ui.tangoTree)
####################################
diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py
index 591f81e..7e5b651 100644
--- a/lib/taurus/qt/qtgui/plot/taurustrend.py
+++ b/lib/taurus/qt/qtgui/plot/taurustrend.py
@@ -36,7 +36,7 @@ import gc
from taurus.qt import Qt, Qwt5
import taurus.core
-from taurus.core.util import CaselessDict, CaselessList, ArrayBuffer
+from taurus.core.util.containers import CaselessDict, CaselessList, ArrayBuffer
from taurus.qt.qtgui.base import TaurusBaseComponent
from taurus.qt.qtgui.plot import TaurusPlot
import PyTango
@@ -204,7 +204,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
attr = self.getModelObj()
basetitle = basetitle.replace('<current_title>',self._titleText)
basetitle = basetitle.replace('<model>',self.getModel())
- if isinstance(attr, taurus.core.TaurusAttribute):
+ if isinstance(attr, taurus.core.taurusattribute.TaurusAttribute):
basetitle = basetitle.replace('<label>',attr.label or '---')
basetitle = basetitle.replace('<attr_name>',attr.name or '---')
basetitle = basetitle.replace('<attr_fullname>',attr.getFullName() or '---')
@@ -252,7 +252,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
def getModelClass(self):
'''see :meth:`TaurusBaseComponent.getModelClass`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def registerDataChanged(self,listener,meth):
'''see :meth:`TaurusBaseComponent.registerDataChanged`'''
@@ -290,8 +290,15 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
v = float(v)
ntrends = 1
except:
- ntrends = len(v)
- else: ntrends = len(self._curves)
+ try:
+ #Trying with spectrums
+ ntrends = len(v)
+ except:
+ #Simply unreadable
+ value = None
+ ntrends = len(self._curves)
+ else:
+ ntrends = len(self._curves)
if self._xBuffer is None:
self._xBuffer = ArrayBuffer(numpy.zeros(min(128,self._maxBufferSize), dtype='d'), maxSize=self._maxBufferSize )
@@ -350,12 +357,12 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
For documentation about the parameters of this method, see
:meth:`TaurusBaseComponent.handleEvent`
'''
- if evt_type == taurus.core.TaurusEventType.Config:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
#self.setTitleText(self._titleText or self.parent().getDefaultCurvesTitle()) #this did not work well (it overwrites custom titles!)
return
else:
model = evt_src if evt_src is not None else self.getModelObj()
- if evt_type == taurus.core.TaurusEventType.Error:
+ if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Error:
self._onDroppedEvent(reason='Error event')
if not self.parent().getUseArchiving(): return
else: value = None
@@ -364,7 +371,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
if not self.parent().getUseArchiving(): return
else: value = None
else:
- value = evt_value if isinstance(evt_value, (taurus.core.TaurusAttrValue, PyTango.DeviceAttribute)) else self.getModelValueObj()
+ value = evt_value if isinstance(evt_value, (taurus.core.taurusbasetypes.TaurusAttrValue, PyTango.DeviceAttribute)) else self.getModelValueObj()
if value is None or value.value is None:
self._onDroppedEvent(reason='invalid value')
if not self.parent().getUseArchiving(): return
@@ -436,7 +443,10 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
self.warning(msg)
p = self.parent()
if p:
- Qt.QMessageBox.warning(p, "Errors in %s"%self._titleText, msg, Qt.QMessageBox.Ok)
+ c = p.canvas()
+ msg2 = "Errors reading %s (%s)"%(self._titleText, self.modelName)
+ Qt.QToolTip.showText(c.mapToGlobal(c.pos()), msg2, c)
+ #Qt.QMessageBox.warning(p, "Errors in %s"%self._titleText, msg, Qt.QMessageBox.Ok)
def isReadOnly(self):
return True
@@ -508,7 +518,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
:param cache: (bool) set to True to do cache'd reading (by default is False)
'''
vobj=self.getModelValueObj(cache=False)
- self.fireEvent(self, taurus.core.TaurusEventType.Periodic, vobj)
+ self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Periodic, vobj)
class ScanTrendsSet(TaurusTrendsSet):
@@ -758,6 +768,15 @@ class ScanTrendsSet(TaurusTrendsSet):
'''
if not isinstance(qdoor, QDoor): qdoor = taurus.Device(qdoor)
self.connect(qdoor, Qt.SIGNAL("recordDataUpdated"), self.scanDataReceived)
+
+
+ def disconnectQDoor(self, qdoor):
+ '''connects this ScanTrendsSet to a QDoor
+
+ :param qdoor: (QDoor or str) either a QDoor instance or the QDoor name
+ '''
+ if not isinstance(qdoor, QDoor): qdoor = taurus.Device(qdoor)
+ self.disconnect(qdoor, Qt.SIGNAL("recordDataUpdated"), self.scanDataReceived)
def getModel(self):
return self.__model
@@ -1078,6 +1097,10 @@ class TaurusTrend(TaurusPlot):
tset.unregisterDataChanged(self, self.curveDataChanged)
tset.forcedReadingTimer = None
tset.clearTrends(replot=False)
+ matchScan = re.search(r"scan:\/\/(.*)", name)
+ if matchScan:
+ olddoorname = matchScan.group(1)
+ tset.disconnectQDoor(olddoorname)
if del_sets:
self.autoShowYAxes()
@@ -1363,7 +1386,7 @@ class TaurusTrend(TaurusPlot):
self.addModels(models)
for m in models:
tset = self.trendSets[m]
- tset.fireEvent(None, taurus.core.TaurusEventType.Change, None) #a fake event to force generating the curves
+ tset.fireEvent(None, taurus.core.taurusbasetypes.TaurusEventType.Change, None) #a fake event to force generating the curves
#set curve properties
self.setCurveAppearanceProperties(configdict["CurveProp"])
self.updateLegend(force=True)
diff --git a/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py b/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
index 475af31..5aad067 100644
--- a/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
+++ b/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
@@ -37,13 +37,13 @@ import os
from taurus.qt import Qt
-import taurus.core
-import taurus.core.util
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusSWDevHealth
+from taurus.core.util.log import Logger
-__LOGGER = taurus.core.util.Logger(__name__)
+__LOGGER = Logger(__name__)
-ElemType = taurus.core.TaurusElementType
-DevHealth = taurus.core.TaurusSWDevHealth
+ElemType = TaurusElementType
+DevHealth = TaurusSWDevHealth
Size = Qt.QSize
__INITIALIZED = False
@@ -243,15 +243,15 @@ def getElementTypeSize(elemType):
return data[__IDX_ELEM_TYPE_SIZE]
def getElementTypeIconName(elemType):
- """Gets an icon name string for the given :class:`taurus.core.TaurusElementType`.
+ """Gets an icon name string for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`.
- If an icon name cannot be found for the given :class:`taurus.core.TaurusElementType`,
+ If an icon name cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`,
None is returned.
:param elemType: (TaurusElementType) the taurus element type
:return: (str) a string representing the icon name for the given
- :class:`taurus.core.TaurusElementType`"""
+ :class:`taurus.core.taurusbasetypes.TaurusElementType`"""
if elemType is None:
return
data = _ELEM_TYPE_MAP.get(elemType)
@@ -260,15 +260,15 @@ def getElementTypeIconName(elemType):
return data[__IDX_ELEM_TYPE_ICON]
def getElementTypeIcon(elemType, fallback=None):
- """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.TaurusElementType`.
+ """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`.
- If an icon cannot be found for the given :class:`taurus.core.TaurusElementType`,
+ If an icon cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`,
fallback is returned.
:param elemType: (TaurusElementType) the taurus element type
:param fallback: (PyQt4.QtGui.QIcon) the fallback icon. Default is None.
- :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.TaurusElementType`"""
+ :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`"""
themeIconName = getElementTypeIconName(elemType)
icon = getThemeIcon(themeIconName)
@@ -277,15 +277,15 @@ def getElementTypeIcon(elemType, fallback=None):
return icon
def getElementTypePixmap(elemType, size=None):
- """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.TaurusElementType`.
+ """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`.
- If a pixmap cannot be found for the given :class:`taurus.core.TaurusElementType`,
+ If a pixmap cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`,
fallback is returned.
:param elemType: (TaurusElementType) the taurus element type
:param fallback: (PyQt4.QtGui.QPixmap) the fallback pixmap. Default is None.
- :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.TaurusElementType`"""
+ :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`"""
if elemType is None:
return
@@ -312,15 +312,15 @@ def getSWDevHealthToolTip(elemHealth):
return data[__IDX_HEALTH_TOOLTIP]
def getSWDevHealthIcon(elemHealth, fallback=None):
- """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.TaurusSWDevHealth`.
+ """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`.
- If an icon cannot be found for the given :class:`taurus.core.TaurusSWDevHealth`,
+ If an icon cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`,
fallback is returned.
:param elemHealth: (TaurusSWDevHealth) the taurus software device health status
:param fallback: (PyQt4.QtGui.QIcon) the fallback icon. Default is None.
- :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.TaurusSWDevHealth`"""
+ :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`"""
if elemHealth is None:
return
data = _HEALTH_MAP.get(elemHealth)
@@ -334,15 +334,15 @@ def getSWDevHealthIcon(elemHealth, fallback=None):
return icon
def getSWDevHealthPixmap(elemHealth, size=None):
- """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.TaurusSWDevHealth`.
+ """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`.
- If a pixmap cannot be found for the given :class:`taurus.core.TaurusSWDevHealth`,
+ If a pixmap cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`,
fallback is returned.
:param elemHealth: (TaurusSWDevHealth) the taurus software device health status
:param fallback: (PyQt4.QtGui.QPixmap) the fallback icon. Default is None.
- :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.TaurusSWDevHealth`"""
+ :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`"""
if elemHealth is None:
return
data = _HEALTH_MAP.get(elemHealth)
diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py
index e940136..2dd9eb8 100644
--- a/lib/taurus/qt/qtgui/table/qlogtable.py
+++ b/lib/taurus/qt/qtgui/table/qlogtable.py
@@ -36,9 +36,8 @@ import datetime
import threading
import socket
-
import taurus
-from taurus.core.util import Logger
+from taurus.core.util.log import Logger
from taurus.core.util.remotelogmonitor import LogRecordStreamHandler, \
LogRecordSocketReceiver
from taurus.core.util.decorator.memoize import memoized
@@ -54,12 +53,12 @@ LEVEL, TIME, MSG, NAME, ORIGIN = range(5)
HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin'
__LEVEL_BRUSH = {
- taurus.Trace : (Qt.QBrush(Qt.Qt.lightGray), Qt.QBrush(Qt.Qt.black)),
- taurus.Debug : (Qt.QBrush(Qt.Qt.green), Qt.QBrush(Qt.Qt.black)),
- taurus.Info : (Qt.QBrush(Qt.Qt.blue), Qt.QBrush(Qt.Qt.white)),
- taurus.Warning : (Qt.QBrush(Qt.QColor(255,165,0)), Qt.QBrush(Qt.Qt.black)),
- taurus.Error : (Qt.QBrush(Qt.Qt.red), Qt.QBrush(Qt.Qt.black)),
- taurus.Critical : (Qt.QBrush(Qt.QColor(160,32,240)), Qt.QBrush(Qt.Qt.white)),
+ taurus.Trace : (Qt.Qt.lightGray, Qt.Qt.black),
+ taurus.Debug : (Qt.Qt.green, Qt.Qt.black),
+ taurus.Info : (Qt.Qt.blue, Qt.Qt.white),
+ taurus.Warning : (Qt.QColor(255,165,0), Qt.Qt.black),
+ taurus.Error : (Qt.Qt.red, Qt.Qt.black),
+ taurus.Critical : (Qt.QColor(160,32,240), Qt.Qt.white),
}
def getBrushForLevel(level):
@@ -76,7 +75,8 @@ def getBrushForLevel(level):
elevel = taurus.Error
elif level <= taurus.Critical:
elevel = taurus.Critical
- return __LEVEL_BRUSH[elevel]
+ f, g = map(Qt.QBrush, __LEVEL_BRUSH[elevel])
+ return f, g
def _origin_cmp(rec1, rec2):
diff --git a/lib/taurus/qt/qtgui/table/taurusdbtable.py b/lib/taurus/qt/qtgui/table/taurusdbtable.py
index 8996e31..a19c31e 100644
--- a/lib/taurus/qt/qtgui/table/taurusdbtable.py
+++ b/lib/taurus/qt/qtgui/table/taurusdbtable.py
@@ -31,7 +31,8 @@ __all__ = ["TaurusDbTableWidget"]
__docformat__ = 'restructuredtext'
from taurus.qt import Qt
-from taurus.core import TaurusElementType, TaurusDatabase
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusdatabase import TaurusDatabase
from taurus.qt.qtcore.model import *
from taurus.qt.qtgui.resource import getElementTypeIcon, getElementTypeIconName
from taurustable import TaurusBaseTableWidget
@@ -39,7 +40,7 @@ from taurustable import TaurusBaseTableWidget
class TaurusDbTableWidget(TaurusBaseTableWidget):
"""A class:`taurus.qt.qtgui.tree.TaurusBaseTableWidget` that connects to a
- :class:`taurus.core.TaurusDatabase` model. It can show the list of database
+ :class:`taurus.core.taurusdatabase.TaurusDatabase` model. It can show the list of database
elements in two different perspectives:
- device : a device list based perspective
diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
index ff71316..2e294a4 100644
--- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
+++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
@@ -67,7 +67,7 @@ class TaurusPropTable(QtGui.QTableWidget, TaurusBaseWidget):
return QtGui.QTableWidget.minimumSizeHint(self)
def getModelClass(self):
- return taurus.core.TaurusDatabase
+ return taurus.core.taurusdatabase.TaurusDatabase
@classmethod
def getQtDesignerPluginInfo(cls):
diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py
index 67432e1..1c47713 100644
--- a/lib/taurus/qt/qtgui/table/taurusgrid.py
+++ b/lib/taurus/qt/qtgui/table/taurusgrid.py
@@ -44,8 +44,8 @@ from taurus.qt import Qt, QtGui, QtCore
import taurus
from taurus.qt.qtcore.util.emitter import modelSetter,TaurusEmitterThread,SingletonWorker,MethodModel
-from taurus.core import TaurusManager
-from taurus.core.util import Logger
+from taurus.core.taurusmanager import TaurusManager
+from taurus.core.util.log import Logger
from taurus.qt.qtgui.base import TaurusBaseWidget
from taurus.qt.qtgui.panel import TaurusValue
from taurus.qt.qtgui.display import TaurusValueLabel,TaurusStateLabel
@@ -64,7 +64,7 @@ def get_all_models(expressions,limit=1000):
It practically equals to fandango.get_matching_attributes; check which is better!
Move this method to taurus.core.tango.search
'''
- print( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
+ #print( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
if isinstance(expressions,str):
#if any(re.match(s,expressions) for s in ('\{.*\}','\(.*\)','\[.*\]')):
##self.debug( 'evaluating expressions ....')
@@ -78,16 +78,16 @@ def get_all_models(expressions,limit=1000):
expressions = list(str(e) for e in expressions)
#self.debug( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
- taurus_db = taurus.core.TaurusManager().getFactory()().getDatabase()
+ taurus_db = taurus.core.taurusmanager.TaurusManager().getFactory()().getDatabase()
#taurus_db = taurus.Database(os.environ['TANGO_HOST'])
if 'SimulationDatabase' in str(type(taurus_db)):
- #self.info( 'Using a simulated database ...')
+ #self.trace( 'Using a simulated database ...')
models = expressions
else:
all_devs = taurus_db.get_device_exported('*')
models = []
for exp in expressions:
- #self.info( 'evaluating exp = "%s"' % exp)
+ #self.trace( 'evaluating exp = "%s"' % exp)
exp = str(exp)
devs = []
targets = []
@@ -100,14 +100,14 @@ def get_all_models(expressions,limit=1000):
else:
devs = [device]
- #self.info( 'TaurusGrid.get_all_models(): devices matched by %s / %s are %d:' % (device,attribute,len(devs)))
+ #self.trace( 'TaurusGrid.get_all_models(): devices matched by %s / %s are %d:' % (device,attribute,len(devs)))
#self.debug( '%s' % (devs))
for dev in devs:
if any(c in attribute for c in '.*[]()+?'):
if '*' in attribute and '.*' not in attribute: attribute = attribute.replace('*','.*')
try:
- #taurus_dp = taurus.core.TaurusDevice(dev)
- taurus_dp = taurus.core.TaurusManager().getFactory()().getDevice(dev)
+ #taurus_dp = taurus.core.taurusdevice.TaurusDevice(dev)
+ taurus_dp = taurus.core.taurusmanager.TaurusManager().getFactory()().getDevice(dev)
#self.debug( "taurus_dp = %s"%taurus_dp.getFullName())
attrs = [att.name for att in taurus_dp.attribute_list_query() if re_match_low(attribute,att.name)]
targets.extend(dev+'/'+att for att in attrs)
@@ -118,7 +118,7 @@ def get_all_models(expressions,limit=1000):
#print 'TaurusGrid.get_all_models(): targets added by %s are: %s' % (exp,targets)
models.extend(targets)
models = models[:limit]
- print( 'Out of TaurusGrid.get_all_models(...)')
+ #print( 'Out of TaurusGrid.get_all_models(...)')
return models
def get_readwrite_models(expressions,limit=1000):
@@ -129,16 +129,16 @@ def get_readwrite_models(expressions,limit=1000):
#self.debug( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
if isinstance(expressions,str):
if any(re.match(s,expressions) for s in ('\{.*\}','\(.*\)','\[.*\]')):
- #self.debug( 'evaluating expressions ....')
+ #self.trace( 'evaluating expressions ....')
expressions = list(eval(expressions))
else:
- #self.debug( 'expressions as string separated by commas ...')
+ #self.trace( 'expressions as string separated by commas ...')
expressions = expressions.split(',')
elif any(isinstance(expressions,klass) for klass in (QtCore.QStringList,list,tuple,dict)):
expressions = list(str(e) for e in expressions)
- taurus_db = taurus.core.TaurusManager().getFactory()().getDatabase()
+ taurus_db = taurus.core.taurusmanager.TaurusManager().getFactory()().getDatabase()
if 'SimulationDatabase' in str(type(taurus_db)):
models = expressions
else:
@@ -161,7 +161,7 @@ def get_readwrite_models(expressions,limit=1000):
if any(c in attribute for c in '.*[]()+?'):
if '*' in attribute and '.*' not in attribute: attribute = attribute.replace('*','.*')
try:
- taurus_dp = taurus.core.TaurusManager().getFactory()().getDevice(dev)
+ taurus_dp = taurus.core.taurusmanager.TaurusManager().getFactory()().getDevice(dev)
attrs = [att.name for att in taurus_dp.attribute_list_query() if re_match_low(attribute,att.name) and att.isReadOnly()]
targets.extend(dev+'/'+att for att in attrs)
except Exception,e:
@@ -236,7 +236,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
f.close()
def load(self,filename,delayed=False):
- self.info('In TauGrid.load(%s,%s)'%(filename,delayed))
+ self.trace('In TauGrid.load(%s,%s)'%(filename,delayed))
if not isinstance(filename,dict):
import pickle
f = open(filename)
@@ -283,7 +283,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
#-----------------------------------------------------------------------
# [MANDATORY]
# Replace your own code here
- # ex.: return taurus.core.Attribute
+ # ex.: return taurus.core.taurusattribute.Attribute
raise RuntimeError("Forgot to overwrite %s.getModelClass" % str(self))
return list
@@ -337,9 +337,9 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
def updateStyle(self):
#-----------------------------------------------------------------------
# Write your own code here to update your widget style
- self.debug('@'*80)
- self.debug('In TaurusGrid.updateStyle() ....... It seems never called!!!!')
- self.debug('@'*80)
+ self.trace('@'*80)
+ self.trace('In TaurusGrid.updateStyle() ....... It seems never called!!!!')
+ self.trace('@'*80)
#It was showing an annoying "True" in the widget
#value = self.getShowText() or ''
@@ -366,8 +366,8 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
self.load(model)
else:
model = isinstance(model,(str,QtCore.QString)) and [model] or list(model)
- self.debug('#'*80)
- self.debug('In TaurusGrid.setModel(%s)'%str(model)[:100])
+ self.trace('#'*80)
+ self.trace('In TaurusGrid.setModel(%s)'%str(model)[:100])
self.delayed = delayed
self.filter = model
@@ -386,7 +386,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
self.debug(('In TaurusGrid.setModel(...): modelNames are %s'%(self._modelNames))[:100]+'...')
if load:
- self.info('In TaurusGrid.setModel(%s,load=True): modelNames are %d'%(str(model)[:100]+'...',len(self._modelNames)))#,self._modelNames))
+ self.trace('In TaurusGrid.setModel(%s,load=True): modelNames are %d'%(str(model)[:100]+'...',len(self._modelNames)))#,self._modelNames))
if devsInRows:
self.setRowLabels(','.join(set(d.rsplit('/',1)[0] for d in self._modelNames)))
self.create_widgets_table(self._modelNames)
@@ -398,19 +398,19 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
self.updateStyle()
if not self.delayed:
- self.info('In setModel(): not delayed loading of models')
+ self.trace('In setModel(): not delayed loading of models')
if not self.modelsThread.isRunning():
- print 'In setModel(): Starting Thread! (%d objs in queue)'%(self.modelsThread.queue.qsize())
- self.debug('<'*80)
+ #print 'In setModel(): Starting Thread! (%d objs in queue)'%(self.modelsThread.queue.qsize())
+ self.trace('<'*80)
self.modelsThread.start()#self.modelsThread.IdlePriority)
else:
- print 'In setModel(): Thread already started! (%d objs in queue)'%(self.modelsThread.queue.qsize())
+ #print 'In setModel(): Thread already started! (%d objs in queue)'%(self.modelsThread.queue.qsize())
self.modelsThread.next()
else:
- self.info('In setModel(): models loading delayed!')
+ self.trace('In setModel(): models loading delayed!')
pass
- self.debug('Out of TaurusGrid.setModel(%s)'%str(model)[:100])
+ self.trace('Out of TaurusGrid.setModel(%s)'%str(model)[:100])
self.updateStyle()
return
@@ -503,7 +503,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
self.columns_frame.hide()
def showAttributeLabels(self,boolean):
- self.info('In showAttributeLabels(%s)'%boolean)
+ self.trace('In showAttributeLabels(%s)'%boolean)
self._show_attr_labels = boolean
for tv in self._widgets_list:
try:
@@ -514,7 +514,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
return self._show_attr_labels
def showAttributeUnits(self,boolean):
- self.info('In showAttributeUnits(%s)'%boolean)
+ self.trace('In showAttributeUnits(%s)'%boolean)
self._show_attr_units = boolean
for tv in self._widgets_list:
try:
@@ -751,7 +751,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
This is a builder. For all the elements in widgets matrix,
just set the corresponding cells of the QTableWidget.
"""
- self.debug('In TaurusGrid.build_table(%s)'%values)
+ self.trace('In TaurusGrid.build_table(%s)'%values)
widgets_matrix = self.build_widgets(values,self.showLabels)
rows = len(widgets_matrix)
cols = rows and len(widgets_matrix[0]) or 0
@@ -804,7 +804,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
#Done in this way as TauValue.mousePressEvent are never called
def mousePressEvent(event,obj):
- print 'In cell clicked'
+ #print 'In cell clicked'
targets = set(str(child.getModelName()) for child in obj.children()
if hasattr(child,'underMouse') and child.underMouse() and hasattr(child,'getModelName'))
[obj.emit(Qt.SIGNAL("itemClicked(QString)"),t) for t in targets]
@@ -817,17 +817,17 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
return widgets_matrix
def itemClicked(self,item_name):
- self.info('In TaurusGrid.itemClicked(%s)'%item_name)
+ self.trace('In TaurusGrid.itemClicked(%s)'%item_name)
self.setItemSelected(item_name)
self.emit(QtCore.SIGNAL("itemClicked(QString)"),str(item_name))
def setItemSelected(self,item_name='',selected=True):
""" it adds a blue frame around a clicked item. """
if isinstance(item_name,TaurusValue):
- self.info('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name.getModel()),selected))
+ self.trace('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name.getModel()),selected))
item = item_name
else:
- self.info('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name),selected))
+ self.trace('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name),selected))
if item_name: item = self.getItemByModel(item_name)
else: item = self._last_selected
if item:
diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py
index cf8af4a..eb23442 100644
--- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py
+++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py
@@ -33,11 +33,12 @@ import numpy
import sys
import taurus.core
+from taurus.core.taurusbasetypes import DataFormat
from taurus.qt.qtgui.base import TaurusBaseWidget, TaurusBaseWritableWidget
from taurus.qt.qtgui.display import TaurusLabel
from taurus.qt.qtgui.resource import getThemeIcon, getThemePixmap
from taurus.qt.qtgui.container import TaurusWidget
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
TableRWState = Enumeration("TableRWState", ("Read", "Write"))
@@ -145,9 +146,9 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
values = numpy.array(attr.value)
wvalues = numpy.array(attr.w_value)
#reshape the table
- if attr.data_format == taurus.core.DataFormat._1D:
+ if attr.data_format == DataFormat._1D:
rows, columns = values.size, 1
- elif attr.data_format == taurus.core.DataFormat._2D:
+ elif attr.data_format == DataFormat._2D:
rows, columns = values.shape
else:
raise TypeError('Unsupported data format "%s"'%repr(attr.data_format))
@@ -174,7 +175,7 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
'''
Returns the configuration object for the data
- :returns: (TaurusConfiguration)
+ :returns: (taurus.core.taurusconfiguration.TaurusConfiguration)
'''
return self._attrConfig
@@ -182,7 +183,7 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
'''
Returns Status of the variable
- :returns: (taurus.core.AttrQuality)
+ :returns: (taurus.core.taurusbasetypes.AttrQuality)
'''
return self._attr.quality
@@ -244,7 +245,7 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
else:
raise TypeError('Unknown data type "%s"'%kind)
#reshape if needed
- if self._attr.data_format == taurus.core.DataFormat._1D:
+ if self._attr.data_format == DataFormat._1D:
table = table.flatten()
return table
@@ -295,9 +296,9 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
#refresh the write data (unless it is dirty)
wvalues=numpy.array(self._attr.w_value)
#reshape the table
- if self._attr.data_format == taurus.core.DataFormat._1D:
+ if self._attr.data_format == DataFormat._1D:
rows, columns = wvalues.size, 1
- elif self._attr.data_format == taurus.core.DataFormat._2D:
+ elif self._attr.data_format == DataFormat._2D:
rows, columns = wvalues.shape
else:
self.warning('unsupported data format %s'%str(val.data_format))
@@ -571,7 +572,7 @@ class TaurusValuesTable(TaurusWidget):
def getModelClass(self):
'''see :meth:`TaurusWidget.getModelClass`'''
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def setModel(self, model):
'''Reimplemented from :meth:`TaurusWidget.setModel`'''
@@ -598,10 +599,10 @@ class TaurusValuesTable(TaurusWidget):
model = self._tableView.model()
if model is None:
return
- if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic) and evt_value is not None:
+ if evt_type in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic) and evt_value is not None:
model.setAttr(evt_value)
self._tableView.resizeColumnsToContents()
- elif evt_type == taurus.core.TaurusEventType.Config:
+ elif evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
#force a read to set an attr
model.setAttr(self.getModelValueObj())
model.setConfig(evt_src)
@@ -721,7 +722,7 @@ class TaurusValuesTable(TaurusWidget):
def chooseModel(self):
'''shows a model chooser'''
from taurus.qt.qtgui.panel import TaurusModelChooser
- selectables=[taurus.core.TaurusElementType.Attribute]
+ selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute]
models, ok = TaurusModelChooser.modelChooserDlg(selectables=selectables, singleModel=True)
if ok and len(models)==1:
self.setModel(models[0])
diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py b/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
index e33b924..27e7a3a 100644
--- a/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
+++ b/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
@@ -38,7 +38,7 @@ from taurus.qt import Qt
import PyTango
import taurus.core
-from taurus.core.util import ATTRIBUTE_QUALITY_PALETTE
+from taurus.core.util.colors import ATTRIBUTE_QUALITY_PALETTE
from taurus.qt.qtgui.base import TaurusBaseWidget
class TaurusValuesTable_OLD(Qt.QTableWidget, TaurusBaseWidget):
@@ -66,13 +66,13 @@ class TaurusValuesTable_OLD(Qt.QTableWidget, TaurusBaseWidget):
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def getModelClass(self):
- return taurus.core.TaurusAttribute
+ return taurus.core.taurusattribute.TaurusAttribute
def isReadOnly(self):
return True
def handleEvent(self, src, evt_type, val):
- if evt_type in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic] and val is not None:
+ if evt_type in [taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic] and val is not None:
values=numpy.array(val.value)
#reshape the table
if val.data_format == PyTango.AttrDataFormat.SPECTRUM:
@@ -97,7 +97,7 @@ class TaurusValuesTable_OLD(Qt.QTableWidget, TaurusBaseWidget):
self.info('using deprecated event handling methods.')
model = self.getModelObj()
val = model.getValueObj()
- self.handleEvent(model, taurus.core.TaurusEventType.Change, val)
+ self.handleEvent(model, taurus.core.taurusbasetypes.TaurusEventType.Change, val)
def updateStyle(self):
if self.getShowQuality():
diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
index 6554f5d..6f7c830 100644
--- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
+++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
@@ -44,7 +44,7 @@ import taurus.qt.qtgui.panel
import taurus.qt.qtgui.taurusgui.paneldescriptionwizard
import taurus.qt.qtgui.input
import copy
-from taurus.core.util import etree
+from lxml import etree
from taurus.core.util import Enumeration
from taurus.qt.qtgui.util import ExternalAppAction
@@ -223,8 +223,8 @@ class ProjectPage(BasePage):
Qt.QObject.connect(self._projectDirBT, Qt.SIGNAL("clicked()"), self.onSelectDir)
def onSelectDir(self):
- dirname = Qt.QFileDialog.getExistingDirectory(self, 'Choose the project directory', self._projectDirLE.text())
- if dirname.isNull(): return
+ dirname = unicode(Qt.QFileDialog.getExistingDirectory(self, 'Choose the project directory', self._projectDirLE.text()))
+ if not dirname: return
self._projectDirLE.setText(dirname)
def validatePage(self):
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
index 88f8944..9d58953 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
@@ -142,15 +142,16 @@ pymca = ExternalApp(['pymca'])
#===============================================================================
# Macro execution configuration
-# (comment out or make MACRO_SERVER=None to skip creating a macro execution
-# infrastructure)
+# Comment out or make MACRO_SERVER=None or set MACRO_PANELS=False to skip
+# creating a macro execution infrastructure.
+# Give empty strings if you want to select the values manually in the GUI
#===============================================================================
#MACROSERVER_NAME =
#DOOR_NAME =
#MACROEDITORS_PATH =
#===============================================================================
-# Monitor widget (This is obsolete now, you can get the same result defining a
+# Monitor widget (This is *obsolete* now, you can get the same result defining a
# custom applet with classname='TaurusMonitorTiny')
#===============================================================================
# MONITOR = ['sys/tg_test/1/double_scalar_rww']
@@ -165,4 +166,11 @@ pymca = ExternalApp(['pymca'])
EXTRA_CATALOG_WIDGETS = [('PyQt4.Qt.QLineEdit',':/taurus.png'),
('PyQt4.Qt.QSpinBox','images/syn2.jpg'),
('PyQt4.Qt.QTextEdit','/tmp/kk.png'),
- ('PyQt4.Qt.QLabel',None)]
\ No newline at end of file
+ ('PyQt4.Qt.QLabel',None)]
+
+#===============================================================================
+# Define one or more embedded consoles in the GUI.
+# Possible items for console are 'ipython', 'tango', 'spock'
+# Note: This is still experimental
+#===============================================================================
+#CONSOLE = ['tango']
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
index d1f25e1..006c81e 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
@@ -80,8 +80,8 @@ pymca = ExternalApp(['pymca'])
#===============================================================================
# Macro execution configuration
-# (comment out or make MACRO_SERVER=None to skip creating a macro execution
-# infrastructure)
+# Comment out or make MACRO_SERVER=None or set MACRO_PANELS=False to skip
+# creating a macro execution infrastructure.
# Give empty strings if you want to select the values manually in the GUI
#===============================================================================
MACROSERVER_NAME = ''
diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
index 03dff88..c0a4b47 100644
--- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
+++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
@@ -44,7 +44,7 @@ from taurus.qt.qtgui.resource import getThemeIcon, getIcon
#from taurus.qt.qtgui.taurusgui.utils import PanelDescription
from taurus.core.tango.sardana import PlotType
from taurus.core.tango.sardana.pool import getChannelConfigs
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
class ChannelFilter(object):
def __init__(self,chlist):
@@ -276,13 +276,26 @@ class MacroBroker(Qt.QObject, TaurusBaseComponent):
else:
self.warning('Cannot create plot for %s', chname)
- self._updateTemporaryTrends1D(trends1d)
+ new1d,removed1d = self._updateTemporaryTrends1D(trends1d)
+ self.emit(Qt.SIGNAL("newShortMessage"),"Changed panels (%i new, %i removed)"%(len(new1d),len(removed1d)))
# self._updateTemporaryTrends2D(trends2d)
def _updateTemporaryTrends1D(self, trends1d):
+ '''adds necessary trend1D panels and removes no longer needed ones
+
+ :param trends1d: (dict) A dict whose keys are tuples of axes and
+ whose values are list of model names to plot
+
+ :returns: (tuple) two lists new,rm:new contains the names of the new
+ panels and rm contains the names of the removed panels
+ '''
+
from taurus.qt.qtgui.plot import TaurusTrend
- mainwindow = self.parent()
+ mainwindow = self.parent()
+ newpanels = []
for axes,plotables in trends1d.items():
+ if not axes:
+ continue
if axes not in self._trends1d:
w = TaurusTrend()
w.setXIsTime(False)
@@ -292,10 +305,17 @@ class MacroBroker(Qt.QObject, TaurusBaseComponent):
panel = mainwindow.createPanel(w, pname, registerconfig=False, permanent=False)
panel.raise_()
self._trends1d[axes] = pname
+ newpanels.append(pname)
else:
panel = mainwindow.getPanel(self._trends1d[axes])
flt = ChannelFilter(plotables)
panel.widget().onScanPlotablesFilterChanged(flt)
+
+ #remove trends that aren no longer configured
+ removedpanels = [name for axes,name in self._trends1d.items() if axes not in trends1d]
+ self.removeTemporaryPanels(removedpanels)
+ return newpanels,removedpanels
+
def _updateTemporaryTrends2D(self, trends2d):
try:
diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
index d888c94..03b4849 100644
--- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
+++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
@@ -42,7 +42,7 @@ from taurus.qt.qtgui.container import TaurusMainWindow
from taurus.qt.qtgui.taurusgui.utils import ExternalApp, PanelDescription, ToolBarDescription, AppletDescription
from taurus.qt.qtgui.panel import QDoubleListDlg
import taurus.qt.qtgui.resource
-from taurus.core.util import etree
+from lxml import etree
class AssociationDialog(Qt.QDialog):
@@ -221,9 +221,9 @@ class TaurusGui(TaurusMainWindow):
self.registerConfigProperty(self._getPermanentCustomPanels, self._setPermanentCustomPanels, 'permanentCustomPanels')
self.registerConfigProperty(self.getAllInstrumentAssociations, self.setAllInstrumentAssociations, 'instrumentAssociation')
-
- from taurus.TaurusCustomSettings import T_FORM_CUSTOM_WIDGET_MAP
- self.setCustomWidgetMap(T_FORM_CUSTOM_WIDGET_MAP)
+
+ from taurus import tauruscustomsettings
+ self.setCustomWidgetMap(getattr(tauruscustomsettings,'T_FORM_CUSTOM_WIDGET_MAP',{}))
#Create a global SharedDataManager
Qt.qApp.SDM = SharedDataManager(self)
@@ -382,9 +382,9 @@ class TaurusGui(TaurusMainWindow):
If None given, the user will be prompted
'''
if name is None:
- items = sorted(self.getPanelNames())
+ items = sorted([n for n,p in self.__panels.iteritems() if p.isCustom()])
name,ok = Qt.QInputDialog.getItem (self, "Remove Panel",
- "Panel to be removed.\n Important: you may want to save the perspective afterwards,\n and maybe remove the panel from other perspectives as well", items, 0, False)
+ "Panel to be removed (only custom panels can be removed).\n Important: you may want to save the perspective afterwards,\n and maybe remove the panel from other perspectives as well", items, 0, False)
if not ok:
return
name = unicode(name)
@@ -392,11 +392,17 @@ class TaurusGui(TaurusMainWindow):
self.debug('Cannot remove panel "%s" (not found)'%name)
return
panel = self.__panels.pop(name)
+ try:
+ panel.widget().setModel(None) #in case the widget is a Taurus one and does some cleaning when setting model to None
+ except:
+ pass
+
self.unregisterConfigurableItem(name, raiseOnError=False)
self.removeDockWidget(panel)
panel.setParent(None)
panel.setAttribute(Qt.Qt.WA_DeleteOnClose)
panel.close()
+ self.debug('Panel "%s" removed'%name)
def createPanel(self, widget, name, floating=False, registerconfig=True, custom=False,
permanent=False, icon=None, instrumentkey=None):
@@ -780,7 +786,8 @@ class TaurusGui(TaurusMainWindow):
#configure the macro infrastructure
MACROSERVER_NAME = getattr(conf,'MACROSERVER_NAME', self.__getVarFromXML(xmlroot,"MACROSERVER_NAME", None))
- if MACROSERVER_NAME is not None:
+ MACRO_PANELS = getattr(conf,'MACRO_PANELS', self.__getVarFromXML(xmlroot,"MACRO_PANELS", True))
+ if MACRO_PANELS and MACROSERVER_NAME is not None:# macro infrastructure will only be created if MACROSERVER_NAME is set
from taurus.qt.qtgui.taurusgui import MacroBroker
self.__macroBroker = MacroBroker(self)
if MACROSERVER_NAME:
@@ -1251,9 +1258,6 @@ def main():
if options.new_gui: #launch app settings wizard instead of taurusgui
from taurus.qt.qtgui.taurusgui import AppSettingsWizard
- Qt.QMessageBox.information(None, 'Alpha-quality warning',
- 'The Applications settings wizard is still under heavy development.\n Use it at your own risk and report any problems',
- Qt.QMessageBox.Ok)
wizard = AppSettingsWizard()
wizard.show()
sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py
index 4719e00..2a95f21 100644
--- a/lib/taurus/qt/qtgui/taurusgui/utils.py
+++ b/lib/taurus/qt/qtgui/taurusgui/utils.py
@@ -30,7 +30,7 @@ __docformat__ = 'restructuredtext'
from taurus.qt.qtgui.util import ExternalAppAction
from taurus.qt.qtgui.util import TaurusWidgetFactory
-from taurus.core.util import etree
+from lxml import etree
import os,sys
#this is here only for backwards compatibility. It should not be used at all
diff --git a/lib/taurus/qt/qtgui/tree/qtree.py b/lib/taurus/qt/qtgui/tree/qtree.py
index c0e635b..14cf443 100644
--- a/lib/taurus/qt/qtgui/tree/qtree.py
+++ b/lib/taurus/qt/qtgui/tree/qtree.py
@@ -35,32 +35,6 @@ from taurus.qt.qtgui.util import ActionFactory
from taurus.qt.qtgui.resource import getIcon, getThemeIcon
-class _NavigationLabel(Qt.QWidget):
- """Internal widget providing a navigation label & icon"""
-
- def __init__(self, pixmap, text, cont, index, parent=None):
- super(_NavigationLabel, self).__init__(parent)
- self._index = index
-
- l = Qt.QHBoxLayout()
- l.setContentsMargins(0,0,0,0)
- self.setLayout(l)
- if pixmap is not None:
- p = Qt.QLabel()
- p.setPixmap(pixmap)
- l.addWidget(p)
- self._label = Qt.QLabel(text)
- l.addWidget(self._label)
- if cont:
- l.addWidget(Qt.QLabel(u" \u00bb "))
-
- def label(self):
- return self._label
-
- def index(self):
- return self._index
-
-
class _NavigationWidget(Qt.QFrame):
"""Internal widget that provides a navigation path to be placed in a toolbar"""
@@ -68,9 +42,12 @@ class _NavigationWidget(Qt.QFrame):
super(_NavigationWidget, self).__init__(parent)
self._tree = treeWidget
self._toolbar = toolBarWidget
+ self._label = Qt.QLabel()
l = Qt.QHBoxLayout()
l.setContentsMargins(4, 0, 4, 0)
self.setLayout(l)
+ l.addWidget(self._label)
+
def treeWidget(self):
return self._tree
@@ -81,49 +58,19 @@ class _NavigationWidget(Qt.QFrame):
def toolBarWidget(self):
return self._toolbar
- def clean(self):
- l = self.layout()
- w = l.takeAt(0)
- while w is not None:
- w = w.widget()
- Qt.QObject.disconnect(w, Qt.SIGNAL("clicked()"), self.onGotoNode)
- w.setParent(None)
- w = l.takeAt(0)
-
def updateSelection(self, index):
- self.clean()
treeWidget = self.treeWidget()
- viewWidget = treeWidget.viewWidget()
- model = viewWidget.model()
src_model = treeWidget.getBaseQModel()
toolbar = self.toolBarWidget()
- rootPixmap = getThemeIcon("go-home").pixmap(toolbar.iconSize())
- rootText = u"Top"
-
- l = self.layout()
- n = 0
+ txt = u""
+
while index.isValid():
src_index = treeWidget._mapToSource(index)
name = src_model.pyData(src_index, Qt.Qt.DisplayRole)
- font = src_model.pyData(src_index, Qt.Qt.FontRole)
- tooltip = src_model.pyData(src_index, Qt.Qt.ToolTipRole)
- decoration = src_model.pyData(src_index, Qt.Qt.DecorationRole)
- pixmap = None
- if isinstance(decoration, Qt.QIcon):
- pixmap = decoration.pixmap(toolbar.iconSize())
- elif isinstance(decoration, Qt.QPixmap):
- pixmap = decoration
- button = _NavigationLabel(pixmap, name, n>0, Qt.QPersistentModelIndex(index))
- font = font or model.DftFont
- button.setFont(font)
- button.setToolTip(tooltip)
- Qt.QObject.connect(button.label(), Qt.SIGNAL("linkActivated(const QString &)"), self.onGotoNode)
- l.insertWidget(0, button)
+ txt = u" \u00bb " + name + txt
index = index.parent()
- n += 1
- rootButton = _NavigationLabel(rootPixmap, rootText, n>0, Qt.QPersistentModelIndex(index))
- rootButton.setFont(model.DftFont)
- l.insertWidget(0, rootButton)
+ txt = u"Root" + txt
+ self._label.setText(txt)
def onGotoNode(self, *args):
label = self.sender()
diff --git a/lib/taurus/qt/qtgui/tree/taurusdbtree.py b/lib/taurus/qt/qtgui/tree/taurusdbtree.py
index 76cfb3b..0667b44 100644
--- a/lib/taurus/qt/qtgui/tree/taurusdbtree.py
+++ b/lib/taurus/qt/qtgui/tree/taurusdbtree.py
@@ -30,7 +30,8 @@ __all__ = ["TaurusDbTreeWidget"]
__docformat__ = 'restructuredtext'
from taurus.qt import Qt
-from taurus.core import TaurusElementType, TaurusDatabase
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusdatabase import TaurusDatabase
from taurus.qt.qtcore.model import *
from taurus.qt.qtgui.base import TaurusBaseWidget
from taurus.qt.qtgui.resource import getThemeIcon, getElementTypeIcon, getElementTypeIconName
@@ -38,7 +39,7 @@ from taurustree import TaurusBaseTreeWidget
class TaurusDbTreeWidget(TaurusBaseTreeWidget):
"""A class:`taurus.qt.qtgui.tree.TaurusBaseTreeWidget` that connects to a
- :class:`taurus.core.TaurusDatabase` model. It can show the list of database
+ :class:`taurus.core.taurusdatabase.TaurusDatabase` model. It can show the list of database
elements in four different perspectives:
- device : a three level hierarchy of devices (domain/family/name)
diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
index 28bad87..781be60 100755
--- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
+++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
@@ -39,15 +39,15 @@ except:icons_dev_tree = None
from taurus.qt import Qt
import taurus.core
-from taurus.core.util import DEVICE_STATE_PALETTE,ATTRIBUTE_QUALITY_PALETTE
-from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
-from taurus.qt.qtgui.container import TaurusWidget
+from taurus.core.util.colors import DEVICE_STATE_PALETTE,ATTRIBUTE_QUALITY_PALETTE
+from taurus.core.util.containers import CaselessDict
+from taurus.core.tango.search import * #@TODO: Avoid implicit imports
from taurus.qt.qtcore.util.emitter import SingletonWorker
-from taurus.core.util import CaselessDict
from taurus.qt.qtcore.mimetypes import * #@TODO: Avoid implicit imports
from taurus.qt.qtcore.util import properties
from taurus.qt.qtcore.util.properties import djoin
-from taurus.core.tango.search import * #@TODO: Avoid implicit imports
+from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
+from taurus.qt.qtgui.container import TaurusWidget
TREE_ITEM_MIME_TYPE = 'application/x-qabstractitemmodeldatalist'
@@ -349,8 +349,14 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
def initConfig(self):
"""
Initializing the attributes that will be kept persitent as Qt settings.
- e.g.; for Filters property are created:
- self.filters / self._filters / self.setFilters / self.getFilters / self.resetFilters
+ e.g. for Filters property, the following attributes are created:
+
+ - self.filters
+ - self._filters
+ - self.setFilters
+ - self.getFilters
+ - self.resetFilters
+
"""
properties.set_property_methods(self,'Filters','QStringList',default='',
#setter = self.setFilters,
@@ -440,7 +446,7 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
return self._filters
def getModelClass(self):
- return list #taurus.core.TaurusDatabase
+ return list #taurus.core.taurusdatabase.TaurusDatabase
def setFilters(self,filters):
filters = split_model_list(filters)
@@ -1136,7 +1142,7 @@ class TaurusTreeNode(Qt.QTreeWidgetItem, TaurusBaseComponent):
return self.log_name + "(" + self.modelName + ")"
def getModelClass(self):
- return taurus.core.TaurusDevice
+ return taurus.core.taurusdevice.TaurusDevice
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# TaurusBaseComponent over writing
@@ -1234,7 +1240,7 @@ SearchEdit = TaurusDevTreeOptions
#####################################################################################
class ServerBrowser(TaurusDevTree):
- """ This class is used only when browsing by Server/Instance instead of Domain/Family/Member schema """
+ """ This class is used only when browsing by Server/Instance instead of Domain/Family/Member scheme """
def getDeviceDict(self,filters):
'''
diff --git a/lib/taurus/qt/qtgui/util/taurusactionfactory.py b/lib/taurus/qt/qtgui/util/taurusactionfactory.py
index 8ad22cc..88e35e1 100644
--- a/lib/taurus/qt/qtgui/util/taurusactionfactory.py
+++ b/lib/taurus/qt/qtgui/util/taurusactionfactory.py
@@ -29,15 +29,15 @@ __all__ = ["ActionFactory"]
__docformat__ = 'restructuredtext'
-import os
-import xml.dom.minidom
-
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
from taurus.qt import Qt
-import taurus.core.util
-import taurus.qt.qtgui.resource
+from taurus.qt.qtgui.resource import getThemeIcon
+
import taurusaction
-class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
+
+class ActionFactory(Singleton, Logger):
"""A Singleton class designed to provide Action related objects."""
def __init__(self):
@@ -46,7 +46,7 @@ class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
def init(self, *args):
"""Singleton instance initialization."""
- self.call__init__(taurus.core.util.Logger,'ActionFactory')
+ self.call__init__(Logger, 'ActionFactory')
self.actions = self.__getActions()
self.menus = self.__getMenus()
@@ -82,6 +82,7 @@ class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
return klass(widget)
def getNewMenu(self, widget, data):
+ import xml.dom.minidom
doc = xml.dom.minidom.parseString(data)
m_node = doc.childNodes[0]
return self.buildMenu(widget, m_node)
@@ -130,7 +131,7 @@ class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
action.setCheckable(True)
if icon is not None:
if isinstance(icon, (str, unicode)):
- icon = taurus.qt.qtgui.resource.getThemeIcon(icon)
+ icon = getThemeIcon(icon)
action.setIcon( icon )
if shortcut is not None:
action.setShortcut(shortcut)
diff --git a/lib/taurus/qt/qtgui/util/tauruscolor.py b/lib/taurus/qt/qtgui/util/tauruscolor.py
index 0ae148c..13f8b6b 100644
--- a/lib/taurus/qt/qtgui/util/tauruscolor.py
+++ b/lib/taurus/qt/qtgui/util/tauruscolor.py
@@ -29,12 +29,13 @@ __docformat__ = 'restructuredtext'
from taurus.qt import Qt
-import taurus.core.util
+from taurus.core.util.colors import ColorPalette, \
+ DEVICE_STATE_DATA, ATTRIBUTE_QUALITY_DATA
-class QtColorPalette(taurus.core.util.ColorPalette):
+class QtColorPalette(ColorPalette):
def __init__(self, dat, int_decoder_dict):
- taurus.core.util.ColorPalette.__init__(self, dat, int_decoder_dict)
+ ColorPalette.__init__(self, dat, int_decoder_dict)
self._qcolor_cache_fg = dict()
self._qcolor_cache_bg = dict()
self._qbrush_cache_fg = dict()
@@ -88,5 +89,5 @@ class QtColorPalette(taurus.core.util.ColorPalette):
import PyTango
-QT_DEVICE_STATE_PALETTE = QtColorPalette(taurus.core.util.DEVICE_STATE_DATA, PyTango.DevState)
-QT_ATTRIBUTE_QUALITY_PALETTE = QtColorPalette(taurus.core.util.ATTRIBUTE_QUALITY_DATA, PyTango.AttrQuality)
+QT_DEVICE_STATE_PALETTE = QtColorPalette(DEVICE_STATE_DATA, PyTango.DevState)
+QT_ATTRIBUTE_QUALITY_PALETTE = QtColorPalette(ATTRIBUTE_QUALITY_DATA, PyTango.AttrQuality)
diff --git a/lib/taurus/qt/qtgui/util/taurusscreenshot.py b/lib/taurus/qt/qtgui/util/taurusscreenshot.py
index 051fb5a..7f1ba02 100644
--- a/lib/taurus/qt/qtgui/util/taurusscreenshot.py
+++ b/lib/taurus/qt/qtgui/util/taurusscreenshot.py
@@ -32,9 +32,9 @@ __docformat__ = 'restructuredtext'
import time
import threading
import os.path
-from taurus.core.util import Logger
-from taurus.qt import Qt
+from taurus.qt import Qt
+from taurus.core.util.log import Logger
_LOGGER = None
@@ -44,6 +44,7 @@ def _getLogger():
_LOGGER = Logger('Grabber')
return _LOGGER
+
class GrabberThread(threading.Thread):
def __init__(self, widget, fileName, period):
diff --git a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
index 39a5886..20520e0 100644
--- a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
+++ b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
@@ -36,8 +36,8 @@ import os.path
from taurus.qt import Qt
-import taurus.core.util
-import taurus.qt.qtgui.base
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
def _getWidgetsOfType(widget, widgets, class_or_type_or_tuple):
@@ -64,7 +64,7 @@ def getWidgetsOfType(widget, class_or_type_or_tuple):
return widgets
-class TaurusWidgetFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
+class TaurusWidgetFactory(Singleton, Logger):
"""The TaurusWidgetFactory is a utility class that provides information
about all Qt widgets (Taurus and non Taurus) that are found in the
current taurus distribution.
@@ -85,7 +85,7 @@ class TaurusWidgetFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
def init(self, *args):
"""Singleton instance initialization."""
name = self.__class__.__name__
- self.call__init__(taurus.core.util.Logger, name)
+ self.call__init__(Logger, name)
path = os.path.dirname(os.path.abspath(__file__))
path, tail = os.path.split(path)
diff --git a/lib/taurus/qt/qtgui/util/tauruswidgettree.py b/lib/taurus/qt/qtgui/util/tauruswidgettree.py
new file mode 100644
index 0000000..d963451
--- /dev/null
+++ b/lib/taurus/qt/qtgui/util/tauruswidgettree.py
@@ -0,0 +1,229 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+##
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+##
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## Taurus 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.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+"""
+"""
+
+__all__ = ["QObjectRepresentation", "get_qobject_tree", "get_qobject_tree_str",
+ "TreeQObjectModel", "TreeQObjectWidget"]
+
+__docformat__ = 'restructuredtext'
+
+import weakref
+
+from taurus.qt import Qt
+
+from taurus.core.util.enumeration import Enumeration
+
+QObjectRepresentation = Enumeration('QObjectRepresentation',
+ ('ClassName', 'ObjectName', 'FullName'))
+
+def _build_qobjects_as_dict(qobject, container):
+
+ container[qobject] = childs = {}
+ for child in qobject.children():
+ if isinstance(child, Qt.QWidget):
+ _build_qobjects_as_dict(child, childs)
+
+def get_qobject_tree_as_dict(qobject=None):
+
+ if qobject is None:
+ app = Qt.QApplication.instance()
+ qobjects = app.topLevelWidgets()
+ else:
+ qobjects = [qobject]
+
+ tree = {}
+ for qobject in qobjects:
+ _build_qobjects_as_dict(qobject, tree)
+
+ return tree
+
+def _build_qobjects_as_list(qobject, container):
+
+ children = qobject.children()
+ node = qobject, []
+ container.append(node)
+ for child in children:
+ if isinstance(child, Qt.QWidget):
+ _build_qobjects_as_list(child, node[1])
+
+def get_qobject_tree_as_list(qobject=None):
+
+ if qobject is None:
+ app = Qt.QApplication.instance()
+ qobjects = app.topLevelWidgets()
+ else:
+ qobjects = [qobject]
+
+ tree = []
+ for qobject in qobjects:
+ _build_qobjects_as_list(qobject, tree)
+
+ return tree
+
+get_qobject_tree = get_qobject_tree_as_list
+
+def _get_qobject_str(qobject, representation):
+ if representation == QObjectRepresentation.ClassName:
+ return qobject.__class__.__name__
+ elif representation == QObjectRepresentation.ObjectName:
+ return str(qobject.objectName())
+ elif representation == QObjectRepresentation.FullName:
+ return '{0}("{1}")'.format(qobject.__class__.__name__, str(qobject.objectName()))
+ return str(qobject)
+
+def _build_qobject_str(node, str_tree, representation=QObjectRepresentation.ClassName):
+
+ qobject, children = node
+ str_node = _get_qobject_str(qobject, representation)
+ str_children = []
+ str_tree.append((str_node, str_children))
+ for child in children:
+ _build_qobject_str(child, str_children, representation=representation)
+
+def get_qobject_tree_str(qobject=None, representation=QObjectRepresentation.ClassName):
+
+ tree, str_tree = get_qobject_tree(qobject=qobject), []
+ for e in tree:
+ _build_qobject_str(e, str_tree, representation=representation)
+ return str_tree
+
+
+from taurus.qt.qtgui.tree.qtree import QBaseTreeWidget
+from taurus.qt.qtcore.model import TaurusBaseModel, TaurusBaseTreeItem
+
+QR = QObjectRepresentation
+
+
+class TreeQObjecttItem(TaurusBaseTreeItem):
+
+ def __init__(self, model, data, parent = None):
+ TaurusBaseTreeItem.__init__(self, model, data, parent=parent)
+ if data is not None:
+ self.qobject = weakref.ref(data)
+ dat = _get_qobject_str(data, QR.ClassName), \
+ _get_qobject_str(data, QR.ObjectName)
+ self.setData(0, dat)
+
+
+class TreeQObjectModel(TaurusBaseModel):
+
+ ColumnNames = "Class", "Object name"
+ ColumnRoles = (QR.ClassName,), QR.ObjectName
+
+ def __init__(self, parent=None, data=None):
+ TaurusBaseModel.__init__(self, parent=parent, data=data)
+
+# def createNewRootItem(self):
+# return TreeQObjecttItem(self, self.ColumnNames)
+
+ def role(self, column, depth=0):
+ if column == 0:
+ return self.ColumnRoles[column][0]
+ return self.ColumnRoles[column]
+
+ def roleIcon(self, taurus_role):
+ return Qt.QIcon()
+
+ def roleSize(self, taurus_role):
+ return Qt.QSize(300, 70)
+
+ def roleToolTip(self, role):
+ return "widget information"
+
+ @staticmethod
+ def _build_qobject_item(model, parent, node):
+ qobject, children = node
+ item = TreeQObjecttItem(model, qobject, parent)
+ parent.appendChild(item)
+ for child in children:
+ TreeQObjectModel._build_qobject_item(model, item, child)
+
+ def setupModelData(self, data):
+ if data is None:
+ return
+ rootItem = self._rootItem
+ for node in data:
+ TreeQObjectModel._build_qobject_item(self, rootItem, node)
+
+
+class TreeQObjectWidget(QBaseTreeWidget):
+
+ KnownPerspectives = {
+ "Default" : {
+ "label" : "Default perspecive",
+ "tooltip" : "QObject tree view",
+ "icon" : "",
+ "model" : [TreeQObjectModel],
+ },
+ }
+
+ DftPerspective = "Default"
+
+
+ def __init__(self, parent=None, designMode=False, with_navigation_bar=True,
+ with_filter_widget=True, perspective=None, proxy=None,
+ qobject_root=None):
+ QBaseTreeWidget.__init__(self, parent, designMode=designMode,
+ with_navigation_bar=with_navigation_bar,
+ with_filter_widget=with_filter_widget,
+ perspective=perspective, proxy=proxy)
+ qmodel = self.getQModel()
+ qmodel.setDataSource(get_qobject_tree(qobject=qobject_root))
+
+
+def build_gui():
+ mw = Qt.QMainWindow()
+ mw.setObjectName("main window")
+ w = Qt.QWidget()
+ w.setObjectName("central widget")
+ mw.setCentralWidget(w)
+ l = Qt.QVBoxLayout()
+ w.setLayout(l)
+ l1 = Qt.QLabel("H1")
+ l1.setObjectName("label 1")
+ l.addWidget(l1)
+ l2 = Qt.QLabel("H2")
+ l2.setObjectName("label 2")
+ l.addWidget(l2)
+ mw.show()
+ return mw
+
+
+def main():
+ from taurus.qt.qtgui.application import TaurusApplication
+ app = TaurusApplication()
+
+ w = build_gui()
+ tree = TreeQObjectWidget(qobject_root=w)
+ tree.show()
+ #import pprint
+ #pprint.pprint(get_qobject_tree_str())
+ w.dumpObjectTree()
+ app.exec_()
+
+if __name__ == "__main__":
+ main()
diff --git a/lib/taurus/qt/taurusqtoptions.py b/lib/taurus/qt/taurusqtoptions.py
index 2155d8d..e1cee64 100644
--- a/lib/taurus/qt/taurusqtoptions.py
+++ b/lib/taurus/qt/taurusqtoptions.py
@@ -38,8 +38,8 @@ QT_USE_API2 = True
def get_logger():
- import taurus.core.util
- return taurus.core.util.Logger('TaurusQt')
+ import taurus.core.util.log
+ return taurus.core.util.log.Logger('TaurusQt')
def prepare_pyqt():
diff --git a/lib/taurus/TaurusCustomSettings.py b/lib/taurus/tauruscustomsettings.py
similarity index 86%
copy from lib/taurus/TaurusCustomSettings.py
copy to lib/taurus/tauruscustomsettings.py
index d22dfdb..9c3686b 100644
--- a/lib/taurus/TaurusCustomSettings.py
+++ b/lib/taurus/tauruscustomsettings.py
@@ -45,4 +45,12 @@ T_FORM_CUSTOM_WIDGET_MAP = \
'TwoDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
'IORegister':('taurus.qt.qtgui.extra_pool.PoolIORegisterTV',(),{})
}
-
+
+# Lightweight imports:
+# True enables delayed imports (may break older code).
+# False (or commented out) for backwards compatibility
+LIGHTWEIGHT_IMPORTS = False
+
+# Extra Taurus schemes. You can add a list of modules to be loaded for
+# providing support to new schemes
+# EXTRA_SCHEME_MODULES = ['myownschememodule']
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/panel/ui/__init__.py b/lib/taurus/web/__init__.py
similarity index 96%
copy from lib/taurus/qt/qtgui/panel/ui/__init__.py
copy to lib/taurus/web/__init__.py
index 208f8eb..836f149 100644
--- a/lib/taurus/qt/qtgui/panel/ui/__init__.py
+++ b/lib/taurus/web/__init__.py
@@ -24,6 +24,6 @@
#############################################################################
"""
-__init__.py:
"""
+__docformat__ = "restructuredtext"
\ No newline at end of file
diff --git a/lib/taurus/web/examples/tornado/countclient.html b/lib/taurus/web/examples/tornado/countclient.html
new file mode 100644
index 0000000..ecccf2f
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/countclient.html
@@ -0,0 +1,130 @@
+<!doctype html>
+<html>
+<head>
+ <title>Taurus</title>
+ <link rel="shortcut icon" href="static/favicon.ico" type="image/x-icon">
+
+ <!-- JQuery (local) -->
+ <script type="text/javascript" src="static/js/jquery.js"></script>
+ <script type="text/javascript" src="static/js/jquery-ui.js"></script>
+ <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link>
+ <!-- JQuery (remote: google CDN) -->
+ <!--
+ <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
+ <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>
+ -->
+
+ <!-- JSXGraph (local) -->
+ <script type="text/javascript" src="static/js/jsxgraphcore.js"></script>
+ <script type="text/javascript" src="static/js/GeonextReader.js"></script>
+ <link type="text/css" href="static/css/jsxgraph.css" rel="stylesheet"></link>
+ <!-- JSXGraph (Remote) -->
+ <!--
+ <link rel="stylesheet" type="text/css" href="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css" />
+ <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore.js"></script>
+ <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/GeonextReader.js"></script>
+ -->
+
+ <!-- Dojo (local) -->
+ <script src="static/js/dojo/dojo.js" data-dojo-config="parseOnLoad: true, async: true"></script>
+
+ <!-- Dojo (remote: google CDN) -->
+ <!--<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.js" data-dojo-config="parseOnLoad: true, async: true"></script>-->
+
+ <!-- taurus (local) -->
+ <link type="text/css" href="static/css/taurus.css" rel="stylesheet"></link>
+
+
+ <!-- Application -->
+ <script type="text/javascript" src="static/js/countclient.js"></script>
+ <style>
+ body {
+ font-size: 62.5%;
+ }
+
+ div.taurus-demo {
+ padding:12px;
+ font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif";
+ }
+ div.taurus-demo h3.docs { clear:left; font-size:12px; font-weight:normal; padding:0 0 1em; margin:0; }
+
+ .toggler { width: 400px; height: 200px; }
+ #tangotest-attributes { width: 240px; height: 135px; padding: 0.4em; position: relative; }
+ #tangotest-attributes h3 { margin: 0; padding: 0.4em; text-align: center; }
+
+ div.motor-attributes {
+ clear:both;
+ padding:12px;
+ font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif";
+ font-size: 1.3em;
+ line-height: 1.4em;
+ width: 520px;
+ }
+ </style>
+</head>
+
+<body>
+ <h1>Taurus</h1>
+ <p>
+ <table border="0">
+ <tr>
+ <td><div id="plot" class="jxgbox" style="width:380px; height:380px;"></div></td>
+ <td>
+ <div id="gauge01"
+ data-taurus-model="motor/motctrl01/1/position"
+ data-taurus-controller="Gauge"
+ style="width:260px; height:260px"></div>
+ </script>
+ </td>
+ <td><div id="geonext" class="jxgbox" style="width:380px; height:380px;"></div></td>
+ </tr>
+ </table>
+ </p>
+ <div class="taurus-demo">
+ <p>
+ <button id="show-tangotest">Show TangoTest</button>
+ </p>
+
+ <div id="motor-attributes" title="Mot01" class="motor-attributes">
+ <table border="0" cellpadding="2" cellspacing="0">
+ <tr>
+ <td data-taurus-model="motor/motctrl01/1/position?configuration=label"></td>
+ <td><div data-taurus-model="motor/motctrl01/1/position"></div></td>
+ <td><input type="number" data-taurus-model="motor/motctrl01/1/position" style="background-color:white;"></input></td>
+ <td><div data-taurus-model="motor/motctrl01/1/position?configuration=unit"></div></td>
+ </tr>
+ <tr>
+ <td><div data-taurus-model="motor/motctrl01/2/velocity?configuration=label"></div></td>
+ <td><div data-taurus-model="motor/motctrl01/2/velocity"></div></td>
+ <td><div data-taurus-model="motor/motctrl01/2/velocity?configuration=unit"></div></td>
+ </tr>
+ <tr>
+ <td><div data-taurus-model="motor/motctrl01/3/backlash?configuration=label"></div></td>
+ <td><div data-taurus-model="motor/motctrl01/3/backlash"></div></td>
+ <td><div data-taurus-model="motor/motctrl01/3/backlash?configuration=unit"></div></td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="toggler">
+ <div id="tangotest-attributes" class="ui-widget-content ui-corner-all">
+ <h3 class="ui-widget-header ui-corner-all">TangoTest</h3>
+ <table border="0" cellpadding="2" cellspacing="0">
+ <tr>
+ <td><div data-taurus-model="sys/tg_test/1/double_scalar?configuration=label"></div></td>
+ <td><div data-taurus-model="sys/tg_test/1/double_scalar"></div></td>
+ <td><div data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit"></div></td>
+ </tr>
+ <tr>
+ <td><div data-taurus-model="sys/tg_test/1/short_scalar?configuration=label"></div></td>
+ <td><div data-taurus-model="sys/tg_test/1/short_scalar"></div></td>
+ <td><div data-taurus-model="sys/tg_test/1/short_scalar?configuration=unit"></div></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </div>
+
+
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/countserver.py b/lib/taurus/web/examples/tornado/countserver.py
new file mode 100644
index 0000000..0058bd3
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/countserver.py
@@ -0,0 +1,148 @@
+import os.path
+
+from tornado.web import Application, RequestHandler
+from tornado.websocket import WebSocketHandler
+from tornado.escape import json_encode, json_decode
+
+from taurus import Database, Device, Attribute, Configuration, Object
+from taurus.core import TaurusDatabase, TaurusDevice, TaurusAttribute, TaurusConfiguration
+from taurus.core import AttrQuality, TaurusEventType
+from taurus.core import AttributeNameValidator, ConfigurationNameValidator
+from taurus.core.util.colors import ATTRIBUTE_QUALITY_PALETTE
+
+class MainHandler(RequestHandler):
+ def get(self):
+ self.render("countclient.html")
+
+
+class TestHandler(RequestHandler):
+ def get(self):
+ self.render("test.html")
+
+
+class TaurusWebAttribute(object):
+
+ TemplateDiv = """<div style="font-size: 24pt;{style}">{value}</div>"""
+
+ def __init__(self, ws, name):
+ self.name = name
+ self.ws = ws
+ self.attribute.addListener(self)
+
+ @property
+ def attribute(self):
+ return Attribute(self.name)
+
+ def eventReceived(self, evt_src, evt_type, evt_value):
+ modelObj = evt_src
+ data = {}
+ if evt_type == TaurusEventType.Error:
+ data['css'] = {'color':'white', 'background-color' : 'red'}
+ data['html'] = str(evt_value)
+ else:
+ if evt_type == TaurusEventType.Config:
+ modelObj = evt_src.getParentObj()
+ data['title'] = evt_src.description
+ valueObj = modelObj.getValueObj()
+ value = valueObj.value
+ quality = valueObj.quality
+ bg, fg = ATTRIBUTE_QUALITY_PALETTE.rgb_pair(quality)
+ bg, fg = "rgb{0}".format(bg), "rgb{0}".format(fg)
+ data['css'] = {'color': fg, 'background-color' : bg}
+ data['html'] = modelObj.displayValue(value)
+ data['value'] = value
+# data['css']['font-size'] = "24pt";
+ data['model'] = modelObj.getNormalName()
+ json_data = json_encode(data)
+ self.write_message(json_data)
+
+ def write_message(self, message):
+ return self.ws.write_message(message)
+
+ def clear(self):
+ self.attribute.removeListener(self)
+
+
+class TaurusWebConfiguration(object):
+
+ TemplateDiv = """<div style="font-size: 24pt;{style}">{value}</div>"""
+
+ def __init__(self, ws, name):
+ self.name = name
+ self.param = ConfigurationNameValidator().getParams(name)['configparam']
+ self.ws = ws
+ self.configuration.addListener(self)
+
+ @property
+ def configuration(self):
+ return Configuration(self.name)
+
+ def eventReceived(self, evt_src, evt_type, evt_value):
+ modelObj = evt_src
+ data = {}
+ if evt_type == TaurusEventType.Error:
+ data['css'] = {'color':'white', 'background-color' : 'red'}
+ data['html'] = str(evt_value)
+ else:
+ data['css'] = {}
+ data['html'] = getattr(modelObj, self.param)
+ data['title'] = modelObj.description
+
+ # data['css']['font-size'] = "24pt";
+ data['model'] = self.name
+ json_data = json_encode(data)
+ self.write_message(json_data)
+
+ def write_message(self, message):
+ return self.ws.write_message(message)
+
+ def clear(self):
+ self.configuration.removeListener(self)
+
+
+class TaurusSocket(WebSocketHandler):
+
+ def open(self):
+ self.models = set()
+
+ def on_message(self, json_data):
+ data = json_decode(json_data)
+ if 'models' in data:
+ self.clear_models()
+ model_names = set(data['models'])
+ for model_name in model_names:
+ model_name = str(model_name)
+ if AttributeNameValidator().isValid(model_name):
+ web_model = TaurusWebAttribute(self, model_name)
+ elif ConfigurationNameValidator().isValid(model_name):
+ web_model = TaurusWebConfiguration(self, model_name)
+ else:
+ continue
+ self.models.add(web_model)
+
+ def on_close(self):
+ self.clear_models()
+
+ def clear_models(self):
+ for model in self.models:
+ model.clear()
+ self.models.clear()
+
+def main():
+ local_path = os.path.dirname(__file__)
+ static_path= os.path.join(local_path, 'static')
+ handlers = [ (r"/", MainHandler),
+ (r"/test", TestHandler),
+ (r"/taurus", TaurusSocket), ]
+ application = Application(handlers, static_path=static_path)
+ application.listen(8888)
+ print "Starting..."
+ try:
+ import tornado.ioloop
+ tornado.ioloop.IOLoop.instance().start()
+ print "Finished"
+ except KeyboardInterrupt:
+ print "Finished by Keyboard interrupt (Ctrl+C)"
+
+if __name__ == "__main__":
+ main()
diff --git a/lib/taurus/web/examples/tornado/demo.html b/lib/taurus/web/examples/tornado/demo.html
new file mode 100644
index 0000000..a2c5cde
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<html>
+<head>
+ <title>Taurus WEB demo</title>
+ <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+ <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+</head>
+<body>
+ <ul>
+ <li><a href="demo1.html">Demo 1</a></li>
+ <li><a href="demo2.html">Demo 2</a></li>
+ <li><a href="demo3.html">Demo 3</a></li>
+ <li><a href="demo4.html">Demo 4</a></li>
+ </ul>
+</body>
+</html>
diff --git a/lib/taurus/core/taurusexception.py b/lib/taurus/web/examples/tornado/demo.py
similarity index 62%
copy from lib/taurus/core/taurusexception.py
copy to lib/taurus/web/examples/tornado/demo.py
index ad3e9ae..04d265b 100644
--- a/lib/taurus/core/taurusexception.py
+++ b/lib/taurus/web/examples/tornado/demo.py
@@ -23,21 +23,32 @@
##
#############################################################################
-"""This module contains the taurus base exception classes"""
-
-__all__ = ["TaurusException", "DoubleRegistration"]
+"""
+"""
__docformat__ = "restructuredtext"
-class TaurusException(Exception):
+import os.path
+
+from taurus.web.taurustornado import RequestHandler
+from taurus.web.taurustornado import start, get_default_handlers
+
+class MainPageHandler(RequestHandler):
+ def get(self):
+ self.render("demo.html")
- def __init__(self, description, code = None):
- #Exception.__init__(self, description, code)
- self.code = code
- self.description = description
+class DemoPageHandler(RequestHandler):
- def __str__(self):
- return str(self.description)
+ def get(self, page):
+ self.render(page)
+
+
+def main():
+ local_path = os.path.dirname(__file__)
+ static_path = os.path.join(local_path, 'static')
+ handlers = [ (r"/", MainPageHandler), (r"/(demo.*)", DemoPageHandler)] + get_default_handlers()
-class DoubleRegistration(TaurusException):
- pass
+ start(handlers=handlers, port=8888, static_path=static_path, debug=True)
+
+if __name__ == "__main__":
+ main()
diff --git a/lib/taurus/web/examples/tornado/demo1.html b/lib/taurus/web/examples/tornado/demo1.html
new file mode 100644
index 0000000..5c1edf8
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo1.html
@@ -0,0 +1,189 @@
+<!doctype html>
+<html>
+<head>
+ <title>Taurus WEB demo 1</title>
+ <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+
+ <!-- JQuery -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+ <!-- Google CDN -->
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+ <!-- So far I don't need JQuery UI in this example so keep it commented -->
+ <!-- JQuery UI -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+ <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+ <!-- Google CDN -->
+ <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+ <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+
+ <!-- So far I don't need Highcharts in this example so keep it commented -->
+ <!-- Highcharts -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+
+ <!-- taurus -->
+ <!-- local -->
+ <script type="text/javascript" src="taurus/js/taurus.js"></script>
+ <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+
+ <!-- Application -->
+ <script type="text/javascript" src="static/js/demo.js"></script>
+ <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+ <script type="text/javascript" src="static/js/demo1.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 1 - simple Tango attributes</div>
+<br/>
+<table class="MS Panel">
+ <tr>
+ <!-- left column -->
+ <td>
+ <p><table class="Form">
+ <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Sardana motor 01</td></tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/position" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/velocity" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/acceleration" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/state" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/status" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=unit" /></td>
+ </tr>
+ </table></p>
+ <p><table class="Form">
+ <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td></tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+ </tr>
+ </table></p>
+ </td>
+
+ <!-- right column -->
+ <td>
+ <table class="Panel">
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">MSPD</td>
+ <td class="MSFETitle">FE04</td>
+ <td class="MSIDTitle">SCW30</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">MISTRAL</td>
+ <td class="MSFETitle">FE09</td>
+ <td class="MSIDTitle">BEND</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">NCD</td>
+ <td class="MSFETitle">FE11</td>
+ <td class="MSIDTitle">IVU21</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/short_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">XALOC</td>
+ <td class="MSFETitle">FE13</td>
+ <td class="MSIDTitle">IVU21</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">CLAESS</td>
+ <td class="MSFETitle">FE22</td>
+ <td class="MSIDTitle">MPW80</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/float_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">CIRCE</td>
+ <td class="MSFETitle">FE24</td>
+ <td class="MSIDTitle">EU62</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/ulong_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">BOREAS</td>
+ <td class="MSFETitle">FE29</td>
+ <td class="MSIDTitle">EU71</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ </tr>
+
+ </table>
+ </td>
+ </tr>
+</table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/demo2.html b/lib/taurus/web/examples/tornado/demo2.html
new file mode 100644
index 0000000..277ae89
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo2.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+<head>
+ <title>Taurus WEB demo 2</title>
+ <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+
+ <!-- JQuery -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+ <!-- Google CDN -->
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+ <!-- So far I don't need JQuery UI in this example so keep it commented -->
+ <!-- JQuery UI -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+ <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+ <!-- Google CDN -->
+ <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+ <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+
+ <!-- So far I don't need Highcharts in this example so keep it commented -->
+ <!-- Highcharts -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+ <!-- Highcharts.com -->
+ <script src="http://code.highcharts.com/highcharts.js"></script>
+
+ <!-- Necessary style (font) for gauge -->
+ <link href='http://fonts.googleapis.com/css?family=Squada+One' rel='stylesheet' type='text/css'>
+
+ <!-- taurus -->
+ <!-- local -->
+ <script type="text/javascript" src="taurus/js/taurus.js"></script>
+ <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+
+ <!-- Application -->
+ <script type="text/javascript" src="static/js/demo.js"></script>
+ <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+ <script type="text/javascript" src="static/js/demo2.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 2 - simple highcharts</div>
+<br/>
+<table><tr>
+ <td>
+ <table class="Form">
+ <tr>
+ <td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+ </tr>
+ </table>
+ </td>
+ <td>
+ <div id="highcharts-canvas" style="display:inline; width:600px; height: 300px; margin: 0 auto;"></div>
+ </td>
+</tr></table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/demo3.html b/lib/taurus/web/examples/tornado/demo3.html
new file mode 100644
index 0000000..c6e5339
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo3.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+<head>
+ <title>Taurus WEB demo 2</title>
+ <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+
+ <!-- JQuery -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+ <!-- Google CDN -->
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+ <!-- So far I don't need JQuery UI in this example so keep it commented -->
+ <!-- JQuery UI -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+ <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+ <!-- Google CDN -->
+ <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+ <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+
+ <!-- So far I don't need Highcharts in this example so keep it commented -->
+ <!-- Highcharts -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+ <!-- Highcharts.com -->
+ <script src="http://code.highcharts.com/highcharts.js"></script>
+
+ <!-- Necessary style (font) for gauge -->
+ <link href='http://fonts.googleapis.com/css?family=Squada+One' rel='stylesheet' type='text/css'>
+
+ <!-- taurus -->
+ <!-- local -->
+ <script type="text/javascript" src="taurus/js/taurus.js"></script>
+ <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+
+ <!-- Application -->
+ <script type="text/javascript" src="static/js/demo.js"></script>
+ <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+ <script type="text/javascript" src="static/js/demo3.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 2 - simple highcharts</div>
+<br/>
+<table><tr>
+ <td>
+ <table class="Form">
+ <tr>
+ <td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+ </tr>
+ </table>
+ </td>
+ <td>
+ <div id="highcharts-canvas" style="display:inline; width:600px; height: 300px; margin: 0 auto;"></div>
+ </td>
+</tr></table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/demo4.html b/lib/taurus/web/examples/tornado/demo4.html
new file mode 100644
index 0000000..4b55b24
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo4.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html>
+<head>
+ <title>Taurus WEB demo 1</title>
+ <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+
+ <!-- JQuery -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+ <!-- Google CDN -->
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+ <!-- So far I don't need JQuery UI in this example so keep it commented -->
+ <!-- JQuery UI -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+ <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+ <!-- Google CDN -->
+ <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+ <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+
+ <!-- So far I don't need Highcharts in this example so keep it commented -->
+ <!-- Highcharts -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+
+ <!-- taurus -->
+ <!-- local -->
+ <script type="text/javascript" src="taurus/js/taurus.js"></script>
+ <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+
+ <!-- Application -->
+ <script type="text/javascript" src="static/js/demo.js"></script>
+ <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+ <script type="text/javascript" src="static/js/demo4.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 4 - Tango attribute arrays</div>
+<br/>
+<table class="Form">
+ <tr>
+ <td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_spectrum_ro?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_spectrum_ro" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_spectrum_ro?configuration=unit" /></td>
+ </tr>
+</table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/machinestatus.html b/lib/taurus/web/examples/tornado/machinestatus.html
new file mode 100644
index 0000000..03201df
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/machinestatus.html
@@ -0,0 +1,184 @@
+<!doctype html>
+<html>
+<head>
+ <title>Taurus WEB demo</title>
+ <link rel="shortcut icon" href="static/favicon.ico" type="image/x-icon">
+
+ <!-- JQuery -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+ <!-- Google CDN -->
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+ <!-- So far I don't need JQuery UI in this example so keep it commented -->
+ <!-- JQuery UI -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+ <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+ <!-- Google CDN -->
+ <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+ <!-- MediaTemple CDN -->
+ <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+ <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+
+ <!-- So far I don't need Highcharts in this example so keep it commented -->
+ <!-- Highcharts -->
+ <!-- local -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+ <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+
+ <!-- taurus -->
+ <!-- local -->
+ <script type="text/javascript" src="taurus/js/taurus.js"></script>
+ <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+
+ <!-- Application -->
+ <script type="text/javascript" src="static/js/machinestatus.js"></script>
+ <link type="text/css" href="static/css/machinestatus.css" rel="stylesheet"></link>
+
+</head>
+
+<body class="MS">
+<table class="MS Panel">
+ <tr>
+ <!-- left column -->
+ <td>
+ <p><table class="Form">
+ <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Sardana motor 01</td></tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/positions" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/velocity" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/acceleration" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/state" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/status" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=unit" /></td>
+ </tr>
+ </table></p>
+ <p><table class="Form">
+ <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td></tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+ </tr>
+ <tr>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+ <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+ </tr>
+ </table></p>
+ </td>
+
+ <!-- right column -->
+ <td>
+ <table class="Panel">
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">MSPD</td>
+ <td class="MSFETitle">FE04</td>
+ <td class="MSIDTitle">SCW30</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">MISTRAL</td>
+ <td class="MSFETitle">FE09</td>
+ <td class="MSIDTitle">BEND</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">NCD</td>
+ <td class="MSFETitle">FE11</td>
+ <td class="MSIDTitle">IVU21</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/short_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">XALOC</td>
+ <td class="MSFETitle">FE13</td>
+ <td class="MSIDTitle">IVU21</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">CLAESS</td>
+ <td class="MSFETitle">FE22</td>
+ <td class="MSIDTitle">MPW80</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/float_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">CIRCE</td>
+ <td class="MSFETitle">FE24</td>
+ <td class="MSIDTitle">EU62</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/ulong_scalar" /></td>
+ </tr>
+
+ <tr>
+ <td class="MSBLTitle" rowspan="2">BOREAS</td>
+ <td class="MSFETitle">FE29</td>
+ <td class="MSIDTitle">EU71</td>
+ </tr>
+ <tr>
+ <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+ <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+ </tr>
+
+ </table>
+ </td>
+ </table>
+</body>
+</html>
diff --git a/lib/taurus/core/taurusexception.py b/lib/taurus/web/examples/tornado/machinestatus.py
similarity index 67%
copy from lib/taurus/core/taurusexception.py
copy to lib/taurus/web/examples/tornado/machinestatus.py
index ad3e9ae..161ef5c 100644
--- a/lib/taurus/core/taurusexception.py
+++ b/lib/taurus/web/examples/tornado/machinestatus.py
@@ -23,21 +23,26 @@
##
#############################################################################
-"""This module contains the taurus base exception classes"""
-
-__all__ = ["TaurusException", "DoubleRegistration"]
+"""
+"""
__docformat__ = "restructuredtext"
-class TaurusException(Exception):
+import os.path
- def __init__(self, description, code = None):
- #Exception.__init__(self, description, code)
- self.code = code
- self.description = description
-
- def __str__(self):
- return str(self.description)
+from taurus.web.taurustornado import RequestHandler
+from taurus.web.taurustornado import start, get_default_handlers
+
+class MainHandler(RequestHandler):
+ def get(self):
+ self.render("machinestatus.html")
+
+def main():
+ local_path = os.path.dirname(__file__)
+ static_path = os.path.join(local_path, 'static')
+ handlers = [ (r"/", MainHandler) ] + get_default_handlers()
-class DoubleRegistration(TaurusException):
- pass
+ start(handlers=handlers, static_path=static_path, debug=True)
+
+if __name__ == "__main__":
+ main()
diff --git a/lib/taurus/web/examples/tornado/static/css/demo.css b/lib/taurus/web/examples/tornado/static/css/demo.css
new file mode 100644
index 0000000..a0056bf
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/css/demo.css
@@ -0,0 +1,83 @@
+
+.MS { color: #FFFFFF;
+ font-family: Sans-serif; }
+
+body.MS { background-color: #444444; }
+
+table.MS { }
+
+.Panel { width: 100%;
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 5px;
+ border-color: white;
+ padding: 4px; }
+
+.PanelMin {
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 5px;
+ border-color: white;
+ padding: 4px; }
+
+.Form {
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 5px;
+ border-color: white;
+ padding: 4px;
+ background-image: linear-gradient(to bottom right, #CCCCCC 0%, #008BCC 100%);
+}
+
+.PanelUp { border-top-width: 1px;
+ border-left-width: 1px;
+ border-right-width: 1px;
+ border-top-style :solid;
+ border-left-style: solid;
+ border-right-style: solid;
+ border-bottom-style: none;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ border-color: whitesmoke;
+ margin: 2px;
+ padding: 4px; }
+
+.MSBLTitle { font-family: arial, serif;
+ font-size : xx-large;
+ font-weight : bold;
+ text-align : left; }
+
+.MSFETitle { font-family: arial, serif;
+ font-size : x-large;
+ font-weight : normal;
+ text-align : left; }
+
+.MSIDTitle { font-family: arial, serif;
+ font-size : x-large;
+ font-weight : normal;
+ text-align : left; }
+
+.Label {
+ font-weight : normal;
+ font-family : monospace;
+ text-align : right;
+ vertical-align: middle; }
+
+.FELabel { font-size : large;
+ font-weight : normal;
+ font-family : monospace;
+ text-align : center;
+ vertical-align: middle; }
+
+.IDLabel { font-size : large;
+ font-weight : normal;
+ font-family : monospace;
+ text-align : right;
+ vertical-align: middle; }
+
+.BorderLabel { border-width:0px;
+ border-style:solid;
+ border-radius: 2px;
+ margin: auto;
+ padding: 4px; }
+
diff --git a/lib/taurus/web/examples/tornado/static/css/machinestatus.css b/lib/taurus/web/examples/tornado/static/css/machinestatus.css
new file mode 100644
index 0000000..1a91ea5
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/css/machinestatus.css
@@ -0,0 +1,76 @@
+
+.MS { color: #FFFFFF;
+ font-family: Sans-serif; }
+
+body.MS { background-color: #444444; }
+
+table.MS { }
+
+.Panel { width: 100%;
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 5px;
+ border-color: white;
+ padding: 4px; }
+
+.Form {
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 5px;
+ border-color: white;
+ padding: 4px;
+ background-image: linear-gradient(to bottom right, #CCCCCC 0%, #008BCC 100%);
+}
+
+.PanelUp { border-top-width: 1px;
+ border-left-width: 1px;
+ border-right-width: 1px;
+ border-top-style :solid;
+ border-left-style: solid;
+ border-right-style: solid;
+ border-bottom-style: none;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ border-color: whitesmoke;
+ margin: 2px;
+ padding: 4px; }
+
+.MSBLTitle { font-family: arial, serif;
+ font-size : xx-large;
+ font-weight : bold;
+ text-align : left; }
+
+.MSFETitle { font-family: arial, serif;
+ font-size : x-large;
+ font-weight : normal;
+ text-align : left; }
+
+.MSIDTitle { font-family: arial, serif;
+ font-size : x-large;
+ font-weight : normal;
+ text-align : left; }
+
+.Label {
+ font-weight : normal;
+ font-family : monospace;
+ text-align : right;
+ vertical-align: middle; }
+
+.FELabel { font-size : large;
+ font-weight : normal;
+ font-family : monospace;
+ text-align : center;
+ vertical-align: middle; }
+
+.IDLabel { font-size : large;
+ font-weight : normal;
+ font-family : monospace;
+ text-align : right;
+ vertical-align: middle; }
+
+.BorderLabel { border-width:0px;
+ border-style:solid;
+ border-radius: 2px;
+ margin: auto;
+ padding: 4px; }
+
diff --git a/lib/taurus/web/examples/tornado/static/js/countclient.coffee b/lib/taurus/web/examples/tornado/static/js/countclient.coffee
new file mode 100644
index 0000000..bb11f5c
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/countclient.coffee
@@ -0,0 +1,75 @@
+taurus_websocket = null
+
+taurus_models = ->
+ ( elem.dataset['taurusModel'] for elem in $('[data-taurus-model]') )
+
+taurus_element = (model) ->
+ $('[data-taurus-model="' + model + '"]')
+
+initialize = ->
+
+ console.log("Initializing page...")
+
+ $('title').html(':: Taurus ::')
+
+ gauge_props =
+ interactionArea: "none"
+ minimum: -140
+ maximum: 150
+
+ dom = require("dojo/dom")
+ CircularLinearGauge = require("dojox/dgauges/components/default/CircularLinearGauge")
+ gauge = new CircularLinearGauge(gauge_props, dom.byId("gauge01"))
+ gauge.set('value', 44)
+
+ taurus_websocket = new WebSocket("ws://pc151.cells.es:8888/taurus")
+
+ taurus_websocket.onopen = ->
+ $('title').html(':: Taurus :: Connected')
+ initialize_taurus()
+
+ taurus_websocket.onmessage = (event) ->
+ event_data = JSON.parse(event.data)
+ elements = taurus_element(event_data.model)
+ elements.filter(":not([data-taurus-controller = 'Gauge'])").css(event_data.css).html(event_data.html)
+ elements.filter("input").css('background-color','').css('color','')
+ g = elements.filter("#gauge01")
+ if g.length and gauge
+ indicatorText = gauge.getElement("indicatorText")
+ indicatorText.set('value', event_data.html)
+ indicatorText.indicator.set('value', event_data.html)
+
+ taurus_websocket.onerror = (event) ->
+ $('body').append('<div>Error:' + event + ' ' + '</div>')
+
+ taurus_websocket.onclose = (event) ->
+ $('title').html(':: Taurus :: Disconnected')
+
+ plot = JXG.JSXGraph.initBoard('plot', {boundingbox: [-10, 10, 10, -10], axis:true, grid:true})
+ geonext = JXG.JSXGraph.loadBoardFromFile('geonext', 'static/geonext/triangle.gxt', 'Geonext')
+
+ props =
+ position : ["right", "bottom"]
+ width : 460
+# buttons :
+# Ok : -> $(this).dialog("close")
+
+ $('#motor-attributes').dialog(props)
+
+ $("#tangotest-attributes" ).hide()
+ $('#show-tangotest').button().click(-> $('#tangotest-attributes').show('bounce', {}, 500, ->))
+
+ console.log("Finished initializing page")
+
+initialize_taurus = ->
+ console.log("Initializing taurus...")
+ models = taurus_models()
+ json_models = JSON.stringify({models : models})
+ taurus_websocket.send(json_models)
+ console.log("Finished initializing taurus")
+
+$ ->
+ dojo_requirements = ["dojo/_base/kernel", "dojo/parser", "dojo/dom",
+ "dojox/dgauges/components/default/CircularLinearGauge"]
+
+ require(dojo_requirements, initialize)
diff --git a/lib/taurus/web/examples/tornado/static/js/countclient.js b/lib/taurus/web/examples/tornado/static/js/countclient.js
new file mode 100644
index 0000000..106978d
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/countclient.js
@@ -0,0 +1,94 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var initialize, initialize_taurus, taurus_element, taurus_models, taurus_websocket;
+
+ taurus_websocket = null;
+
+ taurus_models = function() {
+ var elem, _i, _len, _ref, _results;
+ _ref = $('[data-taurus-model]');
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ elem = _ref[_i];
+ _results.push(elem.dataset['taurusModel']);
+ }
+ return _results;
+ };
+
+ taurus_element = function(model) {
+ return $('[data-taurus-model="' + model + '"]');
+ };
+
+ initialize = function() {
+ var CircularLinearGauge, dom, gauge, gauge_props, geonext, plot, props;
+ console.log("Initializing page...");
+ $('title').html(':: Taurus ::');
+ gauge_props = {
+ interactionArea: "none",
+ minimum: -140,
+ maximum: 150
+ };
+ dom = require("dojo/dom");
+ CircularLinearGauge = require("dojox/dgauges/components/default/CircularLinearGauge");
+ gauge = new CircularLinearGauge(gauge_props, dom.byId("gauge01"));
+ gauge.set('value', 44);
+ taurus_websocket = new WebSocket("ws://pc151.cells.es:8888/taurus");
+ taurus_websocket.onopen = function() {
+ $('title').html(':: Taurus :: Connected');
+ return initialize_taurus();
+ };
+ taurus_websocket.onmessage = function(event) {
+ var elements, event_data, g, indicatorText;
+ event_data = JSON.parse(event.data);
+ elements = taurus_element(event_data.model);
+ elements.filter(":not([data-taurus-controller = 'Gauge'])").css(event_data.css).html(event_data.html);
+ elements.filter("input").css('background-color', '').css('color', '');
+ g = elements.filter("#gauge01");
+ if (g.length && gauge) {
+ indicatorText = gauge.getElement("indicatorText");
+ indicatorText.set('value', event_data.html);
+ return indicatorText.indicator.set('value', event_data.html);
+ }
+ };
+ taurus_websocket.onerror = function(event) {
+ return $('body').append('<div>Error:' + event + ' ' + '</div>');
+ };
+ taurus_websocket.onclose = function(event) {
+ return $('title').html(':: Taurus :: Disconnected');
+ };
+ plot = JXG.JSXGraph.initBoard('plot', {
+ boundingbox: [-10, 10, 10, -10],
+ axis: true,
+ grid: true
+ });
+ geonext = JXG.JSXGraph.loadBoardFromFile('geonext', 'static/geonext/triangle.gxt', 'Geonext');
+ props = {
+ position: ["right", "bottom"],
+ width: 460
+ };
+ $('#motor-attributes').dialog(props);
+ $("#tangotest-attributes").hide();
+ $('#show-tangotest').button().click(function() {
+ return $('#tangotest-attributes').show('bounce', {}, 500, function() {});
+ });
+ return console.log("Finished initializing page");
+ };
+
+ initialize_taurus = function() {
+ var json_models, models;
+ console.log("Initializing taurus...");
+ models = taurus_models();
+ json_models = JSON.stringify({
+ models: models
+ });
+ taurus_websocket.send(json_models);
+ return console.log("Finished initializing taurus");
+ };
+
+ $(function() {
+ var dojo_requirements;
+ dojo_requirements = ["dojo/_base/kernel", "dojo/parser", "dojo/dom", "dojox/dgauges/components/default/CircularLinearGauge"];
+ return require(dojo_requirements, initialize);
+ });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo.js b/lib/taurus/web/examples/tornado/static/js/demo.js
new file mode 100644
index 0000000..a1ed2b6
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo.js
@@ -0,0 +1,14 @@
+
+(function() {
+ var initialize_demo;
+
+ initialize_demo = function() {
+ console.log("Initializing taurus WEB generic demo application...");
+ return console.log("Finished initializing taurus WEB generic demo application");
+ };
+
+ $(function() {
+ return initialize_demo();
+ });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo1.js b/lib/taurus/web/examples/tornado/static/js/demo1.js
new file mode 100644
index 0000000..ebca6a1
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo1.js
@@ -0,0 +1,14 @@
+
+(function() {
+ var initialize_demo1;
+
+ initialize_demo1 = function() {
+ console.log("Initializing taurus WEB demo 1 application...");
+ return console.log("Finished initializing taurus WEB demo 1 application");
+ };
+
+ $(function() {
+ return initialize_demo1();
+ });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo2.js b/lib/taurus/web/examples/tornado/static/js/demo2.js
new file mode 100644
index 0000000..9f8fa5a
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo2.js
@@ -0,0 +1,41 @@
+
+(function() {
+ var initialize_demo2;
+
+ initialize_demo2 = function() {
+ console.log("Initializing taurus WEB demo 2 application...");
+ init_highcharts();
+ return console.log("Finished initializing taurus WEB demo 2 application");
+ };
+
+ $(function() {
+ return initialize_demo2();
+ });
+
+ init_highcharts = function () {
+ $('#highcharts-canvas').highcharts({
+ chart: {
+ type: 'bar'
+ },
+ title: {
+ text: 'Fruit Consumption'
+ },
+ xAxis: {
+ categories: ['Apples', 'Bananas', 'Oranges']
+ },
+ yAxis: {
+ title: {
+ text: 'Fruit eaten'
+ }
+ },
+ series: [{
+ name: 'Jane',
+ data: [1, 0, 4]
+ }, {
+ name: 'John',
+ data: [5, 7, 3]
+ }]
+ });
+ };
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo3.js b/lib/taurus/web/examples/tornado/static/js/demo3.js
new file mode 100644
index 0000000..0bc6e8e
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo3.js
@@ -0,0 +1,44 @@
+
+(function() {
+ var initialize_demo3;
+
+ initialize_demo3 = function() {
+ console.log("Initializing taurus WEB demo 3 application...");
+ init_highcharts();
+ return console.log("Finished initializing taurus WEB demo 3 application");
+ };
+
+ $(function() {
+ return initialize_demo3();
+ });
+
+ init_highcharts = function () {
+ var chart = new Highcharts.Chart({
+ chart: {
+ renderTo: 'highcharts-canvas',
+ //type: 'line'
+ },
+ title: {
+ text: 'Fruit Consumption'
+ },
+ series: [{
+ name: 'Jane',
+ data: []
+ }],
+
+ taurus_model : "sys/tg_test/1/double_scalar"
+ });
+
+ taurus_listener = function (event_data) {
+ if (event_data.model == chart.options.taurus_model) {
+ console.log(event_data.value);
+ data = chart.series.data
+ data.push([data.length,event_data.value]);
+ console.log(chart.series[0].data);
+ chart.redraw();
+ }
+ };
+
+ taurus_onmessage_callbacks.add(taurus_listener);
+};
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo4.js b/lib/taurus/web/examples/tornado/static/js/demo4.js
new file mode 100644
index 0000000..4a35cf6
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo4.js
@@ -0,0 +1,14 @@
+
+(function() {
+ var initialize_demo4;
+
+ initialize_demo4 = function() {
+ console.log("Initializing taurus WEB demo 4 application...");
+ return console.log("Finished initializing taurus WEB demo 4 application");
+ };
+
+ $(function() {
+ return initialize_demo4();
+ });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/machinestatus.coffee b/lib/taurus/web/examples/tornado/static/js/machinestatus.coffee
new file mode 100644
index 0000000..4164093
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/machinestatus.coffee
@@ -0,0 +1,9 @@
+
+initialize = ->
+
+ console.log("Initializing taurus WEB demo application...")
+ console.log("Finished initializing taurus WEB demo application")
+
+$ ->
+ initialize()
+
diff --git a/lib/taurus/web/examples/tornado/static/js/machinestatus.js b/lib/taurus/web/examples/tornado/static/js/machinestatus.js
new file mode 100644
index 0000000..95dca01
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/machinestatus.js
@@ -0,0 +1,14 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var initialize;
+
+ initialize = function() {
+ console.log("Initializing taurus WEB machine status application...");
+ return console.log("Finished initializing taurus WEB machine status application");
+ };
+
+ $(function() {
+ return initialize();
+ });
+
+}).call(this);
diff --git a/lib/taurus/web/static/css/digital.ttf b/lib/taurus/web/static/css/digital.ttf
new file mode 100644
index 0000000..16b2f6c
Binary files /dev/null and b/lib/taurus/web/static/css/digital.ttf differ
diff --git a/lib/taurus/web/static/css/taurus.css b/lib/taurus/web/static/css/taurus.css
new file mode 100644
index 0000000..93d9456
--- /dev/null
+++ b/lib/taurus/web/static/css/taurus.css
@@ -0,0 +1,5 @@
+
+ at font-face {
+ font-family: "digital";
+ src: url("digital.ttf") format("truetype");
+}
diff --git a/lib/taurus/web/static/favicon.ico b/lib/taurus/web/static/favicon.ico
new file mode 100644
index 0000000..7793294
Binary files /dev/null and b/lib/taurus/web/static/favicon.ico differ
diff --git a/lib/taurus/web/static/js/taurus.coffee b/lib/taurus/web/static/js/taurus.coffee
new file mode 100644
index 0000000..0cb0a96
--- /dev/null
+++ b/lib/taurus/web/static/js/taurus.coffee
@@ -0,0 +1,42 @@
+taurus_websocket = null
+
+taurus_models = ->
+ ( elem.dataset['taurusModel'] for elem in $('[data-taurus-model]') )
+
+taurus_element = (model) ->
+ $('[data-taurus-model="' + model + '"]')
+
+initialize = ->
+
+ console.log("Initializing page...")
+
+ taurus_websocket = new WebSocket("ws://160.103.207.112:8888/taurus")
+
+ taurus_websocket.onopen = ->
+ console.log("Websocket connected")
+ # $('title').html(':: ALBA Machine Status :: Connected')
+ initialize_taurus()
+
+ taurus_websocket.onmessage = (event) ->
+ event_data = JSON.parse(event.data)
+ elements = taurus_element(event_data.model)
+ elements.css(event_data.css).html(event_data.html)
+
+ taurus_websocket.onerror = (event) ->
+ $('body').append('<div>Error:' + event + ' ' + '</div>')
+
+ taurus_websocket.onclose = (event) ->
+ console.log("Websocket DISCONNECTED")
+
+ console.log("Finished initializing page")
+
+initialize_taurus = ->
+ console.log("Initializing taurus...")
+ models = taurus_models()
+ json_models = JSON.stringify({models : models})
+ taurus_websocket.send(json_models)
+ console.log("Finished initializing taurus")
+
+$ ->
+ initialize()
+
diff --git a/lib/taurus/web/static/js/taurus.js b/lib/taurus/web/static/js/taurus.js
new file mode 100644
index 0000000..32d134f
--- /dev/null
+++ b/lib/taurus/web/static/js/taurus.js
@@ -0,0 +1,95 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var initialize, initialize_taurus, taurus_element, taurus_models, taurus_websocket;
+
+ taurus_websocket = null;
+
+ taurus_models = function() {
+ var elem, _i, _len, _ref, _results;
+ _ref = $('[data-taurus-model]');
+ _results = [];
+
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ elem = _ref[_i];
+ _results.push(elem.dataset['taurusModel']);
+ }
+ console.log(_results);
+ return _results;
+ };
+
+ taurus_element = function(model) {
+
+ return $('[data-taurus-model="' + model + '"]');
+ };
+
+ initialize = function() {
+ console.log("Initializing page...");
+ host = "pcvdimper.esrf.fr";
+ port = 8888;
+ ws_id = "/taurus";
+ console.log(host);
+ taurus_websocket = new WebSocket("ws://" + host + ":" + port + ws_id);
+ taurus_websocket.onopen = function() {
+ console.log("Websocket connected");
+ return initialize_taurus();
+ };
+ taurus_websocket.onmessage = function(event) {
+ var elements, event_data;
+ var reg = new RegExp("[^a-zA-Z0-9_]", "g");
+ event_data = JSON.parse(event.data);
+
+ elements = taurus_element(event_data.model);
+ elements.each(function(index, elem) {
+ //test if the attribute exist and if the string contains only authorized characters
+ if ($(elem).attr('data-taurus-function') !== undefined && reg.test($(elem).attr('function')) === false)
+ {
+ console.log("window." + $(elem).attr('data-taurus-function') + "()");
+ eval("window." + $(elem).attr('data-taurus-function') + "(event_data,elem)");
+ }
+ else
+ {
+ elements.css(event_data.css).html(event_data.html);
+ }
+ });
+ return;
+ };
+ taurus_websocket.onerror = function(event) {
+ return $('body').append('<div>Error:' + event + ' ' + '</div>');
+ };
+ taurus_websocket.onclose = function(event) {
+ var reg = new RegExp("[^a-zA-Z0-9_]", "g");
+ var elements = $('[data-taurus-model]');
+ elements.each(function(index, elem) {
+ //test if the attribute exist and if the string contains only authorized characters
+ if ($(elem).attr('data-taurus-onclose') !== undefined && reg.test($(elem).attr('function')) === false)
+ {
+ console.log("window." + $(elem).attr('data-taurus-onclose') + "()");
+ eval("window." + $(elem).attr('data-taurus-onclose') + "(event_data,elem)");
+ }
+ else
+ {
+ elements.html("-");
+ }
+ });
+ console.log("Websocket DISCONNECTED");
+ };
+ return console.log("Finished initializing page");
+ };
+
+ initialize_taurus = function() {
+
+ var json_models, models;
+ console.log("Initializing taurus...");
+ models = taurus_models();
+ json_models = JSON.stringify({
+ models: models
+ });
+ taurus_websocket.send(json_models);
+ return console.log("Finished initializing taurus");
+ };
+
+ $(function() {
+ return initialize();
+ });
+
+}).call(this);
diff --git a/lib/taurus/web/taurustornado.py b/lib/taurus/web/taurustornado.py
new file mode 100644
index 0000000..5e63ad6
--- /dev/null
+++ b/lib/taurus/web/taurustornado.py
@@ -0,0 +1,253 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+##
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+##
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## Taurus 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.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+"""
+"""
+
+from __future__ import print_function
+
+__docformat__ = "restructuredtext"
+
+import os.path
+
+from tornado.web import Application, RequestHandler, StaticFileHandler
+from tornado.websocket import WebSocketHandler
+from tornado.escape import json_encode, json_decode
+
+from taurus import Database, Device, Attribute, Configuration, Object
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from taurus.core.taurusbasetypes import AttrQuality, TaurusEventType, DataFormat
+from taurus.core.taurusvalidator import AttributeNameValidator, ConfigurationNameValidator
+from taurus.core.util.colors import ATTRIBUTE_QUALITY_PALETTE
+
+# ugly import to properly manage Tango exceptions
+import PyTango
+
+def error_str(err):
+ if isinstance(err, PyTango.DevFailed):
+ err = err[0]
+ return "[{0}] {1}".format(err.reason, err.desc)
+ return str(err)
+
+class TaurusWebAttribute(object):
+ """This object is a listener for the taurus attribute value.
+ When a attribute changes it sends an event. The event
+ triggers a call to *eventReceived*. *eventReceived* will transform
+ the change event into a JSON encoded string and sends this
+ string through the web socket to the client"""
+
+ def __init__(self, ws, name):
+ self.name = name
+ self.ws = ws
+ self.attribute.addListener(self)
+
+ @property
+ def attribute(self):
+ return Attribute(self.name)
+
+ def eventReceived(self, evt_src, evt_type, evt_value):
+ """Transforms the event into a JSON encoded string and sends this
+ string into the web socket
+
+ The JSON encoded string is a JSON object which contains the members:
+ - model : a string identification of the attribute which changed
+ - html : the new attribute value
+ - css : a hint on the style that should be applied (background color
+ according to the attribute quality)
+
+ In case of an error the html member will contain the exception information.
+ The stylesheet will be white font with violet background."""
+ modelObj = evt_src
+ data = {}
+ if evt_type == TaurusEventType.Error:
+ data['css'] = {'color':'white', 'background-color' : 'violet'}
+ html = value = error_str(evt_value)
+ else:
+ if evt_type == TaurusEventType.Config:
+ modelObj = evt_src.getParentObj()
+ data['title'] = evt_src.description
+ valueObj = modelObj.getValueObj()
+ value = valueObj.value
+ quality = valueObj.quality
+ bg, fg = ATTRIBUTE_QUALITY_PALETTE.rgb_pair(quality)
+ bg, fg = "rgb{0}".format(bg), "rgb{0}".format(fg)
+ data['css'] = {'color': fg, 'background-color' : bg}
+ fmt = valueObj.data_format
+ if fmt == DataFormat._0D:
+ html = modelObj.displayValue(value)
+ if isinstance(value, PyTango._PyTango.DevState):
+ value = int(value)
+ elif fmt in (DataFormat._1D, DataFormat._2D):
+ # bad, very bad performance! Don't worry for now
+ value = value.tolist()
+ html = "[...]"
+ # html = str(value)
+ data['value'] = value
+ data['html'] = html
+ data['model'] = modelObj.getNormalName()
+ try:
+ json_data = json_encode(data)
+ except TypeError as te:
+ data['css'] = {'color':'white', 'background-color' : 'violet'}
+ data['html'] = data['value'] = str(te)
+ json_data = json_encode(data)
+ self.write_message(json_data)
+
+ def write_message(self, message):
+ return self.ws.write_message(message)
+
+ def clear(self):
+ self.attribute.removeListener(self)
+
+
+class TaurusWebConfiguration(object):
+ """This object is a listener for the taurus attribute configuration.
+ When a attribute configuration changes it sends an event. The event
+ triggers a call to *eventReceived*. *eventReceived* will transform
+ the configuration event into a JSON encoded string and sends this
+ string through the web socket to the client"""
+
+ def __init__(self, ws, name):
+ self.name = name
+ self.param = ConfigurationNameValidator().getParams(name)['configparam']
+ self.ws = ws
+ self.configuration = Configuration(self.name)
+ self.configuration.addListener(self)
+
+ def eventReceived(self, evt_src, evt_type, evt_value):
+ """Transforms the event into a JSON encoded string and sends this
+ string into the web socket
+
+ The JSON encoded string is a JSON object which contains the members:
+ - model : a string identification of the attribute configuration
+ which as changed
+ - html : the new attribute configuration value
+ - css : a hint on the style that should be applied (none for now)
+
+ In case of an error the html member will contain the exception information.
+ The stylesheet will be white font with violet background."""
+
+ modelObj = evt_src
+ data = {}
+ if evt_type == TaurusEventType.Error:
+ data['css'] = {'color':'white', 'background-color' : 'violet'}
+ data['html'] = error_str(evt_value)
+ else:
+ data['css'] = {}
+ data['html'] = getattr(modelObj, self.param)
+ data['title'] = modelObj.description
+
+ # data['css']['font-size'] = "24pt";
+ data['model'] = self.name
+ json_data = json_encode(data)
+ self.write_message(json_data)
+
+ def write_message(self, message):
+ return self.ws.write_message(message)
+
+ def clear(self):
+ self.configuration.removeListener(self)
+
+
+class TaurusSocket(WebSocketHandler):
+
+ def open(self):
+ self.models = set()
+
+ def on_message(self, json_data):
+ """Executed when a message comes from the client through the websocket.
+
+ It expected that json_data is a JSON encoded string.
+ It should be a JSON object with *models* member. the value of *models*
+ should be an array of strings, each representing a model name.
+ Example:
+ { models : [ "BO/S05/Pump5/Pressure",
+ "BO/S05/Pump5/Pressure?configuration=unit",
+ "sys/tg_test/1/double_scalar" ]
+ }
+ So far, only attributes and configuration parameters are supported.
+
+ A TaurusWebXXX object will be created for each different model.
+ This object subscribes itself to taurus events. The callback usually
+ transforms such an event into a JSON encoded string which is sent
+ back to the client through this same web socket.
+ """
+ data = json_decode(json_data)
+ if 'models' in data:
+ self.clear_models()
+ model_names = set(data['models'])
+ for model_name in model_names:
+ model_name = str(model_name)
+ if AttributeNameValidator().isValid(model_name):
+ web_model = TaurusWebAttribute(self, model_name)
+ elif ConfigurationNameValidator().isValid(model_name):
+ web_model = TaurusWebConfiguration(self, model_name)
+ else:
+ continue
+ self.models.add(web_model)
+
+ def on_close(self):
+ self.clear_models()
+
+ def clear_models(self):
+ for model in self.models:
+ model.clear()
+ self.models.clear()
+
+def get_taurus_tornado_static_path():
+ local_path = os.path.dirname(__file__)
+ static_path = os.path.join(local_path, 'static')
+ return static_path
+
+def get_default_handlers():
+ return [
+ (r"/taurus", TaurusSocket),
+ (r"/taurus/(.*)", StaticFileHandler, {"path": get_taurus_tornado_static_path() }),
+ ]
+
+def start(handlers=None, static_path=None, port=8888, **kwargs):
+ if static_path is None:
+ local_path = os.path.dirname(__file__)
+ static_path= os.path.join(local_path, 'static')
+ if handlers is None:
+ handlers = [ (r"/", MainHandler),
+ (r"/taurus", TaurusSocket), ]
+
+ application = Application(handlers, static_path=static_path, **kwargs)
+ application.listen(port)
+
+ print("Starting...")
+ try:
+ import tornado.ioloop
+ tornado.ioloop.IOLoop.instance().start()
+ print("Finished")
+ except KeyboardInterrupt:
+ print("Finished by Keyboard interrupt (Ctrl+C)")
+
+if __name__ == "__main__":
+ start()
diff --git a/lib/taurus/web/template/index.html b/lib/taurus/web/template/index.html
new file mode 100644
index 0000000..63cf184
--- /dev/null
+++ b/lib/taurus/web/template/index.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Taurus template page</title>
+ <script type="text/javascript" src="js/jquery.js"></script>
+ <script type="text/javascript" src="js/grid.js"></script>
+ </head>
+ <body>
+ <div id="board"/>
+ </body>
+</html>
diff --git a/scripts/taurusdesigner b/scripts/taurusdesigner
index 1395e56..01a9493 100755
--- a/scripts/taurusdesigner
+++ b/scripts/taurusdesigner
@@ -29,78 +29,7 @@ import optparse
import taurus
from taurus.qt import Qt
+from taurus.qt.qtdesigner.taurusdesigner import main
-def env_index(env, env_name):
- env_name = str(env_name)
- for i, e in enumerate(env):
- e = str(e)
- if e.startswith(env_name):
- return i
- return -1
-
-def has_env(env, env_name):
- return env_index(env, env_name) != -1
-
-def get_env(env, env_name):
- env_name = str(env_name)
- for i, e in enumerate(env):
- e = str(e)
- if e.startswith(env_name):
- return e.split("=")[1]
- return None
-
-def append_or_replace_env(env, env_name, env_value, is_path_like=True):
- i = env_index(env, env_name)
- if i == -1:
- env.append(env_name + "=" + env_value)
- else:
- if is_path_like:
- e_n, e_v = env[i].split("=")
- paths = e_v.split(":")
- if not env_value in paths:
- env_value += ":" + e_v
- env[i] = env_name + "=" + env_value
-
-version = "taurusdesigner %s" % (taurus.Release.version)
-usage = "Usage: %prog [options] <ui file(s)>"
-description = "The Qt designer application customized for taurus"
-parser = optparse.OptionParser(version=version, usage=usage, description=description)
-parser.add_option("--taurus-path", dest="tauruspath", default="",
- help="additional directories to look for taurus widgets")
-parser.add_option("--qt-designer-path", dest="pyqtdesignerpath", default="",
- help="additional directories to look for python qt widgets")
-
-options, args = parser.parse_args()
-
-# Tell Qt Designer where it can find the directory containing the plugins
-env = Qt.QProcess.systemEnvironment()
-
-# Set PYQTDESIGNERPATH to look inside taurus for designer plugins
-taurus_path = os.path.dirname(os.path.abspath(taurus.__file__))
-taurus_qt_designer_path = os.path.join(taurus_path, 'qt', 'qtdesigner')
-
-append_or_replace_env(env, "PYQTDESIGNERPATH", taurus_qt_designer_path)
-
-# Set TAURUSQTDESIGNERPATH
-if len(options.tauruspath) > 0:
- append_or_replace_env(env, "TAURUSQTDESIGNERPATH", options.tauruspath)
- append_or_replace_env(env, "PYTHONPATH", options.tauruspath)
-
-#print "PYTHONPATH=%s" % get_env(env, "PYTHONPATH")
-#print "PYQTDESIGNERPATH=%s" % get_env(env, "PYQTDESIGNERPATH")
-
-# Start Designer.
-designer_bin = str(Qt.QLibraryInfo.location(Qt.QLibraryInfo.BinariesPath))
-
-if sys.platform == "darwin":
- designer_bin += "/Designer.app/Contents/MacOS/Designer"
-else:
- designer_bin += "/designer"
-
-designer = Qt.QProcess()
-designer.setProcessChannelMode(Qt.QProcess.ForwardedChannels)
-designer.setEnvironment(env)
-designer.start(designer_bin, args)
-designer.waitForFinished(-1)
-
-sys.exit(designer.exitCode())
+if __name__ == "__main__":
+ main()
diff --git a/setup.py b/setup.py
index ce99fea..18eb88f 100644
--- a/setup.py
+++ b/setup.py
@@ -59,6 +59,7 @@ def get_release_info():
Release = get_release_info()
author = Release.authors['Tiago']
+maintainer = Release.authors['Pascual-Izarra']
package_dir = { 'taurus' : abspath('lib', 'taurus') }
@@ -173,6 +174,12 @@ requires = [
]
package_data = {
+ 'taurus.core.epics' : ['__taurus_plugin__'],
+ 'taurus.core.evaluation' : ['__taurus_plugin__'],
+ 'taurus.core.resource' : ['__taurus_plugin__'],
+ 'taurus.core.simulation' : ['__taurus_plugin__'],
+ 'taurus.core.tango' : ['__taurus_plugin__'],
+
'taurus.qt.qtgui.resource' : ['*.rcc'],
'taurus.qt.qtgui.util' : ['tauruswidget_template',
'tauruswidget_qtdesignerplugin_template'],
@@ -239,6 +246,15 @@ class build_resources(Command):
self.out = sys.stdout
else:
self.out = StringIO.StringIO()
+ if os.name == 'nt':
+ try:
+ self.QTDIR = os.environ["QTDIR"]
+ self.rcc_exec = self.rcc_exec = os.path.join(self.QTDIR, 'bin', 'rcc')
+ except KeyError:
+ raise Exception("You must set the env. variable QTDIR " \
+ "pointing to the Qt C++ installation directory")
+ else:
+ self.rcc_exec = 'rcc'
def finalize_options (self):
if self.logo is None:
@@ -290,7 +306,7 @@ class build_resources(Command):
# Generate binary rcc file
print("Generating %s... " % rcc_filename, file=out, end='')
out.flush()
- cmd = 'rcc -binary %s -o %s' % (qrc_filename, rcc_filename)
+ cmd = '%s -binary %s -o %s' % (self.rcc_exec, qrc_filename, rcc_filename)
if os.system(cmd):
print("[FAILED]", file=out)
else:
@@ -354,7 +370,7 @@ class build_resources(Command):
# Generate binary rcc file
print("Generating %s... " % rcc_filename, file=out, end='')
out.flush()
- cmd = 'rcc -binary %s -o %s' % (qrc_filename, rcc_filename)
+ cmd = '%s -binary %s -o %s' % (self.rcc_exec, qrc_filename, rcc_filename)
if os.system(cmd):
print("[FAILED]", file=out)
else:
@@ -798,26 +814,33 @@ def svg_to_png(arg, dirname, fnames):
ok = pix.save(full_target_fname)
print(ok and "[OK]" or "[FAIL]", full_source_fname,'->',full_target_fname)
-
-
-setup(name = 'taurus',
- version = Release.version,
- description = Release.description,
- long_description = Release.long_description,
- author = author[0],
- author_email = author[1],
- url = Release.url,
- download_url = Release.download_url,
- platforms = Release.platforms,
- license = Release.license,
- packages = packages,
- package_dir = package_dir,
- classifiers = classifiers,
- package_data = package_data,
- data_files = data_files,
- scripts = scripts,
- provides = provides,
- keywords = Release.keywords,
- requires = requires,
- cmdclass = cmdclass)
-
+def main():
+ setup(name = 'taurus',
+ version = Release.version,
+ description = Release.description,
+ long_description = Release.long_description,
+ author = author[0],
+ author_email = author[1],
+ maintainer = maintainer[0],
+ maintainer_email = maintainer[1],
+ url = Release.url,
+ download_url = Release.download_url,
+ platforms = Release.platforms,
+ license = Release.license,
+ packages = packages,
+ package_dir = package_dir,
+ classifiers = classifiers,
+ package_data = package_data,
+ data_files = data_files,
+ scripts = scripts,
+ provides = provides,
+ keywords = Release.keywords,
+ requires = requires,
+ cmdclass = cmdclass)
+
+if __name__ == "__main__":
+ try:
+ main()
+ print("Setup finished")
+ except Exception as e:
+ print("A error occured: %s\n\nSetup aborted" % str(e))
diff --git a/taurus.bmp b/taurus.bmp
new file mode 100644
index 0000000..bc46819
Binary files /dev/null and b/taurus.bmp differ
diff --git a/taurus.png b/taurus.png
new file mode 100644
index 0000000..03e8d22
Binary files /dev/null and b/taurus.png differ
diff --git a/taurus.svg b/taurus.svg
new file mode 100644
index 0000000..23c140e
--- /dev/null
+++ b/taurus.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:odm="http://product.corel.com/CGS/11/cddns/"
+ xml:space="preserve"
+ width="180pt"
+ height="188pt"
+ style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd"
+ viewBox="0 0 8268 11692"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ id="svg614"
+ sodipodi:version="0.34"
+ sodipodi:docname="D:\Dokumenty\Wikipedie\images\svg\Astro\taurus.svg"><sodipodi:namedview
+ id="base" /><defs
+ id="defs615"><style
+ type="text/css"
+ id="style616"><![CDATA[
+ .fil0 {fill:#000000}
+ ]]></style></defs><g
+ id="Layer 1"
+ transform="matrix(4.552447,0,0,4.540583,-8401.163,-13199.48)"><path
+ class="fil0"
+ d="M2373 3861c-89,-35 -160,-80 -216,-134 -55,-54 -116,-141 -183,-262l-80 -144c-98,-176 -210,-264 -334,-264l-36 0 0 -150 99 0c176,0 336,124 479,371l109 192c74,126 150,214 230,264 80,51 184,76 313,76 129,0 233,-25 313,-76 80,-50 156,-138 229,-264l111 -192c142,-247 302,-371 477,-371l99 0 0 150 -35 0c-125,0 -237,88 -335,264l-80 144c-67,121 -128,208 -183,262 -56,54 -128,99 -216,134 154,85 272,195 356,328 84,133 125,280 125,438 0,230 -85,430 -256,600 -172,170 -373,255 -605,255 -232,0 -433,-85 -605,-255 -172,-170 -258,-370 -258,-600 0,-158 42,-305 126,-438 84,-133 202,-243 356,-328zm381 1420c182,0 337,-63 467,-191 129,-126 194,-279 194,-458 0,-182 -65,-337 -193,-464 -128,-128 -284,-191 -468,-191 -183,0 -339,63 -469,191 -128,127 -193,282 -193,464 0,179 65,332 194,458 129,128 285,191 468,191z"
+ id="path618" /></g></svg>
diff --git a/tests/moduleexplorer.py b/tests/moduleexplorer.py
new file mode 100644
index 0000000..fb341d5
--- /dev/null
+++ b/tests/moduleexplorer.py
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+##
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+##
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## Taurus 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.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
+##
+###########################################################################
+
+''' Returns info about a module'''
+
+import sys, os, inspect, glob, re
+
+class ModuleExplorer(object):
+
+ def __init__(self, exclude_patterns=(), verbose=True):
+ '''
+ :param exclude_patterns: (seq<str>) sequence of strings containing regexp
+ patterns. Each candidate to be explored will be
+ matched against these patterns and will be excluded
+ if it matches any of them.
+ :param verbose: (bool) If True (default) status messages will be printed to stdout
+ '''
+ self.exclude_patterns = [re.compile(p) for p in exclude_patterns]
+ self.verbose = verbose
+
+ def _matchesAnyPattern(self, name, paterns):
+ for p in paterns:
+ if re.match(p,name) is not None:
+ if self.verbose: print 'excluding "%s"'%name
+ return True
+ return False
+
+ def _getlocalmembernames(self, module, predicate=None):
+ ret =[]
+ modulepath, tail = os.path.split(inspect.getabsfile(module))
+ for n,v in inspect.getmembers(module, predicate):
+ if inspect.isbuiltin(v):
+ continue #ignore builtin functions
+ try:
+ memberpath, tail = os.path.split(inspect.getabsfile(v))
+ except TypeError:
+ continue #ignore builtin modules
+ if memberpath == modulepath:
+ ret.append(n)
+ return ret
+
+ def _getSubmodulesFromPath(self, modulepath):
+ g = glob.glob(os.path.join(modulepath,'*','__init__.py'))
+ ret = [re.findall(r".+\/(.*)\/__init__.py", s)[0] for s in g]
+ return ret
+
+ def _isclass_with_init(self, obj):
+ return inspect.isclass(obj) and hasattr(obj,'__init__')
+
+ def _isenumeration(self, obj):
+# return isinstance(obj, taurus.core.util)
+ return False #@todo
+
+ def exploreModule(self, modulename):
+ '''Recursive function that gathers info on a module and all its submodules.
+
+ :param modulename: the name of the module to explore
+
+ :return: (dict<str,object>) a dictionary containing submodulenames,
+ localclassnames, localfunctionnames, localenumerationnames,
+ externalmembernames, submodules, warnings
+ '''
+ if self.verbose: print "Exploring %s..."%modulename
+ warnings = []
+ try:
+ module = __import__(modulename, fromlist = [''])
+ except Exception,e:
+ msg = 'exploreModule: WARNING: Cannot import %s. Reason: %s'%(modulename,repr(e))
+ warnings.append(msg)
+ if self.verbose: print msg
+ return dict(modulename = modulename,
+ basemodulename = modulename.split('.')[-1],
+ modulepath = None,
+ submodulenames = [],
+ localclassnames = [],
+ localfunctionnames = [],
+ localenumerationnames = [],
+ externalmembernames = [],
+ submodules = {},
+ warnings = warnings)
+ modulepath, tail = os.path.split(inspect.getabsfile(module))
+
+ submodulenames = sorted(self._getSubmodulesFromPath(modulepath))
+ localclassnames = sorted(self._getlocalmembernames(module, self._isclass_with_init))
+ localfunctionnames = sorted(self._getlocalmembernames(module, inspect.isfunction))
+ localenumerationnames = sorted([])#@todo
+ externalmembernames = sorted([]) #@todo
+# localmembers = list(submodules) + localfunctionnames + localclassnames + localenumerationnames
+# externalmembers = [n for n,v in inspect.getmembers(object) if (n not in localmembers and not n.startswith('_'))]
+
+ #filter out excluded members
+ submodulenames = [n for n in submodulenames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+ localclassnames = [n for n in localclassnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+ localfunctionnames = [n for n in localfunctionnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+ localenumerationnames = [n for n in localenumerationnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+ externalmembernames = [n for n in externalmembernames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+
+ #recurse
+ submodules = {}
+ for n in submodulenames:
+ sm_name = '.'.join((modulename, n))
+ submodules[n] = self.exploreModule(sm_name)
+
+ return dict(modulename = modulename,
+ basemodulename = modulename.split('.')[-1],
+ modulepath = modulepath,
+ submodulenames = submodulenames,
+ localclassnames = localclassnames,
+ localfunctionnames = localfunctionnames,
+ localenumerationnames = localenumerationnames,
+ externalmembernames = externalmembernames,
+ submodules = submodules,
+ warnings = warnings)
+
+ @staticmethod
+ def getAll(info, key):
+ '''
+ append all values for a given key in a nested "moduleinfo" dictionary
+
+ :param info: (dict) a moduleinfo dictionary like the one returned by :meth:`exploreModule`
+ :param key: (str) a key of a moduleinfo dictionary
+
+ :return: (list<tuple>) a list that concatenates tuples where the first element is the (sub)module name
+ and the second element is the value for the given key.
+ If for a certain submodule, the value is empty, it is not included in the list at all.
+ '''
+ mname = info['modulename']
+ try:
+ ret = [(mname,el) for el in info[key]]
+ except KeyError:
+ return []
+ for sminfo in info['submodules'].itervalues():
+ ret += ModuleExplorer.getAll(sminfo,key)
+ return ret
+
+ @staticmethod
+ def explore(modulename, exclude_patterns=(), verbose=True):
+ '''convenience to explore a module
+
+ :param modulename: the name of the module to explore
+ :param exclude_patterns: (seq<str>) sequence of strings containing regexp
+ patterns. Each candidate to be explored will be
+ matched against these patterns and will be excluded
+ if it matches any of them.
+ :param verbose: (bool) If True (default) status messages will be printed to stdout
+
+ :return: (dict<str,object>, allwarnings) a tuple whose first member is a dictionary
+ containing submodulenames, localclassnames, localfunctionnames, localenumerationnames,
+ externalmembernames, submodules, warnings. The second member of the tuple is a list
+ containing all the warnings accummulated.
+ '''
+ explorer = ModuleExplorer(exclude_patterns=exclude_patterns, verbose=verbose)
+ minfo = explorer.exploreModule(modulename)
+ return minfo, ModuleExplorer.getAll(minfo, 'warnings')
+
+
+
+def main(modulename='taurus', exclude_patterns = ('.*/ui',)):
+ moduleinfo, allw = ModuleExplorer.explore(modulename, exclude_patterns=exclude_patterns, verbose=True)
+ print '\n\n'+'*'*50
+ print "Exploration finished with %i warnings:"%(len(allw))
+ for m,w in allw: print w
+ print '*'*50+'\n'
+ print
+ assert len(allw) == 0
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/lib/taurus/core/util/report/report.py b/tests/taurustest.py
similarity index 64%
copy from lib/taurus/core/util/report/report.py
copy to tests/taurustest.py
index ca11e0e..cc0b8fe 100644
--- a/lib/taurus/core/util/report/report.py
+++ b/tests/taurustest.py
@@ -1,5 +1,4 @@
#!/usr/bin/env python
-
#############################################################################
##
## This file is part of Taurus, a Tango User Interface Library
@@ -23,20 +22,25 @@
##
#############################################################################
-"""This module provides a panel to display taurus messages"""
-
-__all__ = ["TaurusMessageReportHandler"]
-__docformat__ = 'restructuredtext'
+"""Unit tests for Taurus"""
+import unittest
-class TaurusMessageReportHandler(object):
-
- Label = "Default report handler"
+class TaurusImportTestCase(unittest.TestCase):
+ def setUp(self):
+ from moduleexplorer import ModuleExplorer
+ self.explore = ModuleExplorer.explore
- def __init__(self, parent):
- self.parent = parent
-
- def report(self, message):
- pass
-
+ def testImportSubmodules(self):
+ """All submodules should import without problems"""
+ moduleinfo, wrn = self.explore('taurus', verbose=False)
+ msg = None
+ if wrn:
+ msg = '\n%s'%'\n'.join(zip(*wrn)[1])
+ self.assertEqual(len(wrn),0, msg=msg)
+
+
+
+if __name__ == "__main__":
+ unittest.main()
--
framework for TANGO control system client applications
More information about the debian-science-commits
mailing list