From a4fab7339d2ff68c450ccabcfe67afe5c0e9e490 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Wed, 25 Nov 2020 16:46:34 +0900 Subject: [PATCH] project reorganization, filter scaling prep --- .../app_icon_image_provider.dart | 0 .../image_providers/region_provider.dart | 0 .../image_providers/thumbnail_provider.dart | 0 .../image_providers/uri_image_provider.dart | 0 .../image_providers/uri_picture_provider.dart | 0 lib/main.dart | 8 +-- .../actions}/chip_actions.dart | 2 +- .../actions}/collection_actions.dart | 9 +-- .../actions}/entry_actions.dart | 4 +- lib/model/entry_cache.dart | 4 +- lib/model/filters/album.dart | 5 +- lib/model/filters/favourite.dart | 2 +- lib/model/filters/location.dart | 2 +- lib/model/filters/mime.dart | 6 +- lib/model/filters/query.dart | 2 +- lib/model/filters/tag.dart | 2 +- lib/model/image_entry.dart | 7 +- .../source/media_store_source.dart} | 0 lib/{utils => ref}/brand_colors.dart | 0 lib/{model => ref}/mime_types.dart | 20 ------ lib/{utils => ref}/xmp.dart | 0 lib/services/image_file_service.dart | 2 +- lib/{utils => theme}/durations.dart | 0 lib/theme/icons.dart | 67 ++++++++++++++++++ lib/utils/flutter_utils.dart | 5 -- lib/utils/mime_utils.dart | 20 ++++++ lib/widgets/about/about_page.dart | 4 +- lib/widgets/about/licenses.dart | 10 +-- lib/widgets/collection/app_bar.dart | 20 +++--- lib/widgets/collection/collection_page.dart | 4 +- .../entry_set_action_delegate.dart} | 16 ++--- lib/widgets/collection/filter_bar.dart | 4 +- lib/widgets/collection/grid/header_album.dart | 3 +- .../collection/grid/header_generic.dart | 4 +- lib/widgets/collection/grid/list_sliver.dart | 12 +--- lib/widgets/collection/grid/scaling.dart | 66 +++++++++--------- lib/widgets/collection/thumbnail/error.dart | 4 +- lib/widgets/collection/thumbnail/overlay.dart | 5 +- lib/widgets/collection/thumbnail/raster.dart | 8 +-- lib/widgets/collection/thumbnail/vector.dart | 2 +- .../collection/thumbnail_collection.dart | 44 +++++++----- .../feedback.dart | 2 +- .../permission_aware.dart | 3 +- .../size_aware.dart | 2 +- lib/widgets/common/app_bar_subtitle.dart | 2 +- .../common/{ => basic}/labeled_checkbox.dart | 0 lib/widgets/common/{ => basic}/link_chip.dart | 2 +- lib/widgets/common/{ => basic}/menu_row.dart | 2 +- .../common/{fx => basic}/outlined_text.dart | 0 .../reselectable_radio_list_tile.dart} | 4 +- .../{ => behaviour}/double_back_pop.dart | 4 +- .../common/behaviour}/route_tracker.dart | 0 .../common/{ => behaviour}/routes.dart | 4 ++ .../sloppy_scroll_physics.dart | 0 lib/widgets/common/{ => fx}/borders.dart | 0 lib/widgets/common/fx/sweeper.dart | 2 +- .../common/{ => fx}/transition_image.dart | 0 .../{ => identity}/aves_expansion_tile.dart | 2 +- .../{ => identity}/aves_filter_chip.dart | 7 +- .../{icons.dart => identity/aves_icons.dart} | 69 +------------------ .../common/{ => identity}/aves_logo.dart | 0 .../{ => identity}/highlight_title.dart | 0 .../common/{ => identity}/scroll_thumb.dart | 0 .../media_query_data_provider.dart | 0 .../settings_provider.dart | 0 lib/widgets/debug/android_env.dart | 2 +- lib/widgets/debug/app_debug_page.dart | 4 +- lib/widgets/debug/cache.dart | 2 +- lib/widgets/debug/database.dart | 2 +- lib/widgets/debug/firebase.dart | 2 +- lib/widgets/debug/settings.dart | 2 +- lib/widgets/debug/storage.dart | 2 +- .../add_shortcut_dialog.dart | 2 +- .../{common => dialogs}/aves_dialog.dart | 12 ++-- .../aves_selection_dialog.dart | 4 +- .../create_album_dialog.dart | 4 +- .../rename_album_dialog.dart | 2 +- .../rename_entry_dialog.dart | 2 +- lib/widgets/drawer/app_drawer.dart | 7 +- lib/widgets/drawer/tile.dart | 2 +- lib/widgets/filter_grids/album_pick.dart | 8 +-- lib/widgets/filter_grids/albums_page.dart | 4 +- .../common/chip_action_delegate.dart | 12 ++-- .../common/chip_set_action_delegate.dart | 4 +- .../common/decorated_filter_chip.dart | 6 +- .../filter_grids/common/filter_grid_page.dart | 16 ++--- lib/widgets/filter_grids/countries_page.dart | 4 +- lib/widgets/filter_grids/tags_page.dart | 4 +- lib/widgets/fullscreen/debug/metadata.dart | 2 +- .../entry_action_delegate.dart | 12 ++-- lib/widgets/fullscreen/fullscreen_body.dart | 4 +- .../fullscreen/fullscreen_debug_page.dart | 6 +- lib/widgets/fullscreen/fullscreen_page.dart | 2 +- lib/widgets/fullscreen/image_view.dart | 8 +-- .../fullscreen/info/basic_section.dart | 4 +- lib/widgets/fullscreen/info/common.dart | 2 +- lib/widgets/fullscreen/info/info_page.dart | 6 +- .../fullscreen/info/location_section.dart | 6 +- lib/widgets/fullscreen/info/maps/common.dart | 10 +-- .../fullscreen/info/maps/scale_layer.dart | 2 +- .../info/metadata/metadata_section.dart | 8 +-- .../fullscreen/info/metadata/xmp_tile.dart | 8 +-- lib/widgets/fullscreen/overlay/bottom.dart | 4 +- lib/widgets/fullscreen/overlay/common.dart | 2 +- lib/widgets/fullscreen/overlay/top.dart | 8 +-- lib/widgets/fullscreen/overlay/video.dart | 6 +- lib/widgets/fullscreen/tiled_view.dart | 2 +- lib/widgets/fullscreen/video_view.dart | 2 +- lib/widgets/home_page.dart | 4 +- lib/widgets/search/expandable_filter_row.dart | 6 +- lib/widgets/search/search_button.dart | 2 +- lib/widgets/search/search_delegate.dart | 6 +- lib/widgets/search/search_page.dart | 2 +- lib/widgets/settings/settings_page.dart | 10 +-- lib/widgets/settings/svg_background.dart | 2 +- lib/widgets/stats/filter_table.dart | 2 +- lib/widgets/stats/stats.dart | 8 +-- lib/widgets/welcome_page.dart | 6 +- test/model/filters_test.dart | 2 +- 119 files changed, 377 insertions(+), 364 deletions(-) rename lib/{widgets/common => }/image_providers/app_icon_image_provider.dart (100%) rename lib/{widgets/common => }/image_providers/region_provider.dart (100%) rename lib/{widgets/common => }/image_providers/thumbnail_provider.dart (100%) rename lib/{widgets/common => }/image_providers/uri_image_provider.dart (100%) rename lib/{widgets/common => }/image_providers/uri_picture_provider.dart (100%) rename lib/{widgets/filter_grids/common => model/actions}/chip_actions.dart (93%) rename lib/{widgets/collection => model/actions}/collection_actions.dart (86%) rename lib/{widgets/common => model/actions}/entry_actions.dart (96%) rename lib/{widgets/common/data_providers/media_store_collection_provider.dart => model/source/media_store_source.dart} (100%) rename lib/{utils => ref}/brand_colors.dart (100%) rename lib/{model => ref}/mime_types.dart (72%) rename lib/{utils => ref}/xmp.dart (100%) rename lib/{utils => theme}/durations.dart (100%) create mode 100644 lib/theme/icons.dart delete mode 100644 lib/utils/flutter_utils.dart create mode 100644 lib/utils/mime_utils.dart rename lib/widgets/{common/action_delegates/selection_action_delegate.dart => collection/entry_set_action_delegate.dart} (90%) rename lib/widgets/common/{action_delegates => action_mixins}/feedback.dart (98%) rename lib/widgets/common/{action_delegates => action_mixins}/permission_aware.dart (97%) rename lib/widgets/common/{action_delegates => action_mixins}/size_aware.dart (97%) rename lib/widgets/common/{ => basic}/labeled_checkbox.dart (100%) rename lib/widgets/common/{ => basic}/link_chip.dart (96%) rename lib/widgets/common/{ => basic}/menu_row.dart (93%) rename lib/widgets/common/{fx => basic}/outlined_text.dart (100%) rename lib/widgets/common/{aves_radio_list_tile.dart => basic/reselectable_radio_list_tile.dart} (96%) rename lib/widgets/common/{ => behaviour}/double_back_pop.dart (92%) rename lib/{utils => widgets/common/behaviour}/route_tracker.dart (100%) rename lib/widgets/common/{ => behaviour}/routes.dart (90%) rename lib/widgets/common/{ => behaviour}/sloppy_scroll_physics.dart (100%) rename lib/widgets/common/{ => fx}/borders.dart (100%) rename lib/widgets/common/{ => fx}/transition_image.dart (100%) rename lib/widgets/common/{ => identity}/aves_expansion_tile.dart (95%) rename lib/widgets/common/{ => identity}/aves_filter_chip.dart (98%) rename lib/widgets/common/{icons.dart => identity/aves_icons.dart} (52%) rename lib/widgets/common/{ => identity}/aves_logo.dart (100%) rename lib/widgets/common/{ => identity}/highlight_title.dart (100%) rename lib/widgets/common/{ => identity}/scroll_thumb.dart (100%) rename lib/widgets/common/{data_providers => providers}/media_query_data_provider.dart (100%) rename lib/widgets/common/{data_providers => providers}/settings_provider.dart (100%) rename lib/widgets/{common/action_delegates => dialogs}/add_shortcut_dialog.dart (98%) rename lib/widgets/{common => dialogs}/aves_dialog.dart (91%) rename lib/widgets/{common => dialogs}/aves_selection_dialog.dart (94%) rename lib/widgets/{common/action_delegates => dialogs}/create_album_dialog.dart (98%) rename lib/widgets/{common/action_delegates => dialogs}/rename_album_dialog.dart (98%) rename lib/widgets/{common/action_delegates => dialogs}/rename_entry_dialog.dart (98%) rename lib/widgets/{common/action_delegates => fullscreen}/entry_action_delegate.dart (94%) diff --git a/lib/widgets/common/image_providers/app_icon_image_provider.dart b/lib/image_providers/app_icon_image_provider.dart similarity index 100% rename from lib/widgets/common/image_providers/app_icon_image_provider.dart rename to lib/image_providers/app_icon_image_provider.dart diff --git a/lib/widgets/common/image_providers/region_provider.dart b/lib/image_providers/region_provider.dart similarity index 100% rename from lib/widgets/common/image_providers/region_provider.dart rename to lib/image_providers/region_provider.dart diff --git a/lib/widgets/common/image_providers/thumbnail_provider.dart b/lib/image_providers/thumbnail_provider.dart similarity index 100% rename from lib/widgets/common/image_providers/thumbnail_provider.dart rename to lib/image_providers/thumbnail_provider.dart diff --git a/lib/widgets/common/image_providers/uri_image_provider.dart b/lib/image_providers/uri_image_provider.dart similarity index 100% rename from lib/widgets/common/image_providers/uri_image_provider.dart rename to lib/image_providers/uri_image_provider.dart diff --git a/lib/widgets/common/image_providers/uri_picture_provider.dart b/lib/image_providers/uri_picture_provider.dart similarity index 100% rename from lib/widgets/common/image_providers/uri_picture_provider.dart rename to lib/image_providers/uri_picture_provider.dart diff --git a/lib/main.dart b/lib/main.dart index 350685a69..92cd32fbc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,10 +2,10 @@ import 'dart:isolate'; import 'dart:ui'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/utils/route_tracker.dart'; -import 'package:aves/widgets/common/data_providers/settings_provider.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/routes.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/behaviour/route_tracker.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; +import 'package:aves/widgets/common/providers/settings_provider.dart'; import 'package:aves/widgets/home_page.dart'; import 'package:aves/widgets/welcome_page.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; diff --git a/lib/widgets/filter_grids/common/chip_actions.dart b/lib/model/actions/chip_actions.dart similarity index 93% rename from lib/widgets/filter_grids/common/chip_actions.dart rename to lib/model/actions/chip_actions.dart index a63edfd8f..f5cfd1a6e 100644 --- a/lib/widgets/filter_grids/common/chip_actions.dart +++ b/lib/model/actions/chip_actions.dart @@ -1,4 +1,4 @@ -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/widgets.dart'; enum ChipSetAction { diff --git a/lib/widgets/collection/collection_actions.dart b/lib/model/actions/collection_actions.dart similarity index 86% rename from lib/widgets/collection/collection_actions.dart rename to lib/model/actions/collection_actions.dart index c71ba093c..531c8e5f9 100644 --- a/lib/widgets/collection/collection_actions.dart +++ b/lib/model/actions/collection_actions.dart @@ -1,13 +1,14 @@ enum CollectionAction { addShortcut, - copy, + sort, group, - move, refresh, - refreshMetadata, select, selectAll, selectNone, - sort, stats, + // apply to entry set + copy, + move, + refreshMetadata, } diff --git a/lib/widgets/common/entry_actions.dart b/lib/model/actions/entry_actions.dart similarity index 96% rename from lib/widgets/common/entry_actions.dart rename to lib/model/actions/entry_actions.dart index 0b9e70b2f..805df42f0 100644 --- a/lib/widgets/common/entry_actions.dart +++ b/lib/model/actions/entry_actions.dart @@ -1,5 +1,5 @@ -import 'package:aves/widgets/common/icons.dart'; -import 'package:flutter/material.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:flutter/widgets.dart'; enum EntryAction { delete, diff --git a/lib/model/entry_cache.dart b/lib/model/entry_cache.dart index a00303656..b0ef230cc 100644 --- a/lib/model/entry_cache.dart +++ b/lib/model/entry_cache.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'dart:math'; -import 'package:aves/widgets/common/image_providers/thumbnail_provider.dart'; -import 'package:aves/widgets/common/image_providers/uri_image_provider.dart'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/image_providers/uri_image_provider.dart'; class EntryCache { static Future evict( diff --git a/lib/model/filters/album.dart b/lib/model/filters/album.dart index aec589bb7..68e0b8e3d 100644 --- a/lib/model/filters/album.dart +++ b/lib/model/filters/album.dart @@ -1,8 +1,9 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/utils/android_file_utils.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/image_providers/app_icon_image_provider.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/image_providers/app_icon_image_provider.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:palette_generator/palette_generator.dart'; diff --git a/lib/model/filters/favourite.dart b/lib/model/filters/favourite.dart index cee2aff50..d4e9716c1 100644 --- a/lib/model/filters/favourite.dart +++ b/lib/model/filters/favourite.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/model/filters/location.dart b/lib/model/filters/location.dart index a8bafbe0e..2c4a4a7cc 100644 --- a/lib/model/filters/location.dart +++ b/lib/model/filters/location.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/model/filters/mime.dart b/lib/model/filters/mime.dart index 891bd48d6..02ac50252 100644 --- a/lib/model/filters/mime.dart +++ b/lib/model/filters/mime.dart @@ -1,7 +1,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/mime_types.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/utils/mime_utils.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; @@ -35,7 +35,7 @@ class MimeFilter extends CollectionFilter { _label ??= lowMime.split('/')[0].toUpperCase(); } else { _filter = (entry) => entry.mimeType == lowMime; - _label = MimeTypes.displayType(lowMime); + _label = MimeUtils.displayType(lowMime); } _icon ??= AIcons.vector; } diff --git a/lib/model/filters/query.dart b/lib/model/filters/query.dart index 4a07c2671..b23b27f38 100644 --- a/lib/model/filters/query.dart +++ b/lib/model/filters/query.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/model/filters/tag.dart b/lib/model/filters/tag.dart index 30198b8f9..3188d583c 100644 --- a/lib/model/filters/tag.dart +++ b/lib/model/filters/tag.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/model/image_entry.dart b/lib/model/image_entry.dart index 340a69dca..63b78dde1 100644 --- a/lib/model/image_entry.dart +++ b/lib/model/image_entry.dart @@ -17,7 +17,7 @@ import 'package:geocoder/geocoder.dart'; import 'package:latlong/latlong.dart'; import 'package:path/path.dart' as ppath; -import 'mime_types.dart'; +import '../ref/mime_types.dart'; class ImageEntry { String uri; @@ -40,6 +40,9 @@ class ImageEntry { final AChangeNotifier imageChangeNotifier = AChangeNotifier(), metadataChangeNotifier = AChangeNotifier(), addressChangeNotifier = AChangeNotifier(); + // TODO TLAD make it dynamic if it depends on OS/lib versions + static const List undecodable = [MimeTypes.crw, MimeTypes.psd]; + ImageEntry({ this.uri, String path, @@ -59,7 +62,7 @@ class ImageEntry { this.dateModifiedSecs = dateModifiedSecs; } - bool get canDecode => !MimeTypes.undecodable.contains(mimeType); + bool get canDecode => !undecodable.contains(mimeType); ImageEntry copyWith({ @required String uri, diff --git a/lib/widgets/common/data_providers/media_store_collection_provider.dart b/lib/model/source/media_store_source.dart similarity index 100% rename from lib/widgets/common/data_providers/media_store_collection_provider.dart rename to lib/model/source/media_store_source.dart diff --git a/lib/utils/brand_colors.dart b/lib/ref/brand_colors.dart similarity index 100% rename from lib/utils/brand_colors.dart rename to lib/ref/brand_colors.dart diff --git a/lib/model/mime_types.dart b/lib/ref/mime_types.dart similarity index 72% rename from lib/model/mime_types.dart rename to lib/ref/mime_types.dart index 02f954ae4..537d81121 100644 --- a/lib/model/mime_types.dart +++ b/lib/ref/mime_types.dart @@ -41,24 +41,4 @@ class MimeTypes { // groups static const List rawImages = [arw, cr2, crw, dcr, dng, erf, k25, kdc, mrw, nef, nrw, orf, pef, raf, raw, rw2, sr2, srf, srw, x3f]; - static const List undecodable = [crw, psd]; // TODO TLAD make it dynamic if it depends on OS/lib versions - - static String displayType(String mime) { - switch (mime) { - case 'image/x-icon': - return 'ICO'; - case 'image/vnd.adobe.photoshop': - case 'image/x-photoshop': - return 'PSD'; - default: - final patterns = [ - RegExp('.*/'), // remove type, keep subtype - RegExp('(X-|VND.(WAP.)?)'), // noisy prefixes - '+XML', // noisy suffix - ]; - mime = mime.toUpperCase(); - patterns.forEach((pattern) => mime = mime.replaceFirst(pattern, '')); - return mime; - } - } } diff --git a/lib/utils/xmp.dart b/lib/ref/xmp.dart similarity index 100% rename from lib/utils/xmp.dart rename to lib/ref/xmp.dart diff --git a/lib/services/image_file_service.dart b/lib/services/image_file_service.dart index 0eec5e1ff..c27d72d30 100644 --- a/lib/services/image_file_service.dart +++ b/lib/services/image_file_service.dart @@ -4,7 +4,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/mime_types.dart'; +import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/service_policy.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/utils/durations.dart b/lib/theme/durations.dart similarity index 100% rename from lib/utils/durations.dart rename to lib/theme/durations.dart diff --git a/lib/theme/icons.dart b/lib/theme/icons.dart new file mode 100644 index 000000000..6d33fce2b --- /dev/null +++ b/lib/theme/icons.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; + +class AIcons { + static const IconData allCollection = Icons.collections_outlined; + static const IconData image = Icons.photo_outlined; + static const IconData video = Icons.movie_outlined; + static const IconData audio = Icons.audiotrack_outlined; + static const IconData vector = Icons.code_outlined; + + static const IconData android = Icons.android; + static const IconData checked = Icons.done_outlined; + static const IconData date = Icons.calendar_today_outlined; + static const IconData disc = Icons.fiber_manual_record; + static const IconData error = Icons.error_outline; + static const IconData location = Icons.place_outlined; + static const IconData locationOff = Icons.location_off_outlined; + static const IconData raw = Icons.camera_outlined; + static const IconData shooting = Icons.camera_outlined; + static const IconData removableStorage = Icons.sd_storage_outlined; + static const IconData settings = Icons.settings_outlined; + static const IconData text = Icons.format_quote_outlined; + static const IconData tag = Icons.local_offer_outlined; + static const IconData tagOff = MdiIcons.tagOffOutline; + + // actions + static const IconData addShortcut = Icons.add_to_home_screen_outlined; + static const IconData clear = Icons.clear_outlined; + static const IconData collapse = Icons.expand_less_outlined; + static const IconData createAlbum = Icons.add_circle_outline; + static const IconData debug = Icons.whatshot_outlined; + static const IconData delete = Icons.delete_outlined; + static const IconData expand = Icons.expand_more_outlined; + static const IconData flip = Icons.flip_outlined; + static const IconData favourite = Icons.favorite_border; + static const IconData favouriteActive = Icons.favorite; + static const IconData goUp = Icons.arrow_upward_outlined; + static const IconData group = Icons.group_work_outlined; + static const IconData info = Icons.info_outlined; + static const IconData layers = Icons.layers_outlined; + static const IconData openInNew = Icons.open_in_new_outlined; + static const IconData pin = Icons.push_pin_outlined; + static const IconData print = Icons.print_outlined; + static const IconData refresh = Icons.refresh_outlined; + static const IconData rename = Icons.title_outlined; + static const IconData rotateLeft = Icons.rotate_left_outlined; + static const IconData rotateRight = Icons.rotate_right_outlined; + static const IconData search = Icons.search_outlined; + static const IconData select = Icons.select_all_outlined; + static const IconData share = Icons.share_outlined; + static const IconData sort = Icons.sort_outlined; + static const IconData stats = Icons.pie_chart_outlined; + static const IconData zoomIn = Icons.add_outlined; + static const IconData zoomOut = Icons.remove_outlined; + + // albums + static const IconData album = Icons.photo_album_outlined; + static const IconData cameraAlbum = Icons.photo_camera_outlined; + static const IconData downloadAlbum = Icons.file_download; + static const IconData screenshotAlbum = Icons.smartphone_outlined; + + // thumbnail overlay + static const IconData animated = Icons.slideshow; + static const IconData play = Icons.play_circle_outline; + static const IconData selected = Icons.check_circle_outline; + static const IconData unselected = Icons.radio_button_unchecked; +} diff --git a/lib/utils/flutter_utils.dart b/lib/utils/flutter_utils.dart deleted file mode 100644 index 3f06767b8..000000000 --- a/lib/utils/flutter_utils.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:flutter/widgets.dart'; - -extension ExtraContext on BuildContext { - String get currentRouteName => ModalRoute.of(this)?.settings?.name; -} diff --git a/lib/utils/mime_utils.dart b/lib/utils/mime_utils.dart new file mode 100644 index 000000000..52c223f29 --- /dev/null +++ b/lib/utils/mime_utils.dart @@ -0,0 +1,20 @@ +class MimeUtils { + static String displayType(String mime) { + switch (mime) { + case 'image/x-icon': + return 'ICO'; + case 'image/vnd.adobe.photoshop': + case 'image/x-photoshop': + return 'PSD'; + default: + final patterns = [ + RegExp('.*/'), // remove type, keep subtype + RegExp('(X-|VND.(WAP.)?)'), // noisy prefixes + '+XML', // noisy suffix + ]; + mime = mime.toUpperCase(); + patterns.forEach((pattern) => mime = mime.replaceFirst(pattern, '')); + return mime; + } + } +} diff --git a/lib/widgets/about/about_page.dart b/lib/widgets/about/about_page.dart index a2bba1eee..8abc4a8db 100644 --- a/lib/widgets/about/about_page.dart +++ b/lib/widgets/about/about_page.dart @@ -1,7 +1,7 @@ import 'package:aves/flutter_version.dart'; import 'package:aves/widgets/about/licenses.dart'; -import 'package:aves/widgets/common/aves_logo.dart'; -import 'package:aves/widgets/common/link_chip.dart'; +import 'package:aves/widgets/common/basic/link_chip.dart'; +import 'package:aves/widgets/common/identity/aves_logo.dart'; import 'package:flutter/material.dart'; import 'package:package_info/package_info.dart'; diff --git a/lib/widgets/about/licenses.dart b/lib/widgets/about/licenses.dart index 1944dcbbe..3138ee81c 100644 --- a/lib/widgets/about/licenses.dart +++ b/lib/widgets/about/licenses.dart @@ -1,9 +1,9 @@ -import 'package:aves/utils/brand_colors.dart'; +import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/link_chip.dart'; -import 'package:aves/widgets/common/menu_row.dart'; +import 'package:aves/widgets/common/basic/link_chip.dart'; +import 'package:aves/widgets/common/basic/menu_row.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index c0145fc58..2aaef5061 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -6,17 +6,17 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/services/app_shortcut_service.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/collection/collection_actions.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/model/actions/collection_actions.dart'; import 'package:aves/widgets/collection/filter_bar.dart'; -import 'package:aves/widgets/common/action_delegates/add_shortcut_dialog.dart'; -import 'package:aves/widgets/common/action_delegates/selection_action_delegate.dart'; +import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; +import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; import 'package:aves/widgets/common/app_bar_subtitle.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; -import 'package:aves/widgets/common/aves_selection_dialog.dart'; -import 'package:aves/widgets/common/entry_actions.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/menu_row.dart'; +import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; +import 'package:aves/model/actions/entry_actions.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/menu_row.dart'; import 'package:aves/widgets/search/search_button.dart'; import 'package:aves/widgets/search/search_delegate.dart'; import 'package:aves/widgets/stats/stats.dart'; @@ -42,7 +42,7 @@ class CollectionAppBar extends StatefulWidget { class _CollectionAppBarState extends State with SingleTickerProviderStateMixin { final TextEditingController _searchFieldController = TextEditingController(); - SelectionActionDelegate _actionDelegate; + EntrySetActionDelegate _actionDelegate; AnimationController _browseToSelectAnimation; Future _canAddShortcutsLoader; @@ -55,7 +55,7 @@ class _CollectionAppBarState extends State with SingleTickerPr @override void initState() { super.initState(); - _actionDelegate = SelectionActionDelegate( + _actionDelegate = EntrySetActionDelegate( collection: collection, ); _browseToSelectAnimation = AnimationController( diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 35fdb5981..7a52c08f2 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -1,7 +1,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/collection/thumbnail_collection.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; -import 'package:aves/widgets/common/double_back_pop.dart'; +import 'package:aves/widgets/common/behaviour/double_back_pop.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/drawer/app_drawer.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/common/action_delegates/selection_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart similarity index 90% rename from lib/widgets/common/action_delegates/selection_action_delegate.dart rename to lib/widgets/collection/entry_set_action_delegate.dart index 4c15a613b..33fc671a5 100644 --- a/lib/widgets/common/action_delegates/selection_action_delegate.dart +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -5,26 +5,26 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/image_file_service.dart'; -import 'package:aves/widgets/collection/collection_actions.dart'; -import 'package:aves/widgets/common/action_delegates/feedback.dart'; -import 'package:aves/widgets/common/action_delegates/permission_aware.dart'; -import 'package:aves/widgets/common/action_delegates/size_aware.dart'; -import 'package:aves/widgets/common/aves_dialog.dart'; -import 'package:aves/widgets/common/entry_actions.dart'; +import 'package:aves/model/actions/collection_actions.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/model/actions/entry_actions.dart'; import 'package:aves/widgets/filter_grids/album_pick.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:intl/intl.dart'; -class SelectionActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { +class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { final CollectionLens collection; CollectionSource get source => collection.source; Set get selection => collection.selection; - SelectionActionDelegate({ + EntrySetActionDelegate({ @required this.collection, }); diff --git a/lib/widgets/collection/filter_bar.dart b/lib/widgets/collection/filter_bar.dart index e447f934a..712f21fa3 100644 --- a/lib/widgets/collection/filter_bar.dart +++ b/lib/widgets/collection/filter_bar.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/filters.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:flutter/material.dart'; class FilterBar extends StatefulWidget implements PreferredSizeWidget { diff --git a/lib/widgets/collection/grid/header_album.dart b/lib/widgets/collection/grid/header_album.dart index 5afd82fa3..d5ef85b6a 100644 --- a/lib/widgets/collection/grid/header_album.dart +++ b/lib/widgets/collection/grid/header_album.dart @@ -1,6 +1,7 @@ +import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/collection/grid/header_generic.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; import 'package:flutter/material.dart'; class AlbumSectionHeader extends StatelessWidget { diff --git a/lib/widgets/collection/grid/header_generic.dart b/lib/widgets/collection/grid/header_generic.dart index eabeb55d0..6588e746a 100644 --- a/lib/widgets/collection/grid/header_generic.dart +++ b/lib/widgets/collection/grid/header_generic.dart @@ -5,10 +5,10 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/grid/header_album.dart'; import 'package:aves/widgets/collection/grid/header_date.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/collection/grid/list_sliver.dart b/lib/widgets/collection/grid/list_sliver.dart index 3ed09aea1..e275fc223 100644 --- a/lib/widgets/collection/grid/list_sliver.dart +++ b/lib/widgets/collection/grid/list_sliver.dart @@ -4,8 +4,9 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/viewer_service.dart'; import 'package:aves/widgets/collection/grid/list_known_extent.dart'; import 'package:aves/widgets/collection/grid/list_section_layout.dart'; +import 'package:aves/widgets/collection/grid/scaling.dart'; import 'package:aves/widgets/collection/thumbnail/decorated.dart'; -import 'package:aves/widgets/common/routes.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -70,7 +71,7 @@ class GridThumbnail extends StatelessWidget { } }, child: MetaData( - metaData: ThumbnailMetadata(entry), + metaData: ScalerMetadata(entry), child: DecoratedThumbnail( entry: entry, extent: tileExtent, @@ -94,10 +95,3 @@ class GridThumbnail extends StatelessWidget { ); } } - -// metadata to identify entry from RenderObject hit test during collection scaling -class ThumbnailMetadata { - final ImageEntry entry; - - const ThumbnailMetadata(this.entry); -} diff --git a/lib/widgets/collection/grid/scaling.dart b/lib/widgets/collection/grid/scaling.dart index c64c31308..fab83f78f 100644 --- a/lib/widgets/collection/grid/scaling.dart +++ b/lib/widgets/collection/grid/scaling.dart @@ -1,23 +1,28 @@ import 'dart:math'; import 'dart:ui' as ui; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/collection/grid/list_section_layout.dart'; -import 'package:aves/widgets/collection/grid/list_sliver.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/grid/tile_extent_manager.dart'; import 'package:aves/widgets/collection/thumbnail/decorated.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -import 'package:provider/provider.dart'; -class GridScaleGestureDetector extends StatefulWidget { +// metadata to identify entry from RenderObject hit test during collection scaling +class ScalerMetadata { + final T item; + + const ScalerMetadata(this.item); +} + +class GridScaleGestureDetector extends StatefulWidget { final GlobalKey scrollableKey; final ValueNotifier appBarHeightNotifier; final ValueNotifier extentNotifier; final Size viewportSize; - final void Function(ImageEntry entry) onScaled; + final Widget Function(T item, double extent) scaledBuilder; + final Rect Function(T item) getScaledItemTileRect; + final void Function(T item) onScaled; final Widget child; const GridScaleGestureDetector({ @@ -25,20 +30,22 @@ class GridScaleGestureDetector extends StatefulWidget { @required this.appBarHeightNotifier, @required this.extentNotifier, @required this.viewportSize, - this.onScaled, + @required this.scaledBuilder, + @required this.getScaledItemTileRect, + @required this.onScaled, @required this.child, }); @override - _GridScaleGestureDetectorState createState() => _GridScaleGestureDetectorState(); + _GridScaleGestureDetectorState createState() => _GridScaleGestureDetectorState(); } -class _GridScaleGestureDetectorState extends State { +class _GridScaleGestureDetectorState extends State { double _startExtent, _extentMin, _extentMax; bool _applyingScale = false; ValueNotifier _scaledExtentNotifier; OverlayEntry _overlayEntry; - ThumbnailMetadata _metadata; + ScalerMetadata _metadata; ValueNotifier get tileExtentNotifier => widget.extentNotifier; @@ -60,7 +67,7 @@ class _GridScaleGestureDetectorState extends State { scrollableBox.hitTest(result, position: details.localFocalPoint); // find `RenderObject`s at the gesture focal point - T firstOf(BoxHitTestResult result) => result.path.firstWhere((el) => el.target is T, orElse: () => null)?.target as T; + U firstOf(BoxHitTestResult result) => result.path.firstWhere((el) => el.target is U, orElse: () => null)?.target as U; final renderMetaData = firstOf(result); // abort if we cannot find an image to show on overlay if (renderMetaData == null) return; @@ -75,14 +82,12 @@ class _GridScaleGestureDetectorState extends State { final halfExtent = _startExtent / 2; final thumbnailCenter = renderMetaData.localToGlobal(Offset(halfExtent, halfExtent)); _overlayEntry = OverlayEntry( - builder: (context) { - return ScaleOverlay( - imageEntry: _metadata.entry, - center: thumbnailCenter, - gridWidth: gridWidth, - scaledExtentNotifier: _scaledExtentNotifier, - ); - }, + builder: (context) => ScaleOverlay( + builder: (extent) => widget.scaledBuilder(_metadata.item, extent), + center: thumbnailCenter, + gridWidth: gridWidth, + scaledExtentNotifier: _scaledExtentNotifier, + ), ); Overlay.of(scrollableContext).insert(_overlayEntry); }, @@ -112,8 +117,8 @@ class _GridScaleGestureDetectorState extends State { } else { // scroll to show the focal point thumbnail at its new position WidgetsBinding.instance.addPostFrameCallback((_) { - final entry = _metadata.entry; - _scrollToEntry(entry); + final entry = _metadata.item; + _scrollToItem(entry); // warning: posting `onScaled` in the next frame with `addPostFrameCallback` // would trigger only when the scrollable offset actually changes Future.delayed(Durations.collectionScalingCompleteNotificationDelay).then((_) => widget.onScaled?.call(entry)); @@ -129,11 +134,10 @@ class _GridScaleGestureDetectorState extends State { // `Scrollable.ensureVisible` only works on already rendered objects // `RenderViewport.showOnScreen` can find any `RenderSliver`, but not always a `RenderMetadata` // `RenderViewport.scrollOffsetOf` is a good alternative - void _scrollToEntry(ImageEntry entry) { + void _scrollToItem(T item) { final scrollableContext = widget.scrollableKey.currentContext; final scrollableHeight = (scrollableContext.findRenderObject() as RenderBox).size.height; - final sectionedListLayout = Provider.of(context, listen: false); - final tileRect = sectionedListLayout.getTileRect(entry) ?? Rect.zero; + final tileRect = widget.getScaledItemTileRect(item); // most of the time the app bar will be scrolled away after scaling, // so we compensate for it to center the focal point thumbnail final appBarHeight = widget.appBarHeightNotifier.value; @@ -144,13 +148,13 @@ class _GridScaleGestureDetectorState extends State { } class ScaleOverlay extends StatefulWidget { - final ImageEntry imageEntry; + final Widget Function(double extent) builder; final Offset center; final double gridWidth; final ValueNotifier scaledExtentNotifier; const ScaleOverlay({ - @required this.imageEntry, + @required this.builder, @required this.center, @required this.gridWidth, @required this.scaledExtentNotifier, @@ -225,11 +229,7 @@ class _ScaleOverlayState extends State { top: clampedCenter.dy - extent / 2, child: DefaultTextStyle( style: TextStyle(), - child: DecoratedThumbnail( - entry: widget.imageEntry, - extent: extent, - showOverlay: false, - ), + child: widget.builder(extent), ), ), ], diff --git a/lib/widgets/collection/thumbnail/error.dart b/lib/widgets/collection/thumbnail/error.dart index 3054616cf..f66274fde 100644 --- a/lib/widgets/collection/thumbnail/error.dart +++ b/lib/widgets/collection/thumbnail/error.dart @@ -1,5 +1,5 @@ import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/mime_types.dart'; +import 'package:aves/utils/mime_utils.dart'; import 'package:flutter/material.dart'; class ErrorThumbnail extends StatelessWidget { @@ -22,7 +22,7 @@ class ErrorThumbnail extends StatelessWidget { message: tooltip, preferBelow: false, child: Text( - MimeTypes.displayType(entry.mimeType), + MimeUtils.displayType(entry.mimeType), style: TextStyle( color: Colors.blueGrey, fontSize: extent / 5, diff --git a/lib/widgets/collection/thumbnail/overlay.dart b/lib/widgets/collection/thumbnail/overlay.dart index bde0dd789..8dba26cbf 100644 --- a/lib/widgets/collection/thumbnail/overlay.dart +++ b/lib/widgets/collection/thumbnail/overlay.dart @@ -4,9 +4,10 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/enums.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/fx/sweeper.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; diff --git a/lib/widgets/collection/thumbnail/raster.dart b/lib/widgets/collection/thumbnail/raster.dart index 0b70212dd..573caa1dd 100644 --- a/lib/widgets/collection/thumbnail/raster.dart +++ b/lib/widgets/collection/thumbnail/raster.dart @@ -1,11 +1,11 @@ import 'dart:math'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/image_providers/uri_image_provider.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/thumbnail/error.dart'; -import 'package:aves/widgets/common/image_providers/thumbnail_provider.dart'; -import 'package:aves/widgets/common/image_providers/uri_image_provider.dart'; -import 'package:aves/widgets/common/transition_image.dart'; +import 'package:aves/widgets/common/fx/transition_image.dart'; import 'package:flutter/material.dart'; class ThumbnailRasterImage extends StatefulWidget { diff --git a/lib/widgets/collection/thumbnail/vector.dart b/lib/widgets/collection/thumbnail/vector.dart index 58f71609d..ed238e02e 100644 --- a/lib/widgets/collection/thumbnail/vector.dart +++ b/lib/widgets/collection/thumbnail/vector.dart @@ -1,6 +1,6 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/widgets/common/image_providers/uri_picture_provider.dart'; +import 'package:aves/image_providers/uri_picture_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/collection/thumbnail_collection.dart b/lib/widgets/collection/thumbnail_collection.dart index 3e1d1f781..e7788cf94 100644 --- a/lib/widgets/collection/thumbnail_collection.dart +++ b/lib/widgets/collection/thumbnail_collection.dart @@ -2,24 +2,25 @@ import 'dart:async'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; -import 'package:aves/model/mime_types.dart'; +import 'package:aves/model/image_entry.dart'; +import 'package:aves/ref/mime_types.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/app_bar.dart'; import 'package:aves/widgets/collection/empty.dart'; import 'package:aves/widgets/collection/grid/list_section_layout.dart'; import 'package:aves/widgets/collection/grid/list_sliver.dart'; import 'package:aves/widgets/collection/grid/scaling.dart'; import 'package:aves/widgets/collection/grid/tile_extent_manager.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/scroll_thumb.dart'; -import 'package:aves/widgets/common/sloppy_scroll_physics.dart'; +import 'package:aves/widgets/collection/thumbnail/decorated.dart'; +import 'package:aves/widgets/common/behaviour/sloppy_scroll_physics.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/identity/scroll_thumb.dart'; import 'package:draggable_scrollbar/draggable_scrollbar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:provider/provider.dart'; -import 'package:tuple/tuple.dart'; class ThumbnailCollection extends StatelessWidget { final ValueNotifier _appBarHeightNotifier = ValueNotifier(0); @@ -30,16 +31,14 @@ class ThumbnailCollection extends StatelessWidget { @override Widget build(BuildContext context) { return SafeArea( - child: Selector>( - selector: (context, mq) => Tuple2(mq.size, mq.padding.horizontal), - builder: (context, mq, child) { - final mqSize = mq.item1; - final mqHorizontalPadding = mq.item2; + child: LayoutBuilder( + builder: (context, constraints) { + final viewportSize = constraints.biggest; + assert(viewportSize.isFinite, 'Cannot layout collection with unbounded constraints.'); + if (viewportSize.isEmpty) return SizedBox.shrink(); - if (mqSize.isEmpty) return SizedBox.shrink(); - - TileExtentManager.applyTileExtent(Size(mqSize.width - mqHorizontalPadding, mqSize.height), _tileExtentNotifier); - final cacheExtent = TileExtentManager.extentMaxForSize(mqSize) * 2; + TileExtentManager.applyTileExtent(viewportSize, _tileExtentNotifier); + final cacheExtent = TileExtentManager.extentMaxForSize(viewportSize) * 2; // do not replace by Provider.of // so that view updates on collection filter changes @@ -58,11 +57,20 @@ class ThumbnailCollection extends StatelessWidget { cacheExtent: cacheExtent, ); - final scaler = GridScaleGestureDetector( + final scaler = GridScaleGestureDetector( scrollableKey: _scrollableKey, appBarHeightNotifier: _appBarHeightNotifier, extentNotifier: _tileExtentNotifier, - viewportSize: Size(mqSize.width - mqHorizontalPadding, mqSize.height), + viewportSize: viewportSize, + scaledBuilder: (entry, extent) => DecoratedThumbnail( + entry: entry, + extent: extent, + showOverlay: false, + ), + getScaledItemTileRect: (entry) { + final sectionedListLayout = Provider.of(context, listen: false); + return sectionedListLayout.getTileRect(entry) ?? Rect.zero; + }, onScaled: collection.highlight, child: scrollView, ); @@ -71,7 +79,7 @@ class ThumbnailCollection extends StatelessWidget { valueListenable: _tileExtentNotifier, builder: (context, tileExtent, child) => SectionedListLayoutProvider( collection: collection, - scrollableWidth: mqSize.width - mqHorizontalPadding, + scrollableWidth: viewportSize.width, tileExtent: tileExtent, thumbnailBuilder: (entry) => GridThumbnail( key: ValueKey(entry.contentId), diff --git a/lib/widgets/common/action_delegates/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart similarity index 98% rename from lib/widgets/common/action_delegates/feedback.dart rename to lib/widgets/common/action_mixins/feedback.dart index 4f87464b0..eca65b6c9 100644 --- a/lib/widgets/common/action_delegates/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -1,6 +1,6 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/services/image_file_service.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:flushbar/flushbar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; diff --git a/lib/widgets/common/action_delegates/permission_aware.dart b/lib/widgets/common/action_mixins/permission_aware.dart similarity index 97% rename from lib/widgets/common/action_delegates/permission_aware.dart rename to lib/widgets/common/action_mixins/permission_aware.dart index 69816d96f..58b896830 100644 --- a/lib/widgets/common/action_delegates/permission_aware.dart +++ b/lib/widgets/common/action_mixins/permission_aware.dart @@ -1,9 +1,8 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/services/android_file_service.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:flutter/material.dart'; -import '../aves_dialog.dart'; - mixin PermissionAwareMixin { Future checkStoragePermission(BuildContext context, Set entries) { return checkStoragePermissionForAlbums(context, entries.where((e) => e.path != null).map((e) => e.directory).toSet()); diff --git a/lib/widgets/common/action_delegates/size_aware.dart b/lib/widgets/common/action_mixins/size_aware.dart similarity index 97% rename from lib/widgets/common/action_delegates/size_aware.dart rename to lib/widgets/common/action_mixins/size_aware.dart index 1b49dedda..d3d7bd18c 100644 --- a/lib/widgets/common/action_delegates/size_aware.dart +++ b/lib/widgets/common/action_mixins/size_aware.dart @@ -5,7 +5,7 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/services/android_file_service.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/file_utils.dart'; -import 'package:aves/widgets/common/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/widgets/common/app_bar_subtitle.dart b/lib/widgets/common/app_bar_subtitle.dart index 497bf3d69..8b44a7520 100644 --- a/lib/widgets/common/app_bar_subtitle.dart +++ b/lib/widgets/common/app_bar_subtitle.dart @@ -1,5 +1,5 @@ import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:flutter/material.dart'; class SourceStateAwareAppBarTitle extends StatelessWidget { diff --git a/lib/widgets/common/labeled_checkbox.dart b/lib/widgets/common/basic/labeled_checkbox.dart similarity index 100% rename from lib/widgets/common/labeled_checkbox.dart rename to lib/widgets/common/basic/labeled_checkbox.dart diff --git a/lib/widgets/common/link_chip.dart b/lib/widgets/common/basic/link_chip.dart similarity index 96% rename from lib/widgets/common/link_chip.dart rename to lib/widgets/common/basic/link_chip.dart index 8b7e801d8..c0f54a506 100644 --- a/lib/widgets/common/link_chip.dart +++ b/lib/widgets/common/basic/link_chip.dart @@ -1,4 +1,4 @@ -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/widgets/common/menu_row.dart b/lib/widgets/common/basic/menu_row.dart similarity index 93% rename from lib/widgets/common/menu_row.dart rename to lib/widgets/common/basic/menu_row.dart index 29cf302bb..c14161c84 100644 --- a/lib/widgets/common/menu_row.dart +++ b/lib/widgets/common/basic/menu_row.dart @@ -1,4 +1,4 @@ -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:flutter/material.dart'; class MenuRow extends StatelessWidget { diff --git a/lib/widgets/common/fx/outlined_text.dart b/lib/widgets/common/basic/outlined_text.dart similarity index 100% rename from lib/widgets/common/fx/outlined_text.dart rename to lib/widgets/common/basic/outlined_text.dart diff --git a/lib/widgets/common/aves_radio_list_tile.dart b/lib/widgets/common/basic/reselectable_radio_list_tile.dart similarity index 96% rename from lib/widgets/common/aves_radio_list_tile.dart rename to lib/widgets/common/basic/reselectable_radio_list_tile.dart index 424a26b10..f90a4a159 100644 --- a/lib/widgets/common/aves_radio_list_tile.dart +++ b/lib/widgets/common/basic/reselectable_radio_list_tile.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; // `RadioListTile` that can trigger `onChanged` on tap when already selected, if `reselectable` is true -class AvesRadioListTile extends StatelessWidget { +class ReselectableRadioListTile extends StatelessWidget { final T value; final T groupValue; final ValueChanged onChanged; @@ -19,7 +19,7 @@ class AvesRadioListTile extends StatelessWidget { bool get checked => value == groupValue; - const AvesRadioListTile({ + const ReselectableRadioListTile({ Key key, @required this.value, @required this.groupValue, diff --git a/lib/widgets/common/double_back_pop.dart b/lib/widgets/common/behaviour/double_back_pop.dart similarity index 92% rename from lib/widgets/common/double_back_pop.dart rename to lib/widgets/common/behaviour/double_back_pop.dart index dda008461..4a844fdda 100644 --- a/lib/widgets/common/double_back_pop.dart +++ b/lib/widgets/common/behaviour/double_back_pop.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/action_delegates/feedback.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:overlay_support/overlay_support.dart'; diff --git a/lib/utils/route_tracker.dart b/lib/widgets/common/behaviour/route_tracker.dart similarity index 100% rename from lib/utils/route_tracker.dart rename to lib/widgets/common/behaviour/route_tracker.dart diff --git a/lib/widgets/common/routes.dart b/lib/widgets/common/behaviour/routes.dart similarity index 90% rename from lib/widgets/common/routes.dart rename to lib/widgets/common/behaviour/routes.dart index a5ac9d079..03e460480 100644 --- a/lib/widgets/common/routes.dart +++ b/lib/widgets/common/behaviour/routes.dart @@ -1,5 +1,9 @@ import 'package:flutter/material.dart'; +extension ExtraContext on BuildContext { + String get currentRouteName => ModalRoute.of(this)?.settings?.name; +} + class DirectMaterialPageRoute extends PageRouteBuilder { DirectMaterialPageRoute({ RouteSettings settings, diff --git a/lib/widgets/common/sloppy_scroll_physics.dart b/lib/widgets/common/behaviour/sloppy_scroll_physics.dart similarity index 100% rename from lib/widgets/common/sloppy_scroll_physics.dart rename to lib/widgets/common/behaviour/sloppy_scroll_physics.dart diff --git a/lib/widgets/common/borders.dart b/lib/widgets/common/fx/borders.dart similarity index 100% rename from lib/widgets/common/borders.dart rename to lib/widgets/common/fx/borders.dart diff --git a/lib/widgets/common/fx/sweeper.dart b/lib/widgets/common/fx/sweeper.dart index 92bf7bd42..9a44bc053 100644 --- a/lib/widgets/common/fx/sweeper.dart +++ b/lib/widgets/common/fx/sweeper.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; diff --git a/lib/widgets/common/transition_image.dart b/lib/widgets/common/fx/transition_image.dart similarity index 100% rename from lib/widgets/common/transition_image.dart rename to lib/widgets/common/fx/transition_image.dart diff --git a/lib/widgets/common/aves_expansion_tile.dart b/lib/widgets/common/identity/aves_expansion_tile.dart similarity index 95% rename from lib/widgets/common/aves_expansion_tile.dart rename to lib/widgets/common/identity/aves_expansion_tile.dart index e1a60a9fd..7ae1393c6 100644 --- a/lib/widgets/common/aves_expansion_tile.dart +++ b/lib/widgets/common/identity/aves_expansion_tile.dart @@ -1,4 +1,4 @@ -import 'package:aves/widgets/common/highlight_title.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; import 'package:expansion_tile_card/expansion_tile_card.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/common/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart similarity index 98% rename from lib/widgets/common/aves_filter_chip.dart rename to lib/widgets/common/identity/aves_filter_chip.dart index 314a2a38b..732d27485 100644 --- a/lib/widgets/common/aves_filter_chip.dart +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/widgets/common/icons.dart'; import 'package:flutter/material.dart'; typedef FilterCallback = void Function(CollectionFilter filter); @@ -28,7 +28,7 @@ class AvesFilterChip extends StatefulWidget { const AvesFilterChip({ Key key, - this.filter, + @required this.filter, this.removable = false, this.showGenericIcon = true, this.background, @@ -36,7 +36,8 @@ class AvesFilterChip extends StatefulWidget { this.heroType = HeroType.onTap, @required this.onTap, this.onLongPress, - }) : super(key: key); + }) : assert(filter != null), + super(key: key); @override _AvesFilterChipState createState() => _AvesFilterChipState(); diff --git a/lib/widgets/common/icons.dart b/lib/widgets/common/identity/aves_icons.dart similarity index 52% rename from lib/widgets/common/icons.dart rename to lib/widgets/common/identity/aves_icons.dart index 13fd1fa36..c6ed8fb77 100644 --- a/lib/widgets/common/icons.dart +++ b/lib/widgets/common/identity/aves_icons.dart @@ -1,77 +1,12 @@ import 'dart:ui'; +import 'package:aves/image_providers/app_icon_image_provider.dart'; import 'package:aves/model/image_entry.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/image_providers/app_icon_image_provider.dart'; import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; -import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; - -class AIcons { - static const IconData allCollection = Icons.collections_outlined; - static const IconData image = Icons.photo_outlined; - static const IconData video = Icons.movie_outlined; - static const IconData audio = Icons.audiotrack_outlined; - static const IconData vector = Icons.code_outlined; - - static const IconData android = Icons.android; - static const IconData checked = Icons.done_outlined; - static const IconData date = Icons.calendar_today_outlined; - static const IconData disc = Icons.fiber_manual_record; - static const IconData error = Icons.error_outline; - static const IconData location = Icons.place_outlined; - static const IconData locationOff = Icons.location_off_outlined; - static const IconData raw = Icons.camera_outlined; - static const IconData shooting = Icons.camera_outlined; - static const IconData removableStorage = Icons.sd_storage_outlined; - static const IconData settings = Icons.settings_outlined; - static const IconData text = Icons.format_quote_outlined; - static const IconData tag = Icons.local_offer_outlined; - static const IconData tagOff = MdiIcons.tagOffOutline; - - // actions - static const IconData addShortcut = Icons.add_to_home_screen_outlined; - static const IconData clear = Icons.clear_outlined; - static const IconData collapse = Icons.expand_less_outlined; - static const IconData createAlbum = Icons.add_circle_outline; - static const IconData debug = Icons.whatshot_outlined; - static const IconData delete = Icons.delete_outlined; - static const IconData expand = Icons.expand_more_outlined; - static const IconData flip = Icons.flip_outlined; - static const IconData favourite = Icons.favorite_border; - static const IconData favouriteActive = Icons.favorite; - static const IconData goUp = Icons.arrow_upward_outlined; - static const IconData group = Icons.group_work_outlined; - static const IconData info = Icons.info_outlined; - static const IconData layers = Icons.layers_outlined; - static const IconData openInNew = Icons.open_in_new_outlined; - static const IconData pin = Icons.push_pin_outlined; - static const IconData print = Icons.print_outlined; - static const IconData refresh = Icons.refresh_outlined; - static const IconData rename = Icons.title_outlined; - static const IconData rotateLeft = Icons.rotate_left_outlined; - static const IconData rotateRight = Icons.rotate_right_outlined; - static const IconData search = Icons.search_outlined; - static const IconData select = Icons.select_all_outlined; - static const IconData share = Icons.share_outlined; - static const IconData sort = Icons.sort_outlined; - static const IconData stats = Icons.pie_chart_outlined; - static const IconData zoomIn = Icons.add_outlined; - static const IconData zoomOut = Icons.remove_outlined; - - // albums - static const IconData album = Icons.photo_album_outlined; - static const IconData cameraAlbum = Icons.photo_camera_outlined; - static const IconData downloadAlbum = Icons.file_download; - static const IconData screenshotAlbum = Icons.smartphone_outlined; - - // thumbnail overlay - static const IconData animated = Icons.slideshow; - static const IconData play = Icons.play_circle_outline; - static const IconData selected = Icons.check_circle_outline; - static const IconData unselected = Icons.radio_button_unchecked; -} class VideoIcon extends StatelessWidget { final ImageEntry entry; diff --git a/lib/widgets/common/aves_logo.dart b/lib/widgets/common/identity/aves_logo.dart similarity index 100% rename from lib/widgets/common/aves_logo.dart rename to lib/widgets/common/identity/aves_logo.dart diff --git a/lib/widgets/common/highlight_title.dart b/lib/widgets/common/identity/highlight_title.dart similarity index 100% rename from lib/widgets/common/highlight_title.dart rename to lib/widgets/common/identity/highlight_title.dart diff --git a/lib/widgets/common/scroll_thumb.dart b/lib/widgets/common/identity/scroll_thumb.dart similarity index 100% rename from lib/widgets/common/scroll_thumb.dart rename to lib/widgets/common/identity/scroll_thumb.dart diff --git a/lib/widgets/common/data_providers/media_query_data_provider.dart b/lib/widgets/common/providers/media_query_data_provider.dart similarity index 100% rename from lib/widgets/common/data_providers/media_query_data_provider.dart rename to lib/widgets/common/providers/media_query_data_provider.dart diff --git a/lib/widgets/common/data_providers/settings_provider.dart b/lib/widgets/common/providers/settings_provider.dart similarity index 100% rename from lib/widgets/common/data_providers/settings_provider.dart rename to lib/widgets/common/providers/settings_provider.dart diff --git a/lib/widgets/debug/android_env.dart b/lib/widgets/debug/android_env.dart index cb0fa1aa5..e590c9cfe 100644 --- a/lib/widgets/debug/android_env.dart +++ b/lib/widgets/debug/android_env.dart @@ -1,7 +1,7 @@ import 'dart:collection'; import 'package:aves/services/android_app_service.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/debug/app_debug_page.dart b/lib/widgets/debug/app_debug_page.dart index 2ae163bf1..a3c609ab7 100644 --- a/lib/widgets/debug/app_debug_page.dart +++ b/lib/widgets/debug/app_debug_page.dart @@ -1,7 +1,7 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/debug/android_env.dart'; import 'package:aves/widgets/debug/cache.dart'; import 'package:aves/widgets/debug/database.dart'; diff --git a/lib/widgets/debug/cache.dart b/lib/widgets/debug/cache.dart index eeb85e308..09b8e9aa3 100644 --- a/lib/widgets/debug/cache.dart +++ b/lib/widgets/debug/cache.dart @@ -1,6 +1,6 @@ import 'package:aves/services/image_file_service.dart'; import 'package:aves/utils/file_utils.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; diff --git a/lib/widgets/debug/database.dart b/lib/widgets/debug/database.dart index 5c8f9ff19..bcf80693b 100644 --- a/lib/widgets/debug/database.dart +++ b/lib/widgets/debug/database.dart @@ -3,7 +3,7 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_metadata.dart'; import 'package:aves/model/metadata_db.dart'; import 'package:aves/utils/file_utils.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:flutter/material.dart'; class DebugAppDatabaseSection extends StatefulWidget { diff --git a/lib/widgets/debug/firebase.dart b/lib/widgets/debug/firebase.dart index f98d14a91..9551cbfe1 100644 --- a/lib/widgets/debug/firebase.dart +++ b/lib/widgets/debug/firebase.dart @@ -1,4 +1,4 @@ -import 'package:aves/widgets/common/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_core/firebase_core.dart'; diff --git a/lib/widgets/debug/settings.dart b/lib/widgets/debug/settings.dart index 36e68c18f..05e58c137 100644 --- a/lib/widgets/debug/settings.dart +++ b/lib/widgets/debug/settings.dart @@ -1,5 +1,5 @@ import 'package:aves/model/settings/settings.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/debug/storage.dart b/lib/widgets/debug/storage.dart index 1e62b90bb..2c22b29f9 100644 --- a/lib/widgets/debug/storage.dart +++ b/lib/widgets/debug/storage.dart @@ -1,7 +1,7 @@ import 'package:aves/services/android_file_service.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/file_utils.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/common/action_delegates/add_shortcut_dialog.dart b/lib/widgets/dialogs/add_shortcut_dialog.dart similarity index 98% rename from lib/widgets/common/action_delegates/add_shortcut_dialog.dart rename to lib/widgets/dialogs/add_shortcut_dialog.dart index 93e2522a2..b321ec0c1 100644 --- a/lib/widgets/common/action_delegates/add_shortcut_dialog.dart +++ b/lib/widgets/dialogs/add_shortcut_dialog.dart @@ -1,7 +1,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:flutter/material.dart'; -import '../aves_dialog.dart'; +import 'aves_dialog.dart'; class AddShortcutDialog extends StatefulWidget { final Set filters; diff --git a/lib/widgets/common/aves_dialog.dart b/lib/widgets/dialogs/aves_dialog.dart similarity index 91% rename from lib/widgets/common/aves_dialog.dart rename to lib/widgets/dialogs/aves_dialog.dart index 2753de93d..adf8898f8 100644 --- a/lib/widgets/common/aves_dialog.dart +++ b/lib/widgets/dialogs/aves_dialog.dart @@ -14,11 +14,13 @@ class AvesDialog extends AlertDialog { @required List actions, }) : assert((scrollableContent != null) ^ (content != null)), super( - title: title != null ? Padding( - // padding to avoid transparent border overlapping - padding: EdgeInsets.symmetric(horizontal: borderWidth), - child: DialogTitle(title: title), - ) : null, + title: title != null + ? Padding( + // padding to avoid transparent border overlapping + padding: EdgeInsets.symmetric(horizontal: borderWidth), + child: DialogTitle(title: title), + ) + : null, titlePadding: EdgeInsets.zero, // the `scrollable` flag of `AlertDialog` makes it // scroll both the title and the content together, diff --git a/lib/widgets/common/aves_selection_dialog.dart b/lib/widgets/dialogs/aves_selection_dialog.dart similarity index 94% rename from lib/widgets/common/aves_selection_dialog.dart rename to lib/widgets/dialogs/aves_selection_dialog.dart index 920626ffe..c4e5c7e4b 100644 --- a/lib/widgets/common/aves_selection_dialog.dart +++ b/lib/widgets/dialogs/aves_selection_dialog.dart @@ -1,4 +1,4 @@ -import 'package:aves/widgets/common/aves_radio_list_tile.dart'; +import 'package:aves/widgets/common/basic/reselectable_radio_list_tile.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -48,7 +48,7 @@ class _AvesSelectionDialogState extends State { } Widget _buildRadioListTile(T value, String title) { - return AvesRadioListTile( + return ReselectableRadioListTile( key: Key(value.toString()), value: value, groupValue: _selectedValue, diff --git a/lib/widgets/common/action_delegates/create_album_dialog.dart b/lib/widgets/dialogs/create_album_dialog.dart similarity index 98% rename from lib/widgets/common/action_delegates/create_album_dialog.dart rename to lib/widgets/dialogs/create_album_dialog.dart index 02d41d050..101d35d4e 100644 --- a/lib/widgets/common/action_delegates/create_album_dialog.dart +++ b/lib/widgets/dialogs/create_album_dialog.dart @@ -1,12 +1,12 @@ import 'dart:io'; import 'package:aves/utils/android_file_utils.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:path/path.dart'; -import '../aves_dialog.dart'; +import 'aves_dialog.dart'; class CreateAlbumDialog extends StatefulWidget { @override diff --git a/lib/widgets/common/action_delegates/rename_album_dialog.dart b/lib/widgets/dialogs/rename_album_dialog.dart similarity index 98% rename from lib/widgets/common/action_delegates/rename_album_dialog.dart rename to lib/widgets/dialogs/rename_album_dialog.dart index 76e90580a..f9e3f10f4 100644 --- a/lib/widgets/common/action_delegates/rename_album_dialog.dart +++ b/lib/widgets/dialogs/rename_album_dialog.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as path; -import '../aves_dialog.dart'; +import '../dialogs/aves_dialog.dart'; class RenameAlbumDialog extends StatefulWidget { final String album; diff --git a/lib/widgets/common/action_delegates/rename_entry_dialog.dart b/lib/widgets/dialogs/rename_entry_dialog.dart similarity index 98% rename from lib/widgets/common/action_delegates/rename_entry_dialog.dart rename to lib/widgets/dialogs/rename_entry_dialog.dart index 7bd875f14..b28e25730 100644 --- a/lib/widgets/common/action_delegates/rename_entry_dialog.dart +++ b/lib/widgets/dialogs/rename_entry_dialog.dart @@ -4,7 +4,7 @@ import 'package:aves/model/image_entry.dart'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as path; -import '../aves_dialog.dart'; +import 'aves_dialog.dart'; class RenameEntryDialog extends StatefulWidget { final ImageEntry entry; diff --git a/lib/widgets/drawer/app_drawer.dart b/lib/widgets/drawer/app_drawer.dart index cbb1d70ad..1daea1536 100644 --- a/lib/widgets/drawer/app_drawer.dart +++ b/lib/widgets/drawer/app_drawer.dart @@ -3,15 +3,16 @@ import 'dart:ui'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; -import 'package:aves/model/mime_types.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/location.dart'; import 'package:aves/model/source/tag.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/about/about_page.dart'; -import 'package:aves/widgets/common/aves_logo.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/common/identity/aves_icons.dart'; +import 'package:aves/widgets/common/identity/aves_logo.dart'; import 'package:aves/widgets/debug/app_debug_page.dart'; import 'package:aves/widgets/drawer/collection_tile.dart'; import 'package:aves/widgets/drawer/tile.dart'; diff --git a/lib/widgets/drawer/tile.dart b/lib/widgets/drawer/tile.dart index 3fbbfbecb..b2bbb7614 100644 --- a/lib/widgets/drawer/tile.dart +++ b/lib/widgets/drawer/tile.dart @@ -1,6 +1,6 @@ import 'dart:ui'; -import 'package:aves/utils/flutter_utils.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/filter_grids/album_pick.dart b/lib/widgets/filter_grids/album_pick.dart index 09c653e15..0ac6b4413 100644 --- a/lib/widgets/filter_grids/album_pick.dart +++ b/lib/widgets/filter_grids/album_pick.dart @@ -1,14 +1,14 @@ +import 'package:aves/model/actions/chip_actions.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/utils/debouncer.dart'; -import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/common/action_delegates/create_album_dialog.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/dialogs/create_album_dialog.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; -import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; import 'package:aves/widgets/filter_grids/common/chip_set_action_delegate.dart'; import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/widgets/filter_grids/albums_page.dart b/lib/widgets/filter_grids/albums_page.dart index a83481524..a7604e3ef 100644 --- a/lib/widgets/filter_grids/albums_page.dart +++ b/lib/widgets/filter_grids/albums_page.dart @@ -7,9 +7,9 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/filter_grids/common/chip_action_delegate.dart'; -import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; +import 'package:aves/model/actions/chip_actions.dart'; import 'package:aves/widgets/filter_grids/common/chip_set_action_delegate.dart'; import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; import 'package:collection/collection.dart'; diff --git a/lib/widgets/filter_grids/common/chip_action_delegate.dart b/lib/widgets/filter_grids/common/chip_action_delegate.dart index 40e708dc7..15fec7a8c 100644 --- a/lib/widgets/filter_grids/common/chip_action_delegate.dart +++ b/lib/widgets/filter_grids/common/chip_action_delegate.dart @@ -1,14 +1,14 @@ +import 'package:aves/model/actions/chip_actions.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/image_file_service.dart'; -import 'package:aves/widgets/common/action_delegates/feedback.dart'; -import 'package:aves/widgets/common/action_delegates/permission_aware.dart'; -import 'package:aves/widgets/common/action_delegates/rename_album_dialog.dart'; -import 'package:aves/widgets/common/action_delegates/size_aware.dart'; -import 'package:aves/widgets/common/aves_dialog.dart'; -import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/rename_album_dialog.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:path/path.dart' as path; diff --git a/lib/widgets/filter_grids/common/chip_set_action_delegate.dart b/lib/widgets/filter_grids/common/chip_set_action_delegate.dart index b71436362..4e2db7de1 100644 --- a/lib/widgets/filter_grids/common/chip_set_action_delegate.dart +++ b/lib/widgets/filter_grids/common/chip_set_action_delegate.dart @@ -1,8 +1,8 @@ +import 'package:aves/model/actions/chip_actions.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; -import 'package:aves/widgets/common/aves_selection_dialog.dart'; -import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; +import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:aves/widgets/stats/stats.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/filter_grids/common/decorated_filter_chip.dart b/lib/widgets/filter_grids/common/decorated_filter_chip.dart index 19a2d4908..245b8cd12 100644 --- a/lib/widgets/filter_grids/common/decorated_filter_chip.dart +++ b/lib/widgets/filter_grids/common/decorated_filter_chip.dart @@ -6,11 +6,11 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/thumbnail/raster.dart'; import 'package:aves/widgets/collection/thumbnail/vector.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 33288111d..1a14338fb 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -6,19 +6,19 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/app_bar_subtitle.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; -import 'package:aves/widgets/common/double_back_pop.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/menu_row.dart'; -import 'package:aves/widgets/common/scroll_thumb.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/behaviour/double_back_pop.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/menu_row.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/identity/scroll_thumb.dart'; import 'package:aves/widgets/drawer/app_drawer.dart'; import 'package:aves/widgets/filter_grids/common/chip_action_delegate.dart'; -import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; +import 'package:aves/model/actions/chip_actions.dart'; import 'package:aves/widgets/filter_grids/common/chip_set_action_delegate.dart'; import 'package:aves/widgets/filter_grids/common/decorated_filter_chip.dart'; import 'package:aves/widgets/search/search_button.dart'; diff --git a/lib/widgets/filter_grids/countries_page.dart b/lib/widgets/filter_grids/countries_page.dart index 170c837f0..0e5bec313 100644 --- a/lib/widgets/filter_grids/countries_page.dart +++ b/lib/widgets/filter_grids/countries_page.dart @@ -1,3 +1,4 @@ +import 'package:aves/model/actions/chip_actions.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/image_entry.dart'; @@ -5,10 +6,9 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/model/source/location.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/filter_grids/common/chip_action_delegate.dart'; -import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; import 'package:aves/widgets/filter_grids/common/chip_set_action_delegate.dart'; import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; import 'package:collection/collection.dart'; diff --git a/lib/widgets/filter_grids/tags_page.dart b/lib/widgets/filter_grids/tags_page.dart index 97ebc9468..312f4d926 100644 --- a/lib/widgets/filter_grids/tags_page.dart +++ b/lib/widgets/filter_grids/tags_page.dart @@ -6,9 +6,9 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/model/source/tag.dart'; import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/filter_grids/common/chip_action_delegate.dart'; -import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; +import 'package:aves/model/actions/chip_actions.dart'; import 'package:aves/widgets/filter_grids/common/chip_set_action_delegate.dart'; import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; import 'package:collection/collection.dart'; diff --git a/lib/widgets/fullscreen/debug/metadata.dart b/lib/widgets/fullscreen/debug/metadata.dart index d4b03340f..dca1ec6ef 100644 --- a/lib/widgets/fullscreen/debug/metadata.dart +++ b/lib/widgets/fullscreen/debug/metadata.dart @@ -4,7 +4,7 @@ import 'dart:typed_data'; import 'package:aves/model/image_entry.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/common/action_delegates/entry_action_delegate.dart b/lib/widgets/fullscreen/entry_action_delegate.dart similarity index 94% rename from lib/widgets/common/action_delegates/entry_action_delegate.dart rename to lib/widgets/fullscreen/entry_action_delegate.dart index 3b0e4c63e..e77491913 100644 --- a/lib/widgets/common/action_delegates/entry_action_delegate.dart +++ b/lib/widgets/fullscreen/entry_action_delegate.dart @@ -1,13 +1,13 @@ +import 'package:aves/image_providers/uri_image_provider.dart'; +import 'package:aves/model/actions/entry_actions.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/image_file_service.dart'; -import 'package:aves/widgets/common/action_delegates/feedback.dart'; -import 'package:aves/widgets/common/action_delegates/permission_aware.dart'; -import 'package:aves/widgets/common/action_delegates/rename_entry_dialog.dart'; -import 'package:aves/widgets/common/aves_dialog.dart'; -import 'package:aves/widgets/common/entry_actions.dart'; -import 'package:aves/widgets/common/image_providers/uri_image_provider.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/rename_entry_dialog.dart'; import 'package:aves/widgets/fullscreen/fullscreen_debug_page.dart'; import 'package:aves/widgets/fullscreen/source_viewer_page.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/fullscreen_body.dart b/lib/widgets/fullscreen/fullscreen_body.dart index bbb8b3011..3fce014bf 100644 --- a/lib/widgets/fullscreen/fullscreen_body.dart +++ b/lib/widgets/fullscreen/fullscreen_body.dart @@ -6,9 +6,9 @@ import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/utils/change_notifier.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/collection_page.dart'; -import 'package:aves/widgets/common/action_delegates/entry_action_delegate.dart'; +import 'package:aves/widgets/fullscreen/entry_action_delegate.dart'; import 'package:aves/widgets/fullscreen/image_page.dart'; import 'package:aves/widgets/fullscreen/image_view.dart'; import 'package:aves/widgets/fullscreen/info/info_page.dart'; diff --git a/lib/widgets/fullscreen/fullscreen_debug_page.dart b/lib/widgets/fullscreen/fullscreen_debug_page.dart index 2a79c4481..50e55e24e 100644 --- a/lib/widgets/fullscreen/fullscreen_debug_page.dart +++ b/lib/widgets/fullscreen/fullscreen_debug_page.dart @@ -1,8 +1,8 @@ import 'package:aves/main.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/image_providers/thumbnail_provider.dart'; -import 'package:aves/widgets/common/image_providers/uri_picture_provider.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/image_providers/uri_picture_provider.dart'; import 'package:aves/widgets/fullscreen/debug/db.dart'; import 'package:aves/widgets/fullscreen/debug/metadata.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; diff --git a/lib/widgets/fullscreen/fullscreen_page.dart b/lib/widgets/fullscreen/fullscreen_page.dart index 142bfd344..8691f2f3e 100644 --- a/lib/widgets/fullscreen/fullscreen_page.dart +++ b/lib/widgets/fullscreen/fullscreen_page.dart @@ -1,6 +1,6 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/fullscreen/fullscreen_body.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/image_view.dart b/lib/widgets/fullscreen/image_view.dart index b40fa028a..c5ee6c31d 100644 --- a/lib/widgets/fullscreen/image_view.dart +++ b/lib/widgets/fullscreen/image_view.dart @@ -1,12 +1,12 @@ import 'dart:async'; +import 'package:aves/image_providers/thumbnail_provider.dart'; +import 'package:aves/image_providers/uri_image_provider.dart'; +import 'package:aves/image_providers/uri_picture_provider.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/image_providers/thumbnail_provider.dart'; -import 'package:aves/widgets/common/image_providers/uri_image_provider.dart'; -import 'package:aves/widgets/common/image_providers/uri_picture_provider.dart'; import 'package:aves/widgets/fullscreen/tiled_view.dart'; import 'package:aves/widgets/fullscreen/video_view.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/widgets/fullscreen/info/basic_section.dart b/lib/widgets/fullscreen/info/basic_section.dart index 6fa89b94c..7b07a39a9 100644 --- a/lib/widgets/fullscreen/info/basic_section.dart +++ b/lib/widgets/fullscreen/info/basic_section.dart @@ -4,11 +4,11 @@ import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/mime_types.dart'; import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/ref/mime_types.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/utils/file_utils.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/info/common.dart b/lib/widgets/fullscreen/info/common.dart index 5df0ffc7c..d6d7acd4c 100644 --- a/lib/widgets/fullscreen/info/common.dart +++ b/lib/widgets/fullscreen/info/common.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; diff --git a/lib/widgets/fullscreen/info/info_page.dart b/lib/widgets/fullscreen/info/info_page.dart index edaedd16d..bf9f10780 100644 --- a/lib/widgets/fullscreen/info/info_page.dart +++ b/lib/widgets/fullscreen/info/info_page.dart @@ -1,9 +1,9 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/fullscreen/info/basic_section.dart'; import 'package:aves/widgets/fullscreen/info/location_section.dart'; import 'package:aves/widgets/fullscreen/info/metadata/metadata_section.dart'; diff --git a/lib/widgets/fullscreen/info/location_section.dart b/lib/widgets/fullscreen/info/location_section.dart index acd8e5e59..e6d1475d7 100644 --- a/lib/widgets/fullscreen/info/location_section.dart +++ b/lib/widgets/fullscreen/info/location_section.dart @@ -3,9 +3,9 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:aves/widgets/fullscreen/info/maps/common.dart'; import 'package:aves/widgets/fullscreen/info/maps/google_map.dart'; diff --git a/lib/widgets/fullscreen/info/maps/common.dart b/lib/widgets/fullscreen/info/maps/common.dart index 37a311cc3..97e057672 100644 --- a/lib/widgets/fullscreen/info/maps/common.dart +++ b/lib/widgets/fullscreen/info/maps/common.dart @@ -1,11 +1,11 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/android_app_service.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/aves_dialog.dart'; -import 'package:aves/widgets/common/aves_selection_dialog.dart'; -import 'package:aves/widgets/common/borders.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/fullscreen/info/location_section.dart'; import 'package:aves/widgets/fullscreen/overlay/common.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/info/maps/scale_layer.dart b/lib/widgets/fullscreen/info/maps/scale_layer.dart index 7d821ee83..0c9aa1360 100644 --- a/lib/widgets/fullscreen/info/maps/scale_layer.dart +++ b/lib/widgets/fullscreen/info/maps/scale_layer.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:aves/widgets/common/fx/outlined_text.dart'; +import 'package:aves/widgets/common/basic/outlined_text.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map/plugin_api.dart'; diff --git a/lib/widgets/fullscreen/info/metadata/metadata_section.dart b/lib/widgets/fullscreen/info/metadata/metadata_section.dart index b3f558e12..5084c5088 100644 --- a/lib/widgets/fullscreen/info/metadata/metadata_section.dart +++ b/lib/widgets/fullscreen/info/metadata/metadata_section.dart @@ -2,12 +2,12 @@ import 'dart:collection'; import 'package:aves/model/image_entry.dart'; import 'package:aves/services/metadata_service.dart'; -import 'package:aves/utils/brand_colors.dart'; +import 'package:aves/ref/brand_colors.dart'; import 'package:aves/utils/color_utils.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:aves/widgets/fullscreen/info/metadata/metadata_thumbnail.dart'; import 'package:aves/widgets/fullscreen/info/metadata/xmp_tile.dart'; diff --git a/lib/widgets/fullscreen/info/metadata/xmp_tile.dart b/lib/widgets/fullscreen/info/metadata/xmp_tile.dart index f7a7175ee..49d469aff 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_tile.dart +++ b/lib/widgets/fullscreen/info/metadata/xmp_tile.dart @@ -1,11 +1,11 @@ import 'dart:collection'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/utils/brand_colors.dart'; +import 'package:aves/ref/brand_colors.dart'; +import 'package:aves/ref/xmp.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/xmp.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; -import 'package:aves/widgets/common/highlight_title.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; import 'package:aves/widgets/fullscreen/info/common.dart'; import 'package:aves/widgets/fullscreen/info/metadata/metadata_thumbnail.dart'; import 'package:collection/collection.dart'; diff --git a/lib/widgets/fullscreen/overlay/bottom.dart b/lib/widgets/fullscreen/overlay/bottom.dart index af5d068c2..1144ff0b7 100644 --- a/lib/widgets/fullscreen/overlay/bottom.dart +++ b/lib/widgets/fullscreen/overlay/bottom.dart @@ -6,9 +6,9 @@ import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/fullscreen/overlay/common.dart'; import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/overlay/common.dart b/lib/widgets/fullscreen/overlay/common.dart index c5830d2d5..9c7183bee 100644 --- a/lib/widgets/fullscreen/overlay/common.dart +++ b/lib/widgets/fullscreen/overlay/common.dart @@ -1,5 +1,5 @@ -import 'package:aves/widgets/common/borders.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; import 'package:flutter/material.dart'; const kOverlayBackgroundColor = Colors.black26; diff --git a/lib/widgets/fullscreen/overlay/top.dart b/lib/widgets/fullscreen/overlay/top.dart index 0d4c03aa5..5626c06f5 100644 --- a/lib/widgets/fullscreen/overlay/top.dart +++ b/lib/widgets/fullscreen/overlay/top.dart @@ -1,13 +1,13 @@ import 'dart:math'; +import 'package:aves/model/actions/entry_actions.dart'; import 'package:aves/model/favourite_repo.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/entry_actions.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/basic/menu_row.dart'; import 'package:aves/widgets/common/fx/sweeper.dart'; -import 'package:aves/widgets/common/icons.dart'; -import 'package:aves/widgets/common/menu_row.dart'; import 'package:aves/widgets/fullscreen/image_view.dart'; import 'package:aves/widgets/fullscreen/overlay/common.dart'; import 'package:aves/widgets/fullscreen/overlay/minimap.dart'; diff --git a/lib/widgets/fullscreen/overlay/video.dart b/lib/widgets/fullscreen/overlay/video.dart index df66e30d9..47e7a69b8 100644 --- a/lib/widgets/fullscreen/overlay/video.dart +++ b/lib/widgets/fullscreen/overlay/video.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'package:aves/model/image_entry.dart'; import 'package:aves/services/android_app_service.dart'; -import 'package:aves/utils/durations.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/utils/time_utils.dart'; -import 'package:aves/widgets/common/borders.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; import 'package:aves/widgets/fullscreen/overlay/common.dart'; import 'package:flutter/material.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; diff --git a/lib/widgets/fullscreen/tiled_view.dart b/lib/widgets/fullscreen/tiled_view.dart index 2afd375c3..ad123a960 100644 --- a/lib/widgets/fullscreen/tiled_view.dart +++ b/lib/widgets/fullscreen/tiled_view.dart @@ -2,7 +2,7 @@ import 'dart:math'; import 'package:aves/model/image_entry.dart'; import 'package:aves/utils/math_utils.dart'; -import 'package:aves/widgets/common/image_providers/region_provider.dart'; +import 'package:aves/image_providers/region_provider.dart'; import 'package:aves/widgets/fullscreen/image_view.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/video_view.dart b/lib/widgets/fullscreen/video_view.dart index d98aa2073..7007ebb22 100644 --- a/lib/widgets/fullscreen/video_view.dart +++ b/lib/widgets/fullscreen/video_view.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'dart:ui'; +import 'package:aves/image_providers/uri_image_provider.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/common/image_providers/uri_image_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index a75c777d4..e848d0a0b 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -5,12 +5,12 @@ import 'package:aves/model/settings/home_page.dart'; import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/media_store_source.dart'; import 'package:aves/services/image_file_service.dart'; import 'package:aves/services/viewer_service.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/collection/collection_page.dart'; -import 'package:aves/widgets/common/data_providers/media_store_collection_provider.dart'; -import 'package:aves/widgets/common/routes.dart'; +import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; import 'package:aves/widgets/search/search_delegate.dart'; diff --git a/lib/widgets/search/expandable_filter_row.dart b/lib/widgets/search/expandable_filter_row.dart index d7f366083..db02cadeb 100644 --- a/lib/widgets/search/expandable_filter_row.dart +++ b/lib/widgets/search/expandable_filter_row.dart @@ -1,8 +1,8 @@ import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:flutter/material.dart'; class ExpandableFilterRow extends StatelessWidget { diff --git a/lib/widgets/search/search_button.dart b/lib/widgets/search/search_button.dart index 4fac9bb1d..70fbefb06 100644 --- a/lib/widgets/search/search_button.dart +++ b/lib/widgets/search/search_button.dart @@ -1,6 +1,6 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/search/search_delegate.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/search/search_delegate.dart b/lib/widgets/search/search_delegate.dart index 4e64b4e29..754150d56 100644 --- a/lib/widgets/search/search_delegate.dart +++ b/lib/widgets/search/search_delegate.dart @@ -5,16 +5,16 @@ import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/query.dart'; import 'package:aves/model/filters/tag.dart'; -import 'package:aves/model/mime_types.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/location.dart'; import 'package:aves/model/source/tag.dart'; +import 'package:aves/ref/mime_types.dart'; +import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/collection/collection_page.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/search/expandable_filter_row.dart'; import 'package:aves/widgets/search/search_page.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/search/search_page.dart b/lib/widgets/search/search_page.dart index b1a7698a0..171f0a8b6 100644 --- a/lib/widgets/search/search_page.dart +++ b/lib/widgets/search/search_page.dart @@ -1,5 +1,5 @@ +import 'package:aves/theme/durations.dart'; import 'package:aves/utils/debouncer.dart'; -import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/search/search_delegate.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/settings/settings_page.dart b/lib/widgets/settings/settings_page.dart index 2000c2405..8661c13d5 100644 --- a/lib/widgets/settings/settings_page.dart +++ b/lib/widgets/settings/settings_page.dart @@ -2,12 +2,12 @@ import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/home_page.dart'; import 'package:aves/model/settings/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/aves_expansion_tile.dart'; -import 'package:aves/widgets/common/aves_selection_dialog.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; -import 'package:aves/widgets/common/highlight_title.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/common/identity/highlight_title.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:aves/widgets/settings/access_grants.dart'; import 'package:aves/widgets/settings/svg_background.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/settings/svg_background.dart b/lib/widgets/settings/svg_background.dart index b022a2671..929b5a8ad 100644 --- a/lib/widgets/settings/svg_background.dart +++ b/lib/widgets/settings/svg_background.dart @@ -1,5 +1,5 @@ import 'package:aves/model/settings/settings.dart'; -import 'package:aves/widgets/common/borders.dart'; +import 'package:aves/widgets/common/fx/borders.dart'; import 'package:flutter/material.dart'; class SvgBackgroundSelector extends StatefulWidget { diff --git a/lib/widgets/stats/filter_table.dart b/lib/widgets/stats/filter_table.dart index ed12727e5..97964940e 100644 --- a/lib/widgets/stats/filter_table.dart +++ b/lib/widgets/stats/filter_table.dart @@ -1,7 +1,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/utils/color_utils.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/widgets/common/aves_filter_chip.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/widgets/stats/stats.dart b/lib/widgets/stats/stats.dart index 797c2449d..4b343fbca 100644 --- a/lib/widgets/stats/stats.dart +++ b/lib/widgets/stats/stats.dart @@ -5,16 +5,16 @@ import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/image_entry.dart'; -import 'package:aves/model/mime_types.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/utils/color_utils.dart'; import 'package:aves/utils/constants.dart'; +import 'package:aves/utils/mime_utils.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/stats/filter_table.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:collection/collection.dart'; @@ -290,7 +290,7 @@ class EntryByMimeDatum { EntryByMimeDatum({ @required this.mimeType, @required this.entryCount, - }) : displayText = MimeTypes.displayType(mimeType); + }) : displayText = MimeUtils.displayType(mimeType); Color get color => stringToColor(displayText); diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart index fb8b1f64b..e56ea9eaf 100644 --- a/lib/widgets/welcome_page.dart +++ b/lib/widgets/welcome_page.dart @@ -1,7 +1,7 @@ import 'package:aves/model/settings/settings.dart'; -import 'package:aves/utils/durations.dart'; -import 'package:aves/widgets/common/aves_logo.dart'; -import 'package:aves/widgets/common/labeled_checkbox.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/basic/labeled_checkbox.dart'; +import 'package:aves/widgets/common/identity/aves_logo.dart'; import 'package:aves/widgets/home_page.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/test/model/filters_test.dart b/test/model/filters_test.dart index 28bf84b9f..35d4f5076 100644 --- a/test/model/filters_test.dart +++ b/test/model/filters_test.dart @@ -5,7 +5,7 @@ import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/query.dart'; import 'package:aves/model/filters/tag.dart'; -import 'package:aves/model/mime_types.dart'; +import 'package:aves/ref/mime_types.dart'; import 'package:test/test.dart'; void main() {