{ "source_file": "ui/co4e_canvas.py", "source_line_count": 701, "raw_symbol_count": 96, "merged_symbol_count": 95, "merged_duplicates": [ { "symbol": "Co4ECanvas.dropEvent", "raw_ranges": [ [ 683, 700 ], [ 683, 701 ] ], "final_range": [ 683, 701 ] } ], "khac_tai_lieu_note_count": 0, "old_table_reference": "docs/architecture/co4e-split-map.md", "old_table_uniform_target": "presentation/co4e/co4e_canvas_widget.py", "not_in_old_table": [ { "symbol": "Co4ECanvas._ZOOM_MAX", "line": 294 }, { "symbol": "Co4ECanvas._ZOOM_MIN", "line": 294 } ], "symbols": [ { "symbol": "_status_color", "kind": "function", "line_start": 43, "line_end": 50, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "đọc current_palette() từ theme.py — cần import theme trong file đích mới", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem", "kind": "class", "line_start": 59, "line_end": 210, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "QGraphicsObject — cần QApplication để khởi tạo trong test; giữ self.canvas tham chiếu ngược Co4ECanvas (co4e_canvas_widget.py) — coupling hai chiều", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.__init__", "kind": "method", "line_start": 62, "line_end": 72, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.node", "kind": "attribute", "line_start": 64, "line_end": 64, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "tham chiếu tới domain Node — item hiển thị chỉ giữ tham chiếu, không sở hữu", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.canvas", "kind": "attribute", "line_start": 65, "line_end": 65, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "tham chiếu ngược Co4ECanvas (co4e_canvas_widget.py) — item gọi canvas._connect_from, canvas.begin_port_drag/update_port_drag/finish_port_drag (canvas_interaction_mixin.py), canvas._reposition_edges, canvas.graph_changed, canvas.node_selected/node_activated, canvas.add_step_below/begin_connect/delete_node — coupling xuyên 3 file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.status", "kind": "attribute", "line_start": 66, "line_end": 66, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "được set từ ngoài bởi Co4ECanvas.update_node_status/reset_statuses (co4e_canvas_widget.py) — trạng thái chia sẻ", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem._porting", "kind": "attribute", "line_start": 67, "line_end": 67, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.boundingRect", "kind": "method", "line_start": 74, "line_end": 76, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem._card_rect", "kind": "method", "line_start": 78, "line_end": 79, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.paint", "kind": "method", "line_start": 81, "line_end": 139, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "vẽ trực tiếp lên QPainter do framework cấp — gộp nhiều việc: nền/khung thẻ, dải header theo status, label, role badge, body preview, footer, 2 port — cân nhắc tách nhỏ nếu vượt ngưỡng nhưng hiện 59 dòng nên chưa bắt buộc", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem._in_out_port", "kind": "method", "line_start": 141, "line_end": 143, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.itemChange", "kind": "method", "line_start": 145, "line_end": 156, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "gọi self.canvas._reposition_edges/graph_changed.emit/node_selected.emit — trạng thái chia sẻ với co4e_canvas_widget.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.hoverMoveEvent", "kind": "method", "line_start": 158, "line_end": 161, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.mousePressEvent", "kind": "method", "line_start": 163, "line_end": 174, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "đọc self.canvas._connect_from, gọi self.canvas.begin_port_drag — trạng thái/luồng chia sẻ với canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.mouseMoveEvent", "kind": "method", "line_start": 176, "line_end": 181, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "gọi self.canvas.update_port_drag — canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.mouseReleaseEvent", "kind": "method", "line_start": 183, "line_end": 189, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "gọi self.canvas.finish_port_drag — canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.mouseDoubleClickEvent", "kind": "method", "line_start": 191, "line_end": 193, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.contextMenuEvent", "kind": "method", "line_start": 195, "line_end": 207, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "gọi self.canvas.add_step_below/begin_connect (co4e_canvas_widget.py, canvas_interaction_mixin.py) và self.canvas.delete_node (co4e_canvas_widget.py) — coupling 3 file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_NodeItem.center", "kind": "method", "line_start": 209, "line_end": 210, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem", "kind": "class", "line_start": 213, "line_end": 286, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "QGraphicsPathItem — giữ self.canvas tham chiếu ngược Co4ECanvas", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.__init__", "kind": "method", "line_start": 214, "line_end": 225, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.edge", "kind": "attribute", "line_start": 216, "line_end": 216, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "tham chiếu domain Edge", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.canvas", "kind": "attribute", "line_start": 217, "line_end": 217, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "tham chiếu ngược Co4ECanvas — dùng trong contextMenuEvent gọi canvas.delete_edge (co4e_canvas_widget.py)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem._dst", "kind": "attribute", "line_start": 218, "line_end": 218, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem._hover", "kind": "attribute", "line_start": 224, "line_end": 224, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem._apply_pen", "kind": "method", "line_start": 227, "line_end": 235, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.update_path", "kind": "method", "line_start": 237, "line_end": 239, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "gọi _rounded_path từ canvas_geometry.py — được gọi bởi Co4ECanvas._reposition_edges (co4e_canvas_widget.py)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.boundingRect", "kind": "method", "line_start": 241, "line_end": 242, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.shape", "kind": "method", "line_start": 244, "line_end": 249, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "dùng QPainterPathStroker như kiểu giá trị, không cần QApplication sống", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.hoverEnterEvent", "kind": "method", "line_start": 251, "line_end": 255, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.hoverLeaveEvent", "kind": "method", "line_start": 257, "line_end": 261, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.paint", "kind": "method", "line_start": 263, "line_end": 279, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "_EdgeItem.contextMenuEvent", "kind": "method", "line_start": 281, "line_end": 286, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_items.py", "reason": "gọi self.canvas.delete_edge — co4e_canvas_widget.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach _NodeItem/_EdgeItem/_status_color thanh file rieng). Ban do nay tach canvas_items.py vi day la QGraphicsObject/QGraphicsPathItem hien thi thuan, tach khoi Co4ECanvas (QGraphicsView) de giam kich thuoc file va tach lop 've' khoi lop 'dieu khien do thi'." }, { "symbol": "Co4ECanvas", "kind": "class", "line_start": 289, "line_end": 700, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "cắt ngang lát — thân class còn tiếp tục sau dòng 700, agent khác đọc phần còn lại. QGraphicsView — cần chia thành co4e_canvas_widget.py (dữ liệu đồ thị: load/add/delete/relayout) và canvas_interaction_mixin.py (sự kiện chuột/phím/kéo-thả/zoom/pan/overlay), nối qua self dùng chung nhiều thuộc tính", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.node_selected", "kind": "attribute", "line_start": 290, "line_end": 290, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "Signal — được emit từ add_node (widget) và itemChange của _NodeItem (canvas_items.py) — API công khai xuyên file, callers ngoài (co4e_tab.py) kết nối vào", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.node_activated", "kind": "attribute", "line_start": 291, "line_end": 291, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "Signal — emit từ _NodeItem.mouseDoubleClickEvent (canvas_items.py)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.graph_changed", "kind": "attribute", "line_start": 292, "line_end": 292, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "Signal — emit từ nhiều nơi cả widget (add_node/delete_node/relayout...) lẫn item (itemChange trong canvas_items.py) — điểm nối quan trọng giữa 2 file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._ZOOM_MIN", "kind": "attribute", "line_start": 294, "line_end": 294, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "hằng lớp dùng bởi _zoom_by trong canvas_interaction_mixin.py — cross-file, mixin cần truy cập qua self", "in_old_table": false, "old_table_target": null, "old_table_discrepancy": "KHONG co trong bang cu (docs/architecture/co4e-split-map.md) — bang do nhay thang tu dong 292 (graph_changed) sang dong 296 (__init__), bo qua dong 294 (_ZOOM_MIN, _ZOOM_MAX) hoan toan. Day la thieu sot cua bang cu, khong phai sai target." }, { "symbol": "Co4ECanvas._ZOOM_MAX", "kind": "attribute", "line_start": 294, "line_end": 294, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "hằng lớp dùng bởi _zoom_by trong canvas_interaction_mixin.py — cross-file", "in_old_table": false, "old_table_target": null, "old_table_discrepancy": "KHONG co trong bang cu (docs/architecture/co4e-split-map.md) — bang do nhay thang tu dong 292 (graph_changed) sang dong 296 (__init__), bo qua dong 294 (_ZOOM_MIN, _ZOOM_MAX) hoan toan. Day la thieu sot cua bang cu, khong phai sai target." }, { "symbol": "Co4ECanvas.__init__", "kind": "method", "line_start": 296, "line_end": 315, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "khởi tạo cả trạng thái đồ thị (self._scene/_nodes/_edges) LẪN trạng thái tương tác (self._connect_from/_zoom/_panning/_pan_start/_overlay/_port_src/_port_src_pt/_temp_edge) trong cùng một __init__ — nếu tách interaction thành mixin riêng, __init__ này vẫn phải ở lại đây và mixin phải đọc/ghi qua self, không tự khởi tạo lại", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._scene", "kind": "attribute", "line_start": 299, "line_end": 299, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "QGraphicsScene — dùng bởi hầu hết method ở cả 2 file (widget + interaction mixin)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._nodes", "kind": "attribute", "line_start": 305, "line_end": 305, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "dict id->_NodeItem — trạng thái chia sẻ: đọc/ghi bởi cả co4e_canvas_widget.py (add_node/delete_node/load/relayout) và canvas_interaction_mixin.py (_node_at, keyPressEvent xoá selection)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._edges", "kind": "attribute", "line_start": 306, "line_end": 306, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "list _EdgeItem — trạng thái chia sẻ tương tự self._nodes", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._connect_from", "kind": "attribute", "line_start": 307, "line_end": 307, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "trạng thái chế độ 'connect' — ghi bởi begin_connect/_finish_connect (canvas_interaction_mixin.py) và keyPressEvent (Escape, cùng file), đọc bởi _NodeItem.mousePressEvent (canvas_items.py) — coupling 3 file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._zoom", "kind": "attribute", "line_start": 308, "line_end": 308, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "dùng bởi _zoom_by/reset_zoom/fit_view — toàn bộ nằm ở canvas_interaction_mixin.py, chỉ khởi tạo ở đây", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._panning", "kind": "attribute", "line_start": 309, "line_end": 309, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "dùng bởi mousePressEvent/mouseMoveEvent/mouseReleaseEvent (pan) — canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._pan_start", "kind": "attribute", "line_start": 310, "line_end": 310, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._overlay", "kind": "attribute", "line_start": 311, "line_end": 311, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "QWidget con (nút zoom/fit) — quản lý bởi add_overlay/_place_overlay/resizeEvent/scrollContentsBy/showEvent, toàn bộ ở canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._port_src", "kind": "attribute", "line_start": 313, "line_end": 313, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "trạng thái kéo-nối thủ công — ghi/đọc bởi begin_port_drag/update_port_drag/finish_port_drag (canvas_interaction_mixin.py) và keyPressEvent (Escape huỷ, cùng file); _NodeItem (canvas_items.py) khởi phát qua self.canvas.begin_port_drag", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._port_src_pt", "kind": "attribute", "line_start": 314, "line_end": 314, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._temp_edge", "kind": "attribute", "line_start": 315, "line_end": 315, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "QGraphicsPathItem tạm khi đang kéo nối — quản lý bởi begin/update/finish_port_drag và keyPressEvent (Escape), tất cả canvas_interaction_mixin.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.add_overlay", "kind": "method", "line_start": 318, "line_end": 323, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "widget.setParent/show/raise_ — cần Qt sống", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas._place_overlay", "kind": "method", "line_start": 325, "line_end": 330, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "đọc vp.height() — cần viewport thật", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.resizeEvent", "kind": "method", "line_start": 332, "line_end": 334, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.scrollContentsBy", "kind": "method", "line_start": 336, "line_end": 341, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.showEvent", "kind": "method", "line_start": 343, "line_end": 345, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.load", "kind": "method", "line_start": 348, "line_end": 362, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "reset toàn bộ self._nodes/_edges/_connect_from/_port_src/_temp_edge — chạm cả state của interaction mixin, cần đồng bộ khi tách file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.nodes", "kind": "method", "line_start": 364, "line_end": 365, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.edges", "kind": "method", "line_start": 367, "line_end": 368, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.add_node", "kind": "method", "line_start": 371, "line_end": 382, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "emit graph_changed và node_selected", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.add_step_below", "kind": "method", "line_start": 384, "line_end": 390, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._chain_tail", "kind": "method", "line_start": 392, "line_end": 396, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.add_palette_step", "kind": "method", "line_start": 398, "line_end": 400, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.begin_connect", "kind": "method", "line_start": 402, "line_end": 403, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "ghi self._connect_from — đọc bởi _NodeItem.mousePressEvent (canvas_items.py)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas._finish_connect", "kind": "method", "line_start": 405, "line_end": 409, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "gọi self._make_edge (co4e_canvas_widget.py) — cross-file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.begin_port_drag", "kind": "method", "line_start": 412, "line_end": 419, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "tạo self._temp_edge, thêm vào self._scene — được _NodeItem.mousePressEvent (canvas_items.py) gọi qua self.canvas", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.update_port_drag", "kind": "method", "line_start": 421, "line_end": 424, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.finish_port_drag", "kind": "method", "line_start": 426, "line_end": 435, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "gọi self._make_edge (co4e_canvas_widget.py) — cross-file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas._node_at", "kind": "method", "line_start": 437, "line_end": 441, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "duyệt self._scene.items — cần import _NodeItem từ canvas_items.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas._make_edge", "kind": "method", "line_start": 443, "line_end": 451, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "được gọi từ canvas_interaction_mixin.py (_finish_connect, finish_port_drag) — cross-file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._add_edge_item", "kind": "method", "line_start": 453, "line_end": 456, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "tạo _EdgeItem — cần import từ canvas_items.py", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.delete_edge", "kind": "method", "line_start": 458, "line_end": 463, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "được gọi bởi _EdgeItem.contextMenuEvent (canvas_items.py)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.delete_node", "kind": "method", "line_start": 465, "line_end": 475, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "được gọi bởi _NodeItem.contextMenuEvent (canvas_items.py)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.delete_selected", "kind": "method", "line_start": 477, "line_end": 481, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "được gọi bởi keyPressEvent (canvas_interaction_mixin.py) — cross-file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._zoom_by", "kind": "method", "line_start": 484, "line_end": 495, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "dùng self._ZOOM_MIN/_ZOOM_MAX định nghĩa ở class Co4ECanvas (co4e_canvas_widget.py) — cross-file qua self, ghi self._zoom", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.zoom_in", "kind": "method", "line_start": 497, "line_end": 498, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.zoom_out", "kind": "method", "line_start": 500, "line_end": 501, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.reset_zoom", "kind": "method", "line_start": 503, "line_end": 505, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.wheelEvent", "kind": "method", "line_start": 507, "line_end": 519, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.mousePressEvent", "kind": "method", "line_start": 522, "line_end": 529, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "xử lý pan bằng chuột giữa — trùng tên method với _NodeItem.mousePressEvent (canvas_items.py) nhưng khác lớp, không xung đột thật nhưng dễ nhầm khi tách", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.mouseMoveEvent", "kind": "method", "line_start": 531, "line_end": 540, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.mouseReleaseEvent", "kind": "method", "line_start": 542, "line_end": 548, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.fit_view", "kind": "method", "line_start": 550, "line_end": 558, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "fitInView phụ thuộc kích thước viewport thật", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.relayout", "kind": "method", "line_start": 560, "line_end": 578, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "gọi compute_waves (core/co4e.py) và self._reposition_edges — thuật toán xếp lớp thuần dữ liệu", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.relayout_if_vertical", "kind": "method", "line_start": 580, "line_end": 589, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.add_workflow", "kind": "method", "line_start": 591, "line_end": 610, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "được dropEvent (canvas_interaction_mixin.py) gọi khi kéo thả cả workflow — cross-file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.update_node_status", "kind": "method", "line_start": 612, "line_end": 616, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "ghi _NodeItem.status (canvas_items.py) — cross-file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.reset_statuses", "kind": "method", "line_start": 618, "line_end": 621, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.refresh_node", "kind": "method", "line_start": 623, "line_end": 626, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._node_rects", "kind": "method", "line_start": 628, "line_end": 638, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "dùng QRectF như kiểu giá trị", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas._reposition_edges", "kind": "method", "line_start": 640, "line_end": 649, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "reason": "gọi _route từ canvas_geometry.py và e.update_path (_EdgeItem trong canvas_items.py) — cross-file", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": null }, { "symbol": "Co4ECanvas.keyPressEvent", "kind": "method", "line_start": 652, "line_end": 669, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "Escape huỷ self._connect_from/self._temp_edge/self._port_src (khởi tạo ở __init__ trong co4e_canvas_widget.py) — cross-file; Delete gọi self.delete_selected (co4e_canvas_widget.py)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.dragEnterEvent", "kind": "method", "line_start": 671, "line_end": 675, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.dragMoveEvent", "kind": "method", "line_start": 677, "line_end": 681, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "(khong co ghi chu)", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." }, { "symbol": "Co4ECanvas.dropEvent", "kind": "method", "line_start": 683, "line_end": 701, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/canvas_interaction_mixin.py", "reason": "GOP 2 luot quet trung ky hieu: agent 1 doc duoc 683-700 (than try chua dong, cat ngang lat o ranh gioi doc 701-701), agent 2 doc duoc 683-701 (chi dong 701 e.acceptProposedAction() nam trong lat duoc giao, dong 702 la dong trong cuoi file). Doi chieu truc tiep voi ui/co4e_canvas.py xac nhan than ham thuc su ket thuc o dong 701 (701 dong tong cong ca file) -> chon 683-701. Xu ly drop tu sidebar: kind=='workflow' -> add_workflow, nguoc lai -> add_palette_step; import cuc bo workflow_from_dict/step_from_dict tu core/co4e.py; goi self.add_workflow/self.add_palette_step (co4e_canvas_widget.py) -> cross-file. Khong cham dia/mang, chi json.loads tu bytes mime trong bo nho.", "in_old_table": true, "old_table_target": "presentation/co4e/co4e_canvas_widget.py", "old_table_discrepancy": "Bang cu gop chung vao presentation/co4e/co4e_canvas_widget.py (chua tach nhom su kien chuot/phim/keo-tha/zoom/pan/overlay ra mixin rieng). Ban do nay tach canvas_interaction_mixin.py theo dung de xuat trong note cua chinh scan Co4ECanvas o bang cu (dong 90: 'can chia thanh co4e_canvas_widget.py ... va canvas_interaction_mixin.py')." } ] }