清單列
停靠工具窗(SQL Memory、SQL Search)與之後的視窗共用的清單列契約。骨架、主從區與狀態表面見 視窗骨架,視覺語言見 UI 準則。
第一列語意固定,內容列 1–2 列,程式碼片段是可選的第三列。
第一列:主要名稱 → 狀態/物件類型 → 命中部位/次要標記 → 彈性空白 → 伺服器 → 資料庫 → 時間。
工具窗停在右側時可用寬度約 300 DIP,名稱是使用者唯一要掃的東西,固定在最左,膠囊不得排在 它前面;這個順序就是 UI 準則的「識別資訊 → 性質/狀態 → 統計或範圍」。
- Memory:
檔名 → 草稿/執行/收藏 → 次數(可選)→ 伺服器 → 資料庫 → 時間。 - Search:
物件名稱 → 物件類型 → 命中部位 → 命中次數 → 伺服器 → 資料庫;類型是看得見的 icon+文字膠囊,不能只藏在 tooltip;沒有真實更新時間就不顯示時間。 - Search 的命中部位可以有好幾顆:聚合器把同一個物件的名稱、資料行與本文命中併成一列, 而「它對上了哪幾種」正是使用者要從這一列讀到的事。只留代表那一筆的部位等於說 「它是靠名稱進來的」,而使用者關掉名稱那一段之後這一列還在。
- 命中次數用中性膠囊(
×N),與通知的重複次數同一個語言;只有一處時整顆收起—— 每一列都掛一顆×1等於在清單上加一欄沒有資訊的字。 - 同一份事實在 Preview 摘要上用同一個順序。兩個表面各排各的話,使用者在清單上選一筆、 眼睛移到摘要,同一組膠囊卻換了位置。
- 狀態與連線用小型 badge,各帶一個 16 DIP
SqlIcon、間距 4–5 DIP;語意已由膠囊圖示表達 就不重複第二個。主要名稱維持一般文字。 - 缺值直接 collapse 不留空槽;名稱吃剩餘寬度並 ellipsis,全文由 tooltip/Preview 提供。
內容列放 Memory 的單行 SQL 摘要,或 Search 的完整限定名稱與命中的資料行。資料行那一列是 併成一列之後唯一說得出「是哪幾行」的地方——標題已經收回物件本身([dbo].[Cat_BookCopy] 而不是其中隨便一行的名字),名稱以頓號串起來並保留高亮,放不下時由省略號收尾。
片段列只在有本文片段時出現,等寬字、單行、保留高亮;名稱與資料行命中的片段就是名稱本體, 不再畫一次。條件讀的是片段本身而不是代表那一筆的命中部位:併過的一列可能由資料行命中當代表, 而唯一有程式碼可看的是被併進來的那一筆本文命中。
- 操作不自己占一列——那等於每張卡片固定多一列高度。它是浮在第一列右緣的疊層(
CreateRowActionLayer),收起用Collapsed:層不參與 量測,所以揭露不跳版面,底下那一列又一直排到滿。Hidden預留寬度的那一版讓每一列右邊 永遠空著近百 DIP,在停靠面板裡等於名稱少掉三分之一。層是不透明的(ListBackground加一層 跟著 hover/selected 走的染色),左緣以OpacityMask淡出:透明會讓被蓋住的膠囊疊在圖示上。 - 那個
OpacityMask是Absolute座標的漸層,只在左緣約 24 DIP 之內淡出,其餘由Pad補成實心。RelativeToBoundingBox加上落在 0 與 1 的停駐點會讓整片操作層由左到右從全透明 升到不透明——整排圖示是半透明的,連線膠囊一路透出來疊在上面,而那正是「停駐時功能與後面的 東西糊在一起」。遮罩是固定灰階,不隨主題也不隨列寬變,做一次凍結給每一列共用。 - 揭露由
RevealRowActions一份負責:滑鼠停駐或鍵盤焦點落在這一列都揭露,兩條路共用同一段 120 ms 的淡入加 6 DIP 水平滑入(RowActionRevealDuration,走RenderTransform,不改量測, 受全域動畫設定控制)。條件與動畫分開寫的下場是只加了滑鼠那一邊, 而只用鍵盤的人看到的是一整片直接閃出來的圖示。 - 破壞性操作前一條分隔線(
AppendRowActionButton的separated):只留間距的那一版,停駐時整排仍讀成同一組, 刪除就在收藏旁邊一格。線的顏色取卡片前景再降透明度,停駐、選取與高對比換底色時才不會消失; 可見度繫結到後面那顆按鈕,按鈕因列種類或窄版收起時線不會單獨留下。 - 操作做不到就變灰,不收起來:收起來會讓同一列的圖示位置隨內容變,而使用者是照位置按的。 可用性由列自己算一次(
SqlSearchRow),快捷選單與停駐時那一排讀同一個值;兩處各算一次 的症狀是選單上已經變灰、停駐時的同一顆卻按得下去。名稱與提示隨列而變時(別台的結果上 「移至定義(未連線)」)也讀列上那一份(LabelPath/ToolTipPath);做得到、只是換一種 做法的不變灰,變灰只留給真的做不到。 - 靠右那幾組先宣告。
DockPanel依宣告順序量測,名稱先量的話,一個長名稱會把連線與時間 擠出這一列;讓得起的是可以 ellipsis 的名稱,不是固定寬的那幾顆。 - 窄版由宿主量一次(
SqlRowLayout的可繼承附加屬性,門檻 340 DIP、hysteresis 24), 不是每一列各量一次,也不看內容量得多寬——看內容的那一版降完又放得下,膠囊會不停閃動。 降級順序:先把低優先的連線膠囊改 icon-only(字進 Tooltip),再把次要操作收進 overflow (…開的是這一列本來就有的快捷選單,不是第二份命令清單)。名稱、狀態與物件類型不降。 - 不換列,內容列不得被動作擠掉。
多選
SQL Memory 與 SQL Search 的清單都開了多選(SqlCardListBase.EnableSelection)。勾選與選取分開: 選取仍只代表焦點與 Preview,勾選是另一份以列的鍵為準的集合(SqlCardSelection)。
- 進入:Ctrl+點擊,或對焦點列按 Space;Shift+點擊或 Shift+Space 從錨點勾一段。模式中單擊列或 圓圈都切換勾選;↑/↓、Preview、Enter/雙擊仍只作用在焦點列。Esc 或工具列的 ✕ 離開並清空, 勾選數歸零時自動離開。Ctrl+C 只在模式中走選取的複製,平常維持各清單原本的單筆行為。
- 全選只有一層:工具列的全選與 Ctrl+A 勾的是符合目前條件的全部,包括還沒載入的。載入到第幾頁 是分頁與虛擬化的細節,分成「已載入」與「全部符合」兩步的那一版要使用者先懂這件事,還在工具列 下面多佔一列。還有沒載入的列時筆數只說「已選全部符合的項目」,接一段淡色的「已載入 N 筆」; 載入到底就說確切筆數。取消任何一列就回到只算勾起來的那幾筆。
- 還沒載入的列由動作自己讀;進度佔筆數那一格,全選與動作讓給「取消」,不另起一列。
- 條件變了(搜尋、篩選、分頁、換連線)清空勾選;同一組條件重跑(重新整理、重排)照鍵留著, 新結果套完再去掉已經不在的那幾筆。續頁進來的列不勾,全部符合時照樣勾。
勾選欄只在多選模式出現(WrapWithRowCheck、RevealRowCheck):整列左邊一欄 圓形勾選,跨過內容列、垂直置中,佔 RowCheckColumnWidth。平常收起,名稱仍是最左邊那一個。 疊在狀態膠囊圖示上的那一版省下這一欄,但勾選框長在「執行」旁邊,讀起來像在勾那個狀態。
- 圓形而不是方形:勾的是「這一筆」,與設定裡的核取方塊分開;色階與打勾同一份(
CreateCheckBoxTemplate的round)。 - 不做每一列的進場動畫:模式中捲動時新容器一套上樣板就重播,清單邊捲邊閃;進入模式的回饋由 選取工具列負責。
- 狀態只讀列上的
IsChecked(ISqlCheckableRow)與清單設的可繼承附加屬性 (SqlRowCheck),不存在容器上;容器重用時才不會把別列的勾帶過來。 - 勾選框不可聚焦、不在 Tab 順序上,自動化名稱是「選取 名稱」;點它或 Toggle 模式都交給 選取控制器,不自己翻值,否則本機值蓋掉單向繫結。
- 勾起來的列只把外框換成強調色;焦點列仍是選取底色,兩者同時成立時分得出哪一筆在預覽。