【Rust GUI开发入门】编写一个本地音乐播放器(5. 制作音乐列表组件) - Jordan

news/2025/9/30 16:29:13/文章来源:https://www.cnblogs.com/Jordan-Haidee/p/19121392

目的是要做一个这样的音乐列表组件:

songlist-view.png

包含:

  • 一个标题栏
  • 多个列表项

制作标题栏

需要在标题栏上显示排序图标,实现点击排序功能,因此额外需要定义一个枚举类型SortKey指示排序依据。这里的排序图标也手动绘制,不使用网络上的图标:

@rust-attr(derive(serde::Serialize, serde::Deserialize))
export enum SortKey {BySongName,BySinger,ByDuration,
}component SortIcon inherits Window {in-out property <bool> ascending:true;in-out property <bool> display:true;height: 15px;width: 15px;background: transparent;if !ascending && display: Path {MoveTo {x: 5;y: 1;}LineTo {x: 5;y: 9;}LineTo {x: 7;y: 7;}stroke: gray;stroke-width: 1px;}if ascending && display:Path {MoveTo {x: 5;y: 9;}LineTo {x: 5;y: 1;}LineTo {x: 3;y: 3;}stroke: gray;stroke-width: 1px;}
}component TitleBarItem inherits Window {in property <string> name:"name";in-out property <bool> display-sort-icon <=> arrow.display;in-out property <bool> ascending-sort <=> arrow.ascending;Rectangle {width: 100%;height: 100%;text := Text {text: name;color: dimgray;x: parent.width * 0.4;y: parent.height / 2 - self.height / 2;}arrow := SortIcon {ascending: true;width: 12px;height: 12px;x: text.x + text.width + 5px;y: parent.height / 2 - self.height / 2;}}
}export component TitleBar inherits Window {height: 30px;in-out property <SortKey> key;in-out property <bool> ascending;callback sort-items(SortKey, bool);VerticalLayout {HorizontalLayout {alignment: space-between;area1 := TouchArea {width: 33%;clicked => {sort-items(SortKey.BySongName, ascending);}TitleBarItem {width: 100%;height: 100%;name: @tr("Title");background: area1.has-hover ? Palette.control-background : transparent;display-sort-icon: key == SortKey.BySongName;ascending-sort: ascending;}}area2 := TouchArea {width: 33%;clicked => {sort-items(SortKey.BySinger, ascending);}TitleBarItem {name: @tr("Artist");height: 100%;width: 100%;background: area2.has-hover ? Palette.control-background : transparent;display-sort-icon: key == SortKey.BySinger;ascending-sort: ascending;}}area3 := TouchArea {width: 33%;clicked => {sort-items(SortKey.ByDuration, ascending);}TitleBarItem {name: @tr("Duration");height: 100%;width: 100%;background: area3.has-hover ? Palette.control-background : transparent;display-sort-icon: key == SortKey.ByDuration;ascending-sort: ascending;}}}Path {width: 100%;height: 5px;MoveTo {x: 0;y: 0;}LineTo {x: 100%;y: 0;}stroke: Palette.foreground;stroke-width: 0.3px;}}
}

制作列表项

每个列表项关联一首歌曲,显示其相关信息:

  • 歌名
  • 歌手
  • 时长

因此额外定义了一个SongInfo结构体。此外,双击该列表项会触发音乐播放,所以对外暴露一个double-clicked回调函数:

export struct SongInfo {id:int,song_name:string,singer:string,duration:string,song_path:string,
}export component SongItem inherits Window {height: 30px;in property <SongInfo> info:{ id:0, song_name:"xxx", singer:"xxx", duration:"xxx", song_path:"xxx" };callback double_clicked();background: area.has-hover ? Palette.control-background : transparent;VerticalLayout {area := TouchArea {double-clicked => {double_clicked();}HorizontalLayout {alignment: space-between;Rectangle {width: 33%;Text {width: 100%;x: parent.width * 0.4;text: info.song-name;overflow: elide;}}Rectangle {width: 33%;Text {width: 100%;x: parent.width * 0.4;text: info.singer;overflow: elide;}}Rectangle {width: 33%;Text {x: parent.width * 0.4;text: info.duration;}}}}Path {width: 100%;height: 1px;MoveTo {x: 0;y: 0;}LineTo {x: 100%;y: 0;}stroke: Palette.foreground;stroke-width: 0.15px;}}
}

