Skip to content

feat: Adding a quick auto replace image #49

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions fire_atlas_editor/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
include: package:flame_lint/analysis_options.yaml
include: package:flame_lint/analysis_options_with_dcm.yaml

linter:
rules:
avoid_catches_without_on_clauses: false
constant_identifier_names: false
constant_identifier_names: false
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class ChangeImageModal extends StatefulWidget {

class _ChangeImageModalState extends State<ChangeImageModal> {
String? _imageData;
late String? _imagePath;
String? _imageName;

@override
Expand All @@ -29,9 +30,14 @@ class _ChangeImageModalState extends State<ChangeImageModal> {
margin: const EdgeInsets.all(30),
imageData: _imageData,
imageName: _imageName,
onSelectImage: (imageName, imageData) {
onSelectImage: ({
required imageName,
required imagePath,
required imageData,
}) {
setState(() {
_imageData = imageData;
_imagePath = imagePath;
_imageName = imageName;
});
},
Expand All @@ -56,6 +62,7 @@ class _ChangeImageModalState extends State<ChangeImageModal> {
store.dispatchAsync(
UpdateAtlasImageAction(
imageData: _imageData!,
imagePath: _imagePath,
),
);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ class _ConcatImageModalState extends State<ConcatImageModal> {
),
imageData: _imageData,
imageName: _imageName,
onSelectImage: (imageName, imageData) {
onSelectImage: ({
required imageName,
required imagePath,
required imageData,
}) {
setState(() {
_imageData = imageData;
_imageName = imageName;
Expand Down
17 changes: 16 additions & 1 deletion fire_atlas_editor/lib/screens/editor_screen/widgets/toolbar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,20 @@ import 'package:slices/slices.dart';

class _ToolbarSlice extends Equatable {
final FireAtlas? currentAtlas;
final String? lastUsedImage;
final bool hasChanges;

_ToolbarSlice.fromState(FireAtlasState state)
: currentAtlas = state.currentAtlas,
lastUsedImage = state.loadedProject.value?.lastUsedImage,
hasChanges = state.hasChanges;

@override
List<Object?> get props => [currentAtlas?.id, hasChanges];
List<Object?> get props => [
currentAtlas?.id,
lastUsedImage,
hasChanges,
];
}

class Toolbar extends StatelessWidget {
Expand Down Expand Up @@ -91,6 +97,15 @@ class Toolbar extends StatelessWidget {
},
tooltip: 'Update base image',
),
if (!kIsWeb)
FIconButton(
disabled: slice.lastUsedImage == null,
iconData: Icons.fireplace,
onPress: () {
store.dispatchAsync(QuickReplaceImageAction());
},
tooltip: 'Quick replace base image',
),
FIconButton(
iconData: Icons.add_photo_alternate,
onPress: () {
Expand Down
13 changes: 2 additions & 11 deletions fire_atlas_editor/lib/screens/open_screen/open_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import 'dart:io';

import 'package:fire_atlas_editor/screens/open_screen/widgets/atlas_options_container.dart';
import 'package:fire_atlas_editor/screens/open_screen/widgets/support_container.dart';
import 'package:fire_atlas_editor/screens/widgets/scaffold.dart';
Expand All @@ -12,7 +10,6 @@ import 'package:fire_atlas_editor/widgets/button.dart';
import 'package:fire_atlas_editor/widgets/container.dart';
import 'package:fire_atlas_editor/widgets/icon_button.dart';
import 'package:fire_atlas_editor/widgets/text.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:slices/slices.dart';

Expand Down Expand Up @@ -73,6 +70,7 @@ class _OpenScreenState extends State<OpenScreen> {
onConfirm: (
String atlasName,
String imageData,
String imagePath,
double tileWidth,
double tileHeight,
) async {
Expand All @@ -82,6 +80,7 @@ class _OpenScreenState extends State<OpenScreen> {
CreateAtlasAction(
id: atlasName,
imageData: imageData,
imagePath: imagePath,
tileWidth: tileWidth,
tileHeight: tileHeight,
),
Expand Down Expand Up @@ -155,14 +154,6 @@ class _OpenScreenState extends State<OpenScreen> {
Expanded(
child: Image.asset('assets/Logo.png'),
),
if (!kIsWeb && Platform.isMacOS)
Container(
width: 300,
child: _Buttons(
importAtlas: _importAtlas,
newAtlas: _newAtlas,
),
),
],
),
FContainer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import 'package:slices/slices.dart';

class AtlasOptionsContainer extends StatefulWidget {
final void Function() onCancel;
final Function(String, String, double, double) onConfirm;
final Function(String, String, String, double, double) onConfirm;

const AtlasOptionsContainer({
required this.onCancel,
Expand All @@ -25,6 +25,8 @@ class AtlasOptionsContainer extends StatefulWidget {
class _AtlasOptionsContainerState extends State<AtlasOptionsContainer> {
String? _imageData;
String? _imageName;
late String? _imagePath;

late final TextEditingController atlasNameController;
late final TextEditingController tileWidthController;
late final TextEditingController tileHeightController;
Expand Down Expand Up @@ -114,6 +116,7 @@ class _AtlasOptionsContainerState extends State<AtlasOptionsContainer> {
widget.onConfirm(
atlasName,
_imageData!,
_imagePath!,
double.parse(tileWidthRaw),
double.parse(tileHeightRaw),
);
Expand Down Expand Up @@ -164,9 +167,14 @@ class _AtlasOptionsContainerState extends State<AtlasOptionsContainer> {
child: ImageSelectionContainer(
imageData: _imageData,
imageName: _imageName,
onSelectImage: (imageName, imageData) {
onSelectImage: ({
required imageName,
required imagePath,
required imageData,
}) {
setState(() {
_imageData = imageData;
_imagePath = imagePath;
_imageName = imageName;
});
},
Expand Down
43 changes: 39 additions & 4 deletions fire_atlas_editor/lib/services/storage/desktop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ class FireAtlasStorage extends FireAtlasStorageApi {
final file = File(path);
final raw = await file.readAsBytes();
final atlas = FireAtlas.deserializeBytes(raw);
return LoadedProjectEntry(path, atlas);
final lastUsedImage = await getProjectLastImageFile(atlas.id);
return LoadedProjectEntry(path, atlas, lastUsedImage);
}

@override
Expand Down Expand Up @@ -52,13 +53,43 @@ class FireAtlasStorage extends FireAtlasStorageApi {
prefs.setString('PROJECT_${entry.project.id}', path);
}

@override
Future<void> rememberProjectImageFile(
String projectId,
String imagePath,
) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString('LAST_IMAGE_$projectId', imagePath);
}

@override
Future<String?> getProjectLastImageFile(String projectId) async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString('LAST_IMAGE_$projectId');
}

@override
Future<LoadedProjectEntry> selectProject() async {
const typeGroup = XTypeGroup(label: 'fire atlas', extensions: ['fa']);
final file = await _selectDialog(typeGroup);
final bytes = await file.readAsBytes();
final atlas = FireAtlas.deserializeBytes(bytes);
return LoadedProjectEntry(file.path, atlas);

final lastImage = await getProjectLastImageFile(atlas.id);

return LoadedProjectEntry(
file.path,
atlas,
lastImage,
);
}

@override
Future<String> readImageData(String path) async {
final file = File(path);
final bytes = await file.readAsBytes();

return base64Encode(bytes);
}

@override
Expand All @@ -71,10 +102,14 @@ class FireAtlasStorage extends FireAtlasStorageApi {
}

@override
Future<(String, String)> selectFile() async {
Future<(String, String, String)> selectFile() async {
final file = await _selectDialog();
final bytes = await file.readAsBytes();
return (file.name, base64Encode(bytes));
return (
file.name,
file.path,
base64Encode(bytes),
);
}

Future<XFile> _selectDialog([XTypeGroup? typeGroup]) async {
Expand Down
8 changes: 7 additions & 1 deletion fire_atlas_editor/lib/services/storage/storage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,15 @@ abstract class FireAtlasStorageApi {
Future<void> saveProject(LoadedProjectEntry entry);
Future<List<LastProjectEntry>> lastUsedProjects();
Future<void> rememberProject(LoadedProjectEntry entry);
Future<void> rememberProjectImageFile(
String projectId,
String imageFile,
);
Future<String?> getProjectLastImageFile(String projectId);
Future<String> selectNewProjectPath(FireAtlas atlas);
Future<LoadedProjectEntry> selectProject();
Future<(String, String)> selectFile();
Future<(String, String, String)> selectFile();
Future<String> readImageData(String path);
Future<void> exportFile(List<int> bytes, String fileName);
Future<void> setConfig(String key, String value);
Future<String> getConfig(String key, String defaultValue);
Expand Down
17 changes: 16 additions & 1 deletion fire_atlas_editor/lib/services/storage/unsupported.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class FireAtlasStorage extends FireAtlasStorageApi {
}

@override
Future<(String, String)> selectFile() {
Future<(String, String, String)> selectFile() {
throw 'Unsupported';
}

Expand All @@ -51,4 +51,19 @@ class FireAtlasStorage extends FireAtlasStorageApi {
Future<String> getConfig(String key, String defaultValue) {
throw 'Unsupported';
}

@override
Future<String?> getProjectLastImageFile(String projectId) {
throw 'Unsupported';
}

@override
Future<String> readImageData(String path) {
throw 'Unsupported';
}

@override
Future<void> rememberProjectImageFile(String projectId, String imageFile) {
throw 'Unsupported';
}
}
32 changes: 29 additions & 3 deletions fire_atlas_editor/lib/services/storage/web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class FireAtlasStorage extends FireAtlasStorageApi {
final entry = LoadedProjectEntry(
path,
_readBase64Project(value),
null,
);

return entry;
Expand Down Expand Up @@ -61,17 +62,23 @@ class FireAtlasStorage extends FireAtlasStorageApi {
return LoadedProjectEntry(
'ATLAS_${atlas.id}',
atlas,
null,
);
}

@override
Future<String> readImageData(String path) async {
throw 'Unsupported';
}

@override
Future<String> selectNewProjectPath(FireAtlas atlas) async {
return 'ATLAS_${atlas.id}';
}

@override
Future<(String, String)> selectFile() {
final completer = Completer<(String, String)>();
Future<(String, String, String)> selectFile() {
final completer = Completer<(String, String, String)>();
final uploadInput = FileUploadInputElement();
uploadInput.click();

Expand All @@ -85,7 +92,13 @@ class FireAtlasStorage extends FireAtlasStorageApi {
reader.onLoadEnd.listen((e) {
final result = reader.result;
if (result != null) {
completer.complete((file.name, result as String));
completer.complete(
(
file.name,
file.relativePath ?? file.name,
result as String,
),
);
}
});
reader.readAsDataUrl(file);
Expand Down Expand Up @@ -123,4 +136,17 @@ class FireAtlasStorage extends FireAtlasStorageApi {

return FireAtlas.deserializeBytes(jsonRaw);
}

@override
Future<void> rememberProjectImageFile(
String projectId,
String imageFile,
) async {
// Noop on web
}

@override
Future<String?> getProjectLastImageFile(String projectId) {
throw 'Unsupported';
}
}
Loading
Loading