Skip to content

Commit 4340b44

Browse files
committed
feat: Adding copy colors feature
1 parent aa38159 commit 4340b44

File tree

4 files changed

+76
-1
lines changed

4 files changed

+76
-1
lines changed

packages/mini_sprite_editor/lib/config/cubit/config_cubit.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
1+
import 'dart:async';
2+
13
import 'package:equatable/equatable.dart';
24
import 'package:flutter/material.dart';
5+
import 'package:flutter/services.dart';
36
import 'package:hydrated_bloc/hydrated_bloc.dart';
47

58
part 'config_state.dart';
69

710
class 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?;

packages/mini_sprite_editor/lib/sprite/view/sprite_page.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import 'dart:async';
22

3+
import 'package:flame/image_composition.dart';
34
import 'package:flutter/material.dart';
45
import 'package:flutter_bloc/flutter_bloc.dart';
56
import 'package:mini_sprite_editor/config/config.dart';
67
import 'package:mini_sprite_editor/l10n/l10n.dart';
78
import 'package:mini_sprite_editor/library/library.dart';
89
import 'package:mini_sprite_editor/sprite/cubit/tools_cubit.dart';
910
import 'package:mini_sprite_editor/sprite/sprite.dart';
11+
import 'package:mini_sprite_editor/widgets/composed_icon.dart';
1012

1113
class SpritePage extends StatelessWidget {
1214
const SpritePage({super.key});
@@ -220,6 +222,22 @@ class SpriteView extends StatelessWidget {
220222
tooltip: l10n.copyToClipboard,
221223
icon: const Icon(Icons.download),
222224
),
225+
Tooltip(
226+
message: l10n.copyToClipboard,
227+
child: GestureDetector(
228+
key: const Key('copy_palette_clipboard_key'),
229+
onTap: () {
230+
context.read<ConfigCubit>().copyPaletteToClipboard();
231+
ScaffoldMessenger.of(context).showSnackBar(
232+
SnackBar(content: Text(l10n.copiedWithSuccess)),
233+
);
234+
},
235+
child: const ComposedIcon(
236+
primary: Icons.palette,
237+
secondary: Icons.download,
238+
),
239+
),
240+
),
223241
IconButton(
224242
key: const Key('import_from_clipboard_key'),
225243
onPressed: () {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export 'composed_icon.dart';

0 commit comments

Comments
 (0)