把二者组合起来

使用Slint UI的内置ListView组件来渲染多个音乐项,然后竖直堆叠标题栏和这个ListView

export component SongListView inherits Window {in-out property <bool> ascending;in-out property <SortKey> sort-key;in-out property <SortKey> last-sort-key;in-out property <[SongInfo]> song-list;callback sort-songs(SortKey, bool);callback play-song(SongInfo, TriggerSource);VerticalLayout {width: 100%;height: 100%;TitleBar {ascending: root.ascending;key: root.sort-key;sort-items(key, ascending) => {if (root.last-sort-key == key) {root.sort-songs(key, !ascending);} else {root.sort-songs(key, true)}}}ListView {for item in root.song-list: SongItem {info: item;double_clicked => {root.play-song(item, TriggerSource.ClickItem);}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用指南:分布式调度问题:定时任务

实用指南:分布式调度问题:定时任务2025-09-30 16:25 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

运输公司网站模板辽宁建设工程信息网变更

文章目录 一、if语句1.if语句2.if 和 elif区别3.三元表达式 二、循环语句1.range函数和循环结束关键字2.while循环3.for循环 三、逻辑运算符1.and语句2.or语句3.not语句4.逻辑运算法的优先级 四、python运算符优先级和结合性一览表 一、if语句 1.if语句 1.if单分支语句 格式…

【Nordic】nRF9151的SLM例程常用AT指令说明

nRF9151的SLM例程常用AT指令说明 本文章主要讲解如何使用nRF9151DK测试SLM例程并且列出常用的AT指令一、SLM介绍 SLM(Serial LTE Modem)是 Nordic Semiconductor 提供的一种基于串口的 LTE 调制解调器解决方案。它通…

sql server经典语句「转」

1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密: select encrypt(原始密码) select pwdencrypt(原始密码) select pwdcompare(原始密码,加密后密码…

Codeforces 2149G Buratsuta 3 题解 [ 蓝 ] [ 摩尔投票 ] [ 线段树 ] [ 随机化 ] [ 主席树 ] [ 根号分治 ]

Buratsuta 3:典中典中典中典中典了属于是。 Sol.1 摩尔投票 首先维护区间出现次数大于等于 $\left \lfloor \dfrac{len}{k} \right \rfloor $ 次的数是摩尔投票板子,每次把 \(k\) 个不同的数相消即可。然后因为摩尔投…

2025 年最新推荐软件开发机构榜:聚焦微服务架构与 724 小时服务的优质厂商精选指南人力资源管理系统/资产管理系统/数据中台管理系统/流程管理系统软件开发公司推荐

当前数字化转型浪潮下,政企机构对软件开发服务的需求愈发旺盛,涵盖 CRM 系统、物联网、运维管理等多类场景。但市场中厂商资质参差不齐,部分厂商技术架构落后,难以适配业务增长;部分重开发轻售后,故障响应迟缓;…

【半导体物理 | 学习笔记】第一章 半导体中的电子状态

一、半导体的晶格结构和结合性质 金刚石结构和共价键 典型代表:硅、锗晶体正四面体晶胞结构:两个面心立方晶胞套构共价键结合闪锌矿型结构和混合键 典型代表:砷化镓等III-V族晶胞结构:两个面心立方晶胞套构混合键共…

网站如何换域名广州网站建设培训学校

一、栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表&#xff0c;限定仅在表尾进行插入和删除操作的线性表 表尾这一端被称为栈顶&#xff0c;相反地另一端被称为栈底&#xff0c;向栈顶插入元素被称为进栈、入栈、压栈&#xff0c;从栈顶删…

计数(5):多项式相关

计数中我目前只见过两类与多项式相关的问题,一类是采用 gf 来刻画,一类是用拉插来优化掉 dp 的很大一个维度,还有一类就是神秘多项式问题,但是考虑 fft 已经被 cnoi 除名了所以我就不学了( 这部分写的非常浅显,我…

最新WTAPI开发微信机器人教程说明

最新WTAPI开发微信机器人教程说明 微信二次开发机器人接口开发:框架提供了开放接口,可以通过这些接口对微信进行操作。如接收用户消息、发送消息、操作朋友圈等。 自然语言处理:机器人需要能够理解自然语言,以便能…

线性DP - 学习笔记

动态规划:用空间代替重复计算。 有些递归在展开计算时,总是重复调用一个子问题的解,这种重复调用的递归变成动态规划很有收益。 如果每次展开都是不同的解,或者重复调用的现象很少,那么没有改动态规划的必要。 任…

2025 年最新制氮机厂家权威推荐排行榜:聚焦行业优质厂商综合实力,助力企业精准选购优质设备制氮机产生氮气/氮气纯化/设备改造/维修/保养/半导体用制氮机厂家推荐

在工业生产持续升级的当下,制氮机作为保障多行业生产安全、提升生产效率的关键设备,市场需求日益旺盛。但当前制氮机市场品牌繁杂,产品质量参差不齐,部分厂商技术落后导致设备能耗高、纯度波动大,还有些厂商售后体…

南京的网站建设高端网站的建设

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…

现在asp做网站ai效果图网站

0x01应用场景 获取JavaCard卡内剩余空间&#xff0c;一方面是在评估一张卡的时候需要用到&#xff0c;另一方面是在应用个人化或者运行时需要用到。 例如&#xff1a;应用提供商为了保证自己的应用在卡内运行期间能够不受空间影响&#xff0c;一般会在个人化(安装应用)的时候先…

2025 年氨分解设备厂家最新推荐榜单:含半导体 / 冶金 / 稀土行业专用设备及品牌综合实力排名

随着双碳目标深入推进,氨分解制氢技术在氢能产业中的应用愈发广泛,2025 年全球市场规模预计达 28.7 亿美元。然而,行业发展面临诸多痛点:催化剂性能与成本难以平衡,铁基催化剂转化率低、钌基催化剂成本高;设备能…

idea打包推送maven仓库及同时推送到不同的maven仓库,本地和云上的腾讯云

idea打包推送maven仓库及同时推送到不同的maven仓库,本地和云上的腾讯云idea打包推送maven仓库及同时推送到不同的maven仓库,本地和云上的腾讯云 idea客户端打包推送jar报错如下:Execution failed for task :scoote…

2025 阳台柜厂家最新推荐榜:企业资质 / 材质 / 服务全景解析,选对品牌少走弯路杭州阳台柜/浙江阳台柜厂家推荐

阳台已从传统功能区升级为 “家庭第二客厅”,但消费者选购阳台柜时仍面临多重困扰:部分产品在高湿高晒环境下易发霉变形,寿命不足 3 年;多数品牌缺乏全链条服务,设计与落地严重脱节;中间商溢价使性价比大打折扣,…

广州个人网站搭建天津招标信息网

前面两篇文章已经整理了CompletableFuture大部分的特性&#xff0c;本文会整理完CompletableFuture余下的特性&#xff0c;以及将它跟RxJava进行比较。 3.6 Either Either 表示的是两个CompletableFuture&#xff0c;当其中任意一个CompletableFuture计算完成的时候就会执行。 …

2025 年除湿机厂家最新权威推荐排行榜:实力厂家技术口碑评测及场景适配选购指南吊顶/泳池/车库/防爆/调温/新风除湿机厂家推荐

当前除湿机市场需求持续攀升,工业生产对湿度精度要求愈发严苛,民用场景也对环境舒适度有了更高追求,但行业乱象却让用户选购难度大增。一方面,大量产品缺乏核心技术,除湿效率低、能耗高,难以适配电子、制药、家用…

2025 年液氨蒸发器厂家联系方式,众众电热:多领域加热设备供应与定制化解决方案提供商

在政策支持与产业升级的双重驱动下,液氨蒸发器等工业加热设备市场持续扩容,2024 年上半年市场规模已突破 52.7 亿元,预计 2025 年末将增至 68.5 亿元。化工合成、制冷储能等领域的需求增长,以及智能化、低能耗的技…