Skip to content

Commit d39b956

Browse files
authored
[222_74] 优化标签栏比例和样式 (#3237)
1 parent 17dd972 commit d39b956

12 files changed

Lines changed: 192 additions & 208 deletions

File tree

TeXmacs/misc/images/images.qrc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@
55
<file>ocr-button/right-align.svg</file>
66
<file>ocr-button/ocr.svg</file>
77

8+
<file>tabpage/add.svg</file>
9+
<file>tabpage/close.svg</file>
10+
811

912
<!-- dark theme -->
1013
<file>ocr-button/left-align-white.svg</file>
1114
<file>ocr-button/middle-align-white.svg</file>
1215
<file>ocr-button/right-align-white.svg</file>
1316
<file>ocr-button/ocr-white.svg</file>
1417

18+
<file>tabpage/add-white.svg</file>
19+
<file>tabpage/close-white.svg</file>
20+
1521
<!-- tutorial -->
1622
<file>tutorial/ocr-tutorial.gif</file>
1723
<file>tutorial/magic-paste-tutorial.gif</file>
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading

TeXmacs/misc/themes/liii-night.css

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -354,14 +354,9 @@ QDockWidget::title {
354354
****************************************************************************/
355355
/* Tab Page 基础样式 */
356356
QTMTabPage {
357-
padding: 8px 12px;
358357
color: #FFFFFF;
359358
background-color: transparent;
360359
border: 1px solid transparent;
361-
border-top-left-radius: 10px;
362-
border-top-right-radius: 10px;
363-
border-bottom-left-radius: 0;
364-
border-bottom-right-radius: 0;
365360
}
366361

367362
QTMTabPage:hover {
@@ -372,65 +367,35 @@ QTMTabPage:hover {
372367
QTMTabPage:checked {
373368
background-color: #333333;
374369
border: 1px solid #4c4c4c;
375-
border-bottom: none;
376-
border-top-left-radius: 10px;
377-
border-top-right-radius: 10px;
378370
color: #FFFFFF;
379371
}
380372

381-
QTMTabPage QToolButton#tabpage-close-button {
373+
QTMTabPage QPushButton#tabpage-close-button {
382374
background-color: transparent;
383375
border: none;
384-
padding: 0;
385-
margin-left: 6px;
386-
border-radius: 4px;
387-
min-width: 20px;
388-
min-height: 20px;
389-
max-width: 20px;
390-
max-height: 20px;
391-
color: #ffffff;
392-
}
393-
394-
QTMTabPage QToolButton#tabpage-close-button[platform="mac"] {
395-
min-width: 16px;
396-
min-height: 16px;
397-
max-width: 16px;
398-
max-height: 16px;
399-
font-size: 12pt;
376+
qproperty-iconNormal: url(":/tabpage/close-white.svg");
377+
qproperty-iconHovered: url(":/tabpage/close-white.svg");
400378
}
401379

402-
QTMTabPage QToolButton#tabpage-close-button:hover {
380+
QTMTabPage QPushButton#tabpage-close-button:hover {
403381
background-color: #E81123;
404-
color: #FFFFFF;
405382
}
406383

407-
QTMTabPage QToolButton#tabpage-close-button:pressed {
384+
QTMTabPage QPushButton#tabpage-close-button:pressed {
408385
background-color: #C50F1F;
409386
}
410387

411-
QTMTabPageContainer QToolButton#add-tab-button {
388+
QTMTabPageContainer QPushButton#add-tab-button {
412389
background-color: transparent;
413390
border: none;
414-
color: #FFFFFF;
415-
font-weight: bold;
416-
border-radius: 6px;
417-
padding: 0;
418-
font-size: 12pt;
419-
}
420-
421-
QTMTabPageContainer QToolButton#add-tab-button[platform="mac"] {
422-
min-width: 20px;
423-
min-height: 20px;
424-
max-width: 20px;
425-
max-height: 20px;
426-
font-size: 11pt;
391+
qproperty-iconNormal: url(":/tabpage/add-white.svg");
427392
}
428393

