Files
cowork-local/tools/check_combo_popup.py
T
Nam Pham Dinh ThanhandClaude Opus 5 416d88d72f Drop the tick from drop-lists; the row is already tinted
The selected row carries selection-background-color, so a checkmark repeats
what the colour says — and in a combo as wide as "VN" it repeated it on top of
the letters. A combo's default delegate paints menu-style, which is where the
glyph comes from; a plain QStyledItemDelegate paints item-view style, which has
none. widen_popup does both jobs now, so it is tidy_popup.

check_combo_popup additionally requires the delegate to be the plain one and the
stylesheet to still tint the current row — removing the delegate line fails it.

21/21 checkers pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 15:03:39 +09:00

95 lines
3.3 KiB
Python

"""A drop-list must have room for its text and for the tick beside it.
macOS marks the current row with a checkmark; Windows does not. The language
combo is only as wide as "VN", and the popup inherits that width, so on macOS
the tick landed on top of the two letters. Reported from a Mac, so this checks
the property that made it possible rather than the platform.
"""
from __future__ import annotations
import os
import sys
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
from pathlib import Path
REPO = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(REPO.parent))
sys.path.insert(0, str(Path(__file__).resolve().parent))
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from capture_screens import ( # noqa: E402
_apply_theme, _freeze_schedulers, _isolate_home, _load_fonts)
def main() -> int:
sandbox = _isolate_home()
from PySide6.QtWidgets import QApplication, QStyle
app = QApplication([])
_load_fonts()
_freeze_schedulers()
_apply_theme(app)
from cowork_local.config import CONFIG_DIR
assert str(sandbox) in str(CONFIG_DIR), f"isolation failed: {CONFIG_DIR}"
from seed_demo_data import seed
seed()
from cowork_local.app import MainWindow
from cowork_local.config import AppConfig
from cowork_local.i18n import set_language
from cowork_local.state import AppContext
set_language("vi")
win = MainWindow(AppContext(AppConfig.load()), user_name="local")
win.resize(1400, 900)
win.show()
app.processEvents()
fails = []
from PySide6.QtWidgets import QStyledItemDelegate
for name in ("language_combo", "nav_project", "provider_combo"):
combo = getattr(win, name, None)
if combo is None or not combo.count():
continue
view = combo.view()
fm = view.fontMetrics()
longest = max(fm.horizontalAdvance(combo.itemText(i))
for i in range(combo.count()))
tick = combo.style().pixelMetric(QStyle.PM_IndicatorWidth, None, combo)
need = longest + tick
have = max(view.minimumWidth(), combo.width())
print(f"{name:15}: chu dai nhat {longest:>4}px + dau tick {tick:>3}px "
f"= can {need:>4}px | popup rong {have:>4}px")
if have < need:
fails.append(f"{name}: popup {have}px, khong du {need}px cho chu + dau tick")
# No tick: the row is already tinted, and the menu-style delegate that
# draws one on macOS covered the two letters it was marking.
deleg = combo.itemDelegate()
plain = type(deleg) is QStyledItemDelegate
print(f"{'':15} delegate={type(deleg).__name__} (khong ve dau tick={plain})")
if not plain:
fails.append(f"{name}: dung delegate kieu menu — macOS se ve dau tick")
# ...and the current row must still be obvious without one.
view = combo.view()
sheet = app.styleSheet()
if "selection-background-color" not in sheet:
fails.append("popup khong to mau muc dang chon")
print()
for f in fails:
print("FAIL " + f)
print("PASS moi drop-list du cho chu va dau tick" if not fails
else f"{len(fails)} problem(s)")
sys.stdout.flush()
os._exit(1 if fails else 0)
if __name__ == "__main__":
raise SystemExit(main())