Эх сурвалжийг харах

继续优化上传音乐文件界面

onecold 9 сар өмнө
parent
commit
3c078832af

+ 102 - 204
entry/src/main/ets/pages/UploadMusicPage.ets

@@ -39,13 +39,11 @@ export struct UploadMusicPage {
   @StorageProp('bottomSafeHeight') bottomSafeHeight: number = 0;
   @StorageProp('themeColor') themeColor: string = CommonConstants.DEFAULT_THEME_COLOR;
   @StorageProp('isDarkMode') isDarkMode: boolean = false;
-
   // 页面状态变量
   @State selectedFiles: string[] = [];
   @State selectedFileNames: string[] = [];
   @State selectedFileTypes: string[] = []; // 'file' 或 'folder'
   @State accounts: WebDavAccount[] = [];
-  
   // 文件浏览器状态
   @State isShowFileBrowser: boolean = false;
   @State fileBrowserPath: string = '';
@@ -56,7 +54,6 @@ export struct UploadMusicPage {
   @State uploadPath: string = '/';
   @State availablePaths: string[] = [];
   @State duplicateAction: string = 'skip';
-
   // SegmentButton 重复文件处理选项
   @State duplicateOptions: SegmentButtonOptions = SegmentButtonOptions.capsule({
     buttons: [{ text: '跳过' }, { text: '覆盖' }, { text: '重命名' }] as SegmentButtonItemTuple,
@@ -81,16 +78,13 @@ export struct UploadMusicPage {
   @State isLoadingFolders: boolean = false;
   @State pendingCount: number = 0;
   @State finishedCount: number = 0;
-
   // RemoteDriveManager实例
   private webdavManager: RemoteDriveManager = RemoteDriveManager.getInstance();
-  
   // 性能优化:使用LazyDataSource优化队列列表渲染
   // LazyForEach配合IDataSource可以实现按需加载,避免一次性渲染大量列表项
   // 对于包含数百个上传任务的队列,可以显著提升UI响应性能
   private uploadQueueDataSource: UploadTaskDataSource = new UploadTaskDataSource();
   private finishQueueDataSource: UploadTaskDataSource = new UploadTaskDataSource();
-  
   // 事件处理器引用
   private eventHandler: (event: string) => void = (event: string) => {
     this.handleUploadEvent(event);
@@ -439,18 +433,18 @@ export struct UploadMusicPage {
     for (let i = 0; i < tasks.length; i++) {
       this.uploadQueue.push(tasks[i].song);
     }
-    
+
     this.pendingCount = this.uploadQueue.length;
-    
+
     if (this.pendingCount === 0) {
       this.isUploading = false;
       this.currentTask = null;
       this.uploadProgress = 0;
       this.uploadSpeed = '0 KB/s';
     }
-    
+
     this.uploadQueueDataSource.updateTasks(this.uploadQueue);
-    
+
     Logger.info(TAG, `上传队列更新,当前数量: ${this.pendingCount}`);
   }
 
@@ -463,11 +457,11 @@ export struct UploadMusicPage {
     for (let i = 0; i < tasks.length; i++) {
       this.finishQueue.push(tasks[i].song);
     }
-    
+
     this.finishedCount = this.finishQueue.length;
-    
+
     this.finishQueueDataSource.updateTasks(this.finishQueue);
-    
+
     Logger.info(TAG, `完成队列更新,当前数量: ${this.finishedCount}`);
   }
 
@@ -477,17 +471,17 @@ export struct UploadMusicPage {
   private async openFilePicker(): Promise<void> {
     try {
       const documentSelectOptions = new picker.DocumentSelectOptions();
-      
+
       // 设置音频文件过滤器
       documentSelectOptions.fileSuffixFilters = Constants.AUDIO_EXTENSIONS;
-      
+
       // 支持多选
       documentSelectOptions.maxSelectNumber = 100;
 
       const documentPicker = new picker.DocumentViewPicker();
-      
+
       const documentSelectResult = await documentPicker.select(documentSelectOptions);
-      
+
       if (documentSelectResult && documentSelectResult.length > 0) {
         for (let i = 0; i < documentSelectResult.length; i++) {
           try {
@@ -498,10 +492,10 @@ export struct UploadMusicPage {
           }
         }
         Logger.info(TAG, `选择了 ${documentSelectResult.length} 个文件`);
-        
+
         // 保存选中的文件URI
         this.selectedFiles = documentSelectResult;
-        
+
         // 提取文件名用于显示
         this.selectedFileNames = [];
         this.selectedFileTypes = [];
@@ -519,7 +513,7 @@ export struct UploadMusicPage {
             this.selectedFileTypes.push('file');
           }
         }
-        
+
         Logger.info(TAG, `文件列表: ${JSON.stringify(this.selectedFileNames)}`);
       }
     } catch (error) {
@@ -570,13 +564,13 @@ export struct UploadMusicPage {
         targetPath = this.localBrowseRoot;
       }
       Logger.info(TAG, `加载目录: ${targetPath}`);
-      
+
       const files = fs.listFileSync(targetPath);
-      
+
       for (let i = 0; i < files.length; i++) {
         const fileName = files[i];
         const fullPath = `${targetPath}/${fileName}`;
-        
+
         try {
           const stat = fs.statSync(fullPath);
           const isDirectory = stat.isDirectory();
@@ -585,7 +579,7 @@ export struct UploadMusicPage {
           }
           const lowerFileName = fileName.toLowerCase();
           const isAudioFile = !isDirectory && Constants.AUDIO_EXTENSIONS.some(ext => lowerFileName.endsWith(ext));
-          
+
           // 只显示文件夹和音频文件
           if (isDirectory || isAudioFile) {
             this.browserFiles.push({
@@ -599,14 +593,14 @@ export struct UploadMusicPage {
           Logger.warn(TAG, `无法访问: ${fullPath}`);
         }
       }
-      
+
       // 排序:文件夹在前,文件在后
       this.browserFiles.sort((a, b) => {
         if (a.isDirectory && !b.isDirectory) return -1;
         if (!a.isDirectory && b.isDirectory) return 1;
         return a.name.localeCompare(b.name);
       });
-      
+
       Logger.info(TAG, `加载了 ${this.browserFiles.length} 个项目`);
     } catch (error) {
       const err = error as Error;
@@ -734,17 +728,17 @@ export struct UploadMusicPage {
    */
   private async scanFolderForAudioFiles(folderPath: string, relativePrefix: string = ''): Promise<LocalAudioFile[]> {
     const audioFiles: LocalAudioFile[] = [];
-    
+
     try {
       const files = fs.listFileSync(folderPath);
-      
+
       for (let i = 0; i < files.length; i++) {
         const fileName = files[i];
         const fullPath = `${folderPath}/${fileName}`;
-        
+
         try {
           const stat = fs.statSync(fullPath);
-          
+
           if (stat.isDirectory()) {
             const nextPrefix = relativePrefix ? `${relativePrefix}/${fileName}` : fileName;
             const subFiles = await this.scanFolderForAudioFiles(fullPath, nextPrefix);
@@ -769,7 +763,7 @@ export struct UploadMusicPage {
       const err = error as Error;
       Logger.error(TAG, `扫描文件夹失败: ${err.message}`);
     }
-    
+
     return audioFiles;
   }
 
@@ -813,9 +807,9 @@ export struct UploadMusicPage {
     const managerPath = this.webdavManager.currentPath;
     if (
       managerPath &&
-      managerPath.length > 0 &&
-      managerAccount &&
-      managerAccount.id === account.id
+        managerPath.length > 0 &&
+        managerAccount &&
+        managerAccount.id === account.id
     ) {
       this.uploadPath = managerPath;
     } else {
@@ -840,17 +834,17 @@ export struct UploadMusicPage {
     const defaultPath =
       managerAccount &&
         managerAccount.id === this.selectedAccount.id &&
-        this.webdavManager.currentPath &&
+      this.webdavManager.currentPath &&
         this.webdavManager.currentPath.length > 0
         ? this.webdavManager.currentPath
         : this.uploadPath;
-    
+
     this.currentBrowsePath = defaultPath;
     this.isShowPathBrowser = true;
-    
+
     Logger.info(TAG, `isShowPathBrowser 设置为: ${this.isShowPathBrowser}`);
     Logger.info(TAG, '开始加载文件夹列表...');
-    
+
     this.loadWebDavFolders(this.currentBrowsePath);
   }
 
@@ -877,7 +871,7 @@ export struct UploadMusicPage {
       Logger.info(TAG, `加载文件夹列表: ${path}`);
 
       await this.webdavManager.loadFilesInfoFromAccount(this.selectedAccount, path);
-      
+
       // 过滤出文件夹
       const allFiles = this.webdavManager.webDavFiles;
       this.browseFolders = [];
@@ -959,7 +953,7 @@ export struct UploadMusicPage {
 
     try {
       Logger.info(TAG, '开始上传任务');
-      
+
       // 显示处理提示
       promptAction.showToast({
         message: '正在处理文件...',
@@ -970,7 +964,7 @@ export struct UploadMusicPage {
       const songs: VideoItem[] = [];
       let totalFiles = 0;
       let totalFolders = 0;
-      
+
       for (let i = 0; i < this.selectedFiles.length; i++) {
         const selectedUri = this.selectedFiles[i];
         const displayName = this.selectedFileNames[i];
@@ -979,7 +973,7 @@ export struct UploadMusicPage {
         try {
           const fileUriObj = new fileUri.FileUri(selectedUri);
           const resolvedPath = fileUriObj.path || '';
-          
+
           if (!resolvedPath) {
             Logger.error(TAG, `无法获取本地路径,跳过: ${selectedUri}`);
             continue;
@@ -991,11 +985,11 @@ export struct UploadMusicPage {
             Logger.info(TAG, `扫描文件夹: ${folderName}`);
             const audioFiles = await this.scanFolderForAudioFiles(resolvedPath, folderName);
             Logger.info(TAG, `文件夹 ${folderName} 包含 ${audioFiles.length} 个音频文件`);
-            
+
             for (let j = 0; j < audioFiles.length; j++) {
               const audioFile = audioFiles[j];
               const audioFileName = this.getFileNameFromPath(audioFile.fullPath);
-              
+
               const videoItem = new VideoItem(
                 audioFileName,
                 `file://${audioFile.fullPath}`,
@@ -1050,7 +1044,7 @@ export struct UploadMusicPage {
       }
 
       Logger.info(TAG, `处理完成: ${totalFiles} 个文件, ${totalFolders} 个文件夹, 共 ${songs.length} 个音频文件`);
-      
+
       promptAction.showToast({
         message: `准备上传 ${songs.length} 个文件`,
         duration: 2000
@@ -1058,9 +1052,9 @@ export struct UploadMusicPage {
 
       // 添加到上传队列,传递用户选择的上传路径
       Logger.info(TAG, `使用上传路径: ${this.uploadPath}`);
-    const uniqueSongs = this.deduplicateSongs(songs);
-    this.webdavManager.addToUploadQueue(uniqueSongs, this.selectedAccount, this.uploadPath);
-    this.totalUploadCount = uniqueSongs.length;
+      const uniqueSongs = this.deduplicateSongs(songs);
+      this.webdavManager.addToUploadQueue(uniqueSongs, this.selectedAccount, this.uploadPath);
+      this.totalUploadCount = uniqueSongs.length;
       this.uploadedCount = 0;
 
       // 开始处理上传队列
@@ -1320,7 +1314,12 @@ export struct UploadMusicPage {
         .fontSize(12)
         .fontWeight(FontWeight.Medium)
         .fontColor('#FFFFFF')
-        .padding({ left: 6, right: 6, top: 2, bottom: 2 })
+        .padding({
+          left: 6,
+          right: 6,
+          top: 2,
+          bottom: 2
+        })
         .backgroundColor(this.themeColor)
         .borderRadius(8)
     }
@@ -1462,13 +1461,12 @@ export struct UploadMusicPage {
                 (this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F') :
                 (this.isDarkMode ? '#66FFFFFF' : '#99000000'))
               .fontWeight(this.uploadPath ? FontWeight.Medium : FontWeight.Regular)
-              .layoutWeight(1)
               .maxLines(1)
               .textOverflow({ overflow: TextOverflow.Ellipsis })
           }
-          .width('100%')
+
           Blank()
-          
+
           Button('浏览')
             .fontSize(13)
             .height(32)
@@ -1478,12 +1476,13 @@ export struct UploadMusicPage {
             .borderRadius(6)
             .enabled(this.selectedAccount !== null)
             .opacity(this.selectedAccount !== null ? 1.0 : 0.4)
-            .bindContentCover(this.isShowPathBrowser, this.PathBrowserDialogBuilder(), {
-              modalTransition: ModalTransition.DEFAULT,
-              onDisappear: () => {
-                Logger.info(TAG, 'PathBrowser onDisappear 回调');
-                this.isShowPathBrowser = false;
-              }
+            .bindSheet($$this.isShowPathBrowser, this.PathBrowserDialog(), {
+              height: '90%',
+              dragBar: true,
+              showClose: true,
+              preferType: SheetType.BOTTOM,
+              blurStyle: BlurStyle.Thin,
+              title: { title: '选择上传路径' }
             })
             .onClick(() => {
               this.openPathBrowser();
@@ -1497,8 +1496,8 @@ export struct UploadMusicPage {
       .borderRadius(10)
       .border({
         width: 1,
-        color: this.uploadPath ? 
-          (this.isDarkMode ? this.themeColor + '40' : this.themeColor + '30') : 
+        color: this.uploadPath ?
+          (this.isDarkMode ? this.themeColor + '40' : this.themeColor + '30') :
           (this.isDarkMode ? '#19FFFFFF' : '#E5E5EA')
       })
 
@@ -1543,36 +1542,13 @@ export struct UploadMusicPage {
   @Builder
   PathBrowserDialog() {
     Column() {
-      // 标题栏
-      Row({ space: 12 }) {
-        Text('选择上传路径')
-          .fontSize(18)
-          .fontWeight(FontWeight.Bold)
-          .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#E5000000')
-          .layoutWeight(1)
-
-        Button('关闭')
-          .fontSize(14)
-          .height(36)
-          .padding({ left: 16, right: 16 })
-          .backgroundColor(this.isDarkMode ? '#2E3033' : '#E5E5EA')
-          .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#E5000000')
-          .borderRadius(8)
-          .onClick(() => {
-            this.closePathBrowser();
-          })
-      }
-      .width('100%')
-      .padding(16)
-      .backgroundColor(this.isDarkMode ? '#23272E' : '#FFFFFF')
-
       // 当前路径显示
       Row({ space: 12 }) {
         Column({ space: 4 }) {
           Text('当前路径')
             .fontSize(12)
             .fontColor(this.isDarkMode ? '#66FFFFFF' : '#66000000')
-          
+
           Text(this.currentBrowsePath)
             .fontSize(14)
             .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#E5000000')
@@ -1581,7 +1557,7 @@ export struct UploadMusicPage {
         }
         .alignItems(HorizontalAlign.Start)
         .layoutWeight(1)
-        
+
         if (this.currentBrowsePath !== '/') {
           Button('返回上级')
             .fontSize(12)
@@ -1606,7 +1582,7 @@ export struct UploadMusicPage {
             .width(48)
             .height(48)
             .color(this.themeColor)
-          
+
           Text('加载中...')
             .fontSize(14)
             .fontColor(this.isDarkMode ? '#99FFFFFF' : '#99000000')
@@ -1620,7 +1596,7 @@ export struct UploadMusicPage {
           Text('📂')
             .fontSize(48)
             .margin({ bottom: 12 })
-          
+
           Text('当前目录没有子文件夹')
             .fontSize(14)
             .fontColor(this.isDarkMode ? '#66FFFFFF' : '#66000000')
@@ -1659,7 +1635,7 @@ export struct UploadMusicPage {
           }, (folder: FileInfo, index: number) => `folder-${index}-${folder.fileName}`)
         }
         .width('100%')
-        .height(300)
+        .layoutWeight(1)
         .padding(16)
         .backgroundColor(this.isDarkMode ? '#23272E' : '#FFFFFF')
         .divider({
@@ -1694,18 +1670,7 @@ export struct UploadMusicPage {
       }
       .width('100%')
       .padding(16)
-      .backgroundColor(this.isDarkMode ? '#23272E' : '#FFFFFF')
     }
-    .width('90%')
-    .constraintSize({ maxWidth: 600 })
-    .backgroundColor(this.isDarkMode ? '#191A1C' : '#FFFFFF')
-    .borderRadius(16)
-    .shadow({
-      radius: 24,
-      color: this.isDarkMode ? '#33000000' : '#19000000',
-      offsetX: 0,
-      offsetY: 8
-    })
   }
 
   /**
@@ -1729,11 +1694,11 @@ export struct UploadMusicPage {
         Column({ space: 12 }) {
           Text('📦')
             .fontSize(48)
-          
+
           Text('暂无账户')
             .fontSize(16)
             .fontColor(this.isDarkMode ? '#99FFFFFF' : '#99000000')
-          
+
           Text('请先添加账户')
             .fontSize(14)
             .fontColor(this.isDarkMode ? '#66FFFFFF' : '#66000000')
@@ -1755,7 +1720,7 @@ export struct UploadMusicPage {
                     .fontSize(14)
                     .fontWeight(FontWeight.Medium)
                     .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F')
-                  
+
                   Text(`${account.host}:${account.port}`)
                     .fontSize(11)
                     .fontColor(this.isDarkMode ? '#66FFFFFF' : '#8E8E93')
@@ -1850,7 +1815,7 @@ export struct UploadMusicPage {
           Row({ space: 6 }) {
             Text('📁')
               .fontSize(16)
-        Text('浏览选择')
+            Text('浏览选择')
               .fontSize(14)
               .fontWeight(FontWeight.Medium)
           }
@@ -1878,13 +1843,13 @@ export struct UploadMusicPage {
           Text('✓')
             .fontSize(18)
             .fontColor(this.themeColor)
-          
+
           Column({ space: 2 }) {
             Text(`已选择 ${this.selectedFiles.length} 项`)
               .fontSize(14)
               .fontWeight(FontWeight.Medium)
               .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F')
-            
+
             Row({ space: 8 }) {
               if (this.selectedFileTypes.filter(t => t === 'file').length > 0) {
                 Text(`${this.selectedFileTypes.filter(t => t === 'file').length} 个文件`)
@@ -1937,14 +1902,19 @@ export struct UploadMusicPage {
           .fontSize(16)
           .fontWeight(FontWeight.Medium)
           .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#E5000000')
-        
+
         Blank()
-        
+
         Text(`${this.selectedFiles.length}`)
           .fontSize(13)
           .fontWeight(FontWeight.Medium)
           .fontColor('#FFFFFF')
-          .padding({ left: 8, right: 8, top: 4, bottom: 4 })
+          .padding({
+            left: 8,
+            right: 8,
+            top: 4,
+            bottom: 4
+          })
           .backgroundColor(this.themeColor)
           .borderRadius(10)
       }
@@ -1966,7 +1936,7 @@ export struct UploadMusicPage {
                   .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F')
                   .maxLines(1)
                   .textOverflow({ overflow: TextOverflow.Ellipsis })
-                
+
                 if (this.selectedFileTypes[index] === 'folder') {
                   Text('文件夹')
                     .fontSize(12)
@@ -2068,17 +2038,18 @@ export struct UploadMusicPage {
     .width('100%')
     .height('100%')
     .backgroundColor(this.isDarkMode ? '#191A1C' : '#F1F3F5')
-    .bindContentCover(this.isShowFileBrowser, this.FileBrowserDialogBuilder(), {
-      modalTransition: ModalTransition.DEFAULT,
-      onDisappear: () => {
-        Logger.info(TAG, 'FileBrowser onDisappear 回调');
-        this.isShowFileBrowser = false;
-      }
+    .bindSheet($$this.isShowFileBrowser, this.FileBrowserDialog(), {
+      height: '95%',
+      dragBar: true,
+      showClose: true,
+      preferType: SheetType.BOTTOM,
+      blurStyle: BlurStyle.Thin,
+      title: { title: '浏览选择文件' }
     })
   }
 
   @Builder
-  topTitleBar(){
+  topTitleBar() {
     Column() {
       Row({ space: 15 }) {
 
@@ -2088,7 +2059,7 @@ export struct UploadMusicPage {
             .attributeModifier(new SymbolGlyphFancyModifier(25, '', ''))
         }
         .attributeModifier(new ButtonFancyModifier(40, 40))
-        .clickEffect({ level: ClickEffectLevel.MIDDLE,scale:0.6 })
+        .clickEffect({ level: ClickEffectLevel.MIDDLE, scale: 0.6 })
         .animation({ duration: 300, curve: Curve.Ease })
         .onClick(() => {
           this.getUIContext().getRouter().back();
@@ -2097,42 +2068,24 @@ export struct UploadMusicPage {
         .zIndex(0)
 
         Text('上传音乐')
-          .margin({left:3,right:10})
+          .margin({ left: 3, right: 10 })
           .fontColor($r('app.color.text_color'))
           .fontSize(19)
           .maxLines(1)
           .textOverflow({ overflow: TextOverflow.MARQUEE })//超长滚动
           .layoutWeight(1)
-          .clickEffect({ level: ClickEffectLevel.MIDDLE,scale:0.6 })
+          .clickEffect({ level: ClickEffectLevel.MIDDLE, scale: 0.6 })
 
 
       }
     }
-    .padding({ top: this.topSafeHeight+10, left: 10, right: 10,bottom:12 })
-    .width('100%')
-  }
-
-
-  @Builder
-  PathBrowserDialogBuilder() {
-    Stack() {
-      // 背景层
-      Column()
-        .width('100%')
-        .height('100%')
-        .backgroundColor('rgba(0, 0, 0, 0.5)')
-      
-      // 对话框内容(居中显示)
-      Column() {
-        this.PathBrowserDialog()
-      }
-      .width('100%')
-      .height('100%')
-      .justifyContent(FlexAlign.Center)
-      .alignItems(HorizontalAlign.Center)
-    }
+    .padding({
+      top: this.topSafeHeight + 10,
+      left: 10,
+      right: 10,
+      bottom: 12
+    })
     .width('100%')
-    .height('100%')
   }
 
   /**
@@ -2141,36 +2094,13 @@ export struct UploadMusicPage {
   @Builder
   FileBrowserDialog() {
     Column() {
-      // 标题栏
-      Row({ space: 12 }) {
-        Text('浏览选择文件')
-          .fontSize(18)
-          .fontWeight(FontWeight.Bold)
-          .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F')
-          .layoutWeight(1)
-
-        Button('关闭')
-          .fontSize(14)
-          .height(36)
-          .padding({ left: 16, right: 16 })
-          .backgroundColor(this.isDarkMode ? '#2E3238' : '#E5E5EA')
-          .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F')
-          .borderRadius(8)
-          .onClick(() => {
-            this.closeFileBrowser();
-          })
-      }
-      .width('100%')
-      .padding(16)
-      .backgroundColor(this.isDarkMode ? '#23272E' : '#FFFFFF')
-
       // 当前路径和返回按钮
       Row({ space: 12 }) {
         Column({ space: 4 }) {
           Text('当前目录')
             .fontSize(12)
             .fontColor(this.isDarkMode ? '#66FFFFFF' : '#8E8E93')
-          
+
           Text(this.fileBrowserPath)
             .fontSize(13)
             .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F')
@@ -2204,7 +2134,7 @@ export struct UploadMusicPage {
             .width(48)
             .height(48)
             .color(this.themeColor)
-          
+
           Text('加载中...')
             .fontSize(14)
             .fontColor(this.isDarkMode ? '#99FFFFFF' : '#8E8E93')
@@ -2217,7 +2147,7 @@ export struct UploadMusicPage {
         Column({ space: 12 }) {
           Text('📂')
             .fontSize(48)
-          
+
           Text('当前目录为空')
             .fontSize(14)
             .fontColor(this.isDarkMode ? '#66FFFFFF' : '#8E8E93')
@@ -2251,7 +2181,7 @@ export struct UploadMusicPage {
                     .fontColor(this.isDarkMode ? '#E5FFFFFF' : '#1F1F1F')
                     .maxLines(1)
                     .textOverflow({ overflow: TextOverflow.Ellipsis })
-                  
+
                   if (item.isDirectory) {
                     Text('文件夹')
                       .fontSize(12)
@@ -2292,7 +2222,7 @@ export struct UploadMusicPage {
           }, (item: LocalFileItem, index: number) => `${index}-${item.path}`)
         }
         .width('100%')
-        .height(400)
+        .layoutWeight(1)
         .padding(16)
         .backgroundColor(this.isDarkMode ? '#23272E' : '#FFFFFF')
       }
@@ -2330,38 +2260,6 @@ export struct UploadMusicPage {
       }
       .width('100%')
       .padding(16)
-      .backgroundColor(this.isDarkMode ? '#23272E' : '#FFFFFF')
     }
-    .width('90%')
-    .constraintSize({ maxWidth: 700, maxHeight: '80%' })
-    .backgroundColor(this.isDarkMode ? '#191A1C' : '#FFFFFF')
-    .borderRadius(16)
-    .shadow({
-      radius: 24,
-      color: this.isDarkMode ? '#33000000' : '#19000000',
-      offsetX: 0,
-      offsetY: 8
-    })
   }
-
-  @Builder
-  FileBrowserDialogBuilder() {
-    Stack() {
-      // 背景层(不添加 onClick,避免误关闭)
-      Column()
-        .width('100%')
-        .height('100%')
-        .backgroundColor('rgba(0, 0, 0, 0.5)')
-      
-      // 对话框内容(居中显示)
-      Column() {
-        this.FileBrowserDialog()
-      }
-      .width('100%')
-      .height('100%')
-      .justifyContent(FlexAlign.Center)
-    }
-    .width('100%')
-    .height('100%')
-  }
-}
+}

+ 19 - 16
entry/src/main/ets/pages/WebDavMainPage.ets

@@ -691,21 +691,26 @@ export struct WebDavMainPage {
     });
   }
 
-  private showQuickActionSheet(): void {
-    DialogHelper.showActionSheetDialog({
-      title: '请选择操作',
-      sheets: [
-        { value: '一键创建歌单', fontColor: $r('app.color.text_color') },
-        { value: '上传到WebDAV', fontColor: $r('app.color.text_color') }
-      ],
-      onAction: (index: number) => {
-        if (index === 0) {
+  @Builder
+  MoreMenuBuilder() {
+    Menu() {
+
+      MenuItem({
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.music_note_list')),
+        content: $r('app.string.onekey_add_playlist')
+      })
+        .onClick(async () => {
           this.createPlaylistFromCurrentWebDav();
-        } else if (index === 1) {
+        })
+      MenuItem({
+        symbolStartIcon: new SymbolGlyphModifier($r('sys.symbol.arrow_up_to_line')),
+        content: $r('app.string.upload_music_file')
+      })
+        .onClick(async () => {
           this.navigateToUploadPage();
-        }
-      }
-    });
+        })
+
+    }.attributeModifier(new MenuModifier())
   }
 
   @Builder
@@ -935,9 +940,7 @@ export struct WebDavMainPage {
           .attributeModifier(new ButtonFancyModifier(40, 40))
           .animation({ duration: 300, curve: Curve.Ease })
           .clickEffect({ level: ClickEffectLevel.MIDDLE,scale:0.6 })
-          .onClick(() => {
-            this.showQuickActionSheet();
-          })
+          .bindMenu(this.MoreMenuBuilder)
           .attributeModifier(new ShadowModifier())
           .zIndex(0)
 

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

@@ -698,6 +698,14 @@
     {
       "name": "navidrome",
       "value": "Navidrome"
+    },
+    {
+      "name": "onekey_add_playlist",
+      "value": "一键创建歌单"
+    },
+    {
+      "name": "upload_music_file",
+      "value": "上传音乐文件"
     }
 
   ]