diff --git a/lib/utils/dependencies.dart b/lib/model/dependencies.dart similarity index 100% rename from lib/utils/dependencies.dart rename to lib/model/dependencies.dart diff --git a/lib/model/entry/extensions/info.dart b/lib/model/entry/extensions/info.dart index 46649a95f..743b8cc1e 100644 --- a/lib/model/entry/extensions/info.dart +++ b/lib/model/entry/extensions/info.dart @@ -9,7 +9,7 @@ import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/metadata/svg_metadata_service.dart'; import 'package:aves/theme/colors.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/viewer/info/metadata/metadata_dir.dart'; import 'package:aves_model/aves_model.dart'; import 'package:collection/collection.dart'; @@ -115,7 +115,7 @@ extension ExtraAvesEntryInfo on AvesEntry { final dirName = [ 'Stream ${index.toString().padLeft(indexDigits, '0')}', typeText, - ].join(Constants.separator); + ].join(AText.separator); final formattedStreamTags = VideoMetadataFormatter.formatInfo(stream); if (formattedStreamTags.isNotEmpty) { final color = colors.fromString(typeText); diff --git a/lib/model/entry/extensions/props.dart b/lib/model/entry/extensions/props.dart index ed1c3ef1c..0069666b4 100644 --- a/lib/model/entry/extensions/props.dart +++ b/lib/model/entry/extensions/props.dart @@ -3,6 +3,8 @@ import 'dart:ui'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/mime_types.dart'; +import 'package:aves/ref/unicode.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/utils/android_file_utils.dart'; extension ExtraAvesEntryProps on AvesEntry { @@ -81,15 +83,12 @@ extension ExtraAvesEntryProps on AvesEntry { bool get canRemoveMetadata => MimeTypes.canRemoveMetadata(mimeType); - static const ratioSeparator = '\u2236'; - static const resolutionSeparator = ' \u00D7 '; - bool get isSized => width > 0 && height > 0; String get resolutionText { final ws = width; final hs = height; - return isRotated ? '$hs$resolutionSeparator$ws' : '$ws$resolutionSeparator$hs'; + return isRotated ? '$hs${AText.resolutionSeparator}$ws' : '$ws${AText.resolutionSeparator}$hs'; } String get aspectRatioText { @@ -97,9 +96,9 @@ extension ExtraAvesEntryProps on AvesEntry { final gcd = width.gcd(height); final w = width ~/ gcd; final h = height ~/ gcd; - return isRotated ? '$h$ratioSeparator$w' : '$w$ratioSeparator$h'; + return isRotated ? '$h${Unicode.ratio}$w' : '$w${Unicode.ratio}$h'; } else { - return '?$ratioSeparator?'; + return '?${Unicode.ratio}?'; } } diff --git a/lib/model/filters/coordinate.dart b/lib/model/filters/coordinate.dart index 2c822fecf..389364c17 100644 --- a/lib/model/filters/coordinate.dart +++ b/lib/model/filters/coordinate.dart @@ -5,7 +5,6 @@ import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_map/aves_map.dart'; import 'package:flutter/material.dart'; @@ -61,7 +60,7 @@ class CoordinateFilter extends CollectionFilter { bool get exclusiveProp => false; @override - String get universalLabel => _formatBounds(lookupAppLocalizations(AvesApp.supportedLocales.first), CoordinateFormat.decimal); + String get universalLabel => _formatBounds(lookupAppLocalizations(AppLocalizations.supportedLocales.first), CoordinateFormat.decimal); @override String getLabel(BuildContext context) => _formatBounds(context.l10n, context.read().coordinateFormat); diff --git a/lib/model/filters/rating.dart b/lib/model/filters/rating.dart index 0cf9cfbc3..24f0c5b45 100644 --- a/lib/model/filters/rating.dart +++ b/lib/model/filters/rating.dart @@ -1,4 +1,5 @@ import 'package:aves/model/filters/filters.dart'; +import 'package:aves/ref/unicode.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:flutter/widgets.dart'; @@ -67,7 +68,7 @@ class RatingFilter extends CollectionFilter { case 0: return context.l10n.filterNoRatingLabel; default: - return '\u2B50' * rating; + return Unicode.whiteMediumStar * rating; } } } diff --git a/lib/ref/brand_colors.dart b/lib/ref/brand_colors.dart index b175781b2..08dc7fe10 100644 --- a/lib/ref/brand_colors.dart +++ b/lib/ref/brand_colors.dart @@ -1,11 +1,11 @@ -import 'package:flutter/painting.dart'; +import 'dart:ui'; class BrandColors { - static const Color adobeAfterEffects = Color(0xFF9A9AFF); - static const Color adobeIllustrator = Color(0xFFFF9B00); - static const Color adobePhotoshop = Color(0xFF2DAAFF); - static const Color android = Color(0xFF3DDC84); - static const Color flutter = Color(0xFF47D1FD); + static const adobeAfterEffects = Color(0xFF9A9AFF); + static const adobeIllustrator = Color(0xFFFF9B00); + static const adobePhotoshop = Color(0xFF2DAAFF); + static const android = Color(0xFF3DDC84); + static const flutter = Color(0xFF47D1FD); static Color? get(String text) { switch (text.toLowerCase()) { diff --git a/lib/ref/poi.dart b/lib/ref/poi.dart new file mode 100644 index 000000000..1aebe9aae --- /dev/null +++ b/lib/ref/poi.dart @@ -0,0 +1,15 @@ +import 'package:latlong2/latlong.dart'; + +class PointsOfInterest { + static final pointNemo = LatLng(-48.876667, -123.393333); + + static final wonders = [ + LatLng(29.979167, 31.134167), + LatLng(36.451000, 28.223615), + LatLng(32.5355, 44.4275), + LatLng(31.213889, 29.885556), + LatLng(37.0379, 27.4241), + LatLng(37.637861, 21.63), + LatLng(37.949722, 27.363889), + ]; +} \ No newline at end of file diff --git a/lib/ref/unicode.dart b/lib/ref/unicode.dart new file mode 100644 index 000000000..9445cdfd1 --- /dev/null +++ b/lib/ref/unicode.dart @@ -0,0 +1,9 @@ +// cf Flutter's `foundation/unicode.dart` for bidi related characters +class Unicode { + static const noBreakSpace = '\u00A0'; + static const multiplicationSign = '\u00D7'; // × + static const emDash = '\u2014'; // — + static const bullet = '\u2022'; // • + static const ratio = '\u2236'; // ∶ + static const whiteMediumStar = '\u2B50'; // ⭐ +} diff --git a/lib/services/media/embedded_data_service.dart b/lib/services/media/embedded_data_service.dart index d4a668176..137144dca 100644 --- a/lib/services/media/embedded_data_service.dart +++ b/lib/services/media/embedded_data_service.dart @@ -1,6 +1,6 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/services/common/services.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/text.dart'; import 'package:flutter/services.dart'; abstract class EmbeddedDataService { @@ -42,7 +42,7 @@ class PlatformEmbeddedDataService implements EmbeddedDataService { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, - 'displayName': ['${entry.bestTitle}', dataUri].join(Constants.separator), + 'displayName': ['${entry.bestTitle}', dataUri].join(AText.separator), 'dataUri': dataUri, }); if (result != null) return result as Map; @@ -59,7 +59,7 @@ class PlatformEmbeddedDataService implements EmbeddedDataService { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, - 'displayName': ['${entry.bestTitle}', 'Image'].join(Constants.separator), + 'displayName': ['${entry.bestTitle}', 'Image'].join(AText.separator), }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { @@ -75,7 +75,7 @@ class PlatformEmbeddedDataService implements EmbeddedDataService { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, - 'displayName': ['${entry.bestTitle}', 'Video'].join(Constants.separator), + 'displayName': ['${entry.bestTitle}', 'Video'].join(AText.separator), }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { @@ -89,7 +89,7 @@ class PlatformEmbeddedDataService implements EmbeddedDataService { try { final result = await _platform.invokeMethod('extractVideoEmbeddedPicture', { 'uri': entry.uri, - 'displayName': ['${entry.bestTitle}', 'Cover'].join(Constants.separator), + 'displayName': ['${entry.bestTitle}', 'Cover'].join(AText.separator), }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { @@ -105,7 +105,7 @@ class PlatformEmbeddedDataService implements EmbeddedDataService { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, - 'displayName': ['${entry.bestTitle}', '$props'].join(Constants.separator), + 'displayName': ['${entry.bestTitle}', '$props'].join(AText.separator), 'propPath': props, 'propMimeType': propMimeType, }); diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 357067b44..e7c15c510 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -33,6 +33,10 @@ class AvesColorsProvider extends StatelessWidget { } abstract class AvesColorsData { + static const defaultAccent = Colors.indigoAccent; + static const _neutralOnDark = Colors.white; + static const _neutralOnLight = Color(0xAA000000); + Color get neutral; Color fromHue(double hue); @@ -71,9 +75,6 @@ abstract class AvesColorsData { void clearAppColor(String album) => _appColors.remove(album); - static const Color _neutralOnDark = Colors.white; - static const Color _neutralOnLight = Color(0xAA000000); - // mime Color get image => fromHue(243); diff --git a/lib/theme/format.dart b/lib/theme/format.dart index 854299a08..89ef8ed03 100644 --- a/lib/theme/format.dart +++ b/lib/theme/format.dart @@ -1,4 +1,4 @@ -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/text.dart'; import 'package:intl/intl.dart'; String formatDay(DateTime date, String locale) => DateFormat.yMMMd(locale).format(date); @@ -8,7 +8,7 @@ String formatTime(DateTime date, String locale, bool use24hour) => (use24hour ? String formatDateTime(DateTime date, String locale, bool use24hour) => [ formatDay(date, locale), formatTime(date, locale, use24hour), - ].join(Constants.separator); + ].join(AText.separator); String formatFriendlyDuration(Duration d) { final seconds = (d.inSeconds.remainder(Duration.secondsPerMinute)).toString().padLeft(2, '0'); diff --git a/lib/theme/styles.dart b/lib/theme/styles.dart new file mode 100644 index 000000000..95ec94dbc --- /dev/null +++ b/lib/theme/styles.dart @@ -0,0 +1,22 @@ +import 'dart:ui'; + +import 'package:flutter/widgets.dart'; + +class AStyles { + // as of Flutter v2.8.0, overflowing `Text` miscalculates height and some text (e.g. 'Å') is clipped + // so we give it a `strutStyle` with a slightly larger height + static const overflowStrut = StrutStyle(height: 1.3); + + static const knownTitleText = TextStyle( + fontSize: 20, + fontWeight: FontWeight.w300, + fontFeatures: [FontFeature.enable('smcp')], + ); + + static TextStyle unknownTitleText = knownTitleText; + + static void updateStylesForLocale(Locale locale) { + final smcp = locale.languageCode != 'el'; + unknownTitleText = smcp ? knownTitleText : knownTitleText.copyWith(fontFeatures: []); + } +} diff --git a/lib/theme/text.dart b/lib/theme/text.dart new file mode 100644 index 000000000..6e79fa53a --- /dev/null +++ b/lib/theme/text.dart @@ -0,0 +1,7 @@ +import 'package:aves/ref/unicode.dart'; + +class AText { + static const separator = ' ${Unicode.bullet} '; + static const resolutionSeparator = ' ${Unicode.multiplicationSign} '; + static const valueNotAvailable = Unicode.emDash; +} \ No newline at end of file diff --git a/lib/theme/themes.dart b/lib/theme/themes.dart index c23832fdf..16da5d60a 100644 --- a/lib/theme/themes.dart +++ b/lib/theme/themes.dart @@ -7,8 +7,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class Themes { - static const defaultAccent = Colors.indigoAccent; - static const _tooltipTheme = TooltipThemeData( verticalOffset: 32, ); diff --git a/lib/utils/colors.dart b/lib/utils/colors.dart new file mode 100644 index 000000000..d5e9768b4 --- /dev/null +++ b/lib/utils/colors.dart @@ -0,0 +1,8 @@ +import 'dart:ui'; + +class ColorUtils { + // `Color(0x00FFFFFF)` is different from `Color(0x00000000)` (or `Colors.transparent`) + // when used in gradients or lerping to it + static const transparentWhite = Color(0x00FFFFFF); + static const transparentBlack = Color(0x00000000); +} diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart index c47a3f4db..d49974b70 100644 --- a/lib/utils/constants.dart +++ b/lib/utils/constants.dart @@ -1,7 +1,4 @@ -import 'dart:ui'; - import 'package:flutter/material.dart'; -import 'package:latlong2/latlong.dart'; import 'package:permission_handler/permission_handler.dart'; class Constants { @@ -12,32 +9,8 @@ class Constants { Permission.videos, ]; - static const separator = ' • '; - - // `Color(0x00FFFFFF)` is different from `Color(0x00000000)` (or `Colors.transparent`) - // when used in gradients or lerping to it - static const transparentWhite = Color(0x00FFFFFF); - static const transparentBlack = Colors.transparent; - - // as of Flutter v2.8.0, overflowing `Text` miscalculates height and some text (e.g. 'Å') is clipped - // so we give it a `strutStyle` with a slightly larger height - static const overflowStrutStyle = StrutStyle(height: 1.3); - static const double colorPickerRadius = 16; - static const knownTitleTextStyle = TextStyle( - fontSize: 20, - fontWeight: FontWeight.w300, - fontFeatures: [FontFeature.enable('smcp')], - ); - - static TextStyle unknownTitleTextStyle = knownTitleTextStyle; - - static void updateStylesForLocale(Locale locale) { - final smcp = locale.languageCode != 'el'; - unknownTitleTextStyle = smcp ? knownTitleTextStyle : knownTitleTextStyle.copyWith(fontFeatures: []); - } - static const embossShadows = [ Shadow( color: Colors.black, @@ -50,30 +23,5 @@ class Constants { Color(0xffeaecc6), ]; - // Bidi fun, cf https://www.unicode.org/reports/tr9/ - // First Strong Isolate - static const fsi = '\u2068'; - - // Pop Directional Isolate - static const pdi = '\u2069'; - - static const zwsp = '\u200B'; - - static const overlayUnknown = '—'; // em dash - - static final pointNemo = LatLng(-48.876667, -123.393333); - - static final wonders = [ - LatLng(29.979167, 31.134167), - LatLng(36.451000, 28.223615), - LatLng(32.5355, 44.4275), - LatLng(31.213889, 29.885556), - LatLng(37.0379, 27.4241), - LatLng(37.637861, 21.63), - LatLng(37.949722, 27.363889), - ]; - static const int infoGroupMaxValueLength = 140; - - static const String avesGithub = 'https://github.com/deckerst/aves'; } diff --git a/lib/widgets/about/app_ref.dart b/lib/widgets/about/app_ref.dart index 111b97c6b..304848fc6 100644 --- a/lib/widgets/about/app_ref.dart +++ b/lib/widgets/about/app_ref.dart @@ -1,7 +1,6 @@ import 'dart:ui'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/about/policy_page.dart'; import 'package:aves/widgets/common/basic/link_chip.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -10,6 +9,8 @@ import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; class AppReference extends StatefulWidget { + static const avesGithub = 'https://github.com/deckerst/aves'; + const AppReference({super.key}); @override @@ -79,7 +80,7 @@ class _AppReferenceState extends State { size: 24, ), text: 'GitHub', - urlString: Constants.avesGithub, + urlString: AppReference.avesGithub, ), LinkChip( leading: const Icon( @@ -87,7 +88,7 @@ class _AppReferenceState extends State { size: 22, ), text: l10n.aboutLinkLicense, - urlString: '${Constants.avesGithub}/blob/main/LICENSE', + urlString: '${AppReference.avesGithub}/blob/main/LICENSE', ), LinkChip( leading: const Icon( diff --git a/lib/widgets/about/bug_report.dart b/lib/widgets/about/bug_report.dart index 3cd1f7d33..47b7ac0a6 100644 --- a/lib/widgets/about/bug_report.dart +++ b/lib/widgets/about/bug_report.dart @@ -10,7 +10,8 @@ import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/widgets/about/app_ref.dart'; import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -34,7 +35,7 @@ class _BugReportState extends State with FeedbackMixin { late Future _infoLoader; bool _showInstructions = false; - static const bugReportUrl = '${Constants.avesGithub}/issues/new?labels=type%3Abug&template=bug_report.md'; + static const bugReportUrl = '${AppReference.avesGithub}/issues/new?labels=type%3Abug&template=bug_report.md'; @override void initState() { @@ -60,7 +61,7 @@ class _BugReportState extends State with FeedbackMixin { child: Container( padding: const EdgeInsets.symmetric(horizontal: 16), alignment: AlignmentDirectional.centerStart, - child: Text(l10n.aboutBugSectionTitle, style: Constants.knownTitleTextStyle), + child: Text(l10n.aboutBugSectionTitle, style: AStyles.knownTitleText), ), ), body: Padding( diff --git a/lib/widgets/about/licenses.dart b/lib/widgets/about/licenses.dart index e3d476d58..8e6388910 100644 --- a/lib/widgets/about/licenses.dart +++ b/lib/widgets/about/licenses.dart @@ -2,7 +2,7 @@ import 'package:aves/app_flavor.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/brand_colors.dart'; import 'package:aves/theme/colors.dart'; -import 'package:aves/utils/dependencies.dart'; +import 'package:aves/model/dependencies.dart'; import 'package:aves/widgets/about/title.dart'; import 'package:aves/widgets/about/tv_license_page.dart'; import 'package:aves/widgets/common/basic/link_chip.dart'; diff --git a/lib/widgets/about/title.dart b/lib/widgets/about/title.dart index bfb63b27d..ece76b36b 100644 --- a/lib/widgets/about/title.dart +++ b/lib/widgets/about/title.dart @@ -1,5 +1,5 @@ import 'package:aves/model/settings/settings.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:flutter/material.dart'; class AboutSectionTitle extends StatelessWidget { @@ -15,7 +15,7 @@ class AboutSectionTitle extends StatelessWidget { Widget child = Container( alignment: AlignmentDirectional.centerStart, constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), - child: Text(text, style: Constants.knownTitleTextStyle), + child: Text(text, style: AStyles.knownTitleText), ); if (settings.useTvLayout) { diff --git a/lib/widgets/about/translators.dart b/lib/widgets/about/translators.dart index b22f531c0..599f5c0c5 100644 --- a/lib/widgets/about/translators.dart +++ b/lib/widgets/about/translators.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/about/title.dart'; import 'package:aves/widgets/common/basic/text/change_highlight.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -154,7 +154,7 @@ class _RandomTextSpanHighlighterState extends State<_RandomTextSpanHighlighter> TextSpan( children: [ ...widget.spans.expandIndexed((i, v) => [ - if (i != 0) const TextSpan(text: Constants.separator), + if (i != 0) const TextSpan(text: AText.separator), TextSpan(text: v, style: i == _highlightedIndex ? _animatedStyle.value : _baseStyle), ]) ], diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 3554ea4a9..6d275cfd8 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -22,9 +22,9 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/utils/android_file_utils.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/utils/debouncer.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/collection/collection_page.dart'; @@ -224,12 +224,12 @@ class _AvesAppState extends State with WidgetsBindingObserver { final themeBrightness = s.item2; final enableDynamicColor = s.item3; - Constants.updateStylesForLocale(settings.appliedLocale); + AStyles.updateStylesForLocale(settings.appliedLocale); return FutureBuilder( future: _dynamicColorPaletteLoader, builder: (context, snapshot) { - const defaultAccent = Themes.defaultAccent; + const defaultAccent = AvesColorsData.defaultAccent; Color lightAccent = defaultAccent, darkAccent = defaultAccent; if (enableDynamicColor) { // `DynamicColorBuilder` from package `dynamic_color` provides light/dark diff --git a/lib/widgets/collection/grid/list_details.dart b/lib/widgets/collection/grid/list_details.dart index 468224e9d..4d680b81d 100644 --- a/lib/widgets/collection/grid/list_details.dart +++ b/lib/widgets/collection/grid/list_details.dart @@ -4,8 +4,9 @@ import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/utils/collection_utils.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/collection/grid/list_details_theme.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -59,7 +60,7 @@ class EntryListDetails extends StatelessWidget { children: spans, ), style: style, - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, softWrap: false, overflow: TextOverflow.fade, ); @@ -79,10 +80,10 @@ class EntryListDetails extends StatelessWidget { final locale = context.l10n.localeName; final use24hour = context.select((v) => v.alwaysUse24HourFormat); final date = entry.bestDate; - final dateText = date != null ? formatDateTime(date, locale, use24hour) : Constants.overlayUnknown; + final dateText = date != null ? formatDateTime(date, locale, use24hour) : AText.valueNotAvailable; final size = entry.burstEntries?.map((v) => v.sizeBytes).sum ?? entry.sizeBytes; - final sizeText = size != null ? formatFileSize(locale, size) : Constants.overlayUnknown; + final sizeText = size != null ? formatFileSize(locale, size) : AText.valueNotAvailable; return _buildRow( [ diff --git a/lib/widgets/collection/grid/list_details_theme.dart b/lib/widgets/collection/grid/list_details_theme.dart index adbdcb2a1..e9f666570 100644 --- a/lib/widgets/collection/grid/list_details_theme.dart +++ b/lib/widgets/collection/grid/list_details_theme.dart @@ -1,5 +1,5 @@ import 'package:aves/theme/format.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -43,7 +43,7 @@ class EntryListDetailsTheme extends StatelessWidget { TextSpan(text: formatDateTime(DateTime.now(), locale, use24hour), style: captionStyle), textDirection: TextDirection.ltr, textScaleFactor: textScaleFactor, - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, )..layout(const BoxConstraints(), parentUsesSize: true)) .getMaxIntrinsicHeight(double.infinity); diff --git a/lib/widgets/common/expandable_filter_row.dart b/lib/widgets/common/expandable_filter_row.dart index 3557e651c..d7dbd64d3 100644 --- a/lib/widgets/common/expandable_filter_row.dart +++ b/lib/widgets/common/expandable_filter_row.dart @@ -2,7 +2,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:flutter/material.dart'; @@ -34,7 +34,7 @@ class TitledExpandableFilterRow extends StatelessWidget { Widget header = Text( title, - style: Constants.knownTitleTextStyle, + style: AStyles.knownTitleText, ); void toggle() => expandedNotifier.value = isExpanded ? null : title; if (settings.useTvLayout) { diff --git a/lib/widgets/common/grid/header.dart b/lib/widgets/common/grid/header.dart index fc50da0c3..c7dd1b560 100644 --- a/lib/widgets/common/grid/header.dart +++ b/lib/widgets/common/grid/header.dart @@ -3,7 +3,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/section_keys.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/grid/sections/list_layout.dart'; import 'package:flutter/material.dart'; @@ -85,7 +85,7 @@ class SectionHeader extends StatelessWidget { ), TextSpan( text: title, - style: Constants.unknownTitleTextStyle, + style: AStyles.unknownTitleText, ), if (trailing != null) WidgetSpan( @@ -141,7 +141,7 @@ class SectionHeader extends StatelessWidget { if (hasTrailing) TextSpan(text: '\u200A' * 17), TextSpan( text: title, - style: Constants.unknownTitleTextStyle, + style: AStyles.unknownTitleText, ), ], ), diff --git a/lib/widgets/common/grid/sections/fixed/scale_overlay.dart b/lib/widgets/common/grid/sections/fixed/scale_overlay.dart index 4bae5d50e..067bc3ffe 100644 --- a/lib/widgets/common/grid/sections/fixed/scale_overlay.dart +++ b/lib/widgets/common/grid/sections/fixed/scale_overlay.dart @@ -1,6 +1,6 @@ import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/theme/durations.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/utils/colors.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:flutter/material.dart'; @@ -123,12 +123,12 @@ class _OverlayBackgroundState extends State<_OverlayBackground> { gradient: RadialGradient( colors: isDark ? const [ - Constants.transparentBlack, - Constants.transparentBlack, + ColorUtils.transparentBlack, + ColorUtils.transparentBlack, ] : const [ - Constants.transparentWhite, - Constants.transparentWhite, + ColorUtils.transparentWhite, + ColorUtils.transparentWhite, ], ), ); diff --git a/lib/widgets/common/grid/sections/mosaic/scale_overlay.dart b/lib/widgets/common/grid/sections/mosaic/scale_overlay.dart index 07e7ed81d..ea6298e42 100644 --- a/lib/widgets/common/grid/sections/mosaic/scale_overlay.dart +++ b/lib/widgets/common/grid/sections/mosaic/scale_overlay.dart @@ -1,5 +1,5 @@ import 'package:aves/theme/durations.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/utils/colors.dart'; import 'package:aves/widgets/common/grid/sections/mosaic/scale_grid.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:flutter/material.dart'; @@ -110,7 +110,7 @@ class _OverlayBackgroundState extends State<_OverlayBackground> { color: isDark ? Colors.black87 : const Color(0xDDFFFFFF), ) : BoxDecoration( - color: isDark ? Constants.transparentBlack : Constants.transparentWhite, + color: isDark ? ColorUtils.transparentBlack : ColorUtils.transparentWhite, ); } } diff --git a/lib/widgets/common/map/geo_map.dart b/lib/widgets/common/map/geo_map.dart index 0838516a5..348c0d55f 100644 --- a/lib/widgets/common/map/geo_map.dart +++ b/lib/widgets/common/map/geo_map.dart @@ -9,10 +9,10 @@ import 'package:aves/model/entry/sort.dart'; import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/poi.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; @@ -331,7 +331,7 @@ class _GeoMapState extends State { // fallback to default center var center = settings.mapDefaultCenter; if (center == null) { - center = Constants.wonders[Random().nextInt(Constants.wonders.length)]; + center = PointsOfInterest.wonders[Random().nextInt(PointsOfInterest.wonders.length)]; WidgetsBinding.instance.addPostFrameCallback((_) => settings.mapDefaultCenter = center); } bounds = ZoomedBounds.fromPoints( diff --git a/lib/widgets/dialogs/convert_entry_dialog.dart b/lib/widgets/dialogs/convert_entry_dialog.dart index 090c1b0f4..9d2d23a1f 100644 --- a/lib/widgets/dialogs/convert_entry_dialog.dart +++ b/lib/widgets/dialogs/convert_entry_dialog.dart @@ -1,11 +1,11 @@ import 'package:aves/model/entry/entry.dart'; -import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/model/metadata/enums/enums.dart'; import 'package:aves/model/metadata/enums/length_unit.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/media/media_edit_service.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/utils/mime_utils.dart'; import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; @@ -149,7 +149,7 @@ class _ConvertEntryDialogState extends State { ), ), const SizedBox(width: 8), - const Text(ExtraAvesEntryProps.resolutionSeparator), + const Text(AText.resolutionSeparator), const SizedBox(width: 8), Expanded( child: TextField( diff --git a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart index f5e6a8e34..92e1a71ea 100644 --- a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart @@ -6,10 +6,10 @@ import 'package:aves/model/metadata/enums/location_edit_action.dart'; import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/ref/poi.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/theme/themes.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/fx/transitions.dart'; @@ -250,7 +250,7 @@ class _EditEntryLocationDialogState extends State { controller: _latitudeController, decoration: InputDecoration( labelText: l10n.editEntryLocationDialogLatitude, - hintText: coordinateFormatter.format(Constants.pointNemo.latitude), + hintText: coordinateFormatter.format(PointsOfInterest.pointNemo.latitude), ), onChanged: (_) => _validate(), ), @@ -258,7 +258,7 @@ class _EditEntryLocationDialogState extends State { controller: _longitudeController, decoration: InputDecoration( labelText: l10n.editEntryLocationDialogLongitude, - hintText: coordinateFormatter.format(Constants.pointNemo.longitude), + hintText: coordinateFormatter.format(PointsOfInterest.pointNemo.longitude), ), onChanged: (_) => _validate(), ), diff --git a/lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart b/lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart index ff1a175a8..e5b002de4 100644 --- a/lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/rename_entry_dialog.dart @@ -2,9 +2,9 @@ import 'dart:io'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/services/common/services.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class RenameEntryDialog extends StatefulWidget { @@ -43,7 +43,7 @@ class _RenameEntryDialogState extends State { @override Widget build(BuildContext context) { final isRtl = context.isRtl; - final extensionSuffixText = '${Constants.fsi}${entry.extension}${Constants.pdi}'; + final extensionSuffixText = '${Unicode.FSI}${entry.extension}${Unicode.PDI}'; return AvesDialog( content: TextField( controller: _nameController, diff --git a/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart b/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart index 8399a0e32..3ba035090 100644 --- a/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart +++ b/lib/widgets/dialogs/entry_editors/rename_entry_set_page.dart @@ -5,7 +5,7 @@ import 'package:aves/model/naming_pattern.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; import 'package:aves/widgets/common/basic/popup/menu_row.dart'; @@ -117,7 +117,7 @@ class _RenameEntrySetPageState extends State { padding: const EdgeInsets.all(16), child: Text( l10n.renameEntrySetPagePreviewSectionTitle, - style: Constants.knownTitleTextStyle, + style: AStyles.knownTitleText, ), ), Expanded( diff --git a/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart index fd9ef84cc..a20f76ad4 100644 --- a/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/location_pick_page.dart @@ -8,7 +8,8 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/services/geocoding_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/utils/debouncer.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -267,8 +268,8 @@ class _AddressRowState extends State<_AddressRow> { valueListenable: _addressLineNotifier, builder: (context, addressLine, child) { return Text( - addressLine ?? Constants.overlayUnknown, - strutStyle: Constants.overflowStrutStyle, + addressLine ?? AText.valueNotAvailable, + strutStyle: AStyles.overflowStrut, softWrap: false, overflow: TextOverflow.fade, maxLines: 1, @@ -317,8 +318,8 @@ class _CoordinateRow extends StatelessWidget { const SizedBox(width: _LocationInfo.iconPadding), Expanded( child: Text( - location != null ? settings.coordinateFormat.format(context.l10n, location!) : Constants.overlayUnknown, - strutStyle: Constants.overflowStrutStyle, + location != null ? settings.coordinateFormat.format(context.l10n, location!) : AText.valueNotAvailable, + strutStyle: AStyles.overflowStrut, softWrap: false, overflow: TextOverflow.fade, maxLines: 1, diff --git a/lib/widgets/dialogs/video_stream_selection_dialog.dart b/lib/widgets/dialogs/video_stream_selection_dialog.dart index fe14da528..5420ce3e3 100644 --- a/lib/widgets/dialogs/video_stream_selection_dialog.dart +++ b/lib/widgets/dialogs/video_stream_selection_dialog.dart @@ -1,6 +1,6 @@ -import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/ref/languages.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -117,7 +117,7 @@ class _VideoStreamSelectionDialogState extends State final w = stream.width; final h = stream.height; if (w != null && h != null) { - return '$common • $w${ExtraAvesEntryProps.resolutionSeparator}$h'; + return '$common • $w${AText.resolutionSeparator}$h'; } } return common; diff --git a/lib/widgets/filter_grids/common/covered_filter_chip.dart b/lib/widgets/filter_grids/common/covered_filter_chip.dart index 10b75e2ea..610fc5d02 100644 --- a/lib/widgets/filter_grids/common/covered_filter_chip.dart +++ b/lib/widgets/filter_grids/common/covered_filter_chip.dart @@ -12,8 +12,8 @@ import 'package:aves/model/source/tag.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/utils/android_file_utils.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/thumbnail/image.dart'; @@ -214,7 +214,7 @@ class CoveredFilterChip extends StatelessWidget { ), ), Text( - locked ? Constants.overlayUnknown : numberFormat.format(source.count(filter)), + locked ? AText.valueNotAvailable : numberFormat.format(source.count(filter)), style: TextStyle( color: _detailColor(context), fontSize: fontSize, diff --git a/lib/widgets/filter_grids/common/list_details.dart b/lib/widgets/filter_grids/common/list_details.dart index d7cacb7d7..37e6224c4 100644 --- a/lib/widgets/filter_grids/common/list_details.dart +++ b/lib/widgets/filter_grids/common/list_details.dart @@ -4,8 +4,9 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/utils/android_file_utils.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/fx/borders.dart'; @@ -87,7 +88,7 @@ class FilterListDetails extends StatelessWidget { final locale = context.l10n.localeName; final use24hour = context.select((v) => v.alwaysUse24HourFormat); final date = entry?.bestDate; - final dateText = date != null ? formatDateTime(date, locale, use24hour) : Constants.overlayUnknown; + final dateText = date != null ? formatDateTime(date, locale, use24hour) : AText.valueNotAvailable; Widget leading = const Icon(AIcons.date); if (hasTitleLeading) { @@ -106,7 +107,7 @@ class FilterListDetails extends StatelessWidget { child: Text( dateText, style: detailsTheme.captionStyle, - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, softWrap: false, overflow: TextOverflow.fade, ), @@ -157,7 +158,7 @@ class FilterListDetails extends StatelessWidget { Text( '${l10n.itemCount(source.count(filter))} • ${formatFileSize(locale, source.size(filter))}', style: detailsTheme.captionStyle, - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, softWrap: false, overflow: TextOverflow.fade, ), diff --git a/lib/widgets/filter_grids/common/list_details_theme.dart b/lib/widgets/filter_grids/common/list_details_theme.dart index 774faff0f..4176ff615 100644 --- a/lib/widgets/filter_grids/common/list_details_theme.dart +++ b/lib/widgets/filter_grids/common/list_details_theme.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:aves/theme/format.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:flutter/material.dart'; @@ -49,7 +49,7 @@ class FilterListDetailsTheme extends StatelessWidget { TextSpan(text: formatDateTime(DateTime.now(), locale, use24hour), style: captionStyle), textDirection: TextDirection.ltr, textScaleFactor: textScaleFactor, - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, )..layout(const BoxConstraints(), parentUsesSize: true)) .getMaxIntrinsicHeight(double.infinity); diff --git a/lib/widgets/map/map_info_row.dart b/lib/widgets/map/map_info_row.dart index a92336613..a70f20501 100644 --- a/lib/widgets/map/map_info_row.dart +++ b/lib/widgets/map/map_info_row.dart @@ -6,7 +6,8 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/services/geocoding_service.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_map/aves_map.dart'; import 'package:flutter/material.dart'; @@ -118,13 +119,13 @@ class _AddressRowState extends State<_AddressRow> { builder: (context, addressLine, child) { final location = addressLine ?? (entry == null - ? Constants.overlayUnknown + ? AText.valueNotAvailable : entry.hasAddress ? entry.shortAddress : settings.coordinateFormat.format(context.l10n, entry.latLng!)); return Text( location, - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, softWrap: false, overflow: TextOverflow.fade, maxLines: 1, @@ -170,7 +171,7 @@ class _DateRow extends StatelessWidget { final use24hour = context.select((v) => v.alwaysUse24HourFormat); final date = entry?.bestDate; - final dateText = date != null ? formatDateTime(date, locale, use24hour) : Constants.overlayUnknown; + final dateText = date != null ? formatDateTime(date, locale, use24hour) : AText.valueNotAvailable; return Row( children: [ const SizedBox(width: MapInfoRow.iconPadding), @@ -179,7 +180,7 @@ class _DateRow extends StatelessWidget { Expanded( child: Text( dateText, - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, softWrap: false, overflow: TextOverflow.fade, maxLines: 1, diff --git a/lib/widgets/settings/common/quick_actions/editor_page.dart b/lib/widgets/settings/common/quick_actions/editor_page.dart index 91241b9a2..0bec2c037 100644 --- a/lib/widgets/settings/common/quick_actions/editor_page.dart +++ b/lib/widgets/settings/common/quick_actions/editor_page.dart @@ -2,9 +2,8 @@ import 'dart:async'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; -import 'package:aves_utils/aves_utils.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; @@ -13,6 +12,7 @@ import 'package:aves/widgets/settings/common/quick_actions/action_panel.dart'; import 'package:aves/widgets/settings/common/quick_actions/available_actions.dart'; import 'package:aves/widgets/settings/common/quick_actions/placeholder.dart'; import 'package:aves/widgets/settings/common/quick_actions/quick_actions.dart'; +import 'package:aves_utils/aves_utils.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -163,7 +163,7 @@ class _QuickActionEditorBodyState extends State( @@ -240,7 +240,7 @@ class _QuickActionEditorBodyState extends State( diff --git a/lib/widgets/settings/common/tiles.dart b/lib/widgets/settings/common/tiles.dart index 8ce5c354a..c9fabc4c7 100644 --- a/lib/widgets/settings/common/tiles.dart +++ b/lib/widgets/settings/common/tiles.dart @@ -1,6 +1,6 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/utils/time_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_caption.dart'; @@ -179,7 +179,7 @@ class SettingsMultiSelectionListTile extends StatelessWidget { } return ListTile( title: titleWidget, - subtitle: AvesCaption(current.isEmpty ? noneSubtitle : current.map((v) => getName(context, v)).join(Constants.separator)), + subtitle: AvesCaption(current.isEmpty ? noneSubtitle : current.map((v) => getName(context, v)).join(AText.separator)), onTap: () => showSelectionDialog>( context: context, builder: (context) => AvesMultiSelectionDialog( diff --git a/lib/widgets/settings/language/language.dart b/lib/widgets/settings/language/language.dart index 472c2b990..9660938c9 100644 --- a/lib/widgets/settings/language/language.dart +++ b/lib/widgets/settings/language/language.dart @@ -4,9 +4,9 @@ import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/enums/l10n.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/ref/poi.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; import 'package:aves/widgets/settings/common/tiles.dart'; @@ -56,7 +56,7 @@ class SettingsTileLanguageCoordinateFormat extends SettingsTile { onSelection: (v) => settings.coordinateFormat = v, tileTitle: title(context), dialogTitle: context.l10n.settingsCoordinateFormatDialogTitle, - optionSubtitleBuilder: (value) => value.format(context.l10n, Constants.pointNemo), + optionSubtitleBuilder: (value) => value.format(context.l10n, PointsOfInterest.pointNemo), ); } diff --git a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart index 33b496e60..680ab336a 100644 --- a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart +++ b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart @@ -5,7 +5,6 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/font_size_icon_theme.dart'; import 'package:aves/widgets/common/basic/popup/menu_row.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; @@ -183,7 +182,7 @@ class _FilePickerPageState extends State { Widget _buildContentLine(BuildContext context, FileSystemEntity content) { return ListTile( leading: const Icon(AIcons.folder), - title: Text('${Constants.fsi}${pContext.split(content.path).last}${Constants.pdi}'), + title: Text('${Unicode.FSI}${pContext.split(content.path).last}${Unicode.PDI}'), onTap: () { _goTo(content.path); setState(() {}); diff --git a/lib/widgets/stats/stats_page.dart b/lib/widgets/stats/stats_page.dart index 9f1614905..171a7fb7c 100644 --- a/lib/widgets/stats/stats_page.dart +++ b/lib/widgets/stats/stats_page.dart @@ -12,7 +12,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; @@ -285,7 +285,7 @@ class _StatsPageState extends State with FeedbackMixin, VaultAwareMix : null; Widget header = Text( title, - style: Constants.knownTitleTextStyle, + style: AStyles.knownTitleText, ); if (settings.useTvLayout) { header = Container( diff --git a/lib/widgets/viewer/info/common.dart b/lib/widgets/viewer/info/common.dart index a770b5625..db1d815ea 100644 --- a/lib/widgets/viewer/info/common.dart +++ b/lib/widgets/viewer/info/common.dart @@ -1,7 +1,7 @@ import 'dart:math'; -import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -75,7 +75,7 @@ class InfoRowGroup extends StatefulWidget { final linkColor = Theme.of(context).colorScheme.primary; final style = InfoRowGroup.valueStyle.copyWith(color: linkColor, decoration: TextDecoration.underline); - return [TextSpan(text: '${Constants.fsi}$value${Constants.pdi}', style: style, recognizer: recognizer)]; + return [TextSpan(text: '${Unicode.FSI}$value${Unicode.PDI}', style: style, recognizer: recognizer)]; }; } } @@ -164,7 +164,7 @@ class _InfoRowGroupState extends State { // so that layout of the spans follows the directionality of the locale // (e.g. keys on the right for RTL locale, whatever the key intrinsic directionality) // and each span respects the directionality of its inner text only - String _buildTextValue(String value) => '${Constants.fsi}$value${Constants.pdi}'; + String _buildTextValue(String value) => '${Unicode.FSI}$value${Unicode.PDI}'; } typedef InfoValueSpanBuilder = List Function(BuildContext context, String key, String value); diff --git a/lib/widgets/viewer/overlay/details/date.dart b/lib/widgets/viewer/overlay/details/date.dart index 67e24fadd..62abba441 100644 --- a/lib/widgets/viewer/overlay/details/date.dart +++ b/lib/widgets/viewer/overlay/details/date.dart @@ -2,7 +2,8 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/props.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/multipage/controller.dart'; import 'package:aves/widgets/viewer/overlay/details/details.dart'; @@ -26,7 +27,7 @@ class OverlayDateRow extends StatelessWidget { final use24hour = context.select((v) => v.alwaysUse24HourFormat); final date = entry.bestDate; - final dateText = date != null ? formatDateTime(date, locale, use24hour) : Constants.overlayUnknown; + final dateText = date != null ? formatDateTime(date, locale, use24hour) : AText.valueNotAvailable; final resolutionText = entry.isSvg ? entry.aspectRatioText : entry.isSized @@ -37,8 +38,8 @@ class OverlayDateRow extends StatelessWidget { children: [ DecoratedIcon(AIcons.date, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)), const SizedBox(width: ViewerDetailOverlayContent.iconPadding), - Expanded(flex: 3, child: Text(dateText, strutStyle: Constants.overflowStrutStyle)), - Expanded(flex: 2, child: Text(resolutionText, strutStyle: Constants.overflowStrutStyle)), + Expanded(flex: 3, child: Text(dateText, strutStyle: AStyles.overflowStrut)), + Expanded(flex: 2, child: Text(resolutionText, strutStyle: AStyles.overflowStrut)), ], ); } diff --git a/lib/widgets/viewer/overlay/details/description.dart b/lib/widgets/viewer/overlay/details/description.dart index fec7ab219..171ecde5e 100644 --- a/lib/widgets/viewer/overlay/details/description.dart +++ b/lib/widgets/viewer/overlay/details/description.dart @@ -1,5 +1,5 @@ import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/viewer/overlay/details/details.dart'; import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; @@ -31,7 +31,7 @@ class OverlayDescriptionRow extends StatelessWidget { TextSpan(text: description), ], ), - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, ); } } diff --git a/lib/widgets/viewer/overlay/details/location.dart b/lib/widgets/viewer/overlay/details/location.dart index ad3ebd4af..4d6897f0b 100644 --- a/lib/widgets/viewer/overlay/details/location.dart +++ b/lib/widgets/viewer/overlay/details/location.dart @@ -3,7 +3,7 @@ import 'package:aves/model/entry/extensions/location.dart'; import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/overlay/details/details.dart'; import 'package:decorated_icon/decorated_icon.dart'; @@ -34,7 +34,7 @@ class OverlayLocationRow extends AnimatedWidget { children: [ DecoratedIcon(AIcons.location, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)), const SizedBox(width: ViewerDetailOverlayContent.iconPadding), - Expanded(child: Text(location, strutStyle: Constants.overflowStrutStyle)), + Expanded(child: Text(location, strutStyle: AStyles.overflowStrut)), ], ); } diff --git a/lib/widgets/viewer/overlay/details/position_title.dart b/lib/widgets/viewer/overlay/details/position_title.dart index d13640e95..167594b8b 100644 --- a/lib/widgets/viewer/overlay/details/position_title.dart +++ b/lib/widgets/viewer/overlay/details/position_title.dart @@ -1,7 +1,9 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/multipage.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/viewer/multipage/controller.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class OverlayPositionTitleRow extends StatelessWidget { @@ -26,9 +28,9 @@ class OverlayPositionTitleRow extends StatelessWidget { [ if (collectionPosition != null) collectionPosition, if (pagePosition != null) pagePosition, - if (title != null) '${Constants.fsi}$title${Constants.pdi}', - ].join(Constants.separator), - strutStyle: Constants.overflowStrutStyle); + if (title != null) '${Unicode.FSI}$title${Unicode.PDI}', + ].join(AText.separator), + strutStyle: AStyles.overflowStrut); if (multiPageController == null) return toText(); diff --git a/lib/widgets/viewer/overlay/details/rating_tags.dart b/lib/widgets/viewer/overlay/details/rating_tags.dart index 7cebcea4d..8cda1194d 100644 --- a/lib/widgets/viewer/overlay/details/rating_tags.dart +++ b/lib/widgets/viewer/overlay/details/rating_tags.dart @@ -1,6 +1,7 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/overlay/details/details.dart'; import 'package:collection/collection.dart'; @@ -40,7 +41,7 @@ class OverlayRatingTagsRow extends AnimatedWidget { children: [ TextSpan(text: ratingString), if (hasTags) ...[ - if (ratingString.isNotEmpty) const TextSpan(text: Constants.separator), + if (ratingString.isNotEmpty) const TextSpan(text: AText.separator), WidgetSpan( alignment: PlaceholderAlignment.middle, child: Padding( @@ -52,11 +53,11 @@ class OverlayRatingTagsRow extends AnimatedWidget { ), ), ), - TextSpan(text: tags.join(Constants.separator)), + TextSpan(text: tags.join(AText.separator)), ] ], ), - strutStyle: Constants.overflowStrutStyle, + strutStyle: AStyles.overflowStrut, ); } } diff --git a/lib/widgets/viewer/overlay/details/shooting.dart b/lib/widgets/viewer/overlay/details/shooting.dart index 0d8ea39b9..567e652be 100644 --- a/lib/widgets/viewer/overlay/details/shooting.dart +++ b/lib/widgets/viewer/overlay/details/shooting.dart @@ -1,6 +1,7 @@ import 'package:aves/model/metadata/overlay.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/styles.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/overlay/details/details.dart'; import 'package:decorated_icon/decorated_icon.dart'; @@ -20,22 +21,22 @@ class OverlayShootingRow extends StatelessWidget { final locale = context.l10n.localeName; final aperture = details.aperture; - final apertureText = aperture != null ? 'ƒ/${NumberFormat('0.0', locale).format(aperture)}' : Constants.overlayUnknown; + final apertureText = aperture != null ? 'ƒ/${NumberFormat('0.0', locale).format(aperture)}' : AText.valueNotAvailable; final focalLength = details.focalLength; - final focalLengthText = focalLength != null ? context.l10n.focalLength(NumberFormat('0.#', locale).format(focalLength)) : Constants.overlayUnknown; + final focalLengthText = focalLength != null ? context.l10n.focalLength(NumberFormat('0.#', locale).format(focalLength)) : AText.valueNotAvailable; final iso = details.iso; - final isoText = iso != null ? 'ISO$iso' : Constants.overlayUnknown; + final isoText = iso != null ? 'ISO$iso' : AText.valueNotAvailable; return Row( children: [ DecoratedIcon(AIcons.shooting, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)), const SizedBox(width: ViewerDetailOverlayContent.iconPadding), - Expanded(child: Text(apertureText, strutStyle: Constants.overflowStrutStyle)), - Expanded(child: Text(details.exposureTime ?? Constants.overlayUnknown, strutStyle: Constants.overflowStrutStyle)), - Expanded(child: Text(focalLengthText, strutStyle: Constants.overflowStrutStyle)), - Expanded(child: Text(isoText, strutStyle: Constants.overflowStrutStyle)), + Expanded(child: Text(apertureText, strutStyle: AStyles.overflowStrut)), + Expanded(child: Text(details.exposureTime ?? AText.valueNotAvailable, strutStyle: AStyles.overflowStrut)), + Expanded(child: Text(focalLengthText, strutStyle: AStyles.overflowStrut)), + Expanded(child: Text(isoText, strutStyle: AStyles.overflowStrut)), ], ); } diff --git a/lib/widgets/viewer/overlay/selection_button.dart b/lib/widgets/viewer/overlay/selection_button.dart index 874492854..5a3c4ea53 100644 --- a/lib/widgets/viewer/overlay/selection_button.dart +++ b/lib/widgets/viewer/overlay/selection_button.dart @@ -2,7 +2,7 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/common/basic/text/animated_diff.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/buttons/overlay_button.dart'; @@ -50,7 +50,7 @@ class SelectionButton extends StatelessWidget { ), const Padding( padding: EdgeInsets.symmetric(horizontal: 8), - child: Text(Constants.separator), + child: Text(AText.separator), ), Selector, bool>( selector: (context, selection) => selection.isSelected({mainEntry}), diff --git a/lib/widgets/viewer/visual/video/subtitle/ass_parser.dart b/lib/widgets/viewer/visual/video/subtitle/ass_parser.dart index 3e9f24cba..d440b043c 100644 --- a/lib/widgets/viewer/visual/video/subtitle/ass_parser.dart +++ b/lib/widgets/viewer/visual/video/subtitle/ass_parser.dart @@ -1,3 +1,4 @@ +import 'package:aves/ref/unicode.dart'; import 'package:aves/widgets/viewer/visual/video/subtitle/line.dart'; import 'package:aves/widgets/viewer/visual/video/subtitle/span.dart'; import 'package:aves/widgets/viewer/visual/video/subtitle/style.dart'; @@ -39,8 +40,6 @@ class AssParser { // e.g. m 937.5 472.67 b 937.5 472.67 937.25 501.25 960 501.5 960 501.5 937.5 500.33 937.5 529.83 static final pathPattern = RegExp(r'([mnlbspc])([.\s\d]+)'); - static const noBreakSpace = '\u00A0'; - // Parse text with ASS style overrides // cf https://aegi.vmoe.info/docs/3.0/ASS_Tags/ // e.g. `And I'm like, "We can't {\i1}not{\i0} see it."` @@ -389,7 +388,7 @@ class AssParser { ); } - static String _replaceChars(String text) => text.replaceAll(r'\h', noBreakSpace).replaceAll(r'\N', '\n').trim(); + static String _replaceChars(String text) => text.replaceAll(r'\h', Unicode.noBreakSpace).replaceAll(r'\N', '\n').trim(); static int? _parseAlpha(String param) { final match = alphaPattern.firstMatch(param); diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart index 2959174b0..a06e1f902 100644 --- a/lib/widgets/welcome_page.dart +++ b/lib/widgets/welcome_page.dart @@ -3,7 +3,7 @@ import 'package:aves/model/settings/defaults.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/utils/constants.dart'; +import 'package:aves/theme/text.dart'; import 'package:aves/widgets/about/policy_page.dart'; import 'package:aves/widgets/common/basic/link_chip.dart'; import 'package:aves/widgets/common/basic/markdown_container.dart'; @@ -174,7 +174,7 @@ class _WelcomePageState extends State { value: settings.isInstalledAppAccessAllowed, onChanged: (v) => setState(() => settings.isInstalledAppAccessAllowed = v), title: Text(l10n.settingsAllowInstalledAppAccess), - subtitle: Text([l10n.welcomeOptional, l10n.settingsAllowInstalledAppAccessSubtitle].join(Constants.separator)), + subtitle: Text([l10n.welcomeOptional, l10n.settingsAllowInstalledAppAccessSubtitle].join(AText.separator)), contentPadding: contentPadding, ), if (canEnableErrorReporting)