Răsfoiți Sursa

优化排序的UI效果 升降序使用的是二级菜单选择

onecold 6 luni în urmă
părinte
comite
1028785c22

+ 29 - 6
entry/src/main/ets/common/util/MediaTable.ets

@@ -728,7 +728,27 @@ export default  class MediaTable {
         const trackB = this.parseTrackNumber(b.track);
         return trackA - trackB;
       });
-      Logger.info(RdbUtils.RDB_TAG, `parseResultSetToVideoItems: 已按碟片-音轨排序,歌曲数量=${items.length}`);
+      Logger.info(RdbUtils.RDB_TAG, `parseResultSetToVideoItems: 已按碟片-音轨升序排序,歌曲数量=${items.length}`);
+    }
+
+    // sortType=11: 按碟片编号(disc)和音轨号(track)降序排序
+    if (sortType === 11) {
+      items.sort((a, b) => {
+        // 解析disc字段,处理可能为空或包含非数字字符的情况
+        const discA = this.parseDiscNumber(a.disc);
+        const discB = this.parseDiscNumber(b.disc);
+
+        // 先按碟片编号降序排序
+        if (discA !== discB) {
+          return discB - discA;
+        }
+
+        // 碟片编号相同,按音轨号降序排序
+        const trackA = this.parseTrackNumber(a.track);
+        const trackB = this.parseTrackNumber(b.track);
+        return trackB - trackA;
+      });
+      Logger.info(RdbUtils.RDB_TAG, `parseResultSetToVideoItems: 已按碟片-音轨降序排序,歌曲数量=${items.length}`);
     }
 
     return items;
@@ -1270,17 +1290,20 @@ export default  class MediaTable {
       nameColumn = DB_COLUMNS.FILE_NAME;
     }
 
-    // sortType=10 需要特殊处理:按碟片编号升序+音轨号升
+    // sortType=10 或 11 需要特殊处理:按碟片编号+音轨号排
     // 由于RdbPredicates不支持多字段排序,我们需要标记这个谓词需要使用原生SQL
     if (type === 10) {
-      // 将排序类型存储在predicates的某个属性中,以便后续使用原生SQL查询
-      // 注意:这需要在查询时检查并使用querySql而不是query
-      Logger.info(RdbUtils.RDB_TAG, 'applySortConditions: 碟片-音轨排序,需要使用原生SQL');
-      // 由于无法直接修改predicates,我们使用单字段排序作为fallback
+      Logger.info(RdbUtils.RDB_TAG, 'applySortConditions: 碟片-音轨升序排序,需要使用内存排序');
       predicates.orderByAsc('disc'); // 先按碟片编号排序
       // 音轨号排序需要在查询后进行内存排序
       return;
     }
