Source code for taurus.qt.qtdesigner.taurusdesigner

#!/usr/bin/env python

#############################################################################
##
# This file is part of Taurus
##
# http://taurus-scada.org
##
# 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 builtins import str
import sys
import click
import os.path
import subprocess

import taurus
import taurus.tauruscustomsettings
from taurus.external.qt import Qt
from taurus.core.util.log import deprecation_decorator

[docs]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
[docs]def has_env(env, env_name): return env_index(env, env_name) != -1
[docs]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
[docs]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 env_value not in paths: env_value += os.path.pathsep + e_v env[i] = env_name + "=" + env_value
[docs]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)
[docs]def get_qtdesigner_bin(): designer_bin = getattr(taurus.tauruscustomsettings, 'QT_DESIGNER_PATH', None) if designer_bin: return designer_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", "designer") elif plat in ("win32", "nt"): designer_bin = os.path.join(designer_bin, "designer.exe") if not os.path.exists(designer_bin): # some installations don't properly install designer # in QLibraryInfo.BinariesPath. We do a best effort to find it designer_bin = subprocess.check_output('where designer') designer_bin = designer_bin.decode().strip() else: designer_bin = os.path.join(designer_bin, "designer") return designer_bin
[docs]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]
@deprecation_decorator(alt='get_taurus_designer_env', rel='4.5') 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
[docs]def get_taurus_designer_env(taurus_extra_path=None): env = Qt.QProcessEnvironment.systemEnvironment() # Set PYQTDESIGNERPATH to look inside taurus for designer plugins (taurus_designer_path,) = get_taurus_designer_path() env.insert("PYQTDESIGNERPATH", taurus_designer_path) # Set TAURUSQTDESIGNERPATH if taurus_extra_path is not None: env.insert("TAURUSQTDESIGNERPATH", taurus_extra_path) env.insert("PYTHONPATH", taurus_extra_path) return env
[docs]def qtdesigner_start(args, env=None): # Start Designer. designer_bin = get_qtdesigner_bin() designer = Qt.QProcess() designer.setProcessChannelMode(Qt.QProcess.ForwardedChannels) if isinstance(env, Qt.QProcessEnvironment): designer.setProcessEnvironment(env) else: # obsolete call, only for bck-compat taurus.deprecated(dep='passing env which is not a QProcessEnvironment', alt='QProcessEnvironment', rel='4.5') designer.setEnvironment(env) designer.start(designer_bin, args) designer.waitForFinished(-1) return designer.exitCode()
@click.command('designer') @click.argument('ui_files', nargs=-1) @click.option("--taurus-path", "tauruspath", metavar='TAURUSPATH', default=None, help="additional directories to look for taurus widgets") def designer_cmd(ui_files, tauruspath): """Launch a Taurus-customized Qt Designer application""" env = get_taurus_designer_env(taurus_extra_path=tauruspath) sys.exit(qtdesigner_start(ui_files, env=env)) if __name__ == "__main__": designer_cmd()