Delta team/fix comment ui #10
@@ -105,6 +105,32 @@ class StructureGraphView(QWidget):
|
|||||||
# sau — nên panel phải bật theo, không thì lượt quét đó lại im lặng.
|
# sau — nên panel phải bật theo, không thì lượt quét đó lại im lặng.
|
||||||
self.renderer.project_changed.connect(self._on_project_scan_started)
|
self.renderer.project_changed.connect(self._on_project_scan_started)
|
||||||
|
|
||||||
|
def _ensure_scan_path(self) -> None:
|
||||||
|
"""Điền ô đường dẫn từ project đang hoạt động nếu nó đang rỗng.
|
||||||
|
|
||||||
|
``GraphRenderer.auto_scan_and_fit`` thoát sớm khi ô đường dẫn rỗng,
|
||||||
|
trong khi chính nút Scan lại có đường lùi (``path_edit.text() or
|
||||||
|
Path.cwd()``). Bất đối xứng đó nghĩa là: vào màn thì không làm gì, bấm
|
||||||
|
Scan thì chạy — đúng thứ người dùng phàn nàn.
|
||||||
|
|
||||||
|
Điền từ project đang chọn chứ KHÔNG lấy ``cwd()`` làm đường lùi như nút
|
||||||
|
Scan: quét thư mục làm việc của tiến trình là quét một cây không liên
|
||||||
|
quan gì tới project, và nó có thể rất lớn.
|
||||||
|
"""
|
||||||
|
if self.renderer.path_edit.text().strip():
|
||||||
|
return
|
||||||
|
ctx = getattr(self, "ctx", None)
|
||||||
|
pid = (getattr(ctx, "active_project_id", "") or "").strip()
|
||||||
|
if not pid or pid == "default":
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
from ...core.projects import load_project
|
||||||
|
project = load_project(pid)
|
||||||
|
except Exception: # noqa: BLE001
|
||||||
|
return
|
||||||
|
if project is not None:
|
||||||
|
self.renderer.path_edit.setText(str(project.workspace_dir()))
|
||||||
|
|
||||||
def _on_project_scan_started(self) -> None:
|
def _on_project_scan_started(self) -> None:
|
||||||
"""Renderer vừa đổi project. Nó chỉ quét ngay khi màn này đang mở."""
|
"""Renderer vừa đổi project. Nó chỉ quét ngay khi màn này đang mở."""
|
||||||
if self.renderer.isVisible():
|
if self.renderer.isVisible():
|
||||||
@@ -156,6 +182,7 @@ class StructureGraphView(QWidget):
|
|||||||
``graph_rendered`` phát — bao trọn cả lượt quét chạy ở luồng nền phía
|
``graph_rendered`` phát — bao trọn cả lượt quét chạy ở luồng nền phía
|
||||||
sau, chứ không tắt ngay khi hàm này trả về.
|
sau, chứ không tắt ngay khi hàm này trả về.
|
||||||
"""
|
"""
|
||||||
|
self._ensure_scan_path()
|
||||||
da_dung_khung = self.renderer.web is not None
|
da_dung_khung = self.renderer.web is not None
|
||||||
self._show_busy("structure.scanning" if da_dung_khung else "structure.loading_view")
|
self._show_busy("structure.scanning" if da_dung_khung else "structure.loading_view")
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ def _dung(qapp, ViewCls, web=None, path="C:/tmp"):
|
|||||||
v.renderer = _Renderer(qapp, web=web, path=path)
|
v.renderer = _Renderer(qapp, web=web, path=path)
|
||||||
v.renderer._view = v
|
v.renderer._view = v
|
||||||
v._workspace_project = None
|
v._workspace_project = None
|
||||||
|
v.ctx = type("C", (), {"active_project_id": "default"})()
|
||||||
v.resize(800, 600)
|
v.resize(800, 600)
|
||||||
v._build_busy_panel()
|
v._build_busy_panel()
|
||||||
return v
|
return v
|
||||||
@@ -199,3 +200,62 @@ def test_doi_project_khi_man_dang_an_thi_khong_bat_panel(qapp, view):
|
|||||||
assert v._busy.isHidden() is True
|
assert v._busy.isHidden() is True
|
||||||
finally:
|
finally:
|
||||||
v.deleteLater()
|
v.deleteLater()
|
||||||
|
|
||||||
|
|
||||||
|
# ---- đường dẫn quét rỗng thì lấy từ project đang hoạt động ---------------
|
||||||
|
|
||||||
|
def test_o_duong_dan_rong_thi_dien_tu_project_dang_chon(qapp, view, monkeypatch, tmp_path):
|
||||||
|
"""GraphRenderer.auto_scan_and_fit thoát sớm khi ô đường dẫn rỗng, trong khi
|
||||||
|
nút Scan lại có đường lùi — vào màn không làm gì, bấm Scan thì chạy."""
|
||||||
|
import cowork_local.core.projects as projects
|
||||||
|
|
||||||
|
ws = tmp_path / "ws"
|
||||||
|
ws.mkdir()
|
||||||
|
|
||||||
|
class _P:
|
||||||
|
project_id = "p1"
|
||||||
|
def workspace_dir(self, base=None):
|
||||||
|
return ws
|
||||||
|
|
||||||
|
monkeypatch.setattr(projects, "load_project", lambda pid: _P() if pid == "p1" else None)
|
||||||
|
|
||||||
|
v = _dung(qapp, view, path="")
|
||||||
|
v.ctx = type("C", (), {"active_project_id": "p1"})()
|
||||||
|
v.renderer.path_edit = type("E", (), {
|
||||||
|
"_t": "",
|
||||||
|
"text": lambda s: s._t,
|
||||||
|
"setText": lambda s, t: setattr(s, "_t", t)})()
|
||||||
|
try:
|
||||||
|
v._ensure_scan_path()
|
||||||
|
|
||||||
|
assert v.renderer.path_edit.text() == str(ws)
|
||||||
|
finally:
|
||||||
|
v.deleteLater()
|
||||||
|
|
||||||
|
|
||||||
|
def test_da_co_duong_dan_thi_khong_ghi_de(qapp, view):
|
||||||
|
v = _dung(qapp, view, path="C:/da-chon")
|
||||||
|
v.ctx = type("C", (), {"active_project_id": "p1"})()
|
||||||
|
try:
|
||||||
|
v._ensure_scan_path()
|
||||||
|
|
||||||
|
assert v.renderer.path_edit.text() == "C:/da-chon"
|
||||||
|
finally:
|
||||||
|
v.deleteLater()
|
||||||
|
|
||||||
|
|
||||||
|
def test_chua_chon_project_thi_khong_bia_duong_dan(qapp, view):
|
||||||
|
"""Không lấy cwd() làm đường lùi: quét thư mục làm việc của tiến trình là
|
||||||
|
quét một cây không liên quan gì tới project."""
|
||||||
|
v = _dung(qapp, view, path="")
|
||||||
|
v.ctx = type("C", (), {"active_project_id": "default"})()
|
||||||
|
v.renderer.path_edit = type("E", (), {
|
||||||
|
"_t": "",
|
||||||
|
"text": lambda s: s._t,
|
||||||
|
"setText": lambda s, t: setattr(s, "_t", t)})()
|
||||||
|
try:
|
||||||
|
v._ensure_scan_path()
|
||||||
|
|
||||||
|
assert v.renderer.path_edit.text() == ""
|
||||||
|
finally:
|
||||||
|
v.deleteLater()
|
||||||
|
|||||||
Reference in New Issue
Block a user