#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2012, Marten de Vries
#
# This file is part of OpenTeacher.
#
# OpenTeacher is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenTeacher 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenTeacher. If not, see <http://www.gnu.org/licenses/>.
#pyratemp is imported in enable()
import logging
logger = logging.getLogger(__name__)
class ModuleGraphBuilderModule:
def __init__(self, moduleManager, *args, **kwargs):
super().__init__(*args, **kwargs)
self._mm = moduleManager
self.type = "moduleGraphBuilder"
self.requires = (
self._mm.mods(type="qtApp"),
self._mm.mods(type="metadata"),
)
def _addEdges(self, mod, graph, demands, color):
for demand in demands:
for demandedMod in demand:
graph.add_edge(mod.type, demandedMod.type, dir="forward", color=color)
def buildModuleGraph(self, path):
graph = pygraphviz.AGraph(**{
"label": "%s module map" % self._metadata["name"],
"labelloc": "t", #top
"fontsize": len(set(self._mm.mods)) * 1.25,
"fontname": "Ubuntu",
"strict": False,
})
graph.node_attr["style"] = "filled"
hue = self._metadata["mainColorHue"]
color = QtGui.QColor.fromHsv(hue, 41, 250).name()
graph.node_attr["fillcolor"] = color
for mod in self._mm.mods:
if not hasattr(mod, "type"):
continue
graph.add_node(mod.type)
if hasattr(mod, "requires"):
self._addEdges(mod, graph, mod.requires, "#555555")
if hasattr(mod, "uses"):
self._addEdges(mod, graph, mod.uses, "#dddddd")
graph.draw(path, prog="dot")
def enable(self):
global pygraphviz, QtGui
try:
import pygraphviz
from PyQt5 import QtGui
except ImportError as e:
logger.debug(e)
return #remaining inactive
self._modules = set(self._mm.mods(type="modules")).pop()
self._metadata = self._modules.default("active", type="metadata").metadata
self.active = True
def disable(self):
self.active = False
del self._modules
del self._metadata
def init(moduleManager):
return ModuleGraphBuilderModule(moduleManager)