示例#1
0
class Base(object):

    def __init__(self):
        self.proj = Project()
        self.output_xml = "save.xml"
        self.input_xml = "load.xml"
        self._set_up_logger()
        logging.info("Base loaded!")

    def _set_up_logger(self):
        logging.basicConfig(
            level=logging.DEBUG,
            format='[%(asctime)s] {%(pathname)s:%(lineno)d} '
                   '%(levelname)s - %(message)s',
            handlers=[logging.StreamHandler()], datefmt='%H:%M:%S')

    def save(self):
        with open(self.output_xml, 'w') as out:
            out.write(str(self.proj))

    def load(self):
        with open(self.input_xml, 'r') as inp:
            self.proj.deserialize(fromstring(inp.read()))

    def run(self):
        return 0
 def test_project(self):
     _xml = fromstring(
         "<project><edge type='auto' x='0' y='0' thickness='50' " +
         "color='#ffffff' node1='540' node2='0' />" +
         "<node x='0' y='0' id='0' shape='classic' " +
         "background='#000000' height='50' width='100'>" +
         "<text size='0' color='#000000' font='lol'>ExampleText</text>" +
         "<annotation>ExampleAnnotation</annotation>" +
         "</node></project>")
     proj = Project()
     proj.deserialize(_xml)
     self._check_edge(proj)
     self._check_node(proj)
     self._check_text(proj)
     self._check_annotation(proj)
 def test_project(self):
     proj = Project()
     proj.append(
         Node(id="0", x=0, y=0, background="#000000",
              shape="classic", size=50, padding=0,
              text=Text(font="KEK", size=0, color="#808080",
                        text="ExampleText"),
              annotation=Annotation(text="ExampleAnnotation")))
     proj.append(
         Edge(type='auto', thickness=50, color='#ffffff',
              node1=540, node2=0, x=0, y=0))
     self.assertIn("<project>", str(proj))
     self.assertIn("</project>", str(proj))
     self._check_node(proj)
     self._check_edge(proj)
     self._check_text(proj)
     self._check_annotation(proj)
 def test_xml_parse(self):
     proj = Project()
     proj.append(
         Node(id="0", x=0, y=0, background="#000000",
              shape="classic", size=50, padding=0,
              text=Text(font="KEK", size=0, color="#808080",
                        text="ExampleText"),
              annotation=Annotation(text="ExampleAnnotation")))
     proj.append(
         Edge(type='auto', thickness=50, color='#ffffff',
              node1=540, node2=0, x=0, y=0))
     xml = fromstring(str(proj))
     for node in xml.iterfind("node"):
         self._check_xml_node(self._xml_to_str(node))
         for text in xml.iterfind("text"):
             self._check_text(text)
         for annotation in xml.iterfind("annotation"):
             self._check_annotation(annotation)
     for edge in xml.iterfind("edge"):
         self._check_edge(self._xml_to_str(edge))
示例#5
0
 def __init__(self, view_manager):
     self.view_manager = view_manager
     self.node_shape = 0
     self.node_width = 0
     self.node_height = 0
     self.node_background = "#9dd2e7"
     self.node_text_color = "black"
     self.node_text_font = "Sans Serif"
     self.node_text_size = 14
     self.active_node = None
     self.active_edge = None
     self.edge_color = "#9dd2e7"
     self.edge_thickness = 0
     self.edge_spiked = 0
     self.edge_arrow = 0
     self.edge_type = 0
     self.connectNode = None
     self.project = Project()
     self.nodeViews = {}
     self.edgeViews = {}
