ente/lib/ui/tools/debug/path_storage_viewer.dart

125 lines
3.7 KiB
Dart
Raw Normal View History

import 'dart:io';
2022-12-22 04:48:06 +00:00
import 'package:flutter/foundation.dart';
2022-12-13 09:34:14 +00:00
import 'package:flutter/material.dart';
2022-12-22 04:48:06 +00:00
import 'package:flutter/services.dart';
import 'package:logging/logging.dart';
2022-12-13 09:34:14 +00:00
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/components/captioned_text_widget.dart';
2023-01-31 12:21:57 +00:00
import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart';
2022-12-13 09:34:14 +00:00
import 'package:photos/utils/data_util.dart';
2022-12-22 08:15:52 +00:00
import 'package:photos/utils/directory_content.dart';
2022-12-13 09:34:14 +00:00
2022-12-22 04:48:06 +00:00
class PathStorageItem {
2022-12-13 09:34:14 +00:00
final String path;
2022-12-22 04:48:06 +00:00
final String title;
final bool allowCacheClear;
PathStorageItem.name(
this.path,
this.title, {
this.allowCacheClear = false,
});
}
class PathStorageViewer extends StatefulWidget {
2022-12-22 08:15:52 +00:00
final PathStorageItem item;
final bool removeTopRadius;
final bool removeBottomRadius;
final bool enableDoubleTapClear;
2022-12-13 09:34:14 +00:00
const PathStorageViewer(
2022-12-22 08:15:52 +00:00
this.item, {
this.removeTopRadius = false,
this.removeBottomRadius = false,
this.enableDoubleTapClear = false,
Key? key,
2022-12-13 09:34:14 +00:00
}) : super(key: key);
@override
State<PathStorageViewer> createState() => _PathStorageViewerState();
}
class _PathStorageViewerState extends State<PathStorageViewer> {
final Logger _logger = Logger((_PathStorageViewerState).toString());
2022-12-13 09:34:14 +00:00
@override
void initState() {
2022-12-22 08:15:52 +00:00
super.initState();
}
void _safeRefresh() async {
if (mounted) {
setState(() => {});
}
2022-12-13 09:34:14 +00:00
}
@override
Widget build(BuildContext context) {
return FutureBuilder<DirectoryStat>(
future: getDirectorySize(Directory(widget.item.path)),
builder: (context, snapshot) {
if (snapshot.hasData) {
return _buildMenuItemWidget(snapshot.data, null);
} else if (snapshot.hasError) {
_logger.severe(
"Failed to get state for ${widget.item.title}",
snapshot.error,
);
return _buildMenuItemWidget(null, snapshot.error);
} else {
return _buildMenuItemWidget(null, null);
}
},
);
2022-12-13 09:34:14 +00:00
}
Widget _buildMenuItemWidget(DirectoryStat? stat, Object? err) {
2022-12-22 04:48:06 +00:00
return MenuItemWidget(
key: UniqueKey(),
2022-12-22 04:48:06 +00:00
alignCaptionedTextToLeft: true,
captionedTextWidget: CaptionedTextWidget(
2022-12-22 08:15:52 +00:00
title: widget.item.title,
subTitle: stat != null ? '${stat.fileCount}' : null,
2022-12-22 04:48:06 +00:00
subTitleColor: getEnteColorScheme(context).textFaint,
),
trailingWidget: stat != null
? Padding(
padding: const EdgeInsets.only(left: 12.0),
child: Text(
formatBytes(stat.size),
style: getEnteTextTheme(context)
.small
.copyWith(color: getEnteColorScheme(context).textFaint),
),
)
: SizedBox.fromSize(
size: const Size.square(14),
child: CircularProgressIndicator(
strokeWidth: 2,
color: getEnteColorScheme(context).strokeMuted,
),
),
trailingIcon: err != null ? Icons.error_outline_outlined : null,
trailingIconIsMuted: err != null,
singleBorderRadius: 8,
2022-12-22 04:48:06 +00:00
menuItemColor: getEnteColorScheme(context).fillFaint,
2022-12-22 08:15:52 +00:00
isBottomBorderRadiusRemoved: widget.removeBottomRadius,
isTopBorderRadiusRemoved: widget.removeTopRadius,
showOnlyLoadingState: true,
2022-12-22 04:48:06 +00:00
onTap: () async {
if (kDebugMode) {
2022-12-22 08:15:52 +00:00
await Clipboard.setData(ClipboardData(text: widget.item.path));
debugPrint(widget.item.path);
}
},
onDoubleTap: () async {
if (widget.item.allowCacheClear && widget.enableDoubleTapClear) {
await deleteDirectoryContents(widget.item.path);
_safeRefresh();
2022-12-22 04:48:06 +00:00
}
},
2022-12-13 09:34:14 +00:00
);
}
}