-
-
Notifications
You must be signed in to change notification settings - Fork 52
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1924 from matthiasn/feat/paste_image_from_clipboard
feat: paste image from clipboard
- Loading branch information
Showing
13 changed files
with
668 additions
and
3 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import 'package:flutter_riverpod/flutter_riverpod.dart'; | ||
import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||
import 'package:super_clipboard/super_clipboard.dart'; | ||
|
||
part 'clipboard_repository.g.dart'; | ||
|
||
@riverpod | ||
SystemClipboard? clipboardRepository(Ref ref) { | ||
return SystemClipboard.instance; | ||
} |
29 changes: 29 additions & 0 deletions
29
lib/features/journal/repository/clipboard_repository.g.dart
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
import 'dart:async'; | ||
|
||
import 'package:lotti/features/journal/repository/clipboard_repository.dart'; | ||
import 'package:lotti/logic/image_import.dart'; | ||
import 'package:riverpod_annotation/riverpod_annotation.dart'; | ||
import 'package:super_clipboard/super_clipboard.dart'; | ||
|
||
part 'image_paste_controller.g.dart'; | ||
|
||
@riverpod | ||
class ImagePasteController extends _$ImagePasteController { | ||
@override | ||
Future<bool> build({ | ||
required String? linkedFromId, | ||
required String? categoryId, | ||
}) async { | ||
final clipboard = ref.read(clipboardRepositoryProvider); | ||
if (clipboard == null) { | ||
return false; | ||
} | ||
final reader = await clipboard.read(); | ||
return reader.canProvide(Formats.png) || reader.canProvide(Formats.jpeg); | ||
} | ||
|
||
Future<void> paste() async { | ||
final clipboard = ref.read(clipboardRepositoryProvider); | ||
if (clipboard == null) { | ||
return; | ||
} | ||
final reader = await clipboard.read(); | ||
|
||
if (reader.canProvide(Formats.png)) { | ||
reader.getFile(Formats.png, (file) async { | ||
await importPastedImages( | ||
data: await file.readAll(), | ||
fileExtension: 'png', | ||
linkedId: linkedFromId, | ||
categoryId: categoryId, | ||
); | ||
}); | ||
} | ||
|
||
if (reader.canProvide(Formats.jpeg)) { | ||
reader.getFile(Formats.jpeg, (file) async { | ||
await importPastedImages( | ||
data: await file.readAll(), | ||
fileExtension: 'jpg', | ||
linkedId: linkedFromId, | ||
categoryId: categoryId, | ||
); | ||
}); | ||
} | ||
} | ||
} |
201 changes: 201 additions & 0 deletions
201
lib/features/journal/state/image_paste_controller.g.dart
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
37 changes: 37 additions & 0 deletions
37
lib/features/journal/ui/widgets/create/paste_image_list_tile.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:flutter_riverpod/flutter_riverpod.dart'; | ||
import 'package:lotti/features/journal/state/image_paste_controller.dart'; | ||
import 'package:lotti/l10n/app_localizations_context.dart'; | ||
|
||
class PasteImageListTile extends ConsumerWidget { | ||
const PasteImageListTile( | ||
this.linkedFromId, { | ||
this.categoryId, | ||
super.key, | ||
}); | ||
|
||
final String? linkedFromId; | ||
final String? categoryId; | ||
|
||
@override | ||
Widget build(BuildContext context, WidgetRef ref) { | ||
final provider = imagePasteControllerProvider( | ||
linkedFromId: linkedFromId, | ||
categoryId: categoryId, | ||
); | ||
final canPasteImage = ref.watch(provider).valueOrNull ?? false; | ||
|
||
if (!canPasteImage) { | ||
return const SizedBox.shrink(); | ||
} | ||
|
||
return ListTile( | ||
leading: const Icon(Icons.paste), | ||
title: Text(context.messages.addActionAddImageFromClipboard), | ||
onTap: () { | ||
Navigator.of(context).pop(); | ||
ref.read(provider.notifier).paste(); | ||
}, | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.