renaming
This commit is contained in:
parent
c9fa903309
commit
c252ce7828
82 changed files with 325 additions and 325 deletions
|
@ -27,7 +27,7 @@ class ImageFileHandler(private val activity: Activity) : MethodCallHandler {
|
|||
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
|
||||
when (call.method) {
|
||||
"getObsoleteEntries" -> GlobalScope.launch(Dispatchers.IO) { getObsoleteEntries(call, Coresult(result)) }
|
||||
"getImageEntry" -> GlobalScope.launch(Dispatchers.IO) { getImageEntry(call, Coresult(result)) }
|
||||
"getEntry" -> GlobalScope.launch(Dispatchers.IO) { getEntry(call, Coresult(result)) }
|
||||
"getThumbnail" -> GlobalScope.launch(Dispatchers.IO) { getThumbnail(call, Coresult(result)) }
|
||||
"getRegion" -> GlobalScope.launch(Dispatchers.IO) { getRegion(call, Coresult(result)) }
|
||||
"clearSizedThumbnailDiskCache" -> {
|
||||
|
@ -119,23 +119,23 @@ class ImageFileHandler(private val activity: Activity) : MethodCallHandler {
|
|||
}
|
||||
}
|
||||
|
||||
private suspend fun getImageEntry(call: MethodCall, result: MethodChannel.Result) {
|
||||
private suspend fun getEntry(call: MethodCall, result: MethodChannel.Result) {
|
||||
val mimeType = call.argument<String>("mimeType") // MIME type is optional
|
||||
val uri = call.argument<String>("uri")?.let { Uri.parse(it) }
|
||||
if (uri == null) {
|
||||
result.error("getImageEntry-args", "failed because of missing arguments", null)
|
||||
result.error("getEntry-args", "failed because of missing arguments", null)
|
||||
return
|
||||
}
|
||||
|
||||
val provider = getProvider(uri)
|
||||
if (provider == null) {
|
||||
result.error("getImageEntry-provider", "failed to find provider for uri=$uri", null)
|
||||
result.error("getEntry-provider", "failed to find provider for uri=$uri", null)
|
||||
return
|
||||
}
|
||||
|
||||
provider.fetchSingle(activity, uri, mimeType, object : ImageOpCallback {
|
||||
override fun onSuccess(fields: FieldMap) = result.success(fields)
|
||||
override fun onFailure(throwable: Throwable) = result.error("getImageEntry-failure", "failed to get entry for uri=$uri", throwable.message)
|
||||
override fun onFailure(throwable: Throwable) = result.error("getEntry-failure", "failed to get entry for uri=$uri", throwable.message)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ import android.net.Uri
|
|||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.util.Log
|
||||
import deckers.thibault.aves.model.AvesImageEntry
|
||||
import deckers.thibault.aves.model.AvesEntry
|
||||
import deckers.thibault.aves.model.provider.FieldMap
|
||||
import deckers.thibault.aves.model.provider.ImageProvider.ImageOpCallback
|
||||
import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider
|
||||
|
@ -102,7 +102,7 @@ class ImageOpStreamHandler(private val context: Context, private val arguments:
|
|||
}
|
||||
|
||||
destinationDir = StorageUtils.ensureTrailingSeparator(destinationDir)
|
||||
val entries = entryMapList.map(::AvesImageEntry)
|
||||
val entries = entryMapList.map(::AvesEntry)
|
||||
provider.moveMultiple(context, copy, destinationDir, entries, object : ImageOpCallback {
|
||||
override fun onSuccess(fields: FieldMap) = success(fields)
|
||||
override fun onFailure(throwable: Throwable) = error("move-failure", "failed to move entries", throwable)
|
||||
|
|
|
@ -3,7 +3,7 @@ package deckers.thibault.aves.model
|
|||
import android.net.Uri
|
||||
import deckers.thibault.aves.model.provider.FieldMap
|
||||
|
||||
class AvesImageEntry(map: FieldMap) {
|
||||
class AvesEntry(map: FieldMap) {
|
||||
val uri: Uri = Uri.parse(map["uri"] as String) // content or file URI
|
||||
val path = map["path"] as String? // best effort to get local path
|
||||
val mimeType = map["mimeType"] as String
|
|
@ -31,7 +31,7 @@ import deckers.thibault.aves.utils.StorageUtils
|
|||
import org.beyka.tiffbitmapfactory.TiffBitmapFactory
|
||||
import java.io.IOException
|
||||
|
||||
class SourceImageEntry {
|
||||
class SourceEntry {
|
||||
val uri: Uri // content or file URI
|
||||
var path: String? = null // best effort to get local path
|
||||
private val sourceMimeType: String
|
||||
|
@ -119,7 +119,7 @@ class SourceImageEntry {
|
|||
// metadata retrieval
|
||||
// expects entry with: uri, mimeType
|
||||
// finds: width, height, orientation/rotation, date, title, duration
|
||||
fun fillPreCatalogMetadata(context: Context): SourceImageEntry {
|
||||
fun fillPreCatalogMetadata(context: Context): SourceEntry {
|
||||
if (isSvg) return this
|
||||
if (isVideo) {
|
||||
fillVideoByMediaMetadataRetriever(context)
|
|
@ -3,7 +3,7 @@ package deckers.thibault.aves.model.provider
|
|||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.provider.MediaStore
|
||||
import deckers.thibault.aves.model.SourceImageEntry
|
||||
import deckers.thibault.aves.model.SourceEntry
|
||||
|
||||
internal class ContentImageProvider : ImageProvider() {
|
||||
override suspend fun fetchSingle(context: Context, uri: Uri, mimeType: String?, callback: ImageOpCallback) {
|
||||
|
@ -28,7 +28,7 @@ internal class ContentImageProvider : ImageProvider() {
|
|||
return
|
||||
}
|
||||
|
||||
val entry = SourceImageEntry(map).fillPreCatalogMetadata(context)
|
||||
val entry = SourceEntry(map).fillPreCatalogMetadata(context)
|
||||
if (entry.isSized || entry.isSvg) {
|
||||
callback.onSuccess(entry.toMap())
|
||||
} else {
|
||||
|
|
|
@ -2,7 +2,7 @@ package deckers.thibault.aves.model.provider
|
|||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import deckers.thibault.aves.model.SourceImageEntry
|
||||
import deckers.thibault.aves.model.SourceEntry
|
||||
import java.io.File
|
||||
|
||||
internal class FileImageProvider : ImageProvider() {
|
||||
|
@ -12,7 +12,7 @@ internal class FileImageProvider : ImageProvider() {
|
|||
return
|
||||
}
|
||||
|
||||
val entry = SourceImageEntry(uri, mimeType)
|
||||
val entry = SourceEntry(uri, mimeType)
|
||||
|
||||
val path = uri.path
|
||||
if (path != null) {
|
||||
|
|
|
@ -8,7 +8,7 @@ import android.provider.MediaStore
|
|||
import android.util.Log
|
||||
import androidx.exifinterface.media.ExifInterface
|
||||
import com.commonsware.cwac.document.DocumentFileCompat
|
||||
import deckers.thibault.aves.model.AvesImageEntry
|
||||
import deckers.thibault.aves.model.AvesEntry
|
||||
import deckers.thibault.aves.model.ExifOrientationOp
|
||||
import deckers.thibault.aves.utils.LogUtils
|
||||
import deckers.thibault.aves.utils.MimeTypes.isImage
|
||||
|
@ -32,7 +32,7 @@ abstract class ImageProvider {
|
|||
throw UnsupportedOperationException()
|
||||
}
|
||||
|
||||
open suspend fun moveMultiple(context: Context, copy: Boolean, destinationDir: String, entries: List<AvesImageEntry>, callback: ImageOpCallback) {
|
||||
open suspend fun moveMultiple(context: Context, copy: Boolean, destinationDir: String, entries: List<AvesEntry>, callback: ImageOpCallback) {
|
||||
callback.onFailure(UnsupportedOperationException())
|
||||
}
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@ import android.os.Build
|
|||
import android.provider.MediaStore
|
||||
import android.util.Log
|
||||
import com.commonsware.cwac.document.DocumentFileCompat
|
||||
import deckers.thibault.aves.model.AvesImageEntry
|
||||
import deckers.thibault.aves.model.SourceImageEntry
|
||||
import deckers.thibault.aves.model.AvesEntry
|
||||
import deckers.thibault.aves.model.SourceEntry
|
||||
import deckers.thibault.aves.utils.LogUtils
|
||||
import deckers.thibault.aves.utils.MimeTypes
|
||||
import deckers.thibault.aves.utils.MimeTypes.isImage
|
||||
|
@ -158,7 +158,7 @@ class MediaStoreImageProvider : ImageProvider() {
|
|||
// missing some attributes such as width, height, orientation.
|
||||
// Also, the reported size of raw images is inconsistent across devices
|
||||
// and Android versions (sometimes the raw size, sometimes the decoded size).
|
||||
val entry = SourceImageEntry(entryMap).fillPreCatalogMetadata(context)
|
||||
val entry = SourceEntry(entryMap).fillPreCatalogMetadata(context)
|
||||
entryMap = entry.toMap()
|
||||
}
|
||||
|
||||
|
@ -203,7 +203,7 @@ class MediaStoreImageProvider : ImageProvider() {
|
|||
context: Context,
|
||||
copy: Boolean,
|
||||
destinationDir: String,
|
||||
entries: List<AvesImageEntry>,
|
||||
entries: List<AvesEntry>,
|
||||
callback: ImageOpCallback,
|
||||
) {
|
||||
val destinationDirDocFile = createDirectoryIfAbsent(context, destinationDir)
|
||||
|
|
|
@ -2,7 +2,7 @@ import 'dart:async';
|
|||
|
||||
import 'package:aves/model/entry_cache.dart';
|
||||
import 'package:aves/model/favourite_repo.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/services/image_file_service.dart';
|
||||
|
@ -21,7 +21,7 @@ import 'package:path/path.dart' as ppath;
|
|||
|
||||
import '../ref/mime_types.dart';
|
||||
|
||||
class ImageEntry {
|
||||
class AvesEntry {
|
||||
String uri;
|
||||
String _path, _directory, _filename, _extension;
|
||||
int page, contentId;
|
||||
|
@ -45,7 +45,7 @@ class ImageEntry {
|
|||
// TODO TLAD make it dynamic if it depends on OS/lib versions
|
||||
static const List<String> undecodable = [MimeTypes.crw, MimeTypes.psd];
|
||||
|
||||
ImageEntry({
|
||||
AvesEntry({
|
||||
this.uri,
|
||||
String path,
|
||||
this.contentId,
|
||||
|
@ -69,14 +69,14 @@ class ImageEntry {
|
|||
|
||||
bool get canHaveAlpha => MimeTypes.alphaImages.contains(mimeType);
|
||||
|
||||
ImageEntry copyWith({
|
||||
AvesEntry copyWith({
|
||||
@required String uri,
|
||||
@required String path,
|
||||
@required int contentId,
|
||||
@required int dateModifiedSecs,
|
||||
}) {
|
||||
final copyContentId = contentId ?? this.contentId;
|
||||
final copied = ImageEntry(
|
||||
final copied = AvesEntry(
|
||||
uri: uri ?? uri,
|
||||
path: path ?? this.path,
|
||||
contentId: copyContentId,
|
||||
|
@ -96,7 +96,7 @@ class ImageEntry {
|
|||
return copied;
|
||||
}
|
||||
|
||||
ImageEntry getPageEntry({
|
||||
AvesEntry getPageEntry({
|
||||
@required MultiPageInfo multiPageInfo,
|
||||
@required int page,
|
||||
}) {
|
||||
|
@ -126,8 +126,8 @@ class ImageEntry {
|
|||
}
|
||||
|
||||
// from DB or platform source entry
|
||||
factory ImageEntry.fromMap(Map map) {
|
||||
return ImageEntry(
|
||||
factory AvesEntry.fromMap(Map map) {
|
||||
return AvesEntry(
|
||||
uri: map['uri'] as String,
|
||||
path: map['path'] as String,
|
||||
contentId: map['contentId'] as int,
|
||||
|
@ -619,7 +619,7 @@ class ImageEntry {
|
|||
// compare by:
|
||||
// 1) title ascending
|
||||
// 2) extension ascending
|
||||
static int compareByName(ImageEntry a, ImageEntry b) {
|
||||
static int compareByName(AvesEntry a, AvesEntry b) {
|
||||
final c = compareAsciiUpperCase(a.bestTitle, b.bestTitle);
|
||||
return c != 0 ? c : compareAsciiUpperCase(a.extension, b.extension);
|
||||
}
|
||||
|
@ -627,7 +627,7 @@ class ImageEntry {
|
|||
// compare by:
|
||||
// 1) size descending
|
||||
// 2) name ascending
|
||||
static int compareBySize(ImageEntry a, ImageEntry b) {
|
||||
static int compareBySize(AvesEntry a, AvesEntry b) {
|
||||
final c = b.sizeBytes.compareTo(a.sizeBytes);
|
||||
return c != 0 ? c : compareByName(a, b);
|
||||
}
|
||||
|
@ -637,7 +637,7 @@ class ImageEntry {
|
|||
// compare by:
|
||||
// 1) date descending
|
||||
// 2) name ascending
|
||||
static int compareByDate(ImageEntry a, ImageEntry b) {
|
||||
static int compareByDate(AvesEntry a, AvesEntry b) {
|
||||
final c = (b.bestDate ?? _epoch).compareTo(a.bestDate ?? _epoch);
|
||||
return c != 0 ? c : compareByName(a, b);
|
||||
}
|
|
@ -4,11 +4,11 @@ import 'dart:ui';
|
|||
import 'package:aves/image_providers/region_provider.dart';
|
||||
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/model/entry.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
extension ExtraAvesEntry on ImageEntry {
|
||||
extension ExtraAvesEntry on AvesEntry {
|
||||
ThumbnailProvider getThumbnail({double extent = 0}) => ThumbnailProvider(_getThumbnailProviderKey(extent));
|
||||
|
||||
ThumbnailProviderKey _getThumbnailProviderKey(double extent) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/utils/change_notifier.dart';
|
||||
|
||||
|
@ -18,25 +18,25 @@ class FavouriteRepo {
|
|||
|
||||
int get count => _rows.length;
|
||||
|
||||
bool isFavourite(ImageEntry entry) => _rows.any((row) => row.contentId == entry.contentId);
|
||||
bool isFavourite(AvesEntry entry) => _rows.any((row) => row.contentId == entry.contentId);
|
||||
|
||||
FavouriteRow _entryToRow(ImageEntry entry) => FavouriteRow(contentId: entry.contentId, path: entry.path);
|
||||
FavouriteRow _entryToRow(AvesEntry entry) => FavouriteRow(contentId: entry.contentId, path: entry.path);
|
||||
|
||||
Future<void> add(Iterable<ImageEntry> entries) async {
|
||||
Future<void> add(Iterable<AvesEntry> entries) async {
|
||||
final newRows = entries.map(_entryToRow);
|
||||
await metadataDb.addFavourites(newRows);
|
||||
_rows.addAll(newRows);
|
||||
changeNotifier.notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> remove(Iterable<ImageEntry> entries) async {
|
||||
Future<void> remove(Iterable<AvesEntry> entries) async {
|
||||
final removedRows = entries.map(_entryToRow);
|
||||
await metadataDb.removeFavourites(removedRows);
|
||||
removedRows.forEach(_rows.remove);
|
||||
changeNotifier.notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> move(int oldContentId, ImageEntry entry) async {
|
||||
Future<void> move(int oldContentId, AvesEntry entry) async {
|
||||
final oldRow = _rows.firstWhere((row) => row.contentId == oldContentId, orElse: () => null);
|
||||
if (oldRow != null) {
|
||||
_rows.remove(oldRow);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:aves/image_providers/app_icon_image_provider.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/filters.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/widgets/common/identity/aves_icons.dart';
|
||||
|
@ -33,7 +33,7 @@ class AlbumFilter extends CollectionFilter {
|
|||
};
|
||||
|
||||
@override
|
||||
bool filter(ImageEntry entry) => entry.directory == album;
|
||||
bool filter(AvesEntry entry) => entry.directory == album;
|
||||
|
||||
@override
|
||||
String get label => uniqueName ?? album.split(separator).last;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
@ -13,7 +13,7 @@ class FavouriteFilter extends CollectionFilter {
|
|||
};
|
||||
|
||||
@override
|
||||
bool filter(ImageEntry entry) => entry.isFavourite;
|
||||
bool filter(AvesEntry entry) => entry.isFavourite;
|
||||
|
||||
@override
|
||||
String get label => 'Favourite';
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/album.dart';
|
||||
import 'package:aves/model/filters/favourite.dart';
|
||||
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/image_entry.dart';
|
||||
import 'package:aves/utils/color_utils.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -49,7 +49,7 @@ abstract class CollectionFilter implements Comparable<CollectionFilter> {
|
|||
|
||||
String toJson() => jsonEncode(toMap());
|
||||
|
||||
bool filter(ImageEntry entry);
|
||||
bool filter(AvesEntry entry);
|
||||
|
||||
bool get isUnique => true;
|
||||
|
||||
|
@ -78,7 +78,7 @@ abstract class CollectionFilter implements Comparable<CollectionFilter> {
|
|||
// TODO TLAD replace this by adding getters to CollectionFilter, with cached entry/count coming from Source
|
||||
class FilterGridItem<T extends CollectionFilter> {
|
||||
final T filter;
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const FilterGridItem(this.filter, this.entry);
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
@ -35,7 +35,7 @@ class LocationFilter extends CollectionFilter {
|
|||
String get countryNameAndCode => '$_location$locationSeparator$_countryCode';
|
||||
|
||||
@override
|
||||
bool filter(ImageEntry entry) => _location.isEmpty ? !entry.isLocated : entry.isLocated && ((level == LocationLevel.country && entry.addressDetails.countryCode == _countryCode) || (level == LocationLevel.place && entry.addressDetails.place == _location));
|
||||
bool filter(AvesEntry entry) => _location.isEmpty ? !entry.isLocated : entry.isLocated && ((level == LocationLevel.country && entry.addressDetails.countryCode == _countryCode) || (level == LocationLevel.place && entry.addressDetails.place == _location));
|
||||
|
||||
@override
|
||||
String get label => _location.isEmpty ? emptyLabel : _location;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:aves/utils/mime_utils.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -15,7 +15,7 @@ class MimeFilter extends CollectionFilter {
|
|||
static const geotiff = 'aves/geotiff'; // subset of `image/tiff`
|
||||
|
||||
final String mime;
|
||||
bool Function(ImageEntry) _filter;
|
||||
bool Function(AvesEntry) _filter;
|
||||
String _label;
|
||||
IconData _icon;
|
||||
|
||||
|
@ -67,7 +67,7 @@ class MimeFilter extends CollectionFilter {
|
|||
};
|
||||
|
||||
@override
|
||||
bool filter(ImageEntry entry) => _filter(entry);
|
||||
bool filter(AvesEntry entry) => _filter(entry);
|
||||
|
||||
@override
|
||||
String get label => _label;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -12,7 +12,7 @@ class QueryFilter extends CollectionFilter {
|
|||
|
||||
final String query;
|
||||
final bool colorful;
|
||||
bool Function(ImageEntry) _filter;
|
||||
bool Function(AvesEntry) _filter;
|
||||
|
||||
QueryFilter(this.query, {this.colorful = true}) {
|
||||
var upQuery = query.toUpperCase();
|
||||
|
@ -44,7 +44,7 @@ class QueryFilter extends CollectionFilter {
|
|||
};
|
||||
|
||||
@override
|
||||
bool filter(ImageEntry entry) => _filter(entry);
|
||||
bool filter(AvesEntry entry) => _filter(entry);
|
||||
|
||||
@override
|
||||
bool get isUnique => false;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
@ -24,7 +24,7 @@ class TagFilter extends CollectionFilter {
|
|||
};
|
||||
|
||||
@override
|
||||
bool filter(ImageEntry entry) => tag.isEmpty ? entry.xmpSubjects.isEmpty : entry.xmpSubjects.contains(tag);
|
||||
bool filter(AvesEntry entry) => tag.isEmpty ? entry.xmpSubjects.isEmpty : entry.xmpSubjects.contains(tag);
|
||||
|
||||
@override
|
||||
bool get isUnique => false;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db_upgrade.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:path/path.dart';
|
||||
|
@ -116,16 +116,16 @@ class MetadataDb {
|
|||
debugPrint('$runtimeType clearEntries deleted $count entries');
|
||||
}
|
||||
|
||||
Future<List<ImageEntry>> loadEntries() async {
|
||||
Future<List<AvesEntry>> loadEntries() async {
|
||||
final stopwatch = Stopwatch()..start();
|
||||
final db = await _database;
|
||||
final maps = await db.query(entryTable);
|
||||
final entries = maps.map((map) => ImageEntry.fromMap(map)).toList();
|
||||
final entries = maps.map((map) => AvesEntry.fromMap(map)).toList();
|
||||
debugPrint('$runtimeType loadEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries');
|
||||
return entries;
|
||||
}
|
||||
|
||||
Future<void> saveEntries(Iterable<ImageEntry> entries) async {
|
||||
Future<void> saveEntries(Iterable<AvesEntry> entries) async {
|
||||
if (entries == null || entries.isEmpty) return;
|
||||
final stopwatch = Stopwatch()..start();
|
||||
final db = await _database;
|
||||
|
@ -135,7 +135,7 @@ class MetadataDb {
|
|||
debugPrint('$runtimeType saveEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries');
|
||||
}
|
||||
|
||||
Future<void> updateEntryId(int oldId, ImageEntry entry) async {
|
||||
Future<void> updateEntryId(int oldId, AvesEntry entry) async {
|
||||
final db = await _database;
|
||||
final batch = db.batch();
|
||||
batch.delete(entryTable, where: 'contentId = ?', whereArgs: [oldId]);
|
||||
|
@ -143,7 +143,7 @@ class MetadataDb {
|
|||
await batch.commit(noResult: true);
|
||||
}
|
||||
|
||||
void _batchInsertEntry(Batch batch, ImageEntry entry) {
|
||||
void _batchInsertEntry(Batch batch, AvesEntry entry) {
|
||||
if (entry == null) return;
|
||||
batch.insert(
|
||||
entryTable,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
class MultiPageInfo {
|
||||
|
@ -50,7 +50,7 @@ class SinglePageInfo {
|
|||
String toString() => '$runtimeType#${shortHash(this)}{mimeType=$mimeType, width=$width, height=$height, trackId=$trackId, durationMillis=$durationMillis}';
|
||||
}
|
||||
|
||||
class AvesPageEntry extends ImageEntry {
|
||||
class AvesPageEntry extends AvesEntry {
|
||||
final SinglePageInfo pageInfo;
|
||||
|
||||
AvesPageEntry({
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/album.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:aves/utils/android_file_utils.dart';
|
||||
|
@ -50,7 +50,7 @@ mixin AlbumMixin on SourceBase {
|
|||
}
|
||||
}
|
||||
|
||||
Map<String, ImageEntry> getAlbumEntries() {
|
||||
Map<String, AvesEntry> getAlbumEntries() {
|
||||
final entries = sortedEntriesForFilterList;
|
||||
final regularAlbums = <String>[], appAlbums = <String>[], specialAlbums = <String>[];
|
||||
for (var album in sortedAlbums) {
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/album.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:aves/model/source/section_keys.dart';
|
||||
import 'package:aves/model/source/tag.dart';
|
||||
|
@ -20,10 +20,10 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
|
|||
EntrySortFactor sortFactor;
|
||||
final AChangeNotifier filterChangeNotifier = AChangeNotifier();
|
||||
|
||||
List<ImageEntry> _filteredEntries;
|
||||
List<AvesEntry> _filteredEntries;
|
||||
List<StreamSubscription> _subscriptions = [];
|
||||
|
||||
Map<SectionKey, List<ImageEntry>> sections = Map.unmodifiable({});
|
||||
Map<SectionKey, List<AvesEntry>> sections = Map.unmodifiable({});
|
||||
|
||||
CollectionLens({
|
||||
@required this.source,
|
||||
|
@ -63,9 +63,9 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
|
|||
int get entryCount => _filteredEntries.length;
|
||||
|
||||
// sorted as displayed to the user, i.e. sorted then grouped, not an absolute order on all entries
|
||||
List<ImageEntry> _sortedEntries;
|
||||
List<AvesEntry> _sortedEntries;
|
||||
|
||||
List<ImageEntry> get sortedEntries {
|
||||
List<AvesEntry> get sortedEntries {
|
||||
_sortedEntries ??= List.of(sections.entries.expand((e) => e.value));
|
||||
return _sortedEntries;
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
|
|||
return true;
|
||||
}
|
||||
|
||||
Object heroTag(ImageEntry entry) => '$hashCode${entry.uri}';
|
||||
Object heroTag(AvesEntry entry) => '$hashCode${entry.uri}';
|
||||
|
||||
void addFilter(CollectionFilter filter) {
|
||||
if (filter == null || filters.contains(filter)) return;
|
||||
|
@ -123,13 +123,13 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
|
|||
void _applySort() {
|
||||
switch (sortFactor) {
|
||||
case EntrySortFactor.date:
|
||||
_filteredEntries.sort(ImageEntry.compareByDate);
|
||||
_filteredEntries.sort(AvesEntry.compareByDate);
|
||||
break;
|
||||
case EntrySortFactor.size:
|
||||
_filteredEntries.sort(ImageEntry.compareBySize);
|
||||
_filteredEntries.sort(AvesEntry.compareBySize);
|
||||
break;
|
||||
case EntrySortFactor.name:
|
||||
_filteredEntries.sort(ImageEntry.compareByName);
|
||||
_filteredEntries.sort(AvesEntry.compareByName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -139,13 +139,13 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
|
|||
case EntrySortFactor.date:
|
||||
switch (groupFactor) {
|
||||
case EntryGroupFactor.album:
|
||||
sections = groupBy<ImageEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
|
||||
sections = groupBy<AvesEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
|
||||
break;
|
||||
case EntryGroupFactor.month:
|
||||
sections = groupBy<ImageEntry, EntryDateSectionKey>(_filteredEntries, (entry) => EntryDateSectionKey(entry.monthTaken));
|
||||
sections = groupBy<AvesEntry, EntryDateSectionKey>(_filteredEntries, (entry) => EntryDateSectionKey(entry.monthTaken));
|
||||
break;
|
||||
case EntryGroupFactor.day:
|
||||
sections = groupBy<ImageEntry, EntryDateSectionKey>(_filteredEntries, (entry) => EntryDateSectionKey(entry.dayTaken));
|
||||
sections = groupBy<AvesEntry, EntryDateSectionKey>(_filteredEntries, (entry) => EntryDateSectionKey(entry.dayTaken));
|
||||
break;
|
||||
case EntryGroupFactor.none:
|
||||
sections = Map.fromEntries([
|
||||
|
@ -160,8 +160,8 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
|
|||
]);
|
||||
break;
|
||||
case EntrySortFactor.name:
|
||||
final byAlbum = groupBy<ImageEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
|
||||
sections = SplayTreeMap<EntryAlbumSectionKey, List<ImageEntry>>.of(byAlbum, (a, b) => source.compareAlbumsByName(a.folderPath, b.folderPath));
|
||||
final byAlbum = groupBy<AvesEntry, EntryAlbumSectionKey>(_filteredEntries, (entry) => EntryAlbumSectionKey(entry.directory));
|
||||
sections = SplayTreeMap<EntryAlbumSectionKey, List<AvesEntry>>.of(byAlbum, (a, b) => source.compareAlbumsByName(a.folderPath, b.folderPath));
|
||||
break;
|
||||
}
|
||||
sections = Map.unmodifiable(sections);
|
||||
|
@ -177,7 +177,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
|
|||
_applyGroup();
|
||||
}
|
||||
|
||||
void onEntryRemoved(Iterable<ImageEntry> entries) {
|
||||
void onEntryRemoved(Iterable<AvesEntry> entries) {
|
||||
// we should remove obsolete entries and sections
|
||||
// but do not apply sort/group
|
||||
// as section order change would surprise the user while browsing
|
||||
|
@ -207,18 +207,18 @@ mixin CollectionActivityMixin {
|
|||
mixin CollectionSelectionMixin on CollectionActivityMixin {
|
||||
final AChangeNotifier selectionChangeNotifier = AChangeNotifier();
|
||||
|
||||
final Set<ImageEntry> _selection = {};
|
||||
final Set<AvesEntry> _selection = {};
|
||||
|
||||
Set<ImageEntry> get selection => _selection;
|
||||
Set<AvesEntry> get selection => _selection;
|
||||
|
||||
bool isSelected(Iterable<ImageEntry> entries) => entries.every(selection.contains);
|
||||
bool isSelected(Iterable<AvesEntry> entries) => entries.every(selection.contains);
|
||||
|
||||
void addToSelection(Iterable<ImageEntry> entries) {
|
||||
void addToSelection(Iterable<AvesEntry> entries) {
|
||||
_selection.addAll(entries);
|
||||
selectionChangeNotifier.notifyListeners();
|
||||
}
|
||||
|
||||
void removeFromSelection(Iterable<ImageEntry> entries) {
|
||||
void removeFromSelection(Iterable<AvesEntry> entries) {
|
||||
_selection.removeAll(entries);
|
||||
selectionChangeNotifier.notifyListeners();
|
||||
}
|
||||
|
@ -228,7 +228,7 @@ mixin CollectionSelectionMixin on CollectionActivityMixin {
|
|||
selectionChangeNotifier.notifyListeners();
|
||||
}
|
||||
|
||||
void toggleSelection(ImageEntry entry) {
|
||||
void toggleSelection(AvesEntry entry) {
|
||||
if (_selection.isEmpty) select();
|
||||
if (!_selection.remove(entry)) _selection.add(entry);
|
||||
selectionChangeNotifier.notifyListeners();
|
||||
|
|
|
@ -2,8 +2,8 @@ import 'dart:async';
|
|||
|
||||
import 'package:aves/model/favourite_repo.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/model/source/album.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
|
@ -16,15 +16,15 @@ import 'package:flutter/foundation.dart';
|
|||
import 'enums.dart';
|
||||
|
||||
mixin SourceBase {
|
||||
final List<ImageEntry> _rawEntries = [];
|
||||
final List<AvesEntry> _rawEntries = [];
|
||||
|
||||
List<ImageEntry> get rawEntries => List.unmodifiable(_rawEntries);
|
||||
List<AvesEntry> get rawEntries => List.unmodifiable(_rawEntries);
|
||||
|
||||
final EventBus _eventBus = EventBus();
|
||||
|
||||
EventBus get eventBus => _eventBus;
|
||||
|
||||
List<ImageEntry> get sortedEntriesForFilterList;
|
||||
List<AvesEntry> get sortedEntriesForFilterList;
|
||||
|
||||
final Map<CollectionFilter, int> _filterEntryCountMap = {};
|
||||
|
||||
|
@ -39,7 +39,7 @@ mixin SourceBase {
|
|||
|
||||
abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagMixin {
|
||||
@override
|
||||
List<ImageEntry> get sortedEntriesForFilterList => CollectionLens(
|
||||
List<AvesEntry> get sortedEntriesForFilterList => CollectionLens(
|
||||
source: this,
|
||||
groupFactor: EntryGroupFactor.none,
|
||||
sortFactor: EntrySortFactor.date,
|
||||
|
@ -55,7 +55,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
|
|||
debugPrint('$runtimeType loadDates complete in ${stopwatch.elapsed.inMilliseconds}ms for ${_savedDates.length} entries');
|
||||
}
|
||||
|
||||
void addAll(Iterable<ImageEntry> entries) {
|
||||
void addAll(Iterable<AvesEntry> entries) {
|
||||
if (_rawEntries.isNotEmpty) {
|
||||
final newContentIds = entries.map((entry) => entry.contentId).toList();
|
||||
_rawEntries.removeWhere((entry) => newContentIds.contains(entry.contentId));
|
||||
|
@ -70,7 +70,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
|
|||
eventBus.fire(EntryAddedEvent());
|
||||
}
|
||||
|
||||
void removeEntries(List<ImageEntry> entries) {
|
||||
void removeEntries(List<AvesEntry> entries) {
|
||||
entries.forEach((entry) => entry.removeFromFavourites());
|
||||
_rawEntries.removeWhere(entries.contains);
|
||||
cleanEmptyAlbums(entries.map((entry) => entry.directory).toSet());
|
||||
|
@ -91,7 +91,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
|
|||
|
||||
// `dateModifiedSecs` changes when moving entries to another directory,
|
||||
// but it does not change when renaming the containing directory
|
||||
Future<void> moveEntry(ImageEntry entry, Map newFields) async {
|
||||
Future<void> moveEntry(AvesEntry entry, Map newFields) async {
|
||||
final oldContentId = entry.contentId;
|
||||
final newContentId = newFields['contentId'] as int;
|
||||
final newDateModifiedSecs = newFields['dateModifiedSecs'] as int;
|
||||
|
@ -109,7 +109,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
|
|||
}
|
||||
|
||||
void updateAfterMove({
|
||||
@required Set<ImageEntry> selection,
|
||||
@required Set<AvesEntry> selection,
|
||||
@required bool copy,
|
||||
@required String destinationAlbum,
|
||||
@required Iterable<MoveOpEvent> movedOps,
|
||||
|
@ -117,7 +117,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
|
|||
if (movedOps.isEmpty) return;
|
||||
|
||||
final fromAlbums = <String>{};
|
||||
final movedEntries = <ImageEntry>[];
|
||||
final movedEntries = <AvesEntry>[];
|
||||
if (copy) {
|
||||
movedOps.forEach((movedOp) {
|
||||
final sourceUri = movedOp.uri;
|
||||
|
@ -166,25 +166,25 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
|
|||
|
||||
Future<void> refresh();
|
||||
|
||||
Future<void> refreshMetadata(Set<ImageEntry> entries);
|
||||
Future<void> refreshMetadata(Set<AvesEntry> entries);
|
||||
}
|
||||
|
||||
enum SourceState { loading, cataloguing, locating, ready }
|
||||
|
||||
class EntryAddedEvent {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const EntryAddedEvent([this.entry]);
|
||||
}
|
||||
|
||||
class EntryRemovedEvent {
|
||||
final Iterable<ImageEntry> entries;
|
||||
final Iterable<AvesEntry> entries;
|
||||
|
||||
const EntryRemovedEvent(this.entries);
|
||||
}
|
||||
|
||||
class EntryMovedEvent {
|
||||
final Iterable<ImageEntry> entries;
|
||||
final Iterable<AvesEntry> entries;
|
||||
|
||||
const EntryMovedEvent(this.entries);
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/filters/location.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
|
@ -28,7 +28,7 @@ mixin LocationMixin on SourceBase {
|
|||
|
||||
Future<void> locateEntries() async {
|
||||
// final stopwatch = Stopwatch()..start();
|
||||
final byLocated = groupBy<ImageEntry, bool>(rawEntries.where((entry) => entry.hasGps), (entry) => entry.isLocated);
|
||||
final byLocated = groupBy<AvesEntry, bool>(rawEntries.where((entry) => entry.hasGps), (entry) => entry.isLocated);
|
||||
final todo = byLocated[false] ?? [];
|
||||
if (todo.isEmpty) return;
|
||||
|
||||
|
@ -42,7 +42,7 @@ mixin LocationMixin on SourceBase {
|
|||
// - 652 calls (22%) when approximating to 2 decimal places (~1km - town or village)
|
||||
// cf https://en.wikipedia.org/wiki/Decimal_degrees#Precision
|
||||
final latLngFactor = pow(10, 2);
|
||||
Tuple2 approximateLatLng(ImageEntry entry) {
|
||||
Tuple2 approximateLatLng(AvesEntry entry) {
|
||||
final lat = entry.catalogMetadata?.latitude;
|
||||
final lng = entry.catalogMetadata?.longitude;
|
||||
if (lat == null || lng == null) return null;
|
||||
|
@ -57,7 +57,7 @@ mixin LocationMixin on SourceBase {
|
|||
setProgress(done: progressDone, total: progressTotal);
|
||||
|
||||
final newAddresses = <AddressDetails>[];
|
||||
await Future.forEach<ImageEntry>(todo, (entry) async {
|
||||
await Future.forEach<AvesEntry>(todo, (entry) async {
|
||||
final latLng = approximateLatLng(entry);
|
||||
if (knownLocations.containsKey(latLng)) {
|
||||
entry.addressDetails = knownLocations[latLng]?.copyWith(contentId: entry.contentId);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/favourite_repo.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
|
@ -55,14 +55,14 @@ class MediaStoreSource extends CollectionSource {
|
|||
// fetch new entries
|
||||
var refreshCount = 10;
|
||||
const refreshCountMax = 1000;
|
||||
final allNewEntries = <ImageEntry>[], pendingNewEntries = <ImageEntry>[];
|
||||
final allNewEntries = <AvesEntry>[], pendingNewEntries = <AvesEntry>[];
|
||||
void addPendingEntries() {
|
||||
allNewEntries.addAll(pendingNewEntries);
|
||||
addAll(pendingNewEntries);
|
||||
pendingNewEntries.clear();
|
||||
}
|
||||
|
||||
ImageFileService.getImageEntries(knownEntryMap).listen(
|
||||
ImageFileService.getEntries(knownEntryMap).listen(
|
||||
(entry) {
|
||||
pendingNewEntries.add(entry);
|
||||
if (pendingNewEntries.length >= refreshCount) {
|
||||
|
@ -96,7 +96,7 @@ class MediaStoreSource extends CollectionSource {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<void> refreshMetadata(Set<ImageEntry> entries) {
|
||||
Future<void> refreshMetadata(Set<AvesEntry> entries) {
|
||||
final contentIds = entries.map((entry) => entry.contentId).toSet();
|
||||
metadataDb.removeIds(contentIds, updateFavourites: false);
|
||||
return refresh();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
|
@ -31,7 +31,7 @@ mixin TagMixin on SourceBase {
|
|||
setProgress(done: progressDone, total: progressTotal);
|
||||
|
||||
final newMetadata = <CatalogMetadata>[];
|
||||
await Future.forEach<ImageEntry>(todo, (entry) async {
|
||||
await Future.forEach<AvesEntry>(todo, (entry) async {
|
||||
await entry.catalog(background: true);
|
||||
if (entry.isCatalogued) {
|
||||
newMetadata.add(entry.catalogMetadata);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:typed_data';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
@ -81,10 +81,10 @@ class AndroidAppService {
|
|||
return false;
|
||||
}
|
||||
|
||||
static Future<bool> shareEntries(Iterable<ImageEntry> entries) async {
|
||||
static Future<bool> shareEntries(Iterable<AvesEntry> entries) async {
|
||||
// loosen mime type to a generic one, so we can share with badly defined apps
|
||||
// e.g. Google Lens declares receiving "image/jpeg" only, but it can actually handle more formats
|
||||
final urisByMimeType = groupBy<ImageEntry, String>(entries, (e) => e.mimeTypeAnySubtype).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList()));
|
||||
final urisByMimeType = groupBy<AvesEntry, String>(entries, (e) => e.mimeTypeAnySubtype).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList()));
|
||||
try {
|
||||
return await platform.invokeMethod('share', <String, dynamic>{
|
||||
'title': 'Share via:',
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/ref/mime_types.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
@ -26,7 +26,7 @@ class AndroidDebugService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> getBitmapFactoryInfo(ImageEntry entry) async {
|
||||
static Future<Map> getBitmapFactoryInfo(AvesEntry entry) async {
|
||||
try {
|
||||
// return map with all data available when decoding image bounds with `BitmapFactory`
|
||||
final result = await platform.invokeMethod('getBitmapFactoryInfo', <String, dynamic>{
|
||||
|
@ -39,7 +39,7 @@ class AndroidDebugService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> getContentResolverMetadata(ImageEntry entry) async {
|
||||
static Future<Map> getContentResolverMetadata(AvesEntry entry) async {
|
||||
try {
|
||||
// return map with all data available from the content resolver
|
||||
final result = await platform.invokeMethod('getContentResolverMetadata', <String, dynamic>{
|
||||
|
@ -53,7 +53,7 @@ class AndroidDebugService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> getExifInterfaceMetadata(ImageEntry entry) async {
|
||||
static Future<Map> getExifInterfaceMetadata(AvesEntry entry) async {
|
||||
try {
|
||||
// return map with all data available from the `ExifInterface` library
|
||||
final result = await platform.invokeMethod('getExifInterfaceMetadata', <String, dynamic>{
|
||||
|
@ -68,7 +68,7 @@ class AndroidDebugService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> getMediaMetadataRetrieverMetadata(ImageEntry entry) async {
|
||||
static Future<Map> getMediaMetadataRetrieverMetadata(AvesEntry entry) async {
|
||||
try {
|
||||
// return map with all data available from `MediaMetadataRetriever`
|
||||
final result = await platform.invokeMethod('getMediaMetadataRetrieverMetadata', <String, dynamic>{
|
||||
|
@ -81,7 +81,7 @@ class AndroidDebugService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> getMetadataExtractorSummary(ImageEntry entry) async {
|
||||
static Future<Map> getMetadataExtractorSummary(AvesEntry entry) async {
|
||||
try {
|
||||
// return map with the mime type and tag count for each directory found by `metadata-extractor`
|
||||
final result = await platform.invokeMethod('getMetadataExtractorSummary', <String, dynamic>{
|
||||
|
@ -96,7 +96,7 @@ class AndroidDebugService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> getTiffStructure(ImageEntry entry) async {
|
||||
static Future<Map> getTiffStructure(AvesEntry entry) async {
|
||||
if (entry.mimeType != MimeTypes.tiff) return {};
|
||||
|
||||
try {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:typed_data';
|
||||
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/services/image_file_service.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
@ -26,7 +26,7 @@ class AppShortcutService {
|
|||
return false;
|
||||
}
|
||||
|
||||
static Future<void> pin(String label, ImageEntry entry, Set<CollectionFilter> filters) async {
|
||||
static Future<void> pin(String label, AvesEntry entry, Set<CollectionFilter> filters) async {
|
||||
Uint8List iconBytes;
|
||||
if (entry != null) {
|
||||
final size = entry.isVideo ? 0.0 : 256.0;
|
||||
|
|
|
@ -3,7 +3,7 @@ import 'dart:convert';
|
|||
import 'dart:math';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/ref/mime_types.dart';
|
||||
import 'package:aves/services/service_policy.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -18,7 +18,7 @@ class ImageFileService {
|
|||
static final StreamsChannel opChannel = StreamsChannel('deckers.thibault/aves/imageopstream');
|
||||
static const double thumbnailDefaultSize = 64.0;
|
||||
|
||||
static Map<String, dynamic> _toPlatformEntryMap(ImageEntry entry) {
|
||||
static Map<String, dynamic> _toPlatformEntryMap(AvesEntry entry) {
|
||||
return {
|
||||
'uri': entry.uri,
|
||||
'path': entry.path,
|
||||
|
@ -32,13 +32,13 @@ class ImageFileService {
|
|||
}
|
||||
|
||||
// knownEntries: map of contentId -> dateModifiedSecs
|
||||
static Stream<ImageEntry> getImageEntries(Map<int, int> knownEntries) {
|
||||
static Stream<AvesEntry> getEntries(Map<int, int> knownEntries) {
|
||||
try {
|
||||
return mediaStoreChannel.receiveBroadcastStream(<String, dynamic>{
|
||||
'knownEntries': knownEntries,
|
||||
}).map((event) => ImageEntry.fromMap(event));
|
||||
}).map((event) => AvesEntry.fromMap(event));
|
||||
} on PlatformException catch (e) {
|
||||
debugPrint('getImageEntries failed with code=${e.code}, exception=${e.message}, details=${e.details}');
|
||||
debugPrint('getEntries failed with code=${e.code}, exception=${e.message}, details=${e.details}');
|
||||
return Stream.error(e);
|
||||
}
|
||||
}
|
||||
|
@ -55,16 +55,16 @@ class ImageFileService {
|
|||
return [];
|
||||
}
|
||||
|
||||
static Future<ImageEntry> getImageEntry(String uri, String mimeType) async {
|
||||
debugPrint('getImageEntry for uri=$uri, mimeType=$mimeType');
|
||||
static Future<AvesEntry> getEntry(String uri, String mimeType) async {
|
||||
debugPrint('getEntry for uri=$uri, mimeType=$mimeType');
|
||||
try {
|
||||
final result = await platform.invokeMethod('getImageEntry', <String, dynamic>{
|
||||
final result = await platform.invokeMethod('getEntry', <String, dynamic>{
|
||||
'uri': uri,
|
||||
'mimeType': mimeType,
|
||||
}) as Map;
|
||||
return ImageEntry.fromMap(result);
|
||||
return AvesEntry.fromMap(result);
|
||||
} on PlatformException catch (e) {
|
||||
debugPrint('getImageEntry failed with code=${e.code}, exception=${e.message}, details=${e.details}');
|
||||
debugPrint('getEntry failed with code=${e.code}, exception=${e.message}, details=${e.details}');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -224,7 +224,7 @@ class ImageFileService {
|
|||
|
||||
static Future<T> resumeLoading<T>(Object taskKey) => servicePolicy.resume<T>(taskKey);
|
||||
|
||||
static Stream<ImageOpEvent> delete(Iterable<ImageEntry> entries) {
|
||||
static Stream<ImageOpEvent> delete(Iterable<AvesEntry> entries) {
|
||||
try {
|
||||
return opChannel.receiveBroadcastStream(<String, dynamic>{
|
||||
'op': 'delete',
|
||||
|
@ -236,7 +236,7 @@ class ImageFileService {
|
|||
}
|
||||
}
|
||||
|
||||
static Stream<MoveOpEvent> move(Iterable<ImageEntry> entries, {@required bool copy, @required String destinationAlbum}) {
|
||||
static Stream<MoveOpEvent> move(Iterable<AvesEntry> entries, {@required bool copy, @required String destinationAlbum}) {
|
||||
try {
|
||||
return opChannel.receiveBroadcastStream(<String, dynamic>{
|
||||
'op': 'move',
|
||||
|
@ -250,7 +250,7 @@ class ImageFileService {
|
|||
}
|
||||
}
|
||||
|
||||
static Future<Map> rename(ImageEntry entry, String newName) async {
|
||||
static Future<Map> rename(AvesEntry entry, String newName) async {
|
||||
try {
|
||||
// return map with: 'contentId' 'path' 'title' 'uri' (all optional)
|
||||
final result = await platform.invokeMethod('rename', <String, dynamic>{
|
||||
|
@ -264,7 +264,7 @@ class ImageFileService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> rotate(ImageEntry entry, {@required bool clockwise}) async {
|
||||
static Future<Map> rotate(AvesEntry entry, {@required bool clockwise}) async {
|
||||
try {
|
||||
// return map with: 'rotationDegrees' 'isFlipped'
|
||||
final result = await platform.invokeMethod('rotate', <String, dynamic>{
|
||||
|
@ -278,7 +278,7 @@ class ImageFileService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<Map> flip(ImageEntry entry) async {
|
||||
static Future<Map> flip(AvesEntry entry) async {
|
||||
try {
|
||||
// return map with: 'rotationDegrees' 'isFlipped'
|
||||
final result = await platform.invokeMethod('flip', <String, dynamic>{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:typed_data';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/model/panorama.dart';
|
||||
import 'package:aves/services/service_policy.dart';
|
||||
|
@ -12,7 +12,7 @@ class MetadataService {
|
|||
static const platform = MethodChannel('deckers.thibault/aves/metadata');
|
||||
|
||||
// return Map<Map<Key, Value>> (map of directories, each directory being a map of metadata label and value description)
|
||||
static Future<Map> getAllMetadata(ImageEntry entry) async {
|
||||
static Future<Map> getAllMetadata(AvesEntry entry) async {
|
||||
if (entry.isSvg) return null;
|
||||
|
||||
try {
|
||||
|
@ -28,7 +28,7 @@ class MetadataService {
|
|||
return {};
|
||||
}
|
||||
|
||||
static Future<CatalogMetadata> getCatalogMetadata(ImageEntry entry, {bool background = false}) async {
|
||||
static Future<CatalogMetadata> getCatalogMetadata(AvesEntry entry, {bool background = false}) async {
|
||||
if (entry.isSvg) return null;
|
||||
|
||||
Future<CatalogMetadata> call() async {
|
||||
|
@ -65,7 +65,7 @@ class MetadataService {
|
|||
: call();
|
||||
}
|
||||
|
||||
static Future<OverlayMetadata> getOverlayMetadata(ImageEntry entry) async {
|
||||
static Future<OverlayMetadata> getOverlayMetadata(AvesEntry entry) async {
|
||||
if (entry.isSvg) return null;
|
||||
|
||||
try {
|
||||
|
@ -82,7 +82,7 @@ class MetadataService {
|
|||
return null;
|
||||
}
|
||||
|
||||
static Future<MultiPageInfo> getMultiPageInfo(ImageEntry entry) async {
|
||||
static Future<MultiPageInfo> getMultiPageInfo(AvesEntry entry) async {
|
||||
try {
|
||||
final result = await platform.invokeMethod('getMultiPageInfo', <String, dynamic>{
|
||||
'mimeType': entry.mimeType,
|
||||
|
@ -95,7 +95,7 @@ class MetadataService {
|
|||
return null;
|
||||
}
|
||||
|
||||
static Future<PanoramaInfo> getPanoramaInfo(ImageEntry entry) async {
|
||||
static Future<PanoramaInfo> getPanoramaInfo(AvesEntry entry) async {
|
||||
try {
|
||||
// return map with values for:
|
||||
// 'croppedAreaLeft' (int), 'croppedAreaTop' (int), 'croppedAreaWidth' (int), 'croppedAreaHeight' (int),
|
||||
|
@ -124,7 +124,7 @@ class MetadataService {
|
|||
return [];
|
||||
}
|
||||
|
||||
static Future<List<Uint8List>> getExifThumbnails(ImageEntry entry) async {
|
||||
static Future<List<Uint8List>> getExifThumbnails(AvesEntry entry) async {
|
||||
try {
|
||||
final result = await platform.invokeMethod('getExifThumbnails', <String, dynamic>{
|
||||
'mimeType': entry.mimeType,
|
||||
|
@ -138,7 +138,7 @@ class MetadataService {
|
|||
return [];
|
||||
}
|
||||
|
||||
static Future<Map> extractXmpDataProp(ImageEntry entry, String propPath, String propMimeType) async {
|
||||
static Future<Map> extractXmpDataProp(AvesEntry entry, String propPath, String propMimeType) async {
|
||||
try {
|
||||
final result = await platform.invokeMethod('extractXmpDataProp', <String, dynamic>{
|
||||
'mimeType': entry.mimeType,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/services/image_file_service.dart';
|
||||
import 'package:aves/utils/string_utils.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -15,7 +15,7 @@ class SvgMetadataService {
|
|||
static const _textElements = ['title', 'desc'];
|
||||
static const _metadataElement = 'metadata';
|
||||
|
||||
static Future<Size> getSize(ImageEntry entry) async {
|
||||
static Future<Size> getSize(AvesEntry entry) async {
|
||||
try {
|
||||
final data = await ImageFileService.getSvg(entry.uri, entry.mimeType);
|
||||
|
||||
|
@ -48,7 +48,7 @@ class SvgMetadataService {
|
|||
return null;
|
||||
}
|
||||
|
||||
static Future<Map<String, Map<String, String>>> getAllMetadata(ImageEntry entry) async {
|
||||
static Future<Map<String, Map<String, String>>> getAllMetadata(AvesEntry entry) async {
|
||||
String formatKey(String key) {
|
||||
switch (key) {
|
||||
case 'desc':
|
||||
|
|
|
@ -2,7 +2,7 @@ import 'dart:async';
|
|||
|
||||
import 'package:aves/model/actions/collection_actions.dart';
|
||||
import 'package:aves/model/actions/entry_actions.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:aves/services/android_app_service.dart';
|
||||
|
@ -22,7 +22,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
|
|||
|
||||
CollectionSource get source => collection.source;
|
||||
|
||||
Set<ImageEntry> get selection => collection.selection;
|
||||
Set<AvesEntry> get selection => collection.selection;
|
||||
|
||||
EntrySetActionDelegate({
|
||||
@required this.collection,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/model/source/section_keys.dart';
|
||||
import 'package:aves/widgets/collection/grid/headers/any.dart';
|
||||
|
@ -6,7 +6,7 @@ import 'package:aves/widgets/common/grid/section_layout.dart';
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<ImageEntry> {
|
||||
class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<AvesEntry> {
|
||||
final CollectionLens collection;
|
||||
|
||||
const SectionedEntryListLayoutProvider({
|
||||
|
@ -14,7 +14,7 @@ class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<Image
|
|||
@required double scrollableWidth,
|
||||
@required int columnCount,
|
||||
@required double tileExtent,
|
||||
@required Widget Function(ImageEntry entry) tileBuilder,
|
||||
@required Widget Function(AvesEntry entry) tileBuilder,
|
||||
@required Widget child,
|
||||
}) : super(
|
||||
scrollableWidth: scrollableWidth,
|
||||
|
@ -28,7 +28,7 @@ class SectionedEntryListLayoutProvider extends SectionedListLayoutProvider<Image
|
|||
bool get showHeaders => collection.showHeaders;
|
||||
|
||||
@override
|
||||
Map<SectionKey, List<ImageEntry>> get sections => collection.sections;
|
||||
Map<SectionKey, List<AvesEntry>> get sections => collection.sections;
|
||||
|
||||
@override
|
||||
double getHeaderExtent(BuildContext context, SectionKey sectionKey) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:async';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/utils/math_utils.dart';
|
||||
import 'package:aves/widgets/common/extensions/media_query.dart';
|
||||
|
@ -39,7 +39,7 @@ class _GridSelectionGestureDetectorState extends State<GridSelectionGestureDetec
|
|||
|
||||
CollectionLens get collection => widget.collection;
|
||||
|
||||
List<ImageEntry> get entries => collection.sortedEntries;
|
||||
List<AvesEntry> get entries => collection.sortedEntries;
|
||||
|
||||
ScrollController get scrollController => widget.scrollController;
|
||||
|
||||
|
@ -131,12 +131,12 @@ class _GridSelectionGestureDetectorState extends State<GridSelectionGestureDetec
|
|||
}
|
||||
}
|
||||
|
||||
ImageEntry _getEntryAt(Offset localPosition) {
|
||||
AvesEntry _getEntryAt(Offset localPosition) {
|
||||
// as of Flutter v1.22.5, `hitTest` on the `ScrollView` render object works fine when it is static,
|
||||
// but when it is scrolling (through controller animation), result is incomplete and children are missing,
|
||||
// so we use custom layout computation instead to find the entry.
|
||||
final offset = Offset(0, scrollController.offset - appBarHeight) + localPosition;
|
||||
final sectionedListLayout = context.read<SectionedListLayout<ImageEntry>>();
|
||||
final sectionedListLayout = context.read<SectionedListLayout<AvesEntry>>();
|
||||
return sectionedListLayout.getItemAt(offset);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/main.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/services/viewer_service.dart';
|
||||
import 'package:aves/widgets/collection/thumbnail/decorated.dart';
|
||||
|
@ -10,7 +10,7 @@ import 'package:flutter/material.dart';
|
|||
|
||||
class InteractiveThumbnail extends StatelessWidget {
|
||||
final CollectionLens collection;
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double tileExtent;
|
||||
final ValueNotifier<bool> isScrollingNotifier;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/widgets/collection/thumbnail/overlay.dart';
|
||||
import 'package:aves/widgets/collection/thumbnail/raster.dart';
|
||||
|
@ -6,7 +6,7 @@ import 'package:aves/widgets/collection/thumbnail/vector.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class DecoratedThumbnail extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
final CollectionLens collection;
|
||||
final ValueNotifier<bool> isScrollingNotifier;
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/utils/mime_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ErrorThumbnail extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
final String tooltip;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/highlight.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/model/source/enums.dart';
|
||||
|
@ -14,7 +14,7 @@ import 'package:provider/provider.dart';
|
|||
import 'package:tuple/tuple.dart';
|
||||
|
||||
class ThumbnailEntryOverlay extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
|
||||
const ThumbnailEntryOverlay({
|
||||
|
@ -61,7 +61,7 @@ class ThumbnailEntryOverlay extends StatelessWidget {
|
|||
}
|
||||
|
||||
class ThumbnailSelectionOverlay extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
|
||||
const ThumbnailSelectionOverlay({
|
||||
|
@ -121,7 +121,7 @@ class ThumbnailSelectionOverlay extends StatelessWidget {
|
|||
}
|
||||
|
||||
class ThumbnailHighlightOverlay extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
|
||||
const ThumbnailHighlightOverlay({
|
||||
|
@ -137,7 +137,7 @@ class ThumbnailHighlightOverlay extends StatefulWidget {
|
|||
class _ThumbnailHighlightOverlayState extends State<ThumbnailHighlightOverlay> {
|
||||
final ValueNotifier<bool> _highlightedNotifier = ValueNotifier(false);
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
import 'package:aves/image_providers/thumbnail_provider.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/entry_images.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:aves/widgets/collection/thumbnail/error.dart';
|
||||
import 'package:aves/widgets/common/fx/transition_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class RasterImageThumbnail extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
final int page;
|
||||
final ValueNotifier<bool> isScrollingNotifier;
|
||||
|
@ -29,7 +29,7 @@ class RasterImageThumbnail extends StatefulWidget {
|
|||
class _RasterImageThumbnailState extends State<RasterImageThumbnail> {
|
||||
ThumbnailProvider _fastThumbnailProvider, _sizedThumbnailProvider;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
double get extent => widget.extent;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/image_providers/uri_picture_provider.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/settings/entry_background.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/widgets/common/fx/checkered_decoration.dart';
|
||||
|
@ -8,7 +8,7 @@ import 'package:flutter_svg/flutter_svg.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class VectorImageThumbnail extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
final Object heroTag;
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import 'package:aves/main.dart';
|
|||
import 'package:aves/model/filters/favourite.dart';
|
||||
import 'package:aves/model/filters/mime.dart';
|
||||
import 'package:aves/model/highlight.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:aves/ref/mime_types.dart';
|
||||
|
@ -82,7 +82,7 @@ class ThumbnailCollection extends StatelessWidget {
|
|||
),
|
||||
);
|
||||
|
||||
final scaler = GridScaleGestureDetector<ImageEntry>(
|
||||
final scaler = GridScaleGestureDetector<AvesEntry>(
|
||||
tileExtentManager: tileExtentManager,
|
||||
scrollableKey: _scrollableKey,
|
||||
appBarHeightNotifier: _appBarHeightNotifier,
|
||||
|
@ -106,7 +106,7 @@ class ThumbnailCollection extends StatelessWidget {
|
|||
highlightable: false,
|
||||
),
|
||||
getScaledItemTileRect: (context, entry) {
|
||||
final sectionedListLayout = context.read<SectionedListLayout<ImageEntry>>();
|
||||
final sectionedListLayout = context.read<SectionedListLayout<AvesEntry>>();
|
||||
return sectionedListLayout.getTileRect(entry) ?? Rect.zero;
|
||||
},
|
||||
onScaled: (entry) => Provider.of<HighlightInfo>(context, listen: false).add(entry),
|
||||
|
@ -225,7 +225,7 @@ class _CollectionScrollViewState extends State<CollectionScrollView> {
|
|||
child: _buildEmptyCollectionPlaceholder(collection),
|
||||
hasScrollBody: false,
|
||||
)
|
||||
: SectionedListSliver<ImageEntry>(),
|
||||
: SectionedListSliver<AvesEntry>(),
|
||||
BottomPaddingSliver(),
|
||||
],
|
||||
);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/services/image_file_service.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:flushbar/flushbar.dart';
|
||||
|
@ -31,7 +31,7 @@ mixin FeedbackMixin {
|
|||
|
||||
void showOpReport<T extends ImageOpEvent>({
|
||||
@required BuildContext context,
|
||||
@required Set<ImageEntry> selection,
|
||||
@required Set<AvesEntry> selection,
|
||||
@required Stream<T> opStream,
|
||||
@required void Function(Set<T> processed) onDone,
|
||||
}) {
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/services/android_file_service.dart';
|
||||
import 'package:aves/widgets/dialogs/aves_dialog.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
mixin PermissionAwareMixin {
|
||||
Future<bool> checkStoragePermission(BuildContext context, Set<ImageEntry> entries) {
|
||||
Future<bool> checkStoragePermission(BuildContext context, Set<AvesEntry> entries) {
|
||||
return checkStoragePermissionForAlbums(context, entries.where((e) => e.path != null).map((e) => e.directory).toSet());
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:async';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/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';
|
||||
|
@ -11,7 +11,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/widgets.dart';
|
||||
|
||||
mixin SizeAwareMixin {
|
||||
Future<bool> checkFreeSpaceForMove(BuildContext context, Set<ImageEntry> selection, String destinationAlbum, bool copy) async {
|
||||
Future<bool> checkFreeSpaceForMove(BuildContext context, Set<AvesEntry> selection, String destinationAlbum, bool copy) async {
|
||||
final destinationVolume = androidFileUtils.getStorageVolume(destinationAlbum);
|
||||
final free = await AndroidFileService.getFreeSpace(destinationVolume);
|
||||
int needed;
|
||||
|
@ -20,7 +20,7 @@ mixin SizeAwareMixin {
|
|||
needed = selection.fold(0, sumSize);
|
||||
} else {
|
||||
// when moving, we only need space for the entries that are not already on the destination volume
|
||||
final byVolume = groupBy<ImageEntry, StorageVolume>(selection, (entry) => androidFileUtils.getStorageVolume(entry.path));
|
||||
final byVolume = groupBy<AvesEntry, StorageVolume>(selection, (entry) => androidFileUtils.getStorageVolume(entry.path));
|
||||
final otherVolumes = byVolume.keys.where((volume) => volume != destinationVolume);
|
||||
final fromOtherVolumes = otherVolumes.fold<int>(0, (sum, volume) => sum + byVolume[volume].fold(0, sumSize));
|
||||
// and we need at least as much space as the largest entry because individual entries are copied then deleted
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:ui';
|
||||
|
||||
import 'package:aves/image_providers/app_icon_image_provider.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:aves/utils/android_file_utils.dart';
|
||||
import 'package:aves/utils/constants.dart';
|
||||
|
@ -9,7 +9,7 @@ import 'package:decorated_icon/decorated_icon.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class VideoIcon extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double iconSize;
|
||||
final bool showDuration;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:aves/widgets/common/identity/aves_expansion_tile.dart';
|
||||
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
||||
|
@ -26,7 +26,7 @@ class AppDebugPage extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _AppDebugPageState extends State<AppDebugPage> {
|
||||
List<ImageEntry> get entries => widget.source.rawEntries;
|
||||
List<AvesEntry> get entries => widget.source.rawEntries;
|
||||
|
||||
static OverlayEntry _taskQueueOverlayEntry;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/favourite_repo.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/utils/file_utils.dart';
|
||||
import 'package:aves/widgets/common/identity/aves_expansion_tile.dart';
|
||||
|
@ -13,7 +13,7 @@ class DebugAppDatabaseSection extends StatefulWidget {
|
|||
|
||||
class _DebugAppDatabaseSectionState extends State<DebugAppDatabaseSection> with AutomaticKeepAliveClientMixin {
|
||||
Future<int> _dbFileSizeLoader;
|
||||
Future<List<ImageEntry>> _dbEntryLoader;
|
||||
Future<List<AvesEntry>> _dbEntryLoader;
|
||||
Future<List<DateMetadata>> _dbDateLoader;
|
||||
Future<List<CatalogMetadata>> _dbMetadataLoader;
|
||||
Future<List<AddressDetails>> _dbAddressLoader;
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
import 'aves_dialog.dart';
|
||||
|
||||
class RenameEntryDialog extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const RenameEntryDialog(this.entry);
|
||||
|
||||
|
@ -19,7 +19,7 @@ class _RenameEntryDialogState extends State<RenameEntryDialog> {
|
|||
final TextEditingController _nameController = TextEditingController();
|
||||
final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false);
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -3,7 +3,7 @@ import 'dart:ui';
|
|||
|
||||
import 'package:aves/model/filters/album.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
|
@ -20,7 +20,7 @@ import 'package:flutter/material.dart';
|
|||
class DecoratedFilterChip extends StatelessWidget {
|
||||
final CollectionSource source;
|
||||
final CollectionFilter filter;
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
final bool pinned, highlightable;
|
||||
final FilterCallback onTap;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:aves/main.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/settings/home_page.dart';
|
||||
import 'package:aves/model/settings/screen_on.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
|
@ -35,7 +35,7 @@ class HomePage extends StatefulWidget {
|
|||
|
||||
class _HomePageState extends State<HomePage> {
|
||||
MediaStoreSource _mediaStore;
|
||||
ImageEntry _viewerEntry;
|
||||
AvesEntry _viewerEntry;
|
||||
String _shortcutRouteName;
|
||||
List<String> _shortcutFilters;
|
||||
|
||||
|
@ -108,8 +108,8 @@ class _HomePageState extends State<HomePage> {
|
|||
unawaited(Navigator.pushReplacement(context, _getRedirectRoute()));
|
||||
}
|
||||
|
||||
Future<ImageEntry> _initViewerEntry({@required String uri, @required String mimeType}) async {
|
||||
final entry = await ImageFileService.getImageEntry(uri, mimeType);
|
||||
Future<AvesEntry> _initViewerEntry({@required String uri, @required String mimeType}) async {
|
||||
final entry = await ImageFileService.getEntry(uri, mimeType);
|
||||
if (entry != null) {
|
||||
// cataloguing is essential for geolocation and video rotation
|
||||
await entry.catalog();
|
||||
|
|
|
@ -4,7 +4,7 @@ import 'package:aves/model/filters/filters.dart';
|
|||
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/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';
|
||||
|
@ -30,7 +30,7 @@ class StatsPage extends StatelessWidget {
|
|||
final CollectionLens parentCollection;
|
||||
final Map<String, int> entryCountPerCountry = {}, entryCountPerPlace = {}, entryCountPerTag = {};
|
||||
|
||||
List<ImageEntry> get entries => parentCollection?.sortedEntries ?? source.rawEntries;
|
||||
List<AvesEntry> get entries => parentCollection?.sortedEntries ?? source.rawEntries;
|
||||
|
||||
static const mimeDonutMinWidth = 124.0;
|
||||
|
||||
|
@ -66,7 +66,7 @@ class StatsPage extends StatelessWidget {
|
|||
text: 'No images',
|
||||
);
|
||||
} else {
|
||||
final byMimeTypes = groupBy<ImageEntry, String>(entries, (entry) => entry.mimeType).map<String, int>((k, v) => MapEntry(k, v.length));
|
||||
final byMimeTypes = groupBy<AvesEntry, String>(entries, (entry) => entry.mimeType).map<String, int>((k, v) => MapEntry(k, v.length));
|
||||
final imagesByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('image/')));
|
||||
final videoByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('video/')));
|
||||
final mimeDonuts = Wrap(
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/metadata_db.dart';
|
||||
import 'package:aves/widgets/viewer/info/common.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class DbTab extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const DbTab({@required this.entry});
|
||||
|
||||
|
@ -15,11 +15,11 @@ class DbTab extends StatefulWidget {
|
|||
|
||||
class _DbTabState extends State<DbTab> {
|
||||
Future<DateMetadata> _dbDateLoader;
|
||||
Future<ImageEntry> _dbEntryLoader;
|
||||
Future<AvesEntry> _dbEntryLoader;
|
||||
Future<CatalogMetadata> _dbMetadataLoader;
|
||||
Future<AddressDetails> _dbAddressLoader;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
@ -60,7 +60,7 @@ class _DbTabState extends State<DbTab> {
|
|||
},
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
FutureBuilder<ImageEntry>(
|
||||
FutureBuilder<AvesEntry>(
|
||||
future: _dbEntryLoader,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasError) return Text(snapshot.error.toString());
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:collection';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/ref/mime_types.dart';
|
||||
import 'package:aves/services/android_debug_service.dart';
|
||||
import 'package:aves/utils/constants.dart';
|
||||
|
@ -10,7 +10,7 @@ import 'package:aves/widgets/viewer/info/common.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class MetadataTab extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const MetadataTab({@required this.entry});
|
||||
|
||||
|
@ -25,7 +25,7 @@ class _MetadataTabState extends State<MetadataTab> {
|
|||
static const secondTimestampKeys = ['date_added', 'date_modified', 'date_expires', 'isPlayed'];
|
||||
static const millisecondTimestampKeys = ['datetaken', 'datetime'];
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'package:aves/image_providers/uri_picture_provider.dart';
|
||||
import 'package:aves/main.dart';
|
||||
import 'package:aves/model/entry_images.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:aves/widgets/viewer/debug/db.dart';
|
||||
import 'package:aves/widgets/viewer/debug/metadata.dart';
|
||||
|
@ -13,7 +13,7 @@ import 'package:tuple/tuple.dart';
|
|||
class ViewerDebugPage extends StatelessWidget {
|
||||
static const routeName = '/viewer/debug';
|
||||
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const ViewerDebugPage({@required this.entry});
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:aves/model/actions/entry_actions.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/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';
|
||||
|
@ -28,7 +28,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin {
|
|||
|
||||
bool get hasCollection => collection != null;
|
||||
|
||||
void onActionSelected(BuildContext context, ImageEntry entry, EntryAction action) {
|
||||
void onActionSelected(BuildContext context, AvesEntry entry, EntryAction action) {
|
||||
switch (action) {
|
||||
case EntryAction.toggleFavourite:
|
||||
entry.toggleFavourite();
|
||||
|
@ -88,21 +88,21 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin {
|
|||
}
|
||||
}
|
||||
|
||||
Future<void> _flip(BuildContext context, ImageEntry entry) async {
|
||||
Future<void> _flip(BuildContext context, AvesEntry entry) async {
|
||||
if (!await checkStoragePermission(context, {entry})) return;
|
||||
|
||||
final success = await entry.flip();
|
||||
if (!success) showFeedback(context, 'Failed');
|
||||
}
|
||||
|
||||
Future<void> _rotate(BuildContext context, ImageEntry entry, {@required bool clockwise}) async {
|
||||
Future<void> _rotate(BuildContext context, AvesEntry entry, {@required bool clockwise}) async {
|
||||
if (!await checkStoragePermission(context, {entry})) return;
|
||||
|
||||
final success = await entry.rotate(clockwise: clockwise);
|
||||
if (!success) showFeedback(context, 'Failed');
|
||||
}
|
||||
|
||||
Future<void> _showDeleteDialog(BuildContext context, ImageEntry entry) async {
|
||||
Future<void> _showDeleteDialog(BuildContext context, AvesEntry entry) async {
|
||||
final confirmed = await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
|
@ -140,7 +140,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin {
|
|||
}
|
||||
}
|
||||
|
||||
Future<void> _showRenameDialog(BuildContext context, ImageEntry entry) async {
|
||||
Future<void> _showRenameDialog(BuildContext context, AvesEntry entry) async {
|
||||
final newName = await showDialog<String>(
|
||||
context: context,
|
||||
builder: (context) => RenameEntryDialog(entry),
|
||||
|
@ -152,7 +152,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin {
|
|||
showFeedback(context, await entry.rename(newName) ? 'Done!' : 'Failed');
|
||||
}
|
||||
|
||||
void _goToSourceViewer(BuildContext context, ImageEntry entry) {
|
||||
void _goToSourceViewer(BuildContext context, AvesEntry entry) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
|
@ -164,7 +164,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin {
|
|||
);
|
||||
}
|
||||
|
||||
void _goToDebug(BuildContext context, ImageEntry entry) {
|
||||
void _goToDebug(BuildContext context, AvesEntry entry) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/widgets/common/magnifier/pan/gesture_detector_scope.dart';
|
||||
|
@ -34,7 +34,7 @@ class MultiEntryScroller extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _MultiEntryScrollerState extends State<MultiEntryScroller> with AutomaticKeepAliveClientMixin {
|
||||
List<ImageEntry> get entries => widget.collection.sortedEntries;
|
||||
List<AvesEntry> get entries => widget.collection.sortedEntries;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -80,7 +80,7 @@ class _MultiEntryScrollerState extends State<MultiEntryScroller> with AutomaticK
|
|||
);
|
||||
}
|
||||
|
||||
Widget _buildViewer(ImageEntry entry, {MultiPageInfo multiPageInfo, int page}) {
|
||||
Widget _buildViewer(AvesEntry entry, {MultiPageInfo multiPageInfo, int page}) {
|
||||
return Selector<MediaQueryData, Size>(
|
||||
selector: (c, mq) => mq.size,
|
||||
builder: (c, mqSize, child) {
|
||||
|
@ -99,7 +99,7 @@ class _MultiEntryScrollerState extends State<MultiEntryScroller> with AutomaticK
|
|||
);
|
||||
}
|
||||
|
||||
MultiPageController _getMultiPageController(ImageEntry entry) {
|
||||
MultiPageController _getMultiPageController(AvesEntry entry) {
|
||||
return widget.multiPageControllers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2;
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,7 @@ class _MultiEntryScrollerState extends State<MultiEntryScroller> with AutomaticK
|
|||
}
|
||||
|
||||
class SingleEntryScroller extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final VoidCallback onTap;
|
||||
final List<Tuple2<String, IjkMediaController>> videoControllers;
|
||||
final List<Tuple2<String, MultiPageController>> multiPageControllers;
|
||||
|
@ -125,7 +125,7 @@ class SingleEntryScroller extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _SingleEntryScrollerState extends State<SingleEntryScroller> with AutomaticKeepAliveClientMixin {
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -173,7 +173,7 @@ class _SingleEntryScrollerState extends State<SingleEntryScroller> with Automati
|
|||
);
|
||||
}
|
||||
|
||||
MultiPageController _getMultiPageController(ImageEntry entry) {
|
||||
MultiPageController _getMultiPageController(AvesEntry entry) {
|
||||
return widget.multiPageControllers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
||||
import 'package:aves/widgets/viewer/entry_viewer_stack.dart';
|
||||
|
@ -8,7 +8,7 @@ class MultiEntryViewerPage extends AnimatedWidget {
|
|||
static const routeName = '/viewer';
|
||||
|
||||
final CollectionLens collection;
|
||||
final ImageEntry initialEntry;
|
||||
final AvesEntry initialEntry;
|
||||
|
||||
const MultiEntryViewerPage({
|
||||
Key key,
|
||||
|
@ -34,7 +34,7 @@ class MultiEntryViewerPage extends AnimatedWidget {
|
|||
class SingleEntryViewerPage extends StatelessWidget {
|
||||
static const routeName = '/viewer';
|
||||
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const SingleEntryViewerPage({
|
||||
Key key,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/settings/screen_on.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
|
@ -31,7 +31,7 @@ import 'package:tuple/tuple.dart';
|
|||
|
||||
class EntryViewerStack extends StatefulWidget {
|
||||
final CollectionLens collection;
|
||||
final ImageEntry initialEntry;
|
||||
final AvesEntry initialEntry;
|
||||
|
||||
const EntryViewerStack({
|
||||
Key key,
|
||||
|
@ -44,7 +44,7 @@ class EntryViewerStack extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerProviderStateMixin, WidgetsBindingObserver {
|
||||
final ValueNotifier<ImageEntry> _entryNotifier = ValueNotifier(null);
|
||||
final ValueNotifier<AvesEntry> _entryNotifier = ValueNotifier(null);
|
||||
int _currentHorizontalPage;
|
||||
ValueNotifier<int> _currentVerticalPage;
|
||||
PageController _horizontalPager, _verticalPager;
|
||||
|
@ -63,7 +63,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
|
|||
|
||||
bool get hasCollection => collection != null;
|
||||
|
||||
List<ImageEntry> get entries => hasCollection ? collection.sortedEntries : [widget.initialEntry];
|
||||
List<AvesEntry> get entries => hasCollection ? collection.sortedEntries : [widget.initialEntry];
|
||||
|
||||
static const int transitionPage = 0;
|
||||
|
||||
|
@ -199,7 +199,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
|
|||
}
|
||||
|
||||
Widget _buildTopOverlay() {
|
||||
final child = ValueListenableBuilder<ImageEntry>(
|
||||
final child = ValueListenableBuilder<AvesEntry>(
|
||||
valueListenable: _entryNotifier,
|
||||
builder: (context, entry, child) {
|
||||
if (entry == null) return SizedBox.shrink();
|
||||
|
@ -232,7 +232,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
|
|||
}
|
||||
|
||||
Widget _buildBottomOverlay() {
|
||||
Widget bottomOverlay = ValueListenableBuilder<ImageEntry>(
|
||||
Widget bottomOverlay = ValueListenableBuilder<AvesEntry>(
|
||||
valueListenable: _entryNotifier,
|
||||
builder: (context, entry, child) {
|
||||
if (entry == null) return SizedBox.shrink();
|
||||
|
@ -312,7 +312,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
|
|||
return bottomOverlay;
|
||||
}
|
||||
|
||||
MultiPageController _getMultiPageController(ImageEntry entry) {
|
||||
MultiPageController _getMultiPageController(AvesEntry entry) {
|
||||
return entry.isMultipage ? _multiPageControllers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2 : null;
|
||||
}
|
||||
|
||||
|
@ -478,7 +478,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with SingleTickerPr
|
|||
|
||||
class ViewerVerticalPageView extends StatefulWidget {
|
||||
final CollectionLens collection;
|
||||
final ValueNotifier<ImageEntry> entryNotifier;
|
||||
final ValueNotifier<AvesEntry> entryNotifier;
|
||||
final List<Tuple2<String, IjkMediaController>> videoControllers;
|
||||
final List<Tuple2<String, MultiPageController>> multiPageControllers;
|
||||
final PageController horizontalPager, verticalPager;
|
||||
|
@ -507,13 +507,13 @@ class ViewerVerticalPageView extends StatefulWidget {
|
|||
class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
|
||||
final ValueNotifier<Color> _backgroundColorNotifier = ValueNotifier(Colors.black);
|
||||
final ValueNotifier<bool> _infoPageVisibleNotifier = ValueNotifier(false);
|
||||
ImageEntry _oldEntry;
|
||||
AvesEntry _oldEntry;
|
||||
|
||||
CollectionLens get collection => widget.collection;
|
||||
|
||||
bool get hasCollection => collection != null;
|
||||
|
||||
ImageEntry get entry => widget.entryNotifier.value;
|
||||
AvesEntry get entry => widget.entryNotifier.value;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -3,7 +3,7 @@ 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/filters/tag.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/ref/mime_types.dart';
|
||||
import 'package:aves/utils/constants.dart';
|
||||
|
@ -15,7 +15,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:intl/intl.dart';
|
||||
|
||||
class BasicSection extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final CollectionLens collection;
|
||||
final FilterCallback onFilter;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:aves/widgets/common/app_bar_title.dart';
|
||||
import 'package:aves/widgets/viewer/info/info_search.dart';
|
||||
|
@ -6,7 +6,7 @@ import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class InfoAppBar extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier;
|
||||
final VoidCallback onBackPressed;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:aves/widgets/common/basic/insets.dart';
|
||||
|
@ -14,7 +14,7 @@ import 'package:provider/provider.dart';
|
|||
|
||||
class InfoPage extends StatefulWidget {
|
||||
final CollectionLens collection;
|
||||
final ValueNotifier<ImageEntry> entryNotifier;
|
||||
final ValueNotifier<AvesEntry> entryNotifier;
|
||||
final ValueNotifier<bool> visibleNotifier;
|
||||
|
||||
const InfoPage({
|
||||
|
@ -34,7 +34,7 @@ class _InfoPageState extends State<InfoPage> {
|
|||
|
||||
CollectionLens get collection => widget.collection;
|
||||
|
||||
ImageEntry get entry => widget.entryNotifier.value;
|
||||
AvesEntry get entry => widget.entryNotifier.value;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -48,7 +48,7 @@ class _InfoPageState extends State<InfoPage> {
|
|||
child: Selector<MediaQueryData, double>(
|
||||
selector: (c, mq) => mq.size.width,
|
||||
builder: (c, mqWidth, child) {
|
||||
return ValueListenableBuilder<ImageEntry>(
|
||||
return ValueListenableBuilder<AvesEntry>(
|
||||
valueListenable: widget.entryNotifier,
|
||||
builder: (context, entry, child) {
|
||||
return entry != null
|
||||
|
@ -107,7 +107,7 @@ class _InfoPageState extends State<InfoPage> {
|
|||
|
||||
class _InfoPageContent extends StatefulWidget {
|
||||
final CollectionLens collection;
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final ValueNotifier<bool> visibleNotifier;
|
||||
final ScrollController scrollController;
|
||||
final bool split;
|
||||
|
@ -134,7 +134,7 @@ class _InfoPageContentState extends State<_InfoPageContent> {
|
|||
|
||||
CollectionLens get collection => widget.collection;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:aves/widgets/collection/empty.dart';
|
||||
import 'package:aves/widgets/viewer/info/metadata/metadata_dir_tile.dart';
|
||||
|
@ -7,7 +7,7 @@ import 'package:collection/collection.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class InfoSearchDelegate extends SearchDelegate {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier;
|
||||
|
||||
Map<String, MetadataDirectory> get metadata => metadataNotifier.value;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/filters/location.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/settings/coordinate_format.dart';
|
||||
import 'package:aves/model/settings/map_style.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
|
@ -17,7 +17,7 @@ import 'package:tuple/tuple.dart';
|
|||
|
||||
class LocationSection extends StatefulWidget {
|
||||
final CollectionLens collection;
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final bool showTitle;
|
||||
final ValueNotifier<bool> visibleNotifier;
|
||||
final FilterCallback onFilter;
|
||||
|
@ -43,7 +43,7 @@ class _LocationSectionState extends State<LocationSection> with TickerProviderSt
|
|||
|
||||
CollectionLens get collection => widget.collection;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
@ -158,7 +158,7 @@ class _LocationSectionState extends State<LocationSection> with TickerProviderSt
|
|||
}
|
||||
|
||||
class _AddressInfoGroup extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const _AddressInfoGroup({@required this.entry});
|
||||
|
||||
|
@ -169,7 +169,7 @@ class _AddressInfoGroup extends StatefulWidget {
|
|||
class _AddressInfoGroupState extends State<_AddressInfoGroup> {
|
||||
Future<String> _addressLineLoader;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
import 'dart:typed_data';
|
||||
import 'dart:ui' as ui;
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/widgets/collection/thumbnail/raster.dart';
|
||||
import 'package:aves/widgets/collection/thumbnail/vector.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
|
||||
class ImageMarker extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final double extent;
|
||||
final Size pointerSize;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:collection';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/ref/brand_colors.dart';
|
||||
import 'package:aves/services/svg_metadata_service.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
|
@ -16,7 +16,7 @@ import 'package:flutter/foundation.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class MetadataDirTile extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final String title;
|
||||
final MetadataDirectory dir;
|
||||
final ValueNotifier<String> expandedDirectoryNotifier;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:collection';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/services/metadata_service.dart';
|
||||
import 'package:aves/services/svg_metadata_service.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
|
@ -13,7 +13,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
|
||||
|
||||
class MetadataSectionSliver extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final ValueNotifier<bool> visibleNotifier;
|
||||
final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier;
|
||||
|
||||
|
@ -31,7 +31,7 @@ class _MetadataSectionSliverState extends State<MetadataSectionSliver> with Auto
|
|||
final ValueNotifier<String> _loadedMetadataUri = ValueNotifier(null);
|
||||
final ValueNotifier<String> _expandedDirectoryNotifier = ValueNotifier(null);
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
bool get isVisible => widget.visibleNotifier.value;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:async';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/services/metadata_service.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
|
@ -9,7 +9,7 @@ enum MetadataThumbnailSource { embedded, exif }
|
|||
|
||||
class MetadataThumbnails extends StatefulWidget {
|
||||
final MetadataThumbnailSource source;
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const MetadataThumbnails({
|
||||
Key key,
|
||||
|
@ -24,7 +24,7 @@ class MetadataThumbnails extends StatefulWidget {
|
|||
class _MetadataThumbnailsState extends State<MetadataThumbnails> {
|
||||
Future<List<Uint8List>> _loader;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
String get uri => entry.uri;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:collection';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/ref/mime_types.dart';
|
||||
import 'package:aves/ref/xmp.dart';
|
||||
import 'package:aves/services/android_app_service.dart';
|
||||
|
@ -22,7 +22,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:pedantic/pedantic.dart';
|
||||
|
||||
class XmpDirTile extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final SplayTreeMap<String, String> tags;
|
||||
final ValueNotifier<String> expandedNotifier;
|
||||
final bool initiallyExpanded;
|
||||
|
@ -39,7 +39,7 @@ class XmpDirTile extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _XmpDirTileState extends State<XmpDirTile> with FeedbackMixin {
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -123,7 +123,7 @@ class _XmpDirTileState extends State<XmpDirTile> with FeedbackMixin {
|
|||
return;
|
||||
}
|
||||
|
||||
final embedEntry = ImageEntry.fromMap(fields);
|
||||
final embedEntry = AvesEntry.fromMap(fields);
|
||||
unawaited(Navigator.push(
|
||||
context,
|
||||
TransparentMaterialPageRoute(
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/services/metadata_service.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -10,7 +10,7 @@ class MultiPageController extends ChangeNotifier {
|
|||
final Future<MultiPageInfo> info;
|
||||
final ValueNotifier<int> pageNotifier = ValueNotifier(0);
|
||||
|
||||
MultiPageController(ImageEntry entry) : info = MetadataService.getMultiPageInfo(entry);
|
||||
MultiPageController(AvesEntry entry) : info = MetadataService.getMultiPageInfo(entry);
|
||||
|
||||
int get page => pageNotifier.value;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/image_metadata.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/metadata.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/model/settings/coordinate_format.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
|
@ -20,7 +20,7 @@ import 'package:provider/provider.dart';
|
|||
import 'package:tuple/tuple.dart';
|
||||
|
||||
class ViewerBottomOverlay extends StatefulWidget {
|
||||
final List<ImageEntry> entries;
|
||||
final List<AvesEntry> entries;
|
||||
final int index;
|
||||
final bool showPosition;
|
||||
final EdgeInsets viewInsets, viewPadding;
|
||||
|
@ -42,10 +42,10 @@ class ViewerBottomOverlay extends StatefulWidget {
|
|||
|
||||
class _ViewerBottomOverlayState extends State<ViewerBottomOverlay> {
|
||||
Future<OverlayMetadata> _detailLoader;
|
||||
ImageEntry _lastEntry;
|
||||
AvesEntry _lastEntry;
|
||||
OverlayMetadata _lastDetails;
|
||||
|
||||
ImageEntry get entry {
|
||||
AvesEntry get entry {
|
||||
final entries = widget.entries;
|
||||
final index = widget.index;
|
||||
return index < entries.length ? entries[index] : null;
|
||||
|
@ -138,7 +138,7 @@ const double _interRowPadding = 2.0;
|
|||
const double _subRowMinWidth = 300.0;
|
||||
|
||||
class _BottomOverlayContent extends AnimatedWidget {
|
||||
final ImageEntry mainEntry, entry;
|
||||
final AvesEntry mainEntry, entry;
|
||||
final MultiPageInfo multiPageInfo;
|
||||
final int page;
|
||||
final OverlayMetadata details;
|
||||
|
@ -302,7 +302,7 @@ class _BottomOverlayContent extends AnimatedWidget {
|
|||
}
|
||||
|
||||
class _LocationRow extends AnimatedWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
_LocationRow({
|
||||
Key key,
|
||||
|
@ -328,7 +328,7 @@ class _LocationRow extends AnimatedWidget {
|
|||
}
|
||||
|
||||
class _PositionTitleRow extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final String collectionPosition;
|
||||
final MultiPageController multiPageController;
|
||||
|
||||
|
@ -369,7 +369,7 @@ class _PositionTitleRow extends StatelessWidget {
|
|||
}
|
||||
|
||||
class _DateRow extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final MultiPageController multiPageController;
|
||||
|
||||
const _DateRow({
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/widgets/viewer/multipage.dart';
|
||||
import 'package:aves/widgets/viewer/visual/state.dart';
|
||||
|
@ -8,7 +8,7 @@ import 'package:flutter/foundation.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class Minimap extends StatelessWidget {
|
||||
final ImageEntry mainEntry;
|
||||
final AvesEntry mainEntry;
|
||||
final ValueNotifier<ViewState> viewStateNotifier;
|
||||
final MultiPageController multiPageController;
|
||||
final Size size;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:aves/widgets/collection/thumbnail/overlay.dart';
|
||||
|
@ -10,7 +10,7 @@ import 'package:flutter/foundation.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class MultiPageOverlay extends StatefulWidget {
|
||||
final ImageEntry mainEntry;
|
||||
final AvesEntry mainEntry;
|
||||
final MultiPageController controller;
|
||||
final double availableWidth;
|
||||
|
||||
|
@ -34,7 +34,7 @@ class _MultiPageOverlayState extends State<MultiPageOverlay> {
|
|||
static const double extent = 48;
|
||||
static const double separatorWidth = 2;
|
||||
|
||||
ImageEntry get mainEntry => widget.mainEntry;
|
||||
AvesEntry get mainEntry => widget.mainEntry;
|
||||
|
||||
MultiPageController get controller => widget.controller;
|
||||
|
||||
|
@ -162,7 +162,7 @@ class _MultiPageOverlayState extends State<MultiPageOverlay> {
|
|||
);
|
||||
}
|
||||
|
||||
Widget _buildPageThumbnail(ImageEntry entry) {
|
||||
Widget _buildPageThumbnail(AvesEntry entry) {
|
||||
Widget child = RasterImageThumbnail(
|
||||
entry: entry,
|
||||
extent: extent,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/services/metadata_service.dart';
|
||||
import 'package:aves/widgets/viewer/overlay/common.dart';
|
||||
import 'package:aves/widgets/viewer/panorama_page.dart';
|
||||
|
@ -6,7 +6,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:pedantic/pedantic.dart';
|
||||
|
||||
class PanoramaOverlay extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final Animation<double> scale;
|
||||
|
||||
const PanoramaOverlay({
|
||||
|
|
|
@ -2,7 +2,7 @@ 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/entry.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
|
@ -19,7 +19,7 @@ import 'package:provider/provider.dart';
|
|||
import 'package:tuple/tuple.dart';
|
||||
|
||||
class ViewerTopOverlay extends StatelessWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final Animation<double> scale;
|
||||
final EdgeInsets viewInsets, viewPadding;
|
||||
final Function(EntryAction value) onActionSelected;
|
||||
|
@ -135,7 +135,7 @@ class _TopOverlayRow extends StatelessWidget {
|
|||
final List<EntryAction> inAppActions;
|
||||
final List<EntryAction> externalAppActions;
|
||||
final Animation<double> scale;
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final Function(EntryAction value) onActionSelected;
|
||||
|
||||
const _TopOverlayRow({
|
||||
|
@ -299,7 +299,7 @@ class _TopOverlayRow extends StatelessWidget {
|
|||
}
|
||||
|
||||
class _FavouriteToggler extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final bool isMenuItem;
|
||||
final VoidCallback onPressed;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/services/android_app_service.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
|
@ -12,7 +12,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
|
||||
|
||||
class VideoControlOverlay extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final IjkMediaController controller;
|
||||
final Animation<double> scale;
|
||||
|
||||
|
@ -37,7 +37,7 @@ class _VideoControlOverlayState extends State<VideoControlOverlay> with SingleTi
|
|||
// video info is not refreshed by default, so we use a timer to do so
|
||||
Timer _progressTimer;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
Animation<double> get scale => widget.scale;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:aves/model/entry_images.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/panorama.dart';
|
||||
import 'package:aves/theme/icons.dart';
|
||||
import 'package:aves/widgets/common/basic/insets.dart';
|
||||
|
@ -15,7 +15,7 @@ import 'package:provider/provider.dart';
|
|||
class PanoramaPage extends StatefulWidget {
|
||||
static const routeName = '/viewer/panorama';
|
||||
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final PanoramaInfo info;
|
||||
|
||||
const PanoramaPage({
|
||||
|
@ -31,7 +31,7 @@ class _PanoramaPageState extends State<PanoramaPage> {
|
|||
final ValueNotifier<bool> _overlayVisible = ValueNotifier(true);
|
||||
final ValueNotifier<SensorControl> _sensorControl = ValueNotifier(SensorControl.None);
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
PanoramaInfo get info => widget.info;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/entry_images.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/services/image_file_service.dart';
|
||||
import 'package:aves/services/metadata_service.dart';
|
||||
import 'package:pdf/widgets.dart' as pdf;
|
||||
|
@ -9,7 +9,7 @@ import 'package:pedantic/pedantic.dart';
|
|||
import 'package:printing/printing.dart';
|
||||
|
||||
class EntryPrinter {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
const EntryPrinter(this.entry);
|
||||
|
||||
|
@ -58,7 +58,7 @@ class EntryPrinter {
|
|||
return pages;
|
||||
}
|
||||
|
||||
Future<pdf.Widget> _buildPageImage(ImageEntry entry) async {
|
||||
Future<pdf.Widget> _buildPageImage(AvesEntry entry) async {
|
||||
if (entry.isSvg) {
|
||||
final bytes = await ImageFileService.getSvg(entry.uri, entry.mimeType);
|
||||
if (bytes != null && bytes.isNotEmpty) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:aves/image_providers/uri_picture_provider.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/multipage.dart';
|
||||
import 'package:aves/model/settings/entry_background.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
|
@ -23,7 +23,7 @@ import 'package:flutter_svg/flutter_svg.dart';
|
|||
import 'package:tuple/tuple.dart';
|
||||
|
||||
class EntryPageView extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final MultiPageInfo multiPageInfo;
|
||||
final int page;
|
||||
final Size viewportSize;
|
||||
|
@ -36,7 +36,7 @@ class EntryPageView extends StatefulWidget {
|
|||
|
||||
EntryPageView({
|
||||
Key key,
|
||||
ImageEntry mainEntry,
|
||||
AvesEntry mainEntry,
|
||||
this.multiPageInfo,
|
||||
this.page,
|
||||
this.viewportSize,
|
||||
|
@ -56,7 +56,7 @@ class _EntryPageViewState extends State<EntryPageView> {
|
|||
final ValueNotifier<ViewState> _viewStateNotifier = ValueNotifier(ViewState.zero);
|
||||
final List<StreamSubscription> _subscriptions = [];
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
Size get viewportSize => widget.viewportSize;
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import 'dart:math';
|
|||
|
||||
import 'package:aves/image_providers/region_provider.dart';
|
||||
import 'package:aves/model/entry_images.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/settings/entry_background.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/utils/math_utils.dart';
|
||||
|
@ -15,7 +15,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:tuple/tuple.dart';
|
||||
|
||||
class RasterImageView extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final ValueNotifier<ViewState> viewStateNotifier;
|
||||
final ImageErrorWidgetBuilder errorBuilder;
|
||||
|
||||
|
@ -39,7 +39,7 @@ class _RasterImageViewState extends State<RasterImageView> {
|
|||
ImageStreamListener _fullImageListener;
|
||||
final ValueNotifier<bool> _fullImageLoaded = ValueNotifier(false);
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
ValueNotifier<ViewState> get viewStateNotifier => widget.viewStateNotifier;
|
||||
|
||||
|
@ -323,7 +323,7 @@ class _RasterImageViewState extends State<RasterImageView> {
|
|||
}
|
||||
|
||||
class RegionTile extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
|
||||
// `tileRect` uses Flutter view coordinates
|
||||
// `regionRect` uses the raw image pixel coordinates
|
||||
|
@ -354,7 +354,7 @@ class RegionTile extends StatefulWidget {
|
|||
class _RegionTileState extends State<RegionTile> {
|
||||
RegionProvider _provider;
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
import 'dart:async';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/entry_images.dart';
|
||||
import 'package:aves/model/image_entry.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
|
||||
|
||||
class VideoView extends StatefulWidget {
|
||||
final ImageEntry entry;
|
||||
final AvesEntry entry;
|
||||
final IjkMediaController controller;
|
||||
|
||||
const VideoView({
|
||||
|
@ -23,7 +23,7 @@ class VideoView extends StatefulWidget {
|
|||
class _VideoViewState extends State<VideoView> {
|
||||
final List<StreamSubscription> _subscriptions = [];
|
||||
|
||||
ImageEntry get entry => widget.entry;
|
||||
AvesEntry get entry => widget.entry;
|
||||
|
||||
IjkMediaController get controller => widget.controller;
|
||||
|
||||
|
|
Loading…
Reference in a new issue