#!/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/>.
#
# ###########################################################################
"""This module is designed to provide a factory class for taurus Qt actions
"""
from taurus.core.util.log import Logger
from taurus.core.util.singleton import Singleton
from taurus.external.qt import Qt
from . import taurusaction
__docformat__ = "restructuredtext"
[docs]
class ActionFactory(Singleton, Logger):
"""A Singleton class designed to provide Action related objects."""
def __init__(self):
"""Initialization. Nothing to be done here for now."""
pass
[docs]
def init(self, *args):
"""Singleton instance initialization."""
self.call__init__(Logger, "ActionFactory")
self.actions = self.__getActions()
self.menus = self.__getMenus()
def __getClasses(self, super_class):
ret = {}
klass_type = type(super_class)
for name in dir(taurusaction):
klass = getattr(taurusaction, name)
if klass == super_class:
continue
if type(klass) == klass_type and issubclass(klass, super_class):
ret[klass.menuID] = klass
return ret
def __getActions(self):
"""Calculates the map of existing action classes"""
return self.__getClasses(taurusaction.TaurusAction)
def __getMenus(self):
"""Calculates the map of existing menu classes"""
return self.__getClasses(taurusaction.TaurusMenu)
[docs]
def getActions(self):
return self.actions
[docs]
def getNewAction(self, widget, id):
klass = self.actions.get(id)
if klass is None:
return None
return klass(widget)
[docs]
def buildAction(self, widget, a_node):
if not a_node.hasAttribute("class"):
return None
id = a_node.getAttribute("class")
action = self.getNewAction(widget, id)
# if node has alternative label, display it instead
if a_node.hasAttribute("label"):
action.setText(a_node.getAttribute("label"))
if a_node.hasAttribute("checkable"):
action.setCheckable(bool(a_node.getAttribute("checkable")))
# TODO: assign an icon to the action
# if a_node.hasAttribute("icon"):
# icon = a_node.getAttribute("icon")
# # action.setIcon(icon)
return action
[docs]
def createAction(
self,
parent,
text,
shortcut=None,
icon=None,
tip=None,
toggled=None,
triggered=None,
data=None,
context=Qt.Qt.WindowShortcut,
):
"""Create a QAction"""
action = Qt.QAction(text, parent)
if triggered is not None:
action.triggered.connect(triggered)
if toggled is not None:
action.toggled.connect(toggled)
action.setCheckable(True)
if icon is not None:
if isinstance(icon, str):
icon = Qt.QIcon.fromTheme(icon)
action.setIcon(icon)
if shortcut is not None:
action.setShortcut(shortcut)
if tip is not None:
action.setToolTip(tip)
action.setStatusTip(tip)
if data is not None:
action.setData(data)
# TODO: Hard-code all shortcuts and choose context=Qt.WidgetShortcut
# (this will avoid calling shortcuts from another dockwidget
# since the context thing doesn't work quite well with these widgets)
action.setShortcutContext(context)
return action