Skip to content

Commit 4bb1429

Browse files
committed
Add importing system for editor
1 parent 50bcf2c commit 4bb1429

30 files changed

+533
-194
lines changed

Diff for: .github/workflows/dart.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ jobs:
5050
- name: Build flutter_rust_bridge bindings
5151
if: matrix.projects == 'plugin'
5252
run: |
53-
cargo install flutter_rust_bridge_codegen
53+
cargo install flutter_rust_bridge_codegen@2.8.0
5454
flutter_rust_bridge_codegen generate
5555
- name: Run build_runner
5656
if: matrix.projects == 'api' || matrix.projects == 'app'

Diff for: api/pubspec.lock

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ packages:
2929
dependency: "direct main"
3030
description:
3131
name: archive
32-
sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a"
32+
sha256: "528579c7e4579719f04b21eeeeddfd73a18b31dabc22766893b7d1be7f49b967"
3333
url: "https://pub.dev"
3434
source: hosted
35-
version: "4.0.2"
35+
version: "4.0.3"
3636
args:
3737
dependency: transitive
3838
description:

Diff for: app/lib/l10n/app_en.arb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"servers": "Servers",
33
"connect": "Connect",
4-
"create": "Create",
4+
"add": "Add",
55
"minimize": "Minimize",
66
"maximize": "Maximize",
77
"restore": "Restore",

Diff for: app/lib/pages/editor/backgrounds.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class BackgroundsEditorPage extends StatelessWidget {
6767
if (name == null) return;
6868
cubit.setBackground(name, BackgroundDefinition(texture: ''));
6969
},
70-
label: Text(AppLocalizations.of(context).create),
70+
label: Text(LeapLocalizations.of(context).create),
7171
icon: const Icon(PhosphorIconsLight.plus),
7272
),
7373
);

Diff for: app/lib/pages/editor/boards.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class BoardsEditorPage extends StatelessWidget {
7676
if (name == null) return;
7777
cubit.setBoard(name, BoardDefinition(texture: ''));
7878
},
79-
label: Text(AppLocalizations.of(context).create),
79+
label: Text(LeapLocalizations.of(context).create),
8080
icon: const Icon(PhosphorIconsLight.plus),
8181
),
8282
);

Diff for: app/lib/pages/editor/decks.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class DecksEditorPage extends StatelessWidget {
6767
if (name == null) return;
6868
cubit.setDeck(name, DeckDefinition());
6969
},
70-
label: Text(AppLocalizations.of(context).create),
70+
label: Text(LeapLocalizations.of(context).create),
7171
icon: const Icon(PhosphorIconsLight.plus),
7272
),
7373
);
@@ -202,7 +202,7 @@ class _DeckEditorDialogState extends State<DeckEditorDialog> {
202202
});
203203
},
204204
icon: const Icon(PhosphorIconsLight.plus),
205-
label: Text(AppLocalizations.of(context).create),
205+
label: Text(LeapLocalizations.of(context).create),
206206
),
207207
),
208208
],
@@ -262,7 +262,7 @@ class _DeckEditorDialogState extends State<DeckEditorDialog> {
262262
});
263263
},
264264
icon: const Icon(PhosphorIconsLight.plus),
265-
label: Text(AppLocalizations.of(context).create),
265+
label: Text(LeapLocalizations.of(context).create),
266266
),
267267
),
268268
],

Diff for: app/lib/pages/editor/figures.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class FiguresEditorPage extends StatelessWidget {
7676
cubit.setFigure(
7777
name, FigureDefinition(back: FigureBackDefinition(texture: '')));
7878
},
79-
label: Text(AppLocalizations.of(context).create),
79+
label: Text(LeapLocalizations.of(context).create),
8080
icon: const Icon(PhosphorIconsLight.plus),
8181
),
8282
);
@@ -242,7 +242,7 @@ class _FigureEditorDialogState extends State<FigureEditorDialog> {
242242
);
243243
});
244244
},
245-
label: Text(AppLocalizations.of(context).create),
245+
label: Text(LeapLocalizations.of(context).create),
246246
icon: Icon(PhosphorIconsLight.plus),
247247
),
248248
),

Diff for: app/lib/pages/editor/textures.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class TexturesEditorPage extends StatelessWidget {
5252
if (name == null) return;
5353
cubit.setTexture(name, bytes);
5454
},
55-
label: Text(AppLocalizations.of(context).create),
55+
label: Text(LeapLocalizations.of(context).create),
5656
icon: const Icon(PhosphorIconsLight.plus),
5757
),
5858
);