429-
QTMTabPageContainer QToolButton#add-tab-button:hover {
394+
QTMTabPageContainer QPushButton#add-tab-button:hover {
430395
background-color: rgba(255, 255, 255, 0.06);
431396
}
432397

433-
QTMTabPageContainer QToolButton#add-tab-button:pressed {
398+
QTMTabPageContainer QPushButton#add-tab-button:pressed {
434399
background-color: rgba(255, 255, 255, 0.10);
435400
}
436401

TeXmacs/misc/themes/liii.css

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -344,14 +344,9 @@ QDockWidget::title {
344344
****************************************************************************/
345345
/* Tab Page 基础样式 */
346346
QTMTabPage {
347-
padding: 8px 12px;
348347
color: #000000;
349348
background-color: transparent;
350349
border: 1px solid transparent;
351-
border-top-left-radius: 10px;
352-
border-top-right-radius: 10px;
353-
border-bottom-left-radius: 0;
354-
border-bottom-right-radius: 0;
355350
}
356351

357352
QTMTabPage:hover {
@@ -362,63 +357,34 @@ QTMTabPage:hover {
362357
QTMTabPage:checked {
363358
background-color: #FFFFFF;
364359
border: 1px solid #CFCFCF;
365-
border-bottom: none;
366-
border-top-left-radius: 10px;
367-
border-top-right-radius: 10px;
368360
}
369361

370-
QTMTabPage QToolButton#tabpage-close-button {
362+
QTMTabPage QPushButton#tabpage-close-button {
371363
background-color: transparent;
372364
border: none;
373-
padding: 0;
374-
margin-left: 6px;
375-
border-radius: 4px;
376-
min-width: 20px;
377-
min-height: 20px;
378-
max-width: 20px;
379-
max-height: 20px;
380-
}
381-
382-
QTMTabPage QToolButton#tabpage-close-button[platform="mac"] {
383-
min-width: 16px;
384-
min-height: 16px;
385-
max-width: 16px;
386-
max-height: 16px;
387-
font-size: 12pt;
365+
qproperty-iconNormal: url(":/tabpage/close.svg");
366+
qproperty-iconHovered: url(":/tabpage/close-white.svg");
388367
}
389368

390-
QTMTabPage QToolButton#tabpage-close-button:hover {
369+
QTMTabPage QPushButton#tabpage-close-button:hover {
391370
background-color: #E81123;
392-
color: #FFFFFF;
393371
}
394372

395-
QTMTabPage QToolButton#tabpage-close-button:pressed {
373+
QTMTabPage QPushButton#tabpage-close-button:pressed {
396374
background-color: #C50F1F;
397375
}
398376

399-
QTMTabPageContainer QToolButton#add-tab-button {
377+
QTMTabPageContainer QPushButton#add-tab-button {
400378
background-color: transparent;
401379
border: none;
402-
color: #2c2c2c;
403-
font-weight: bold;
404-
border-radius: 6px;
405-
padding: 0;
406-
font-size: 12pt;
407-
}
408-
409-
QTMTabPageContainer QToolButton#add-tab-button[platform="mac"] {
410-
min-width: 20px;
411-
min-height: 20px;
412-
max-width: 20px;
413-
max-height: 20px;
414-
font-size: 11pt;
380+
qproperty-iconNormal: url(":/tabpage/add.svg");
415381
}
416382

417-
QTMTabPageContainer QToolButton#add-tab-button:hover {
383+
QTMTabPageContainer QPushButton#add-tab-button:hover {
418384
background-color: rgba(0, 0, 0, 0.08);
419385
}
420386

421-
QTMTabPageContainer QToolButton#add-tab-button:pressed {
387+
QTMTabPageContainer QPushButton#add-tab-button:pressed {
422388
background-color: rgba(0, 0, 0, 0.12);
423389
}
424390

