浏览代码

Allow changing file name via info dialog

Neeraj Gupta 3 年之前
父节点
当前提交
f5d1a24ee7
共有 4 个文件被更改,包括 54 次插入3 次删除
  1. 7 0
      lib/models/file.dart
  2. 5 1
      lib/models/magic_metadata.dart
  3. 10 2
      lib/ui/file_info_dialog.dart
  4. 32 0
      lib/utils/magic_util.dart

+ 7 - 0
lib/models/file.dart

@@ -208,6 +208,13 @@ class File {
     }
     }
   }
   }
 
 
+  String getDisplayName() {
+    if (pubMagicMetadata != null && pubMagicMetadata.editedName != null) {
+      return pubMagicMetadata.editedName;
+    }
+    return title;
+  }
+
   // returns true if the file isn't available in the user's gallery
   // returns true if the file isn't available in the user's gallery
   bool isRemoteFile() {
   bool isRemoteFile() {
     return localID == null && uploadedFileID != null;
     return localID == null && uploadedFileID != null;

+ 5 - 1
lib/models/magic_metadata.dart

@@ -6,6 +6,7 @@ const kVisibilityArchive = 1;
 const kMagicKeyVisibility = 'visibility';
 const kMagicKeyVisibility = 'visibility';
 
 
 const kPubMagicKeyEditedTime = 'editedTime';
 const kPubMagicKeyEditedTime = 'editedTime';
+const kPubMagicKeyEditedName = 'editedName';
 
 
 class MagicMetadata {
 class MagicMetadata {
   // 0 -> visible
   // 0 -> visible
@@ -36,8 +37,9 @@ class MagicMetadata {
 
 
 class PubMagicMetadata {
 class PubMagicMetadata {
   int editedTime;
   int editedTime;
+  String editedName;
 
 
-  PubMagicMetadata({this.editedTime});
+  PubMagicMetadata({this.editedTime, this.editedName});
 
 
   factory PubMagicMetadata.fromEncodedJson(String encodedJson) =>
   factory PubMagicMetadata.fromEncodedJson(String encodedJson) =>
       PubMagicMetadata.fromJson(jsonDecode(encodedJson));
       PubMagicMetadata.fromJson(jsonDecode(encodedJson));
@@ -48,6 +50,7 @@ class PubMagicMetadata {
   Map<String, dynamic> toJson() {
   Map<String, dynamic> toJson() {
     final map = <String, dynamic>{};
     final map = <String, dynamic>{};
     map[kPubMagicKeyEditedTime] = editedTime;
     map[kPubMagicKeyEditedTime] = editedTime;
+    map[kPubMagicKeyEditedName] = editedName;
     return map;
     return map;
   }
   }
 
 
@@ -55,6 +58,7 @@ class PubMagicMetadata {
     if (map == null) return null;
     if (map == null) return null;
     return PubMagicMetadata(
     return PubMagicMetadata(
       editedTime: map[kPubMagicKeyEditedTime],
       editedTime: map[kPubMagicKeyEditedTime],
+      editedName: map[kPubMagicKeyEditedName],
     );
     );
   }
   }
 }
 }

+ 10 - 2
lib/ui/file_info_dialog.dart

@@ -8,6 +8,7 @@ import 'package:photos/ui/exif_info_dialog.dart';
 import 'package:photos/utils/date_time_util.dart';
 import 'package:photos/utils/date_time_util.dart';
 import 'package:photos/utils/exif_util.dart';
 import 'package:photos/utils/exif_util.dart';
 import 'package:photos/utils/file_util.dart';
 import 'package:photos/utils/file_util.dart';
+import 'package:photos/utils/magic_util.dart';
 import 'package:photos/utils/toast_util.dart';
 import 'package:photos/utils/toast_util.dart';
 
 
 class FileInfoWidget extends StatefulWidget {
 class FileInfoWidget extends StatefulWidget {
@@ -137,7 +138,8 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
     if (_isImage && _exif != null) {
     if (_isImage && _exif != null) {
       items.add(_getExifWidgets(_exif));
       items.add(_getExifWidgets(_exif));
     }
     }
-    if (widget.file.uploadedFileID != null && widget.file.updationTime != null) {
+    if (widget.file.uploadedFileID != null &&
+        widget.file.updationTime != null) {
       items.addAll(
       items.addAll(
         [
         [
           Row(
           Row(
@@ -170,7 +172,13 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
       ),
       ),
     );
     );
     return AlertDialog(
     return AlertDialog(
-      title: Text(widget.file.title),
+      title: InkWell(
+        child: Text(widget.file.getDisplayName()),
+        onTap: () async {
+          await editFilename(context, widget.file);
+          setState(() {});
+        },
+      ),
       content: SingleChildScrollView(
       content: SingleChildScrollView(
         child: ListBody(
         child: ListBody(
           children: items,
           children: items,

+ 32 - 0
lib/utils/magic_util.dart

@@ -1,10 +1,13 @@
+import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 import 'package:flutter/widgets.dart';
 import 'package:logging/logging.dart';
 import 'package:logging/logging.dart';
+import 'package:path/path.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/events/force_reload_home_gallery_event.dart';
 import 'package:photos/events/force_reload_home_gallery_event.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/magic_metadata.dart';
 import 'package:photos/models/magic_metadata.dart';
 import 'package:photos/services/file_magic_service.dart';
 import 'package:photos/services/file_magic_service.dart';
+import 'package:photos/ui/rename_dialog.dart';
 import 'package:photos/utils/dialog_util.dart';
 import 'package:photos/utils/dialog_util.dart';
 import 'package:photos/utils/toast_util.dart';
 import 'package:photos/utils/toast_util.dart';
 
 
@@ -41,6 +44,35 @@ Future<bool> editTime(
   }
   }
 }
 }
 
 
+Future<bool> editFilename(
+  BuildContext context,
+  File file,
+) async {
+  try {
+    final fileName = file.getDisplayName();
+    final nameWithoutExt = basenameWithoutExtension(fileName);
+    final extName = extension(fileName);
+    var result = await showDialog<String>(
+      context: context,
+      builder: (BuildContext context) {
+        return RenameDialog(nameWithoutExt, 'file', maxLength: 50);
+      },
+      barrierColor: Colors.black.withOpacity(0.85),
+    );
+
+    if (result == null || result.trim() == nameWithoutExt.trim()) {
+      return true;
+    }
+    result = result + extName;
+    await _updatePublicMetadata(
+        context, List.of([file]), kPubMagicKeyEditedName, result);
+    return true;
+  } catch (e, s) {
+    showToast('something went wrong');
+    return false;
+  }
+}
+
 Future<void> _updatePublicMetadata(
 Future<void> _updatePublicMetadata(
     BuildContext context, List<File> files, String key, dynamic value) async {
     BuildContext context, List<File> files, String key, dynamic value) async {
   if (files.isEmpty) {
   if (files.isEmpty) {