跳到正文

D. 播放列表 ​

<fb-playlist-tabs> ​

播放列表选项卡标签栏组件,支持 ArrowLeft 与 ArrowRight 键盘切换、边缘拖拽调宽、拖拽重排与溢出滚动。

html
<fb-playlist-tabs></fb-playlist-tabs>
属性类型默认值说明
active-indexstring—只读反映当前激活播放列表索引
countstring—只读反映播放列表总数
native-contextbooleanfalse开启时同时呼出原生播放列表右键菜单(observed)

只读宿主状态: 拖拽标签时为 dragging,标签栏内容溢出时为 overflow

CSS Parts: tabs-container, tab, tab-name, tab-count, drop-indicator, add-button

tab 上 locked 属性标识锁定的播放列表,data-guid 是该列表的 GUID。

标签栏通过 GUID 绑定播放列表:标签渲染后即使其他列表发生增删,点击对应标签仍激活最初关联的列表;若目标列表已被移除,点击时不产生激活行为。fb-playlist-select 与 fb-playlist-reorder 事件在宿主操作完成后派发。

事件:

js
el.addEventListener('fb-playlist-select', e => {
  console.log('选中播放列表:', e.detail.index, e.detail.guid);
});
el.addEventListener('fb-playlist-context', e => {
  // 菜单关闭后按 e.detail.guid 操作;到那时序号可能已指向别的列表。
  console.log('右键菜单:', e.detail.guid, e.detail.x, e.detail.y);
});
el.addEventListener('fb-playlist-add', e => {
  console.log('点击新建');
});
el.addEventListener('fb-playlist-reorder', e => {
  console.log('拖拽重排:', e.detail.fromIndex, '→', e.detail.toIndex);
  console.log('新顺序:', e.detail.newOrderGuids);
});

<fb-resizable-header> ​

可调列宽表头组件,支持鼠标拖拽调宽、列拖拽重排与点击表头排序。通常与 <fb-playlist-view> 配合协同渲染。

html
<fb-resizable-header columns='[{"id":"title","label":"Title","width":"2fr"}]'></fb-resizable-header>
属性类型默认值说明
columnsstring (JSON)[]列定义数组(每项包含 id、label/name、width 如 1fr、sortable 与 fixed)
sort-columnstring—当前排序列 ID(observed 与 reflected)
sort-direction'asc' | 'desc''asc'当前排序方向(observed 与 reflected)

带有 fixed 的列不可调整宽度或重排。只读宿主状态: resizing(正在调宽)、reordering(正在重排)

CSS Parts: header, cell, cell-{id}, resize-handle, sort-icon, sort-active, drop-indicator, drag-ghost, label

只读属性(JS):

  • gridTemplate — 当前 CSS grid-template-columns 值(同步到 playlist-view)
  • columnIds — 当前列 ID 顺序数组

事件:

js
// 列宽调整
el.addEventListener('fb-column-resize', e => {
  console.log('列宽:', e.detail.column, e.detail.width);
  // 同步到 playlist-view
  playlistView.setAttribute('grid-template', e.detail.gridTemplate);
});

// 列重排序
el.addEventListener('fb-column-reorder', e => {
  console.log('重排:', e.detail.fromIndex, '→', e.detail.toIndex);
  console.log('新顺序:', e.detail.columns);
});

// 点击列排序
el.addEventListener('fb-column-sort', e => {
  console.log('排序:', e.detail.column, e.detail.direction);
});

// 右键列头
el.addEventListener('fb-header-context', e => {
  console.log('列头右键:', e.detail.x, e.detail.y);
});

<fb-playlist-view> ​

基于 requestAnimationFrame 与 DOM 池虚拟滚动的播放列表核心视图组件。支持 Ctrl/Cmd 与 Shift 连续多选、Enter 键播放、Delete 键删除以及 Ctrl+A 全选。

html
<fb-playlist-view row-height="24"></fb-playlist-view>
属性类型默认值说明
playliststring—播放列表的 guid(以 { 开头的值)或序号;省略时自动跟随当前活动列表(observed),见下文
columnsstring'index,title,artist,album,duration'以逗号分隔的列名列表(observed)
row-heightstring'32'行高像素值(observed)
grid-templatestring—CSS grid-template-columns 属性值,用于与 fb-resizable-header 保持列宽同步(observed)
formatsstring (JSON){}自定义列 ID 与 TitleFormatting 表达式的映射字典(observed)
track-countstring—只读反映当前列表曲目总数
selected-countstring—只读反映当前选中的曲目总数

play_count、first_played、last_played、added 四列显示 foo_playcount 的字段,rating 列显示五颗可点击的星。若需展示 fb.playlist.getAvailableColumns() 列出的其他列,可将该列的 pattern 映射至自定义列 ID 并配置到 formats,再将该 ID 添加至 columns。列对象的 name 随 foobar2000 界面语言动态变化,不可作为稳定 ID 使用。

html
<fb-playlist-view columns="index,title,play_count,rating,mood"
  formats='{"mood":"%mood%"}'></fb-playlist-view>

CSS Parts: viewport, scroll-content, row, row-{column}

row 上的状态属性(可用于 CSS 选择器):selected、focused、playing。

若 playlist 设置为 GUID,当其他播放列表增删或重排时,视图仍保持锁定该列表;若该列表被移除,视图变为空白。若设置为索引序号,视图展示对应位置的列表,列表变动时重新定位索引。若未指定该属性,视图自动跟随当前活动播放列表。组件确定目标列表后,与宿主的后续交互及事件 detail 均统一使用 playlistGuid 寻址。

事件:

js
el.addEventListener('fb-track-select', e => {
  console.log('选中:', e.detail.index, e.detail.indices, e.detail.playlistGuid);
});
el.addEventListener('fb-track-play', e => {
  console.log('双击播放:', e.detail.index, e.detail.playlistGuid);
});
el.addEventListener('fb-track-context', e => {
  console.log('右键菜单:', e.detail.indices, e.detail.playlistGuid, e.detail.x, e.detail.y);
});

<fb-queue-view> ​

播放队列条目视图组件,双击队列中行条目可将其从队列中移除。

html
<fb-queue-view columns="index,title,artist,duration">
  <span slot="empty">队列为空</span>
</fb-queue-view>
属性类型默认值说明
columnsstring'index,title,artist,duration'以逗号分隔的列名列表
emptyboolean—只读反映当前播放队列是否为空
countstring—只读反映队列条目总数

CSS Parts: container, row, row-{column}, empty
Slots: empty

事件:

js
el.addEventListener('fb-queue-context', e => {
  console.log('右键菜单:', e.detail.index, e.detail.x, e.detail.y);
});
el.addEventListener('fb-queue-remove', e => {
  console.log('移除:', e.detail.index);
});

<fb-playlist-selector> ​

播放列表下拉选择器组件。

html
<fb-playlist-selector></fb-playlist-selector>
属性类型默认值说明
selected-indexstring—只读反映当前选中的播放列表索引
selected-namestring—只读反映当前选中的播放列表名称

CSS Parts: select

事件:

js
el.addEventListener('fb-playlist-pick', e => {
  console.log('选择:', e.detail.index, e.detail.guid, e.detail.name);
});