Files
cowork-local/docs/architecture/co4e-split-map-canvas-widget.json
T
f9f6bc01fd
CI / test (push) Canceled after 0s
Feature/delta team/epic r04 (#7)
## Summary

epic r04 - begin refactor

## Change Type

- [x] Cowork feature
- [ ] Bug fix
- [ ] Core AI contribution
- [ ] Test / hardening
- [ ] Performance
- [ ] Documentation

## Related Work

Cowork Task:

Core Repo: http://34.143.229.138/gitea-admin/fsg-ai-core-assets

Core AI Issue:

Core Task:

Related PR:

## Scope

What is intentionally included?

What is intentionally NOT included?

## Validation

- [ ] Unit tests
- [ ] Integration tests
- [ ] Manual verification
- [ ] Regression check

Commands / evidence:

## Security Impact

Permission / credential / network / customer data impact:

## Compatibility

- [ ] No breaking change
- [ ] Breaking change documented

## Reviewer Notes

Anything Cowork reviewers should pay attention to.

---------

Co-authored-by: Anh Tran Nguyen Minh <anhtnm1@fpt.com>
Co-authored-by: Huong Le Thi Thien <huongltt35@fpt.com>
Co-authored-by: Nam Pham Dinh Thanh <nampdt@fpt.com>
Co-authored-by: Vu Dam Tuan <vudt15@fpt.com>
Co-authored-by: Hiep Ha Van <hiephv3@fpt.com>
Co-authored-by: Lam Hoang Van <lamhv7@fpt.com>
Reviewed-on: #7
Co-authored-by: Duy Le Huu <duylh19@fpt.com>
2026-08-31 05:15:13 +00:00

1276 lines
66 KiB
JSON

{
"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')."
}
]
}