diff --git a/lib/models/records/record.dart b/lib/models/records/record.dart index 3f9823f..d0f15c6 100644 --- a/lib/models/records/record.dart +++ b/lib/models/records/record.dart @@ -218,8 +218,12 @@ class Record { bool get isRoot => this == _rootRecord; + bool get isLink => assetUri.startsWith("resrec"); + + bool get isItem => assetUri.startsWith("resdb"); + String get linkRecordId { - if (!assetUri.startsWith("resrec")) { + if (!isLink) { throw "Record is not a link."; } diff --git a/lib/widgets/inventory/inventory_browser.dart b/lib/widgets/inventory/inventory_browser.dart index 1878be1..5303924 100644 --- a/lib/widgets/inventory/inventory_browser.dart +++ b/lib/widgets/inventory/inventory_browser.dart @@ -2,6 +2,9 @@ import 'dart:async'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:provider/provider.dart'; import 'package:recon/auxiliary.dart'; import 'package:recon/clients/inventory_client.dart'; import 'package:recon/models/inventory/resonite_directory.dart'; @@ -9,9 +12,6 @@ import 'package:recon/models/records/record.dart'; import 'package:recon/widgets/default_error_widget.dart'; import 'package:recon/widgets/inventory/object_inventory_tile.dart'; import 'package:recon/widgets/inventory/path_inventory_tile.dart'; -import 'package:flutter/material.dart'; -import 'package:photo_view/photo_view.dart'; -import 'package:provider/provider.dart'; class InventoryBrowser extends StatefulWidget { const InventoryBrowser({super.key}); @@ -127,16 +127,23 @@ class _InventoryBrowserState extends State with AutomaticKeepA shrinkWrap: true, itemCount: paths.length, gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 256, - childAspectRatio: 3.5, - crossAxisSpacing: 0, - mainAxisSpacing: 0), + maxCrossAxisExtent: 256, + childAspectRatio: 3.5, + crossAxisSpacing: 0, + mainAxisSpacing: 0, + ), itemBuilder: (context, index) { final record = paths[index]; return PathInventoryTile( record: record, + selected: iClient.isRecordSelected(record), + onLongPress: () async { + iClient.toggleRecordSelected(record); + }, onTap: iClient.isAnyRecordSelected - ? () {} + ? () { + iClient.toggleRecordSelected(record); + } : () async { try { await iClient.navigateTo(record); diff --git a/lib/widgets/inventory/inventory_browser_app_bar.dart b/lib/widgets/inventory/inventory_browser_app_bar.dart index f98d55f..a84bd23 100644 --- a/lib/widgets/inventory/inventory_browser_app_bar.dart +++ b/lib/widgets/inventory/inventory_browser_app_bar.dart @@ -1,13 +1,14 @@ import 'dart:isolate'; import 'dart:ui'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/clients/inventory_client.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:path/path.dart'; import 'package:provider/provider.dart'; +import 'package:recon/auxiliary.dart'; +import 'package:recon/clients/inventory_client.dart'; +import 'package:share_plus/share_plus.dart'; class InventoryBrowserAppBar extends StatefulWidget { const InventoryBrowserAppBar({super.key}); @@ -71,6 +72,15 @@ class _InventoryBrowserAppBarState extends State { icon: const Icon(Icons.close), ), actions: [ + if (iClient.selectedRecordCount == 1 && + (iClient.selectedRecords.firstOrNull?.isLink == true || + iClient.selectedRecords.firstOrNull?.isItem == true)) + IconButton( + onPressed: () { + Share.share(iClient.selectedRecords.first.assetUri); + }, + icon: const Icon(Icons.share), + ), if (iClient.onlyFilesSelected) IconButton( onPressed: () async { diff --git a/pubspec.lock b/pubspec.lock index a869643..98c7b4b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -504,6 +504,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" nested: dependency: transitive description: @@ -752,6 +760,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "6cec740fa0943a826951223e76218df002804adb588235a8910dc3d6b0654e11" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7" + url: "https://pub.dev" + source: hosted + version: "3.3.0" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 4e2a09d..3835209 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,6 +63,7 @@ dependencies: permission_handler: ^10.2.0 flutter_downloader: ^1.10.4 flutter_cube: ^0.1.1 + share_plus: ^7.1.0 dev_dependencies: flutter_test: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index a728785..11b1970 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { @@ -21,6 +22,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); RecordWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 3016adf..0093ee4 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -7,6 +7,7 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_secure_storage_windows permission_handler_windows record_windows + share_plus url_launcher_windows )