示例#6
0
class Controller(object):

    NODE_IDS = 0
    EDGE_IDS = 0

    def __init__(self, view_manager):
        self.view_manager = view_manager
        self.node_shape = 0
        self.node_width = 0
        self.node_height = 0
        self.node_background = "#9dd2e7"
        self.node_text_color = "black"
        self.node_text_font = "Sans Serif"
        self.node_text_size = 14
        self.active_node = None
        self.active_edge = None
        self.edge_color = "#9dd2e7"
        self.edge_thickness = 0
        self.edge_spiked = 0
        self.edge_arrow = 0
        self.edge_type = 0
        self.connectNode = None
        self.workspace_width = 800
        self.workspace_height = 600
        self.project = Project()
        self.nodeViews = {}
        self.edgeViews = {}

    def load(self, what):
        try:
            # open file and load project
            if what != "":
                xml = QFile(what.toLocalFile())
            else:
                xml = QFile("temp")
            if xml.open(QFile.ReadOnly):
                self.project.deserialize(fromstring(xml.readAll()))
            if(what == ""):
                os.remove("./temp")
            # create views
            for id in self.project.nodes:
                self.nodeViews[id] = self.view_manager.create_node(
                    self.project.nodes[id])
                # node_ids should be biggest of loaded ids
                if self.NODE_IDS <= id:
                    self.NODE_IDS = id + 1
            # create edges
            for id in self.project.edges:
                self.edgeViews[id] = self.view_manager.create_edge(
                    self.project.edges[id],
                    self.project.nodes[self.project.edges[id].node1],
                    self.project.nodes[self.project.edges[id].node2])
                # egde_ids should be biggest of loaded ids
                if self.EDGE_IDS <= id:
                    self.EDGE_IDS = id + 1
            print("Loaded nodes: " + str(self.project.nodes))
            print("Loaded NodeViews: " + str(self.nodeViews))
            print("Loaded edges: " + str(self.project.edges))
            print("Loaded EdgeViews: " + str(self.edgeViews))
        except:
            print("Nepodarilo sa nacitat subor")

    def exporting(self):
        try:
            os.mkdir("export")
        except:
            pass

    def save(self, where):
        try:
            os.mkdir("save")
        except:
            pass
        where = "save/" + where
        if where != "":
            if where[-4:] != ".xml":
                where += ".xml"
        else:
            where = "temp"
        with open(where, "w") as out:
            out.write(str(self.project))

    def create_node(self, x, y):
        height = self.node_height
        if height == 0:
            height = 100
        width = self.node_width
        if width == 0:
            width = 100
        node = Node(x=int(x), y=int(y), background=self.node_background,
                    shape=self.node_shape, width=width,
                    height=height, id=self.NODE_IDS, text=Text(
                        font=self.node_text_font, size=self.node_text_size,
                        color=self.node_text_color, text=""),
                    annotation=Annotation())
        if self.node_shape == 2:
            node.background = ""
        self.project.append(node)
        self.nodeViews[self.NODE_IDS] = self.view_manager.create_node(node)
        self.NODE_IDS += 1
        self.active_node = None
        self.node_focus(node.id)

    def create_edge(self, node1, node2):
        print(node1.id, node2.id)
        thickness = self.edge_thickness
        if thickness == 0:
            thickness = 10
        edge = Edge(x=int((node1.x + node2.x) / 2),
                    y=int((node1.y + node2.y) / 2),
                    thickness=thickness, type=self.edge_type,
                    spiked=self.edge_spiked, arrow=self.edge_arrow,
                    node1=node1.id, node2=node2.id, id=self.EDGE_IDS,
                    color=self.edge_color)
        self.project.edges[self.EDGE_IDS] = edge
        self.edgeViews[self.EDGE_IDS] = self.view_manager.create_edge(
            edge, node1, node2)
        self.EDGE_IDS += 1
        self.edge_focus(edge.id)

    def node_text_changed(self, id, text):
        logging.debug('Text of node ' + str(id) + ' changed to: ' + text)
        self.project.nodes[int(id)].text.text = text

    def node_annot_changed(self, id, text):
        self.project.nodes[id].annotation = Annotation(text=text)
        self.view_manager.node_update(self.project.nodes[int(id)])

    def node_position_changed(self, id, x, y):
        logging.debug('Position of node ' + str(id) + ' changed to: [' +
                      str(int(x)) + ',' + str(int(y)) + ']')
        self.active_node.x = int(x)
        self.active_node.y = int(y)
        self.view_manager._main.rootObject().setProperty(
            "activeNodeX", int(x))
        self.view_manager._main.rootObject().setProperty(
            "activeNodeY", int(y))
        self.view_manager.node_update(self.project.nodes[int(id)])

        # Connection indicator modification
        if self.connectNode is not None:
            if self.connectNode.id == int(id):
                self.view_manager._main.rootObject().setProperty(
                    "connectingFromX", x)
                self.view_manager._main.rootObject().setProperty(
                    "connectingFromY", y)
                self.view_manager._main.rootObject().setProperty(
                    "connectingToX", x)
                self.view_manager._main.rootObject().setProperty(
                    "connectingToY", y)

        # Edge modification
        start_ids = []
        end_ids = []
        for key, edge in self.project.edges.items():
            if edge.node1 == int(id):
                start_ids.append(edge.id)
            elif edge.node2 == int(id):
                end_ids.append(edge.id)

        for key, view in self.edgeViews.items():
            if key in start_ids:
                view.rootObject().setProperty("startX", str(x))
                view.rootObject().setProperty("startY", str(y))
            elif key in end_ids:
                view.rootObject().setProperty("endX", str(x))
                view.rootObject().setProperty("endY", str(y))

    def clear_workspace(self):
        node_keys = list(self.project.nodes.keys())
        for id in node_keys:
            self.node_delete(int(id))
        self.NODE_IDS = 0
        self.EDGE_IDS = 0

    def node_delete(self, id):
        logging.debug('Delete of node ' + str(id) + ' issued')
        self.nodeViews[int(id)].deleteLater()
        del self.nodeViews[int(id)]
        del self.project.nodes[int(id)]
        invalid_edges = []
        for key, edge in self.project.edges.items():
            if ((edge.node1 == int(id)) or (edge.node2 == int(id))):
                invalid_edges.append(key)
        for edge_id in invalid_edges:
            self.edge_delete(edge_id)
        if self.connectNode and self.connectNode.id == int(id):
            self.connectNode = None
        self.active_node = None
        self.view_manager._main.rootObject().setProperty(
            "hasActiveNode", False)

    def edge_delete(self, id):
        logging.debug('Delete of edge ' + str(id) + ' issued')
        self.edgeViews[int(id)].deleteLater()
        del self.edgeViews[int(id)]
        del self.project.edges[int(id)]
        self.active_edge = None
        self.view_manager._main.rootObject().setProperty(
            "hasActiveEdge", False)

    def edge_position_changed(self, id, x, y):
        self.project.edges[int(id)].x = int(x)
        self.project.edges[int(id)].y = int(y)
        logging.debug('Position of edge ' + str(id) + ' ctrpoint changed' +
                      ' to: [' + str(int(x)) + ',' + str(int(y)) + ']\n' +
                      str(self.project.edges[int(id)]))

    def node_connect(self, id):
        if self.connectNode is None:
            self.connectNode = self.project.nodes[int(id)]
            self.view_manager._main.rootObject().setProperty(
                "connectingFromX", self.connectNode.x)
            self.view_manager._main.rootObject().setProperty(
                "connectingFromY", self.connectNode.y)
            self.view_manager._main.rootObject().setProperty(
                "connectingToX", self.connectNode.x)
            self.view_manager._main.rootObject().setProperty(
                "connectingToY", self.connectNode.y)
            self.view_manager._main.rootObject().setProperty(
                "connecting", True)
        elif self.connectNode.id != int(id):
            self.view_manager._main.rootObject().setProperty(
                "connecting", False)
            self.create_edge(self.connectNode, self.project.nodes[int(id)])
            self.connectNode = None

    def mouse_position(self, x, y):
        self.view_manager._main.rootObject().setProperty("connectingToX", x)
        self.view_manager._main.rootObject().setProperty("connectingToY", y)

    def lose_focus(self):
        self.connectNode = None
        self.view_manager._main.rootObject().setProperty(
            "connecting", False)
        self.view_manager._main.rootObject().setProperty(
            "hasActiveNode", False)
        if (self.active_node is not None):
            self.nodeViews[self.active_node.id].rootObject().setProperty(
                "inputting", False)
        self.active_node = None
        self.edge_transfer_active_to(None)

    def node_color_sel(self, color):
        self.node_background = color.name()
        if (self.active_node is not None)and(self.active_node.shape != 2):
            self.nodeViews[self.active_node.id].rootObject().setProperty(
                "background", str(color.name()))
            self.active_node.background = str(color.name())

    def node_text_color_sel(self, color):
        self.node_text_color = color.name()
        if self.active_node is not None:
            self.nodeViews[self.active_node.id].rootObject().setProperty(
                "textColor", str(color.name()))
            self.active_node.text.color = str(color.name())
            self.view_manager._main.rootObject().setProperty(
                "activeNodeTextColor", str(color.name()))

    def edge_color_sel(self, color):
        self.edge_color = color.name()
        if self.active_edge is not None:
            self.edgeViews[self.active_edge.id].rootObject().setProperty(
                "color", str(color.name()))
            self.active_edge.color = str(color.name())

    def edge_type_sel(self, type, spiked, arrow):
        self.edge_type = int(type)
        self.edge_spiked = int(spiked)
        self.edge_arrow = int(arrow)

    def node_shape_sel(self, shape):
        self.node_shape = int(shape)

    def window_resize(self, width, height):
        self.workspace_height = int(height)
        self.workspace_width = int(width)
        logging.debug('New window size: [' +
                      str(width) + ',' + str(height) + ']')
        for key, view in self.edgeViews.items():
            view.rootObject().setProperty("workspaceWidth", str(width))
            view.rootObject().setProperty("workspaceHeight", str(height))
        for key, view in self.nodeViews.items():
            view.rootObject().setProperty("workspaceWidth", str(width))
            view.rootObject().setProperty("workspaceHeight", str(height))

    def node_focus(self, id):
        self.active_node = self.project.nodes[int(id)]
        self.view_manager._main.rootObject().setProperty(
            "hasActiveNode", False)
        if self.active_node.shape != 2:
            self.view_manager._main.rootObject().setProperty(
                "activeNodeColor", str(self.active_node.background))
        self.view_manager._main.rootObject().setProperty(
            "activeNodeShape", self.active_node.shape)
        self.view_manager._main.rootObject().setProperty(
            "activeNodeWidth", self.active_node.width)
        self.view_manager._main.rootObject().setProperty(
            "activeNodeHeight", self.active_node.height)
        self.view_manager._main.rootObject().setProperty(
            "activeNodeX", self.active_node.x)
        self.view_manager._main.rootObject().setProperty(
            "activeNodeY", self.active_node.y)
        self.view_manager._main.rootObject().setProperty(
            "activeNodeText", str(self.active_node.text.text))
        self.view_manager._main.rootObject().setProperty(
            "activeNodeTextSize", self.active_node.text.size)
        self.view_manager._main.rootObject().setProperty(
            "activeNodeTextColor", str(self.active_node.text.color))
        self.view_manager._main.rootObject().setProperty(
            "hasActiveNode", True)

    def edge_focus(self, id):
        self.edge_transfer_active_to(int(id))
        self.view_manager._main.rootObject().setProperty(
            "hasActiveEdge", False)
        self.view_manager._main.rootObject().setProperty(
            "activeEdgeColor", str(self.active_edge.color))
        self.view_manager._main.rootObject().setProperty(
            "activeEdgeThickness", self.active_edge.thickness)
        self.view_manager._main.rootObject().setProperty(
            "activeEdgeType", self.active_edge.type)
        self.view_manager._main.rootObject().setProperty(
            "activeEdgeSpiked", self.active_edge.spiked)
        self.view_manager._main.rootObject().setProperty(
            "activeEdgeArrow", self.active_edge.arrow)
        self.view_manager._main.rootObject().setProperty(
            "hasActiveEdge", True)

    def node_width_changed(self, width):
        self.node_width = int(width)
        if self.active_node is not None:
            real_x = int(self.active_node.x - int(width)/2)
            self.active_node.width = int(width)
            self.nodeViews[self.active_node.id].rootObject().setProperty(
                "width", int(width))
            self.nodeViews[self.active_node.id].rootObject().setX(real_x)
            self.view_manager._main.rootObject().setProperty(
                "activeNodeWidth", int(width))
            self.view_manager._main.rootObject().setProperty(
                "activeNodeX", int(self.active_node.x))

    def node_height_changed(self, height):
        self.node_height = int(height)
        if self.active_node is not None:
            real_y = int(self.active_node.y - int(height)/2)
            self.active_node.height = int(height)
            self.nodeViews[self.active_node.id].rootObject().setProperty(
                "height", int(height))
            self.nodeViews[self.active_node.id].rootObject().setY(real_y)
            self.view_manager._main.rootObject().setProperty(
                "activeNodeHeight", int(height))
            self.view_manager._main.rootObject().setProperty(
                "activeNodeY", int(self.active_node.y))

    def node_text_size_changed(self, size):
        self.node_text_size = int(size)
        if self.active_node is not None:
            self.active_node.text.size = int(size)
            self.nodeViews[self.active_node.id].rootObject().setProperty(
                "textSize", int(size))
            self.view_manager._main.rootObject().setProperty(
                "activeNodeTextSize", int(size))

    def node_image_loaded(self, source):
        if self.active_node is not None:
            self.active_node.background = source.toString()

    def edge_thickness_changed(self, thickness):
        self.edge_thickness = thickness
        if self.active_edge is not None:
            self.active_edge.thickness = int(thickness)
            self.edgeViews[self.active_edge.id].rootObject().setProperty(
                "thickness", int(thickness))
            self.view_manager._main.rootObject().setProperty(
                "activeEdgeThickness", int(thickness))

    def edge_transfer_active_to(self, id):
        if self.active_edge is not None:
            self.edgeViews[self.active_edge.id].rootObject().setProperty(
                "isActive", False)
        if id is not None:
            self.active_edge = self.project.edges[int(id)]
            self.edgeViews[self.active_edge.id].rootObject().setProperty(
                "isActive", True)
        else:
            self.active_edge = None

    def hide_edge_controls(self):
        for key, view in self.edgeViews.items():
            view.rootObject().setProperty("showCtrlPoint", False)

    def show_edge_controls(self):
        for key, view in self.edgeViews.items():
            view.rootObject().setProperty("showCtrlPoint", True)
示例#7
0
 def __init__(self):
     self.proj = Project()
     self.output_xml = "save.xml"
     self.input_xml = "load.xml"
     self._set_up_logger()
     logging.info("Base loaded!")