+    if (type === 11) {
+      Logger.info(RdbUtils.RDB_TAG, 'applySortConditions: 碟片-音轨降序排序,需要使用内存排序');
+      predicates.orderByDesc('disc'); // 先按碟片编号降序排序
+      // 音轨号排序需要在查询后进行内存排序
+      return;
+    }
 
     switch (type) {
       case 0:

+ 64 - 71
entry/src/main/ets/view/LocalMusic.ets

@@ -300,6 +300,20 @@ const ITEM_HEIGHT_SMALL: number = 48; // 列表项小高度
 const ITEM_HEIGHT: number = 65; // 列表项中高度
 const ITEM_HEIGHT_BIG: number = 78; // 列表项大高度
 
+/**
+ * 排序模式枚举
+ * 定义各种排序方式的升序基准值
+ */
+export enum SortMode {
+  ByArtist = 0,      // 按艺术家升序
+  ByAlbum = 2,       // 按专辑升序
+  ByName = 4,        // 按名称升序
+  ByTime = 6,        // 按时间升序
+  ByAddTime = 7,     // 按添加时间(只有降序)
+  ByCount = 8,       // 按数量升序
+  ByDiscTrack = 10   // 按碟片编号-音轨号升序
+}
+
 //功能强大的音乐播放器
 @Preview
 @Component
@@ -2215,69 +2229,35 @@ export struct LocalMusic {
   SortMenuBuilder() {
     Menu() {
       MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.text_and_arrow_up')),
-        content: "按艺术家升序"
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.person')),
+        content: "按艺术家",
+        builder: this.SubSortBuilder(SortMode.ByArtist),
+        symbolEndIcon: this.isSortTypeInRange(SortMode.ByArtist) ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
-        .onClick(async () => {
-          await this.doSortType(0)
-        })
-      MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.text_and_arrow_down')),
-        content: "按艺术家降序"
-      })
-        .onClick(async () => {
-          await this.doSortType(1)
-        })
       MenuItem({
         symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.textformat_size_square')),
-        content: "按专辑升序"
+        content: "按专辑",
+        builder: this.SubSortBuilder(SortMode.ByAlbum),
+        symbolEndIcon: this.isSortTypeInRange(SortMode.ByAlbum) ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
-        .onClick(async () => {
-          await this.doSortType(2)
-        })
       MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.character_arrow_clockwise')),
-        content: "按专辑降序"
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.textformat')),
+        content: "按名称",
+        builder: this.SubSortBuilder(SortMode.ByName),
+        symbolEndIcon: this.isSortTypeInRange(SortMode.ByName) ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
-        .onClick(async () => {
-          await this.doSortType(3)
-        })
-      MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.text_and_arrow_up')),
-        content: $r('app.string.sort_by_name')
-      })
-        .onClick(async () => {
-          await this.doSortType(4)
-        })
-      MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.text_and_arrow_down')),
-        content: '按名称降序'
-      })
-        .onClick(async () => {
-          await this.doSortType(5)
-        })
       MenuItem({
         symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.clock')),
-        content: $r('app.string.sort_by_time')
-      })
-        .onClick(async () => {
-          await this.doSortType(6)
-        })
-
-      MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.timer')),
-        content: '按添加时间降序'
+        content: $r('app.string.sort_by_time'),
+        builder: this.SubSortBuilder(SortMode.ByTime),
+        symbolEndIcon: this.isSortTypeInRange(SortMode.ByTime) ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
-        .onClick(async () => {
-          await this.doSortType(7)
-        })
       MenuItem({
         symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.music')),
-        content: '按碟片编号-音轨号升序'
+        content: '按碟片音轨号',
+        builder: this.SubSortBuilder(SortMode.ByDiscTrack),
+        symbolEndIcon: this.isSortTypeInRange(SortMode.ByDiscTrack) ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
-        .onClick(async () => {
-          await this.doSortType(10)
-        })
         .visibility((this.modeType==0||(this.modeType==3&&this.isCanBack))?Visibility.Visible:Visibility.None)
 
     }.attributeModifier(new MenuModifier())
@@ -2286,38 +2266,41 @@ export struct LocalMusic {
   @Builder
   SortMenuForArtistAblumBuilder() {
     Menu() {
-
       MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.text_and_arrow_up')),
-        content: $r('app.string.sort_by_name')
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.textformat')),
+        content: "按名称",
+        builder: this.SubSortBuilder(SortMode.ByName),
+        symbolEndIcon: this.isSortTypeInRange(SortMode.ByName) ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
-        .onClick(async () => {
-          await this.doSortType(4)
-        })
       MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.text_and_arrow_down')),
-        content: '按名称降序'
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.clock')),
+        content: '按数量',
+        builder: this.SubSortBuilder(SortMode.ByCount),
+        symbolEndIcon: this.isSortTypeInRange(SortMode.ByCount) ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
-        .onClick(async () => {
-          await this.doSortType(5)
-        })
+
+    }.attributeModifier(new MenuModifier())
+  }
+
+  @Builder SubSortBuilder(sortType: number){
+    Menu(){
       MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.clock')),
-        content: '按数量升序'
+        content: "升序",
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.arrow_up')),
+        symbolEndIcon: this.sortType === sortType ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
         .onClick(async () => {
-          await this.doSortType(8)
+          await this.doSortType(sortType)
         })
-
       MenuItem({
-        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.timer')),
-        content: '按数量降序'
+        content: "降序",
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.arrow_down')),
+        symbolEndIcon: this.sortType === sortType + 1 ? new SymbolGlyphModifier($r('sys.symbol.checkmark')) : undefined
       })
         .onClick(async () => {
-          await this.doSortType(9)
+          await this.doSortType(sortType + 1) // 降序的sortType = 升序的sortType + 1
         })
-
-    }.attributeModifier(new MenuModifier())
+    }
   }
 
 
@@ -2434,6 +2417,16 @@ export struct LocalMusic {
     return PreferencesUtil.getNumberSync(storageKey, defaultSortType);
   }
 
+  /**
+   * 检查当前sortType是否在指定排序类型的范围内
+   * 用于判断是否显示打勾图标
+   * @param baseSortType 基础排序类型(升序的值)
+   * @returns 如果当前sortType是该排序类型的升序或降序,返回true
+   */
+  private isSortTypeInRange(baseSortType: number): boolean {
+    return this.sortType === baseSortType || this.sortType === baseSortType + 1;
+  }
+
   showSheelDialog() {
     // if(PreferencesUtil.getBooleanSync('isFirstMusic',true)) {
     //   this.showTips()

+ 1 - 1
entry/src/main/resources/base/element/string.json

@@ -673,7 +673,7 @@
     },
     {
       "name": "sort_by_time",
-      "value": "按添加时间升序"
+      "value": "按时间"
     },
     {
       "name": "import_from_files",