TeXmacs/progs/texmacs/menus/tabpage-menu.scm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@
4545
((balloon (eval `(verbatim ,tab-title))
4646
(eval `(verbatim ,doc-path)))
4747
(window-set-view view-win view #t)) ;; #t stansd for focus
48-
((balloon "" "Close") (safely-kill-tabpage-by-url view-win view buf))
48+
((balloon "" "Close") (safely-kill-tabpage-by-url view-win view buf))
4949
(eval active?)
5050
))))

devel/222_75.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# 222_75 TabPage UI 重构:统一跨平台样式并引入 SVG 图标
2+
3+
## 如何测试
4+
5+
1. 编译:`xmake b stem`
6+
2. 启动 Mogan,确认标签页栏(TabPage Bar)视觉正常。
7+
3. 确认关闭按钮和添加按钮显示为 SVG 图标(`×``+`),而非文字或原生按钮。
8+
4. 确认关闭按钮仅在鼠标 Hover 或标签处于选中状态时显示,移出后隐藏。
9+
5. 确认启动页(Startup Tab)标签文字居中对齐。
10+
6. 分别验证亮色/暗色主题下图标颜色正常(亮色主题关闭按钮 hover 变红,暗色主题图标为白色)。
11+
7. 验证标签页拖拽排序功能正常。
12+
8. 分别测试 macOS / Windows / Linux 下的标签页高度和按钮尺寸一致性。
13+
14+
## 2026/04/28 实现说明
15+
16+
### What
17+
18+
对 TabPage 组件进行全面 UI 重构,将关闭按钮和添加按钮从 `QToolButton` 迁移到 `QWK::WindowButton`,引入 SVG 图标资源,并彻底移除 macOS / Windows / Linux 三平台硬编码差异,实现跨平台样式统一。
19+
20+
#### 修改文件
21+
22+
**src/Plugins/Qt/QTMTabPage.cpp / hpp**
23+
- 关闭按钮 `m_closeBtn` 和添加按钮 `m_addTabButton` 类型从 `QToolButton*` 改为 `QWK::WindowButton*`
24+
- 移除全部 `#ifdef Q_OS_MAC` 分支:包括 `TAB_CONTENT_VERTICAL_OFFSET``getScaledSystemBarHeight``getScaledSystemButtonHeight``getScaledTabCloseButtonSize` 等。
25+
- DPI 缩放统一使用 `DpiUtils::scaled()`,新增 `getScaledAddButtonHeight()` / `getScaledCloseButtonHeight()` 替代旧函数。
26+
- 新增 `ADD_BUTTON_SIZE = 20``CLOSE_BUTTON_SIZE = 18` 常量。
27+
- `STARTUP_TAB_MAX_WIDTH_BASE` 区分社区版(`IS_COMMUNITY`)和商业版:120 / 90。
28+
- 关闭按钮连接逻辑改为 `QPointer<QAction>` 保护,防止 action 被释放后悬空触发。
29+
- `paintEvent` 中启动页标签文字改为 `Qt::AlignCenter`,普通标签保持 `Qt::AlignLeft`
30+
- `updateCloseButtonVisibility` 增加条件:仅在 `underMouse() || isChecked()` 时显示关闭按钮。
31+
- 默认构造函数不再调用 `initializeCloseButton()``dummyTabPage` 不需要关闭按钮),并在所有访问 `m_closeBtn` 处补充空指针检查。
32+
- `m_closeBtn` 成员添加 `= nullptr` 默认初始化。
33+
- `enterEvent` 补充 `override` 关键字。
34+
- 移除未使用的全局变量 `g_hiddentTabIndex`
35+
- `QTMTabPageContainer` 析构函数移除冗余的 `delete m_addTabButton`
36+
- `arrangeTabPages``addButtonWidth` 语义修正:`height()``width()`
37+
38+
**src/Plugins/Qt/qt_tm_widget.cpp**
39+
- 标题栏高度统一为 `42 * scale`(macOS 原特殊值 20 移除)。
40+
- 系统按钮尺寸统一为 `60 * scale` 宽、`42 * scale` 高(移除 macOS 特殊逻辑)。
41+
- 图标基础尺寸统一为 `16 * scale`(macOS 原特殊值 20 移除)。
42+
- 工具栏高度统一为 `DpiUtils::scaled(32)`,tab row 高度统一为 `DpiUtils::scaled(38)`(移除 macOS 特殊值 30)。
43+
- 登录按钮图标尺寸统一为 `12`(macOS 原特殊值 20 移除)。
44+
- 登出按钮图标尺寸统一为 `20`(macOS 原特殊值 30 移除)。
45+
46+
**TeXmacs/misc/themes/liii.css / liii-night.css**
47+
- `QTMTabPage` 移除硬编码 `padding``border-radius``border-bottom: none`,改为由 C++ 动态计算。
48+
- 关闭按钮和添加按钮选择器从 `QToolButton` 改为 `QPushButton`
49+
- 移除全部 `[platform="mac"]` 规则。
50+
- 关闭按钮通过 `qproperty-iconNormal` / `qproperty-iconHovered` 设置图标(亮色:`close.svg` / `close-white.svg`;暗色:`close-white.svg`)。
51+
- 添加按钮通过 `qproperty-iconNormal` 设置图标(亮色:`add.svg`;暗色:`add-white.svg`)。
52+
- 移除关闭按钮的 `min-width``max-width``margin-left` 等硬编码尺寸。
53+
- 移除添加按钮的 `font-weight: bold``font-size``color` 等文字样式。
54+
55+
**TeXmacs/misc/images/images.qrc**
56+
- 新增 4 个 SVG 资源文件:`tabpage/add.svg``tabpage/close.svg``tabpage/add-white.svg``tabpage/close-white.svg`
57+
58+
**TeXmacs/misc/images/tabpage/*.svg**
59+
- 新增 4 个 SVG 图标文件,基于 48×48 viewBox,提供亮色/暗色两版。
60+
61+
**TeXmacs/progs/texmacs/menus/tabpage-menu.scm**
62+
- 关闭按钮文字从 `"✕"` 改为 `""`(空字符串),因为图标已由 CSS/C++ 接管。
63+
64+
### Why
65+
66+
1. **跨平台统一**:旧代码中 macOS 拥有大量独立分支(标题栏高度、按钮尺寸、字体大小等),维护成本高且视觉不一致。统一后三平台代码完全一致。
67+
2. **图标化**:关闭按钮和添加按钮从纯文字(```+`)升级为 SVG 图标,视觉更现代,且支持亮色/暗色主题自动切换。
68+
3. **样式解耦**:将 `padding``border-radius` 等从 CSS 硬编码移至 C++ 动态计算(通过 `DpiUtils::scaled()`),确保高 DPI 下尺寸正确。
69+
4. **交互优化**:关闭按钮仅在需要时显示(hover/选中),减少标签页视觉噪音,更接近现代浏览器标签页体验。
70+
5. **安全性**`QPointer<QAction>` 防护避免 action 生命周期问题;空指针检查使 `dummyTabPage` 不初始化关闭按钮的逻辑更安全。
71+
72+
### How
73+
74+
- 引入 `QWK::WindowButton`(已存在于项目中,用于系统标题栏按钮)替代 `QToolButton`,复用其 `iconNormal` / `iconHovered` 属性支持。
75+
- 新增 `tabpage/` SVG 资源目录,通过 `.qrc` 编译进二进制。
76+
- CSS 中通过 `qproperty-*` 语法将图标路径与按钮绑定。
77+
- 全面替换 `int (base * getDPIScaleFactor())``DpiUtils::scaled(base)`,消除浮点截断误差。
78+
- 移除 `dummyTabPage` 的关闭按钮初始化,并在所有 `m_closeBtn` 访问点做空指针守卫。

0 commit comments

Comments
 (0)