Skip to content

Commit 9161cb0

Browse files
committed
Add support for exporting to text in ui
1 parent 6795f58 commit 9161cb0

File tree

7 files changed

+69
-11
lines changed

7 files changed

+69
-11
lines changed

api/lib/src/converter/text.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,15 @@ Map<String, dynamic> convertDocumentToText(NoteData data) {
6666
for (final pack in data.getBundledPacks()) {
6767
final bytes = data.getBundledPackData(pack);
6868
if (bytes == null) continue;
69-
assets[pack] = base64Encode(bytes);
69+
packs[pack] = base64Encode(bytes);
7070
}
7171
addMap('packs', packs);
7272

7373
final palettes = <String, Map<String, dynamic>>{};
7474
for (final palette in data.getNamedPalettes()) {
7575
palettes[palette.name] = palette.item.toJson();
7676
}
77-
addMap('styles', palettes);
77+
addMap('palettes', palettes);
7878

7979
final styles = <String, Map<String, dynamic>>{};
8080
for (final style in data.getNamedStyles()) {

api/lib/src/models/data.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,5 +502,5 @@ final class NoteData extends ArchiveData<NoteData> {
502502

503503
NoteFile toFile() => NoteFile(exportAsBytes());
504504

505-
Map<String, dynamic> toText() => convertDocumentToText(this);
505+
Map<String, dynamic> exportAsText() => convertDocumentToText(this);
506506
}

app/lib/actions/export.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import 'package:flutter_bloc/flutter_bloc.dart';
55

66
class ExportIntent extends Intent {
77
final BuildContext context;
8+
final bool isText;
89

9-
const ExportIntent(this.context);
10+
const ExportIntent(this.context, {this.isText = false});
1011
}
1112

1213
class ExportAction extends Action<ExportIntent> {
@@ -17,6 +18,11 @@ class ExportAction extends Action<ExportIntent> {
1718
final bloc = intent.context.read<DocumentBloc>();
1819
final state = bloc.state;
1920
if (state is! DocumentLoaded) return;
20-
exportData(intent.context, (await state.saveData()).exportAsBytes());
21+
final data = (await state.saveData());
22+
if (intent.isText) {
23+
exportTextData(intent.context, data.exportAsText());
24+
} else {
25+
exportData(intent.context, data.exportAsBytes());
26+
}
2127
}
2228
}

app/lib/api/save.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,24 @@ Future<void> exportData(
8989
label: AppLocalizations.of(context).export,
9090
);
9191

92+
Future<void> exportTextData(
93+
BuildContext context,
94+
Map<String, dynamic> bytes, [
95+
bool share = false,
96+
]) =>
97+
exportFile(
98+
context: context,
99+
bytes: utf8.encode(JsonEncoder.withIndent(
100+
'\t',
101+
).convert(bytes)),
102+
fileExtension: 'tbfly',
103+
mimeType: 'application/json',
104+
uniformTypeIdentifier: 'dev.linwood.butterfly.textnote',
105+
share: share,
106+
fileName: 'output',
107+
label: AppLocalizations.of(context).export,
108+
);
109+
92110
Future<void> writeClipboardData(
93111
ClipboardManager clipboardManager,
94112
AssetFileType type,

app/lib/l10n/app_en.arb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,5 +693,7 @@
693693
"selectComponent": "Select component",
694694
"bundlePackInDocument": "Bundle pack in document",
695695
"bundledPacksDescription": "Bundled packs are included in the document and only be used to share with the document. Assets can only be used in the document if the pack is installed. Packs can be installed with clicking on them.",
696-
"fillAlpha": "Fill alpha"
696+
"fillAlpha": "Fill alpha",
697+
"packagedDocument": "Packaged document",
698+
"rawDocument": "Raw document"
697699
}

app/lib/views/app_bar.dart

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ class _MainPopupMenu extends StatelessWidget {
477477
SubmenuButton(
478478
menuChildren: [
479479
MenuItemButton(
480-
leadingIcon: const PhosphorIcon(PhosphorIconsLight.file),
480+
leadingIcon: const PhosphorIcon(PhosphorIconsLight.archive),
481481
shortcut: const SingleActivator(
482482
LogicalKeyboardKey.keyE,
483483
control: true,
@@ -488,7 +488,22 @@ class _MainPopupMenu extends StatelessWidget {
488488
ExportIntent(context),
489489
);
490490
},
491-
child: Text(AppLocalizations.of(context).document),
491+
child: Text(AppLocalizations.of(context).packagedDocument),
492+
),
493+
MenuItemButton(
494+
leadingIcon: const PhosphorIcon(PhosphorIconsLight.file),
495+
shortcut: const SingleActivator(
496+
LogicalKeyboardKey.keyE,
497+
control: true,
498+
shift: true,
499+
),
500+
onPressed: () async {
501+
Actions.maybeInvoke<ExportIntent>(
502+
context,
503+
ExportIntent(context, isText: true),
504+
);
505+
},
506+
child: Text(AppLocalizations.of(context).rawDocument),
492507
),
493508
MenuItemButton(
494509
leadingIcon: const PhosphorIcon(PhosphorIconsLight.fileSvg),
@@ -511,8 +526,9 @@ class _MainPopupMenu extends StatelessWidget {
511526
),
512527
shortcut: const SingleActivator(
513528
LogicalKeyboardKey.keyE,
514-
shift: true,
529+
alt: true,
515530
control: true,
531+
shift: true,
516532
),
517533
onPressed: () {
518534
Actions.maybeInvoke<ImageExportIntent>(
@@ -525,9 +541,8 @@ class _MainPopupMenu extends StatelessWidget {
525541
MenuItemButton(
526542
leadingIcon: const PhosphorIcon(PhosphorIconsLight.filePdf),
527543
shortcut: const SingleActivator(
528-
LogicalKeyboardKey.keyE,
544+
LogicalKeyboardKey.keyP,
529545
shift: true,
530-
alt: true,
531546
control: true,
532547
),
533548
onPressed: () {

app/macos/Runner/Info.plist

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,23 @@
4747
</array>
4848
</dict>
4949
</dict>
50+
<dict>
51+
<key>UTTypeIdentifier</key>
52+
<string>dev.linwood.butterfly.textnote</string>
53+
<key>UTTypeConformsTo</key>
54+
<array>
55+
<string>public.json</string>
56+
</array>
57+
<key>UTTypeDescription</key>
58+
<string>Linwood Butterfly Text Note</string>
59+
<key>UTTypeTagSpecification</key>
60+
<dict>
61+
<key>public.filename-extension</key>
62+
<array>
63+
<string>tbfly</string>
64+
</array>
65+
</dict>
66+
</dict>
5067
<dict>
5168
<key>UTTypeIdentifier</key>
5269
<string>dev.linwood.butterfly.xopp</string>

0 commit comments

Comments
 (0)