Diff for: app/lib/pages/game/notes.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class _GameNotesDrawerState extends State<GameNotesDrawer> {
104104
height: 48,
105105
child: ElevatedButton.icon(
106106
icon: const Icon(PhosphorIconsLight.plus),
107-
label: Text(AppLocalizations.of(context).create),
107+
label: Text(LeapLocalizations.of(context).create),
108108
onPressed: () {
109109
final bloc = context.read<WorldBloc>();
110110
showDialog(

Diff for: app/lib/pages/game/team.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class TeamDialogState extends State<TeamDialog> {
117117
Navigator.of(context).pop();
118118
},
119119
child: Text(_isCreate()
120-
? AppLocalizations.of(context).create
120+
? LeapLocalizations.of(context).create
121121
: AppLocalizations.of(context).edit),
122122
);
123123
},

Diff for: app/lib/pages/home/connect.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ class _ServersDialogState extends State<ServersDialog> {
332332
height: 48,
333333
child: ElevatedButton.icon(
334334
icon: const Icon(PhosphorIconsLight.plus),
335-
label: Text(AppLocalizations.of(context).create),
335+
label: Text(LeapLocalizations.of(context).create),
336336
onPressed: () => showDialog<bool>(
337337
context: context,
338338
builder: (context) => const ConnectEditDialog(),

Diff for: app/lib/pages/home/create.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ class _CreateDialogState extends State<CreateDialog>
225225
],
226226
);
227227
return ResponsiveAlertDialog(
228-
title: Text(AppLocalizations.of(context).create),
228+
title: Text(LeapLocalizations.of(context).create),
229229
constraints: const BoxConstraints(
230230
maxWidth: LeapBreakpoints.expanded,
231231
maxHeight: 700,
@@ -320,7 +320,7 @@ class _CreateDialogState extends State<CreateDialog>
320320
Navigator.of(context).pop(true);
321321
}
322322
},
323-
label: Text(AppLocalizations.of(context).create),
323+
label: Text(LeapLocalizations.of(context).create),
324324
icon: const Icon(PhosphorIconsLight.plus),
325325
),
326326
]

Diff for: app/lib/pages/home/play.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ class _PlayDialogState extends State<PlayDialog> with TickerProviderStateMixin {
220220
height: 48,
221221
child: ElevatedButton.icon(
222222
icon: const Icon(PhosphorIconsLight.plus),
223-
label: Text(AppLocalizations.of(context).create),
223+
label: Text(LeapLocalizations.of(context).create),
224224
onPressed: () => showDialog<bool>(
225225
context: context,
226226
builder: (context) => const CreateDialog(),

Diff for: app/lib/pages/packs/dialog.dart

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:file_selector/file_selector.dart' as fs;
12
import 'package:flutter/material.dart';
23
import 'package:flutter_bloc/flutter_bloc.dart';
34
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

Diff for: app/lib/pages/packs/editor.dart

+95-13
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,101 @@ class _EditorPacksViewState extends State<_EditorPacksView> {
128128
Align(
129129
alignment: Alignment.bottomRight,
130130
child: FloatingActionButton.extended(
131-
onPressed: () async {
132-
final name = await showDialog(
133-
context: context, builder: (context) => NameDialog());
134-
if (name == null) return;
135-
await _fileSystem.editorSystem.createFile(
136-
name,
137-
SetonixData.empty().setMetadata(FileMetadata(
138-
name: name,
139-
type: FileType.pack,
140-
)));
141-
_reloadPacks();
142-
},
143-
label: Text(AppLocalizations.of(context).create),
131+
onPressed: () => showLeapBottomSheet(
132+
context: context,
133+
titleBuilder: (context) => Text(AppLocalizations.of(context).add),
134+
childrenBuilder: (context) => [
135+
ListTile(
136+
title: Text(LeapLocalizations.of(context).create),
137+
leading: const Icon(PhosphorIconsLight.plusCircle),
138+
onTap: () async {
139+
final name = await showDialog(
140+
context: context, builder: (context) => NameDialog());
141+
if (name == null) return;
142+
await _fileSystem.editorSystem.createFile(
143+
name,
144+
SetonixData.empty().setMetadata(FileMetadata(
145+
name: name,
146+
type: FileType.pack,
147+
)));
148+
_reloadPacks();
149+
},
150+
),
151+
ListTile(
152+
title: Text(AppLocalizations.of(context).installed),
153+
leading: const Icon(PhosphorIconsLight.download),
154+
onTap: () async {
155+
final packs = await _fileSystem.packSystem.getFiles();
156+
if (packs.isEmpty || !context.mounted) {
157+
return;
158+
}
159+
showDialog(
160+
context: context,
161+
builder: (context) => AlertDialog(
162+
title: Text(AppLocalizations.of(context).import),
163+
scrollable: true,
164+
content: Column(
165+
mainAxisSize: MainAxisSize.min,
166+
children: packs.map((pack) {
167+
final file = pack.data!;
168+
final data = file.load();
169+
final metadata = data.getMetadataOrDefault();
170+
return ListTile(
171+
title: Text(metadata.name),
172+
subtitle: Text(pack.identifier),
173+
onTap: () async {
174+
await _fileSystem.editorSystem.createFile(
175+
metadata.name,
176+
SetonixData.fromData(data.exportAsBytes()));
177+
_reloadPacks();
178+
},
179+
);
180+
}).toList(),
181+
),
182+
actions: [
183+
TextButton(
184+
onPressed: () => Navigator.of(context).pop(false),
185+
child: Text(AppLocalizations.of(context).cancel),
186+
),
187+
],
188+
),
189+
);
190+
},
191+
),
192+
ListTile(
193+
title: Text(AppLocalizations.of(context).import),
194+
leading: const Icon(PhosphorIconsLight.arrowSquareIn),
195+
onTap: () async {
196+
final result = await fs.openFile(
197+
acceptedTypeGroups: [
198+
fs.XTypeGroup(
199+
label: AppLocalizations.of(context).packs,
200+
extensions: const ['stnx'],
201+
uniformTypeIdentifiers: const [
202+
'dev.linwood.setonix.pack'
203+
],
204+
mimeTypes: const [
205+
'application/octet-stream',
206+
'application/zip'
207+
],
208+
)
209+
],
210+
);
211+
if (result == null) return;
212+
final bytes = await result.readAsBytes();
213+
final data = SetonixFile(bytes).load();
214+
final metadata = data.getMetadataOrDefault();
215+
if (metadata.type != FileType.pack) {
216+
return;
217+
}
218+
await _fileSystem.editorSystem
219+
.createFile(metadata.name, data);
220+
_reloadPacks();
221+
},
222+
),
223+
],
224+
),
225+
label: Text(AppLocalizations.of(context).add),
144226
icon: const Icon(PhosphorIconsLight.plus),
145227
),
146228
),

Diff for: app/pubspec.lock

+10-10
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ packages:
2929
dependency: "direct main"
3030
description:
3131
name: archive
32-
sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a"
32+
sha256: "528579c7e4579719f04b21eeeeddfd73a18b31dabc22766893b7d1be7f49b967"
3333
url: "https://pub.dev"
3434
source: hosted
35-
version: "4.0.2"
35+
version: "4.0.3"
3636
args:
3737
dependency: transitive
3838
description:
@@ -254,10 +254,10 @@ packages:
254254
dependency: "direct main"
255255
description:
256256
name: device_info_plus
257-
sha256: "72d146c6d7098689ff5c5f66bcf593ac11efc530095385356e131070333e64da"
257+
sha256: c3093ce936028bf4b35d0dd54948ee62ed1cf95f6ae4447c7abed07c7cbee38b
258258
url: "https://pub.dev"
259259
source: hosted
260-
version: "11.3.0"
260+
version: "11.3.1"
261261
device_info_plus_platform_interface:
262262
dependency: transitive
263263
description:
@@ -800,18 +800,18 @@ packages:
800800
dependency: "direct main"
801801
description:
802802
name: package_info_plus
803-
sha256: "67eae327b1b0faf761964a1d2e5d323c797f3799db0e85aa232db8d9e922bc35"
803+
sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191"
804804
url: "https://pub.dev"
805805
source: hosted
806-
version: "8.2.1"
806+
version: "8.3.0"
807807
package_info_plus_platform_interface:
808808
dependency: transitive
809809
description:
810810
name: package_info_plus_platform_interface
811-
sha256: "205ec83335c2ab9107bbba3f8997f9356d72ca3c715d2f038fc773d0366b4c76"
811+
sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
812812
url: "https://pub.dev"
813813
source: hosted
814-
version: "3.1.0"
814+
version: "3.2.0"
815815
path:
816816
dependency: transitive
817817
description:
@@ -1418,10 +1418,10 @@ packages:
14181418
dependency: transitive
14191419
description:
14201420
name: win32_registry
1421-
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
1421+
sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae"
14221422
url: "https://pub.dev"
14231423
source: hosted
1424-
version: "1.1.5"
1424+
version: "2.1.0"
14251425
window_manager:
14261426
dependency: "direct main"
14271427
description:

Diff for: docs/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@
1616
"@phosphor-icons/react": "^2.1.7",
1717
"@types/react": "^19.0.10",
1818
"@types/react-dom": "^19.0.4",
19-
"astro": "^5.3.0",
19+
"astro": "^5.3.1",
2020
"react": "^19.0.0",
2121
"react-dom": "^19.0.0",
2222
"remark-gemoji": "^8.0.0",
2323
"remark-heading-id": "^1.0.1",
2424
"typescript": "^5.7.3"
2525
},
26-
"packageManager": "pnpm@10.4.1",
26+
"packageManager": "pnpm@10.5.0",
2727
"devDependencies": {
2828
"@vite-pwa/astro": "^0.5.0",
29-
"sass": "^1.85.0",
29+
"sass": "^1.85.1",
3030
"sharp": "^0.33.5",
3131
"vite-plugin-pwa": "^0.21.1",
3232
"workbox-window": "^7.3.0"

0 commit comments

Comments
 (0)