[AI] docs: 同步 2.0 发布状态 - 计划书定稿(§7 决策回填、M8 tag 已打)、README 目录结构/头部版本刷新、dtkcss.pc 版本 2.0.0
为 DTK(Deepin ToolKit)应用增加 “用 CSS 设计界面” 的能力。一份接近 Web CSS 的样式表, 由引擎翻译为 DTK 原生的 DPalette / DStyle / DFontSizeManager 以及事件驱动的状态调色板, 从而兼顾明暗主题、控件状态(hover/pressed/disabled/focus)与 DTK 视觉规范。
DPalette
DStyle
DFontSizeManager
hover/pressed/disabled/focus
本模块是 DTK 上游功能的 提案实现原型,目标 DTK 6.x(palette 主线,DThemeManager 已废弃)。 已弃用 QSS:状态与复杂样式不再走 setStyleSheet,全部落在 DPalette/DStyle 原生通道。
DThemeManager
setStyleSheet
用写网页的方式写 DTK 应用:标准 HTML 定义结构(元素自动映射为 QWidget 控件树),标准 CSS 定义样式(引擎翻译为 DPalette / DStyle / DFontSizeManager / Qt 布局),DTK 负责原生绘制与主题。
src/css2/
Dtk::Css2
dcss2.h
src/css/
Dtk::Css
third_party/libcss
!important
var()
@media
[attr]
DtkHtmlWindow
loadDocument(html)
<style>
loadHtml
loadCss
widgetFor(id)
libparserutils
libwapcaplet
docs/spike/2026-08-15-libcss-event-api/README.md
-fPIC
DTK-CSS-开发计划书.md
dtkcss
D*
QPushButton
dtkcss/ ├── CMakeLists.txt # CMake 构建(Qt5/Qt6 + pkg-config DTK) ├── dtkcss.pro # qmake 构建(DTK 习惯用法;VERSION 2.0.0,集成 css2 + vendor libcss) ├── dtkcss.pc # pkg-config 文件(qmake 用) ├── cmake/dtkcss.pc.in # pkg-config 模板(CMake 用) ├── src/ │ ├── src.pri # 源/头文件清单(v1 css + 2.0 css2 + vendor libcss) │ ├── css/ # v1 引擎(命名空间 Dtk::Css,保留兼容) │ │ ├── dcssglobal.h # 版本 / 导出宏 / 命名空间 │ │ ├── dcss.h # 总包含头 │ │ ├── dcssrule.h/.cpp # 选择器 / 规则 AST + 匹配 │ │ ├── dcssstylesheet.h/.cpp # 解析后的样式表 │ │ ├── dcssparser.h/.cpp # CSS 解析器(纯 Qt,可单测) │ │ ├── dcsspalette.h/.cpp # 颜色解析 / var / DPalette 角色映射 │ │ ├── dcssmetrics.h/.cpp # DStyle 度量 + DFontSizeManager │ │ ├── dcsspropertyregistry.h/.cpp # 属性注册表(轻量 IR):属性→通道/角色 + 扩展注册 API │ │ ├── dcsscache.h/.cpp # 编译结果缓存:双主题 × 状态 palette 快照 │ │ ├── dcssstateengine.h/.cpp # 状态引擎:事件驱动切换状态调色板,替代 QSS │ │ ├── dcssapplicator.h/.cpp # 应用器(编译 + 缓存 + DPaletteHelper 写入) │ │ └── dcssapplicationhelper.h/.cpp # 应用级入口 │ └── css2/ # 2.0 引擎(命名空间 Dtk::Css2,公开头 dcss2.h) │ ├── dcss2.h / dcss2global.h # 总包含头 / 导出宏 │ ├── dcss2token / rule / stylesheet # 词法 token / 选择器 AST / 规则树 │ ├── dcss2parser / frontend / varscan # libcss 解析前端 + --* 变量旁路 │ ├── dcss2dom / widgetmap / htmlwindow # HTML DOM + 元素→控件映射 + DtkHtmlWindow │ ├── dcss2value / property / cascade / applicator # 级联/继承/计算值/应用器 │ ├── dcss2layout # flex/grid 布局通道(QBoxLayout/QGridLayout) │ ├── dcss2theme # DPalette 角色 / @media 明暗主题 │ └── dcss2stateengine # 交互状态引擎(hover/focus → 自动重算 + 过渡) ├── third_party/libcss/ # vendor 的 libcss(MIT,NetSurf;仅 lex/parse/charset/utils) ├── examples/ │ ├── demo_html/ # HTML+CSS 设置窗口示例(M7) │ ├── calendar_demo/ # 日历示例:HTML/CSS/逻辑三层分离 + shots 自测 + render 日志 │ └── demo/ # v1 示例 ├── docs/ │ ├── skill/dtk-css/ # dtk-css Skill(SKILL.md + references + evals,7 用例) │ ├── spike/ # 技术 spike 记录(libcss 事件 API,2026-08-15) │ └── architecture-review.md └── tests/ ├── test_*.cpp # v1 引擎 8 测试(parser/palette/metrics/state/cascade/selector/registry/integration) ├── test_css2_*.cpp # 2.0 引擎 9 测试(parser/selector/varscan/dom/widgetmap/cascade/layout/theme/state) ├── CMakeLists.txt └── *.pro # qmake 单测工程 ├── scripts/ci-build.sh # CI 依赖安装 + 构建 + 测试脚本(Deepin 23) └── .github/workflows/ci.yml # GitHub Actions(deepin:beige 容器)
⚠️ 实际编译需要 Linux + DTK 6.x 开发环境(deepin 23 / UOS,或装有 dtkwidget-dev、dtkgui-dev 的构建机)。Windows 下无法构建 DTK,本仓库仅作为源码与原型交付。
dtkwidget-dev
dtkgui-dev
qmake dtkcss.pro make sudo make install
mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr make ctest --output-on-failure # 运行全部单元/集成测试 sudo make install
安装后产物:/usr/include/dtkcss/*.h、libdtkcss.so.2.0.0、dtkcss.pc。 第三方应用通过 pkg-config 使用:
/usr/include/dtkcss/*.h
libdtkcss.so.2.0.0
dtkcss.pc
// main.cpp #include <dtkcss/dcss.h>
g++ main.cpp $(pkg-config --cflags --libs dtkcss) -o app
scripts/ci-build.sh 可在任意 Deepin 23 环境一键构建 + 测试;qmake 与 CMake 两条构建路径均验证通过(qmake dtkcss.pro && make)。
scripts/ci-build.sh
qmake dtkcss.pro && make
#include <dtkcss/dcss.h> DTKCSS_USE_NAMESPACE // 应用级(在 DApplication 之后调用) DCssApplicationHelper::instance()->loadAppCss(":/style/app.css"); // 注册窗口:其控件树应用样式,并在明暗主题切换时自动重应用 DCssApplicationHelper::instance()->registerWidget(mainWindow); // 单控件级 DCssApplicator::applyString( "DButton { background: #0081ff; color: white; border-radius: 12px; }", myButton);
@theme auto; /* auto=跟随系统 / light / dark */ :root { --brand: #0081ff; --radius: 8px; } DMainWindow { background: #f8f8f8; } DButton { background: #e5e5e5; /* → DPalette::Button */ color: #000; /* → DPalette::ButtonText */ border-color: #d0d0d0; /* → DPalette::FrameBorder */ border-radius: var(--radius); /* → DStyle::setFrameRadius(原生,M4 实现) */ font-size: T6; /* → DFontSizeManager::T6(M4 实现) */ padding: 6px 12px; /* → M5 QSS 桥接 (暂未实现) */ } DButton:hover { background: #dcdcdc; } /* → 状态引擎:hover 进入时切换 palette 快照 */ DButton:pressed{ background: #d0d0d0; } /* → 状态引擎:pressed 快照 */ DButton:disabled { background: #f0f0f0; color: rgba(0,0,0,.3); } /* → QPalette::Disabled 组 */ #login-btn { background: var(--brand); } /* 按 objectName 命中 */ /* 暗色主题覆盖 */ @media (prefers-color-scheme: dark) { DButton { background: #444; color: #fff; } }
选择器:DButton / QPushButton(类,含基类匹配)、#id(objectName)、 [attr="val"](动态属性)、DMainWindow DButton(后代)、DMainWindow > DButton(子代)、 :not(QPushButton) / :not(#id) / :not([attr])(排除)、:hover/:pressed/:disabled/:focus/:checked(伪类,状态引擎)。
DButton
#id
[attr="val"]
DMainWindow DButton
DMainWindow > DButton
:not(QPushButton)
:not(#id)
:not([attr])
:hover/:pressed/:disabled/:focus/:checked
当前(M1–M5)已完成:
DCssStylesheet
tests/test_parser
ItemBackground/TextTitle/TextTips/TextWarning/FrameBorder
@media dark/light
@theme
border-radius
DStyle::setFrameRadius
font-size
padding
QWidget::setContentsMargins
DCssApplicator
:hover/:pressed/:focus/:checked
DCssStateEngine
DPaletteHelper
:disabled
QPalette::Disabled
DCssStyleCache
applyCached
tests/test_cascade
DCssApplicationHelper::reload()
QFileSystemWatcher
>
:not()
rulesFor
tests/test_selector
spacing
setSpacing
dcssApplyColor
dcssRegisterProperty()
[attr=...]
DCssStyleCache::styleDirty
DCssApplicationHelper::refreshWidget()
tests/test_registry
tests/test_integration
setPaletteType
@media dark
:pressed
为 linuxdeepin 的dtk 添加css 界面开发能力
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
dtkcss — DTK CSS 样式引擎
为 DTK(Deepin ToolKit)应用增加 “用 CSS 设计界面” 的能力。一份接近 Web CSS 的样式表, 由引擎翻译为 DTK 原生的
DPalette/DStyle/DFontSizeManager以及事件驱动的状态调色板, 从而兼顾明暗主题、控件状态(hover/pressed/disabled/focus)与 DTK 视觉规范。DTK CSS 2.0(v2.0.0 已发布,M1–M8 全部完成;代码已并入 master)
用写网页的方式写 DTK 应用:标准 HTML 定义结构(元素自动映射为 QWidget 控件树),标准 CSS 定义样式(引擎翻译为 DPalette / DStyle / DFontSizeManager / Qt 布局),DTK 负责原生绘制与主题。
src/css2/(命名空间Dtk::Css2,公开头dcss2.h);v1 引擎保留于src/css/共存(双引擎并存,Dtk::Css与Dtk::Css2独立 API)。third_party/libcss)的解析前端(事件流 + 原始 token),自研选择匹配/级联/计算值/布局/主题。!important/继承/var())、flex/grid 布局、DPalette 角色、明暗主题(@media)、hover/focus 状态驱动重算、动态[attr]自动重算、opacity 过渡。DtkHtmlWindow+loadDocument(html)(内嵌<style>)或loadHtml/loadCss;widgetFor(id)绑定逻辑。libparserutils/libwapcaplet(pkg-config;deepin 无包时按docs/spike/2026-08-15-libcss-event-api/README.md源码构建,静态库需-fPIC)。已确认的设计决策(见
DTK-CSS-开发计划书.md)dtkcssD*)与 Qt 标准控件(QPushButton等)目录结构
构建
qmake
CMake
安装与消费(发版验证通过)
安装后产物:
/usr/include/dtkcss/*.h、libdtkcss.so.2.0.0、dtkcss.pc。 第三方应用通过 pkg-config 使用:scripts/ci-build.sh可在任意 Deepin 23 环境一键构建 + 测试;qmake 与 CMake 两条构建路径均验证通过(qmake dtkcss.pro && make)。API 用法(草案)
支持的 CSS 语法(子集)
选择器:
DButton/QPushButton(类,含基类匹配)、#id(objectName)、[attr="val"](动态属性)、DMainWindow DButton(后代)、DMainWindow > DButton(子代)、:not(QPushButton)/:not(#id)/:not([attr])(排除)、:hover/:pressed/:disabled/:focus/:checked(伪类,状态引擎)。开发状态
当前(M1–M5)已完成:
DCssStylesheet),可在不含 DTK 的环境下用tests/test_parser对解析器做单元测试;DPalette(标准 QPalette 角色 + DTK 扩展角色ItemBackground/TextTitle/TextTips/TextWarning/FrameBorder等), 支持@media dark/light与@theme的明暗过滤;border-radius→DStyle::setFrameRadius,font-size→DFontSizeManager(T1–T11 / px),padding(1–4 值简写)→QWidget::setContentsMargins, 经DCssApplicator的 metric 通道落地;:hover/:pressed/:focus/:checked由DCssStateEngine事件驱动切换 预编译的 palette 快照(经DPaletteHelper写入,扩展角色不丢失);:disabled编译进QPalette::Disabled组由 DTK 原生绘制;DCssStyleCache缓存每控件双主题快照, 主题切换走applyCached零重算;!important> 特异性(id > class/attr/伪类 > 类型)> 文档顺序 排序应用(tests/test_cascade覆盖);DCssApplicationHelper::reload()+QFileSystemWatcher支持样式表热重载。>子代组合器、:not()(单复合参数,参数计入特异性);DCssStylesheet按 subject 类型建索引,rulesFor只评估类链桶 + 泛型桶,替代全量扫描 (tests/test_selector覆盖);spacing→ 布局setSpacing。dcssApplyColor的 if-else 链;dcssRegisterProperty()支持注册自定义属性 (开闭原则);动态属性[attr=...]变化自动失效并重算(DCssStyleCache::styleDirty), objectName 运行时变更用DCssApplicationHelper::refreshWidget()手动刷新 (tests/test_registry覆盖)。tests/test_integration端到端覆盖计划书验收标准——基础背景/文字色/圆角/padding、 真实setPaletteType主题切换(@media dark免重启生效)、:pressed状态、注册/加载顺序;scripts/ci-build.sh+ GitHub Actions(deepin:beige 容器)在 CI 中跑构建与全部测试。