Exemple #1
0
    def __init__(self, actionId):
        super().__init__(actionId)

        self._action = ProxyAction(self)
        self._active = False
        self._contextInitialized = False
        self._action.setShortcutVisibleInToolTip(True)
        self._action.changed.connect(self._updateActiveState)

        self._contextActionMap = {}      # QtC: QMap<Id, QPointer<QAction> >, here: Id -> QAction
        self._scriptableMap = {}         # QtC: QMap<QAction*, bool>
    def testShortcut(self):
        a = QAction("Test Action", None)
        a.setToolTip("Test Tooltip")

        p = ProxyAction()
        p.setAttribute(ProxyActionAttribute.UpdateText)
        p.action = a
        p.setShortcut(QKeySequence("Ctrl+T"))
        self.assertEqual(p.text(), "Test Action")
        p.setShortcutVisibleInToolTip(True)
        self.assertEqual(p.toolTip(), "Test Tooltip <span style=\"color: gray; font-size: small\">Ctrl+T</span>")
        p.setShortcutVisibleInToolTip(False)
        self.assertEqual(p.toolTip(), "Test Tooltip")
Exemple #3
0
class Action(AbstractCommand):
    def __init__(self, actionId):
        super().__init__(actionId)

        self._action = ProxyAction(self)
        self._active = False
        self._contextInitialized = False
        self._action.setShortcutVisibleInToolTip(True)
        self._action.changed.connect(self._updateActiveState)

        self._contextActionMap = {}      # QtC: QMap<Id, QPointer<QAction> >, here: Id -> QAction
        self._scriptableMap = {}         # QtC: QMap<QAction*, bool>


    def action(self):
        return self._action

    def setKeySequence(self, key: QKeySequence):
        super().setKeySequence(key)
        self._action.setShortcut(key)
        self.keySequenceChanged.emit()

    def keySequence(self):
        return self._action.shortcut()

    def setCurrentContext(self, context: Context):
        self._context = copy(context)

        currentAction = None
        for i in range(len(self.context)):
            a = self._contextActionMap.get(self._context[i], None)
            if a:
                currentAction = a
                break

        self._action.setAction(currentAction)
        self._updateActiveState()

    def shortcut(self):
        return None

    @pyqtSlot()
    def _updateActiveState(self):
        """Updates the state of the Action"""
        self._setActive(self._action.isEnabled() and self._action.isVisible() and not self._action.isSeparator())

    def __msgActionWarning(self, newAction: QAction, actionId: ItemId, oldAction: QAction or None):
        """
        :returns: a Warning text with the given Action's and ItemId's properties
        :param newAction: Action to take strings from
        :param  actionId: ItemId to take strings from
        """
        oldActionMsg = " {}/{}".format(oldAction.objectName(), oldAction.text()) if oldAction else ""
        msg = "addOverrideAction {}/{}: Action{} is already registered for context {} {}.".format(
            newAction.objectName(), newAction.text(), oldActionMsg, actionId.uniqueIdentifier, actionId.toSetting())
        return msg

    def addOverrideAction(self, action: QAction, context: Context, scriptable: bool):
        if HostOsInfo.isMacHost():
            action.setIconVisibleInMenu(False)
            if self.isEmpty():
                self._action.initialize(action)
            if context.isEmpty():
                self._contextActionMap[None] = action
            else:
                for i in range(len(context)):
                    cId = context[i]
                    if cId in self._contextActionMap:
                        warnings.warn(self.__msgActionWarning(action, cId, self._contextActionMap.get(cId, None)))
                    self._contextActionMap[cId] = action

            self._scriptableMap[action] = scriptable
            self.setCurrentContext(self._context)

    def removeOverrideAction(self, action: QAction):
        """Silently deletes all occurrences of :param: action or empty actions from internal list."""
        try:
            del self._contextActionMap[action]
            #FIXME: QtC here cleans all empty "dangling" QPointers (0) as well.
            # No way to do this in Python as there is no QPointer that keeps track of the object's life cycle
        except KeyError:
            pass

        self.setCurrentContext(self._context)

    def isActive(self) -> bool:
        return self._active

    def _setActive(self, state: bool):
        if bool(state) != self._active:
            self._active = bool(state)
            self.activeStateChanged.emit()

    def isEmpty(self):
        return len(self._contextActionMap) == 0

    def isScriptable(self, context: Context=None):
        if context is None:
            return True in self._scriptableMap.values()

        if context == self._context and self._action.action in self._scriptableMap:
            return self._scriptableMap[self._action.action]

        for i in range(len(context)):
            a = self._contextActionMap.get(i, 0)
            if a is not None:
                if a in self._scriptableMap and self._scriptableMap[a] is not None:
                    return True
        return False

    def setAttribute(self, attr: CommandAttribute):
        super().setAttribute(attr)
        if attr == CommandAttribute.CA_Hide:
            self._action.setAttribute(ProxyActionAttribute.Hide)
        elif attr == CommandAttribute.CA_UpdateText:
            self._action.setAttribute(ProxyActionAttribute.UpdateText)
        elif attr == CommandAttribute.CA_UpdateIcon:
            self._action.setAttribute(ProxyActionAttribute.UpdateIcon)
        elif attr == CommandAttribute.CA_NonConfigurable:
            pass

    def removeAttribute(self, attr: CommandAttribute):
        super().setAttribute(attr)
        if attr == CommandAttribute.CA_Hide:
            self._action.removeAttribute(ProxyActionAttribute.Hide)
        elif attr == CommandAttribute.CA_UpdateText:
            self._action.removeAttribute(ProxyActionAttribute.UpdateText)
        elif attr == CommandAttribute.CA_UpdateIcon:
            self._action.removeAttribute(ProxyActionAttribute.UpdateIcon)
        elif attr == CommandAttribute.CA_NonConfigurable:
            pass
Exemple #4
0
 def stringWithAppendedShortcut(self, string: str) -> str:
     """Returns the **string** with an appended representation of the keyboard shortcut
     that is currently assigned to this Command."""
     return ProxyAction.stringWithAppendedShortcut(str, self.keySequence())