#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
**componentsManagerUi.py**
**Platform:**
Windows, Linux, Mac Os X.
**Description:**
Defines the :class:`ComponentsManagerUi` Component Interface class.
**Others:**
"""
#**********************************************************************************************************************
#*** Future imports.
#**********************************************************************************************************************
from __future__ import unicode_literals
#**********************************************************************************************************************
#*** External imports.
#**********************************************************************************************************************
import os
import sys
if sys.version_info[:2] <= (2, 6):
from ordereddict import OrderedDict
else:
from collections import OrderedDict
from PyQt4.QtCore import QMargins
from PyQt4.QtCore import Qt
from PyQt4.QtCore import pyqtSignal
from PyQt4.QtGui import QAction
#**********************************************************************************************************************
#*** Internal imports.
#**********************************************************************************************************************
import foundations.exceptions
import foundations.walkers
import foundations.strings
import foundations.verbose
import manager.exceptions
import umbra.engine
import umbra.exceptions
import umbra.ui.nodes
from manager.qwidgetComponent import QWidgetComponentFactory
from umbra.components.factory.componentsManagerUi.models import ComponentsModel
from umbra.components.factory.componentsManagerUi.nodes import ComponentNode
from umbra.components.factory.componentsManagerUi.nodes import PathNode
from umbra.components.factory.componentsManagerUi.views import Components_QTreeView
#**********************************************************************************************************************
#*** Module attributes.
#**********************************************************************************************************************
__author__ = "Thomas Mansencal"
__copyright__ = "Copyright (C) 2008 - 2014 - Thomas Mansencal"
__license__ = "GPL V3.0 - http://www.gnu.org/licenses/"
__maintainer__ = "Thomas Mansencal"
__email__ = "[email protected]"
__status__ = "Production"
__all__ = ["LOGGER", "COMPONENT_UI_FILE", "ComponentsManagerUi"]
LOGGER = foundations.verbose.installLogger()
COMPONENT_UI_FILE = os.path.join(os.path.dirname(__file__), "ui", "Components_Manager_Ui.ui")
#**********************************************************************************************************************
#*** Module classes and definitions.
#**********************************************************************************************************************
[docs]class ComponentsManagerUi(QWidgetComponentFactory(uiFile=COMPONENT_UI_FILE)):
"""
| Defines the :mod:`umbra.components.factory.componentsManagerUi.componentsManagerUi` Component Interface class.
| It defines methods to interact with
the :class:`manager.componentsManager.Manager` class Application instance Components.
"""
# Custom signals definitions.
refreshNodes = pyqtSignal()
"""
This signal is emited by the :class:`ComponentsManagerUi` class when :obj:`ComponentsManagerUi.model` class property
model Nodes nodes needs to be refreshed. ( pyqtSignal )
"""
activatedComponent = pyqtSignal(unicode)
"""
This signal is emited by the :class:`ComponentsManagerUi` class when a Component is activated. ( pyqtSignal )
:return: Activated Component name.
:rtype: unicode
"""
deactivatedComponent = pyqtSignal(unicode)
"""
This signal is emited by the :class:`ComponentsManagerUi` class when a Component is deactivated. ( pyqtSignal )
:return: Deactivated Component name.
:rtype: unicode
"""
reloadedComponent = pyqtSignal(unicode)
"""
This signal is emited by the :class:`ComponentsManagerUi` class when a Component is reloaded. ( pyqtSignal )
:return: Reloaded Component name.
:rtype: unicode
"""
def __init__(self, parent=None, name=None, *args, **kwargs):
"""
Initializes the class.
:param parent: Object parent.
:type parent: QObject
:param name: Component name.
:type name: unicode
:param \*args: Arguments.
:type \*args: \*
:param \*\*kwargs: Keywords arguments.
:type \*\*kwargs: \*\*
"""
LOGGER.debug("> Initializing '{0}()' class.".format(self.__class__.__name__))
super(ComponentsManagerUi, self).__init__(parent, name, *args, **kwargs)
# --- Setting class attributes. ---
self.deactivatable = False
self.__uiResourcesDirectory = "resources"
self.__uiActivatedImage = "Activated.png"
self.__uiDeactivatedImage = "Deactivated.png"
self.__uiCategoryAffixe = "_Category.png"
self.__dockArea = 1
self.__engine = None
self.__settings = None
self.__model = None
self.__view = None
self.__headers = OrderedDict([("Components", "name"),
("Activated", "activated"),
("Category", "category"),
("Dependencies", "require"),
("Version", "version")])
self.__treeViewInnerMargins = QMargins(0, 0, 0, 12)
self.__componentsInformationsDefaultText = \
"<center><h4>* * *</h4>Select some Components to display related informations!<h4>* * *</h4></center>"
self.__componentsInformationsText = """
<h4><center>{0}</center></h4>
<p>
<b>Category:</b> {1}
<br/>
<b>Author:</b> {2}
<br/>
<b>Email:</b> <a href="mailto:{3}">
<span style=" text-decoration: underline; color:#e0e0e0;">{3}</span></a>
<br/>
<b>Url:</b> <a href="{4}">
<span style=" text-decoration: underline; color:#e0e0e0;">{4}</span></a>
<p>
<b>Description:</b> {5}
</p>
</p>
"""
#******************************************************************************************************************
#*** Attributes properties.
#******************************************************************************************************************
@property
def uiResourcesDirectory(self):
"""
Property for **self.__uiResourcesDirectory** attribute.
:return: self.__uiResourcesDirectory.
:rtype: unicode
"""
return self.__uiResourcesDirectory
@uiResourcesDirectory.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def uiResourcesDirectory(self, value):
"""
Setter for **self.__uiResourcesDirectory** attribute.
:param value: Attribute value.
:type value: unicode
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "uiResourcesDirectory"))
@uiResourcesDirectory.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def uiResourcesDirectory(self):
"""
Deleter for **self.__uiResourcesDirectory** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "uiResourcesDirectory"))
@property
def uiActivatedImage(self):
"""
Property for **self.__uiActivatedImage** attribute.
:return: self.__uiActivatedImage.
:rtype: unicode
"""
return self.__uiActivatedImage
@uiActivatedImage.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def uiActivatedImage(self, value):
"""
Setter for **self.__uiActivatedImage** attribute.
:param value: Attribute value.
:type value: unicode
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "uiActivatedImage"))
@uiActivatedImage.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def uiActivatedImage(self):
"""
Deleter for **self.__uiActivatedImage** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "uiActivatedImage"))
@property
def uiDeactivatedImage(self):
"""
Property for **self.__uiDeactivatedImage** attribute.
:return: self.__uiDeactivatedImage.
:rtype: unicode
"""
return self.__uiDeactivatedImage
@uiDeactivatedImage.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def uiDeactivatedImage(self, value):
"""
Setter for **self.__uiDeactivatedImage** attribute.
:param value: Attribute value.
:type value: unicode
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "uiDeactivatedImage"))
@uiDeactivatedImage.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def uiDeactivatedImage(self):
"""
Deleter for **self.__uiDeactivatedImage** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "uiDeactivatedImage"))
@property
def uiCategoryAffixe(self):
"""
Property for **self.__uiCategoryAffixe** attribute.
:return: self.__uiCategoryAffixe.
:rtype: unicode
"""
return self.__uiCategoryAffixe
@uiCategoryAffixe.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def uiCategoryAffixe(self, value):
"""
Setter for **self.__uiCategoryAffixe** attribute.
:param value: Attribute value.
:type value: unicode
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "uiCategoryAffixe"))
@uiCategoryAffixe.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def uiCategoryAffixe(self):
"""
Deleter for **self.__uiCategoryAffixe** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "uiCategoryAffixe"))
@property
def dockArea(self):
"""
Property for **self.__dockArea** attribute.
:return: self.__dockArea.
:rtype: int
"""
return self.__dockArea
@dockArea.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def dockArea(self, value):
"""
Setter for **self.__dockArea** attribute.
:param value: Attribute value.
:type value: int
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "dockArea"))
@dockArea.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def dockArea(self):
"""
Deleter for **self.__dockArea** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "dockArea"))
@property
def engine(self):
"""
Property for **self.__engine** attribute.
:return: self.__engine.
:rtype: QObject
"""
return self.__engine
@engine.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def engine(self, value):
"""
Setter for **self.__engine** attribute.
:param value: Attribute value.
:type value: QObject
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "engine"))
@engine.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def engine(self):
"""
Deleter for **self.__engine** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "engine"))
@property
def settings(self):
"""
Property for **self.__settings** attribute.
:return: self.__settings.
:rtype: QSettings
"""
return self.__settings
@settings.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def settings(self, value):
"""
Setter for **self.__settings** attribute.
:param value: Attribute value.
:type value: QSettings
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "settings"))
@settings.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def settings(self):
"""
Deleter for **self.__settings** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "settings"))
@property
def model(self):
"""
Property for **self.__model** attribute.
:return: self.__model.
:rtype: ComponentsModel
"""
return self.__model
@model.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def model(self, value):
"""
Setter for **self.__model** attribute.
:param value: Attribute value.
:type value: ComponentsModel
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "model"))
@model.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def model(self):
"""
Deleter for **self.__model** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "model"))
@property
def view(self):
"""
Property for **self.__view** attribute.
:return: self.__view.
:rtype: QWidget
"""
return self.__view
@view.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def view(self, value):
"""
Setter for **self.__view** attribute.
:param value: Attribute value.
:type value: QWidget
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "view"))
@view.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def view(self):
"""
Deleter for **self.__view** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "view"))
@property
def headers(self):
"""
Property for **self.__headers** attribute.
:return: self.__headers.
:rtype: list
"""
return self.__headers
@headers.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def headers(self, value):
"""
Setter for **self.__headers** attribute.
:param value: Attribute value.
:type value: list
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "headers"))
@headers.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
@property
def treeViewInnerMargins(self):
"""
Property for **self.__treeViewInnerMargins** attribute.
:return: self.__treeViewInnerMargins.
:rtype: int
"""
return self.__treeViewInnerMargins
@treeViewInnerMargins.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def treeViewInnerMargins(self, value):
"""
Setter for **self.__treeViewInnerMargins** attribute.
:param value: Attribute value.
:type value: int
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "treeViewInnerMargins"))
@treeViewInnerMargins.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def treeViewInnerMargins(self):
"""
Deleter for **self.__treeViewInnerMargins** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "treeViewInnerMargins"))
@property
def componentsInformationsDefaultText(self):
"""
Property for **self.__componentsInformationsDefaultText** attribute.
:return: self.__componentsInformationsDefaultText.
:rtype: unicode
"""
return self.__componentsInformationsDefaultText
@componentsInformationsDefaultText.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def componentsInformationsDefaultText(self, value):
"""
Setter for **self.__componentsInformationsDefaultText** attribute.
:param value: Attribute value.
:type value: unicode
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "componentsInformationsDefaultText"))
@componentsInformationsDefaultText.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def componentsInformationsDefaultText(self):
"""
Deleter for **self.__componentsInformationsDefaultText** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "componentsInformationsDefaultText"))
@property
def componentsInformationsText(self):
"""
Property for **self.__componentsInformationsText** attribute.
:return: self.__componentsInformationsText.
:rtype: unicode
"""
return self.__componentsInformationsText
@componentsInformationsText.setter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
def componentsInformationsText(self, value):
"""
Setter for **self.__componentsInformationsText** attribute.
:param value: Attribute value.
:type value: unicode
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is read only!".format(self.__class__.__name__, "componentsInformationsText"))
@componentsInformationsText.deleter
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def componentsInformationsText(self):
"""
Deleter for **self.__componentsInformationsText** attribute.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' attribute is not deletable!".format(self.__class__.__name__, "componentsInformationsText"))
#******************************************************************************************************************
#*** Class methods.
#******************************************************************************************************************
[docs] def activate(self, engine):
"""
Activates the Component.
:param engine: Engine to attach the Component to.
:type engine: QObject
:return: Method success.
:rtype: bool
"""
LOGGER.debug("> Activating '{0}' Component.".format(self.__class__.__name__))
self.__uiResourcesDirectory = os.path.join(os.path.dirname(__file__), self.__uiResourcesDirectory)
self.__engine = engine
self.__settings = self.__engine.settings
self.activated = True
return True
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def deactivate(self):
"""
Deactivates the Component.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' Component cannot be deactivated!".format(self.__class__.__name__, self.__name))
[docs] def initializeUi(self):
"""
Initializes the Component ui.
:return: Method success.
:rtype: bool
"""
LOGGER.debug("> Initializing '{0}' Component ui.".format(self.__class__.__name__))
self.__model = ComponentsModel(self, horizontalHeaders=self.__headers)
self.setComponents()
self.Components_Manager_Ui_treeView.setParent(None)
self.Components_Manager_Ui_treeView = Components_QTreeView(self, self.__model)
self.Components_Manager_Ui_treeView.setObjectName("Components_Manager_Ui_treeView")
self.Components_Manager_Ui_gridLayout.setContentsMargins(self.__treeViewInnerMargins)
self.Components_Manager_Ui_gridLayout.addWidget(self.Components_Manager_Ui_treeView, 0, 0)
self.__view = self.Components_Manager_Ui_treeView
self.__view.setContextMenuPolicy(Qt.ActionsContextMenu)
self.__view_addActions()
self.Components_Informations_textBrowser.setText(self.__componentsInformationsDefaultText)
self.Components_Manager_Ui_splitter.setSizes([ 16777215, 1 ])
# Signals / Slots.
self.__view.selectionModel().selectionChanged.connect(self.__view_selectionModel__selectionChanged)
self.refreshNodes.connect(self.__model__refreshNodes)
self.initializedUi = True
return True
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(foundations.exceptions.ProgrammingError)
[docs] def uninitializeUi(self):
"""
Uninitializes the Component ui.
"""
raise foundations.exceptions.ProgrammingError(
"{0} | '{1}' Component ui cannot be uninitialized!".format(self.__class__.__name__, self.name))
[docs] def onStartup(self):
"""
Defines the slot triggered by Framework startup.
:return: Method success.
:rtype: bool
"""
LOGGER.debug("> Calling '{0}' Component Framework 'onStartup' method.".format(self.__class__.__name__))
self.refreshNodes.emit()
return True
def __model__refreshNodes(self):
"""
Defines the slot triggered by the Model when nodes need refresh.
"""
LOGGER.debug("> Refreshing '{0}' Model!".format("Components_Manager_Ui_treeView"))
self.setComponents()
def __view_addActions(self):
"""
Sets the **Components_Manager_Ui_treeView** actions.
"""
self.Components_Manager_Ui_treeView.addAction(self.__engine.actionsManager.registerAction(
"Actions|Umbra|Components|factory.ComponentsManagerUi|Activate Component(s)",
slot=self.__view_activateComponentsAction__triggered))
self.Components_Manager_Ui_treeView.addAction(self.__engine.actionsManager.registerAction(
"Actions|Umbra|Components|factory.ComponentsManagerUi|Deactivate Component(s)",
slot=self.__view_deactivateComponentsAction__triggered))
separatorAction = QAction(self.Components_Manager_Ui_treeView)
separatorAction.setSeparator(True)
self.Components_Manager_Ui_treeView.addAction(separatorAction)
self.Components_Manager_Ui_treeView.addAction(self.__engine.actionsManager.registerAction(
"Actions|Umbra|Components|factory.ComponentsManagerUi|Reload Component(s)",
slot=self.__view_reloadComponentsAction__triggered))
separatorAction = QAction(self.Components_Manager_Ui_treeView)
separatorAction.setSeparator(True)
self.Components_Manager_Ui_treeView.addAction(separatorAction)
def __view_activateComponentsAction__triggered(self, checked):
"""
Defines the slot triggered by \*\*'Actions|Umbra|Components|factory.ComponentsManagerUi|Activate Component(s)'** action.
:param checked: Action checked state.
:type checked: bool
:return: Method success.
:rtype: bool
"""
return self.activateComponentsUi()
def __view_deactivateComponentsAction__triggered(self, checked):
"""
Defines the slot triggered by
**'Actions|Umbra|Components|factory.ComponentsManagerUi|Deactivate Component(s)'** action.
:param checked: Action checked state.
:type checked: bool
:return: Method success.
:rtype: bool
"""
return self.deactivateComponentsUi()
def __view_reloadComponentsAction__triggered(self, checked):
"""
Defines the slot triggered by \*\*'Actions|Umbra|Components|factory.ComponentsManagerUi|Reload Component(s)'** action.
:param checked: Action checked state.
:type checked: bool
:return: Method success.
:rtype: bool
"""
return self.reloadComponentsUi()
def __view_selectionModel__selectionChanged(self, selectedItems, deselectedItems):
"""
Sets the **Additional_Informations_textEdit** Widget.
:param selectedItems: Selected items.
:type selectedItems: QItemSelection
:param deselectedItems: Deselected items.
:type deselectedItems: QItemSelection
"""
LOGGER.debug("> Initializing '{0}' Widget.".format("Additional_Informations_textEdit"))
selectedComponents = self.getSelectedComponents()
content = []
if selectedComponents:
for item in selectedComponents:
content.append(self.__componentsInformationsText.format(item.name,
item.category,
item.author,
item.email,
item.url,
item.description))
else:
content.append(self.__componentsInformationsDefaultText)
separator = "" if len(content) == 1 else "<p><center>* * *<center/></p>"
self.Components_Informations_textBrowser.setText(separator.join(content))
def __storeDeactivatedComponents(self):
"""
Stores deactivated Components in settings file.
"""
deactivatedComponents = []
for node in foundations.walkers.nodesWalker(self.__model.rootNode):
if node.family == "Component":
node.component.interface.activated or deactivatedComponents.append(node.component.name)
LOGGER.debug("> Storing '{0}' deactivated Components.".format(", ".join(deactivatedComponents)))
self.__settings.setKey("Settings", "deactivatedComponents", ",".join(deactivatedComponents))
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(umbra.exceptions.notifyExceptionHandler,
# Oncilla: Statement commented by auto-documentation process: manager.exceptions.ComponentActivationError)
# Oncilla: Statement commented by auto-documentation process: @umbra.engine.encapsulateProcessing
[docs] def activateComponentsUi(self):
"""
Activates user selected Components.
:return: Method success.
:rtype: bool
:note: May require user interaction.
"""
selectedComponents = self.getSelectedComponents()
self.__engine.startProcessing("Activating Components ...", len(selectedComponents))
activationFailedComponents = []
for component in selectedComponents:
if not component.interface.activated:
success = self.activateComponent(component.name) or False
if not success:
activationFailedComponents.append(component)
else:
self.__engine.notificationsManager.warnify("{0} | '{1}' Component is already activated!".format(
self.__class__.__name__, component.name))
self.__engine.stepProcessing()
self.__engine.stopProcessing()
self.__storeDeactivatedComponents()
if not activationFailedComponents:
return True
else:
raise manager.exceptions.ComponentActivationError(
"{0} | Exception(s) raised while activating '{1}' Component(s)!".format(self.__class__.__name__,
", ". join((activationFailedComponent.name for activationFailedComponent in activationFailedComponents))))
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(umbra.exceptions.notifyExceptionHandler,
# Oncilla: Statement commented by auto-documentation process: manager.exceptions.ComponentDeactivationError)
# Oncilla: Statement commented by auto-documentation process: @umbra.engine.encapsulateProcessing
[docs] def deactivateComponentsUi(self):
"""
Deactivates user selected Components.
:return: Method success.
:rtype: bool
:note: May require user interaction.
"""
selectedComponents = self.getSelectedComponents()
self.__engine.startProcessing("Deactivating Components ...", len(selectedComponents))
deactivationFailedComponents = []
for component in selectedComponents:
if component.interface.activated:
if component.interface.deactivatable:
success = self.deactivateComponent(component.name) or False
if not success:
deactivationFailedComponents.append(component)
else:
self.__engine.notificationsManager.warnify(
"{0} | '{1}' Component cannot be deactivated!".format(self.__class__.__name__, component.name))
else:
self.__engine.notificationsManager.warnify(
"{0} | '{1}' Component is already deactivated!".format(self.__class__.__name__, component.name))
self.__engine.stepProcessing()
self.__engine.stopProcessing()
self.__storeDeactivatedComponents()
if not deactivationFailedComponents:
return True
else:
raise manager.exceptions.ComponentDeactivationError(
"{0} | Exception(s) raised while deactivating '{1}' Component(s)!".format(self.__class__.__name__,
", ". join((deactivationFailedComponent.name
for deactivationFailedComponent in deactivationFailedComponents))))
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(umbra.exceptions.notifyExceptionHandler,
# Oncilla: Statement commented by auto-documentation process: manager.exceptions.ComponentReloadError)
# Oncilla: Statement commented by auto-documentation process: @umbra.engine.encapsulateProcessing
[docs] def reloadComponentsUi(self):
"""
Reloads user selected Components.
:return: Method success.
:rtype: bool
:note: May require user interaction.
"""
selectedComponents = self.getSelectedComponents()
self.__engine.startProcessing("Reloading Components ...", len(selectedComponents))
reloadFailedComponents = []
for component in selectedComponents:
if component.interface.deactivatable:
success = self.reloadComponent(component.name) or False
if not success:
reloadFailedComponents.append(component)
else:
self.__engine.notificationsManager.warnify(
"{0} | '{1}' Component cannot be deactivated and won't be reloaded!".format(self.__class__.__name__,
component.name))
self.__engine.stepProcessing()
self.__engine.stopProcessing()
if not reloadFailedComponents:
return True
else:
raise manager.exceptions.ComponentReloadError(
"{0} | Exception(s) raised while reloading '{1}' Component(s)!".format(self.__class__.__name__,
", ". join((reloadFailedComponent.name for reloadFailedComponent in reloadFailedComponents))))
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(manager.exceptions.ComponentExistsError, Exception)
[docs] def activateComponent(self, name):
"""
Activates given Component.
:param name: Component name.
:type name: unicode
:return: Method success.
:rtype: bool
"""
if not name in self.__engine.componentsManager.components:
raise manager.exceptions.ComponentExistsError(
"{0} | '{1}' Component isn't registered in the Components Manager!".format(self.__class__.__name__, name))
component = self.__engine.componentsManager.components[name]
if component.interface.activated:
LOGGER.warning("!> {0} | '{1}' Component is already activated!".format(self.__class__.__name__, name))
return False
LOGGER.debug("> Attempting '{0}' Component activation.".format(component.name))
component.interface.activate(self.__engine)
if component.category in ("Default", "QObject"):
component.interface.initialize()
elif component.category == "QWidget":
component.interface.initializeUi()
component.interface.addWidget()
LOGGER.info("{0} | '{1}' Component has been activated!".format(self.__class__.__name__, component.name))
self.activatedComponent.emit(name)
self.refreshNodes.emit()
return True
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(manager.exceptions.ComponentExistsError,
# Oncilla: Statement commented by auto-documentation process: manager.exceptions.ComponentDeactivationError)
[docs] def deactivateComponent(self, name):
"""
Deactivates given Component.
:param name: Component name.
:type name: unicode
:return: Method success.
:rtype: bool
"""
if not name in self.__engine.componentsManager.components:
raise manager.exceptions.ComponentExistsError(
"{0} | '{0}' Component isn't registered in the Components Manager!".format(self.__class__.__name__, name))
component = self.__engine.componentsManager.components[name]
if not component.interface.activated:
LOGGER.warning("!> {0} | '{1}' Component is already deactivated!".format(self.__class__.__name__, name))
return False
LOGGER.debug("> Attempting '{0}' Component deactivation.".format(component.name))
if component.interface.deactivatable:
if component.category in ("Default", "QObject"):
component.interface.uninitialize()
elif component.category == "QWidget":
component.interface.uninitializeUi()
component.interface.removeWidget()
component.interface.deactivate()
LOGGER.info("{0} | '{1}' Component has been deactivated!".format(self.__class__.__name__, component.name))
self.deactivatedComponent.emit(name)
self.refreshNodes.emit()
return True
else:
raise manager.exceptions.ComponentDeactivationError(
"{0} | '{1}' Component cannot be deactivated!".format(self.__class__.__name__, component.name))
# Oncilla: Statement commented by auto-documentation process:
# Oncilla: Statement commented by auto-documentation process: @foundations.exceptions.handleExceptions(manager.exceptions.ComponentExistsError,
# Oncilla: Statement commented by auto-documentation process: manager.exceptions.ComponentReloadError)
[docs] def reloadComponent(self, name):
"""
Reloads given Component.
:param name: Component name.
:type name: unicode
:return: Method success.
:rtype: bool
"""
if not name in self.__engine.componentsManager.components:
raise manager.exceptions.ComponentExistsError(
"{0} | '{1}' Component isn't registered in the Components Manager!".format(self.__class__.__name__, name))
component = self.__engine.componentsManager.components[name]
LOGGER.debug("> Attempting '{0}' Component reload.".format(component.name))
if component.interface.deactivatable:
dependents = list(reversed(self.__engine.componentsManager.listDependents(component.name)))
if filter(lambda x: not self.__engine.componentsManager[x].deactivatable, dependents):
LOGGER.warning(
"!> {0} | '{1}' Component has non reloadable dependencies and won't be reloaded!".format(
self.__class__.__name__, component.name))
return False
LOGGER.info("{0} | '{1}' Component dependents: '{2}'.".format(self.__class__.__name__,
component.name,
", ".join(dependents)))
LOGGER.debug("> Deactivating '{0}' Component dependents.".format(component.name))
dependents.append(component.name)
for dependent in dependents:
if self.__engine.componentsManager[dependent].activated:
self.deactivateComponent(dependent)
self.__engine.processEvents()
LOGGER.debug("> Reloading '{0}' Component dependents.".format(component.name))
self.__engine.componentsManager.reloadComponent(component.name)
LOGGER.debug("> Activating '{0}' Component dependents.".format(component.name))
for dependent in reversed(dependents):
if not self.__engine.componentsManager[dependent].activated:
self.activateComponent(dependent)
self.__engine.processEvents()
LOGGER.info("{0} | '{1}' Component has been reloaded!".format(self.__class__.__name__, component.name))
self.reloadedComponent.emit(component.name)
return True
else:
raise manager.exceptions.ComponentReloadError(
"{0} | '{1}' Component cannot be deactivated and won't be reloaded!".format(self.__class__.__name__,
component.name))
[docs] def getComponents(self):
"""
Returns the Components.
:return: Components.
:rtype: list
"""
return self.__engine.componentsManager.components
[docs] def listComponents(self):
"""
Lists the Components names.
:return: Components names.
:rtype: list
"""
return self.__engine.componentsManager.listComponents()
[docs] def setComponents(self):
"""
Sets the Components Model nodes.
"""
nodeFlags = attributesFlags = int(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
rootNode = umbra.ui.nodes.DefaultNode(name="InvisibleRootNode")
paths = {}
for path in self.__engine.componentsManager.paths:
basename = os.path.basename(path)
if not paths.get(basename):
paths[basename] = {}
paths[basename].update(dict((name, component) \
for (name, component) in self.__engine.componentsManager \
if basename == os.path.basename(os.path.dirname(component.directory))))
for path, components in paths.iteritems():
pathNode = PathNode(name=path.title(),
parent=rootNode,
nodeFlags=nodeFlags,
attributesFlags=attributesFlags)
for component in components.itervalues():
if not component.interface:
continue
componentNode = ComponentNode(component,
name=component.title,
parent=pathNode,
nodeFlags=nodeFlags,
attributesFlags=attributesFlags,
activated=umbra.ui.nodes.GraphModelAttribute(name="activated",
flags=attributesFlags,
roles={Qt.DisplayRole: foundations.strings.toString(component.interface.activated),
Qt.DecorationRole:os.path.join(self.__uiResourcesDirectory,
component.interface.activated and \
self.__uiActivatedImage or self.__uiDeactivatedImage)}))
componentNode.roles[Qt.DecorationRole] = os.path.join(self.__uiResourcesDirectory,
"{0}{1}".format(component.category, self.__uiCategoryAffixe))
rootNode.sortChildren()
self.__model.initializeModel(rootNode)
return True
[docs] def getSelectedNodes(self):
"""
Returns the View selected nodes.
:return: View selected nodes.
:rtype: dict
"""
return self.__view.getSelectedNodes()
[docs] def getSelectedComponentsNodes(self):
"""
Returns the View selected Components nodes.
:return: View selected Components nodes.
:rtype: list
"""
return [node for node in self.getSelectedNodes() if node.family == "Component"]
[docs] def getSelectedComponents(self):
"""
Returns the View selected Components.
:return: View selected Components.
:rtype: list
"""
return [node.component for node in self.getSelectedComponentsNodes()]