File tree Expand file tree Collapse file tree 4 files changed +75
-1
lines changed
packages/mini_sprite_editor/lib Expand file tree Collapse file tree 4 files changed +75
-1
lines changed Original file line number Diff line number Diff line change 1+ import 'dart:async' ;
2+
13import 'package:equatable/equatable.dart' ;
24import 'package:flutter/material.dart' ;
5+ import 'package:flutter/services.dart' ;
36import 'package:hydrated_bloc/hydrated_bloc.dart' ;
47
58part 'config_state.dart' ;
69
710class ConfigCubit extends HydratedCubit <ConfigState > {
8- ConfigCubit () : super (const ConfigState .initial ());
11+ ConfigCubit ({
12+ Future <void > Function (ClipboardData )? setClipboardData,
13+ }) : _setClipboardData = setClipboardData ?? Clipboard .setData,
14+ super (const ConfigState .initial ());
15+
16+ final Future <void > Function (ClipboardData ) _setClipboardData;
917
1018 void setThemeMode (ThemeMode mode) {
1119 emit (state.copyWith (themeMode: mode));
@@ -39,6 +47,13 @@ class ConfigCubit extends HydratedCubit<ConfigState> {
3947 emit (state.copyWith (mapGridSize: value));
4048 }
4149
50+ void copyPaletteToClipboard () {
51+ final colorsInHex = state.colors
52+ .map ((e) => e.toARGB32 ().toRadixString (16 ).padLeft (8 , '0' ))
53+ .join ('\n ' );
54+ unawaited (_setClipboardData (ClipboardData (text: colorsInHex)));
55+ }
56+
4257 @override
4358 ConfigState ? fromJson (Map <String , dynamic > json) {
4459 final themeModeRaw = json['theme_mode' ] as String ? ;
Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ import 'package:mini_sprite_editor/l10n/l10n.dart';
77import 'package:mini_sprite_editor/library/library.dart' ;
88import 'package:mini_sprite_editor/sprite/cubit/tools_cubit.dart' ;
99import 'package:mini_sprite_editor/sprite/sprite.dart' ;
10+ import 'package:mini_sprite_editor/widgets/composed_icon.dart' ;
1011
1112class SpritePage extends StatelessWidget {
1213 const SpritePage ({super .key});
@@ -220,6 +221,22 @@ class SpriteView extends StatelessWidget {
220221 tooltip: l10n.copyToClipboard,
221222 icon: const Icon (Icons .download),
222223 ),
224+ Tooltip (
225+ message: l10n.copyToClipboard,
226+ child: GestureDetector (
227+ key: const Key ('copy_palette_clipboard_key' ),
228+ onTap: () {
229+ context.read <ConfigCubit >().copyPaletteToClipboard ();
230+ ScaffoldMessenger .of (context).showSnackBar (
231+ SnackBar (content: Text (l10n.copiedWithSuccess)),
232+ );
233+ },
234+ child: const ComposedIcon (
235+ primary: Icons .palette,
236+ secondary: Icons .download,
237+ ),
238+ ),
239+ ),
223240 IconButton (
224241 key: const Key ('import_from_clipboard_key' ),
225242 onPressed: () {
Original file line number Diff line number Diff line change 1+ import 'package:flame/extensions.dart' ;
2+ import 'package:flutter/material.dart' ;
3+
4+ class ComposedIcon extends StatelessWidget {
5+ const ComposedIcon ({
6+ required this .primary,
7+ required this .secondary,
8+ super .key,
9+ });
10+
11+ final IconData primary;
12+ final IconData secondary;
13+
14+ @override
15+ Widget build (BuildContext context) {
16+ return Stack (
17+ clipBehavior: Clip .none,
18+ children: [
19+ Icon (primary),
20+ Positioned (
21+ left: 10 ,
22+ top: 6 ,
23+ child: Icon (
24+ size: 18 ,
25+ shadows: [
26+ Shadow (
27+ color:
28+ Theme .of (context).iconTheme.color? .darken (
29+ .7 ,
30+ ) ??
31+ Colors .black,
32+ blurRadius: 4 ,
33+ ),
34+ ],
35+ secondary,
36+ ),
37+ ),
38+ ],
39+ );
40+ }
41+ }
Original file line number Diff line number Diff line change 1+ export 'composed_icon.dart' ;
You can’t perform that action at this time.
0 commit comments