Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 41 additions & 25 deletions internal/e2e/counts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ package e2e
//
// 1. **角标文本在无障碍树里是那一枚键的子节点**(它是 `Attach` 上去的,
// 无障碍树的父子关系跟着元素树走,不跟「它悬在哪儿」走)。
// 2. **角标的 bounds 落在那一枚键的右上象限**(`Attach(AnchorTopRight,
// AnchorTopLeft)`:角标左缘贴图形右缘、上缘贴图形上沿,数字整个在图形
// 右上外侧)。
// 2. **角标咬进图形的右上角**(`Attach(AnchorTopRight, AnchorTopRight)` +
// `Top(-out).Right(-(notchW-bite))`:缺口块的左缘收进图形右缘
// `badgeNotchBite`(6),把那一角的字形笔画盖成底色;数字从缺口里往右
// 排、和咬掉的笔画之间留着 `badgeNotchPadL` 那一道底色缝,主体探在
// 图形外的空气里)。
//
// 这两层在无头 Tester 里问不到——框架只在**辅助技术问起**时才描述那一帧
// (`mygo/ui/access.go` 的 `accessibilityOn`:真窗口里是系统的读屏软件问起,
Expand Down Expand Up @@ -57,8 +59,10 @@ import (
// bounds**。这一层于是断两样:
//
// 1. 键的无障碍名字里带着那个数(「赞 9k+」)——读屏用户听得到。
// 2. `capture` 回来的画面上,**键的右上象限有墨迹、而图形正右方那一带没有**
// ——横排那一版(数字在图形右边那一格、中心 y ≈ 键中心 y)立刻红。
// 2. `capture` 回来的画面上,**图形的右上角被咬掉一块**(那一带以前是字形
// 笔画、现在是底色),而**数字的墨迹从图形右缘以内起排、一直探到图形
// 右侧的空气里**——外侧角标那一版(数字整条在图形右缘以右、图形的角
// 完好无损)和横排那一版(数字中心 y ≈ 键中心 y)都立刻红。
func TestThePlayBarCountsSitAsBadges(t *testing.T) {
if os.Getenv("BIU_RUN_MYGO_E2E") != "1" {
t.Skip("设置 BIU_RUN_MYGO_E2E=1 才运行真窗口 E2E")
Expand Down Expand Up @@ -151,28 +155,40 @@ func TestThePlayBarCountsSitAsBadges(t *testing.T) {
// 底色取样点:键的左上角(键没有底、是播放条那一行的底色)。
bg := pixelAt(img, geom, key.Bounds.X+2, key.Bounds.Y+2)

// 🔴 **两条判据把「贴在右上外侧」钉死**(角标的左上角钉在图形盒子
// 右上角 = icx+9, icy−9,不收不压,字左对齐从图形右缘起排):
// 🔴 **三条判据把「缺口嵌字」钉死**(缺口块的左缘收进图形右缘
// `badgeNotchBite` = 6 → 咬掉图形右上角 [icx+3, icx+9] 那一带;
// 数字在缺口里,左缘起在缺口左缘 + `badgeNotchPadL`(8)≈ icx+11、
// 贴着图形上沿那一带往右排——**数字和被咬的笔画之间留着一道看得见的
// 底色缝**,那是视觉审查钉下的:「豁口里留一圈白」):
//
// R1 [icx+13, icx+27] × [icy−9, icy+1]——角标的**本体那一带**:实测
// 数字笔画落在图形右缘往右 ≈ icx+9 起、贴着图形上沿的横带里。
// 横排版(数字中线 ≈ icy、左缘起在图形右沿 +2)的左半截会撞进
// 这里的下半截——所以这条还要带上「上沿那一半」:横排版的数字
// 上不到 icy−9 那一带。
// R2 [icx+9, icx+11.5]——角标的**左端**:`AnchorTopLeft` 把它钉在图形
// 右缘(icx+9),左端就落在 icx+9——**一点不往图形上收**。而横排
// 那一版的数字从图形右沿 +2 起排(icx+11 才有墨),icx+9 那一带
// 是空的;往回收 1.5 那版左端在 icx+7.5,这里反而没墨。这条有墨
// ⇒ 数字的左缘就贴着图形右缘,不多不少。
if ink := darkerIn(img, geom, icx+13, icy-9, 14, 10, bg); ink == 0 {
t.Errorf("「%s」键图形右上外侧(%.0f,%.0f 起 14×10 DIP)一点墨迹都没有——"+
"数字没有收成角标(角标本体在图形右缘往右、贴着上沿那一带)",
c.name, icx+13, icy-9)
// R1 [icx+5.5, icx+10.5] × [icy−8, icy+1]——缺口左端到数字起笔之间的
// **底色缝**:这一带在缺口块上、可是字还没起笔(PadL 那 8 像素),
// 所以一个比底色深的像素都不该有。外侧角标那一版(数字从图形右缘
// 紧贴着起排)这里有墨;「缝挤回 3」那一版这里也是墨——这条断的
// 就是「数字和笔画之间留没留缝」。
// R2 [icx+3, icx+5.5] × [icy−7, icy−3]——图形右上角**被咬掉的那一口**:
// 缺口块把它盖成了底色。以前这里有三枚图标各自的笔画(星的右臂、
// 拇指背的起弧、气泡的右上那一段弧)——缺口的判据就是这一带
// **不再有比底色深的像素**。外侧角标那一版(图形完好)这里全是
// 墨迹;横排版更是整段笔画。
// R3 [icx+11, icx+30] × [icy−8, icy+1]——数字**探在图形右侧空气里**的
// 主体:缺口往右长过图形右缘,「9k+」那一串的本体就落在这一带。
// 缺了它说明数字全缩在图形框上——那是「盖住整个图形」的错误版,
// 不是咬在角上的缺口。
if ink := darkerIn(img, geom, icx+5.5, icy-8, 5, 9, bg); ink != 0 {
t.Errorf("「%s」键缺口左端到数字起笔之间(%.0f,%.0f 起 5×9 DIP)有 %d 个比底色深的像素——"+
"数字和被咬的笔画之间那道底色缝没了(视觉审查:「豁口里要留一圈白」,"+
"PadL 那 8 像素就是这道缝)", c.name, icx+5.5, icy-8, ink)
}
if ink := darkerIn(img, geom, icx+9, icy-9, 2.5, 10, bg); ink == 0 {
t.Errorf("「%s」键图形右缘贴边(%.0f,%.0f 起 2.5×10 DIP)一点墨迹都没有——"+
"数字的左缘不在图形右缘上(横排版左缘在缝后、内收版左缘在图形上,这里都该是空的)",
c.name, icx+9, icy-9)
if ink := darkerIn(img, geom, icx+3, icy-7, 2.5, 4, bg); ink != 0 {
t.Errorf("「%s」键图形右上角(%.0f,%.0f 起 2.5×4 DIP)还有 %d 个比底色深的像素——"+
"那一角没有被咬掉(缺口要把图形右上角的笔画盖成底色,这一带该是空的)",
c.name, icx+3, icy-7, ink)
}
if ink := darkerIn(img, geom, icx+11, icy-8, 19, 9, bg); ink == 0 {
t.Errorf("「%s」键图形右侧空气里(%.0f,%.0f 起 19×9 DIP)一点墨迹都没有——"+
"数字没有探出图形右缘(缺口主体在图形外面,「9k+」那一串的本体在这一带)",
c.name, icx+11, icy-8)
}
}
}
Expand Down
8 changes: 6 additions & 2 deletions internal/ui/comments_entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,12 @@ func (s *Shell) viewCommentsButton(c *ui.Context, st app.State) {
Height(iconHitMd).Padding(space.None, space.Px7)
btn.Children(func() {
// ⚠️ **结构是共享的那一份**(`countKeyIcon`):一个 18×18 的图形盒子,
// 角标挂在盒子的右上角。角标的上限 / 字号 / 挂点在 `playbar_counts.go`。
countKeyIcon(c, iconComments, btn.Hovered(), btn.Pressed(), count)
// 缺口块挂在盒子的右上角。缺口 / 字号 / 挂点在 `playbar_counts.go`。
//
// ⚠️ **缺口色 = 按钮底下那块底**:播放条那一列的底是
// `coverWash(t.Background)`(和这一列自己同一个来源,`playbar.go`)。
countKeyIcon(c, iconComments, btn.Hovered(), btn.Pressed(), count,
s.coverWash(c.Theme(), c.Theme().Background))
})

if s.withTip(c, btn, commentsKeyTip(count)).Clicked() {
Expand Down
13 changes: 10 additions & 3 deletions internal/ui/like.go
Original file line number Diff line number Diff line change
Expand Up @@ -864,13 +864,20 @@ func (s *Shell) likeButton(c *ui.Context, name, label string, color ui.Color, li
// 18 + 7 + 7 = 32,和没有数字时**一个字节都不差**。
ui.Box(c).Size(iconMd, iconMd).Children(func() {
drawIcon(c)
// 🔴 **角标**(票 #701 起、本票起收成右上角):获赞数。
// 🔴 **缺口角标**(票 #701 起带数、本票起收成网易云式缺口):获赞数。
//
// ⚠️ **走共享的那一份**(`countBadge`):挂点 / 字号 / 上限 / 颜色
// ⚠️ **走共享的那一份**(`countBadge`):缺口块 / 挂点 / 字号 / 颜色
// **只有一处**——赞键自己拼图形盒子(那两层是绝对定位的,有自己的锚
// 结构),但角标不许另写一份。
//
// ⚠️ **缺口色 = 按钮底下那块底**:播放条那一列的底是
// `coverWash(t.Background)`(和播放条自己同一个来源,`playbar.go`)。
//
// 🔴 **`dx` 传图形自己那一份抖**(不是 0):长按三连的时候底下那两层
// 在 `dx` 上抖,缺口块不吃同一个平移就是「图标在抖、缺口原地不动」
// ——按住 2.5s 全程缺口漂离图标(对抗性审查查出的一笔)。
if hasCount {
countBadge(c, count)
countBadge(c, count, s.coverWash(c.Theme(), c.Theme().Background), dx)
}
})
})
Expand Down
5 changes: 4 additions & 1 deletion internal/ui/playbar.go
Original file line number Diff line number Diff line change
Expand Up @@ -940,7 +940,10 @@ func (s *Shell) viewFavButton(c *ui.Context, st app.State) {
btn := flat.Button(c, "").Label(countKeyLabel("收藏", count)).
Height(iconHitMd).Padding(space.None, space.Px7)
btn.Children(func() {
countKeyIcon(c, favIcon(faved), btn.Hovered(), btn.Pressed(), count)
// ⚠️ **缺口色 = 按钮底下那块底**:播放条那一列的底是
// `coverWash(t.Background)`(和这一列自己同一个来源)。
countKeyIcon(c, favIcon(faved), btn.Hovered(), btn.Pressed(), count,
s.coverWash(c.Theme(), c.Theme().Background))
})
if faved {
// ⚠️ **只在这一支设颜色**:没收藏的那一支一个字都不改,好让「默认那个颜色」
Expand Down
Loading
Loading