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>
95 lines
3.3 KiB
Python
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())
|