mirror of
https://github.com/zontreck/NBTEditor
synced 2024-11-21 13:48:56 -07:00
Implement adding tags
This commit is contained in:
parent
8b9acb7847
commit
e2657a3bb5
18 changed files with 168 additions and 26 deletions
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
@ -1,6 +1,15 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:libac_dart/nbt/Tag.dart';
|
import 'package:libac_dart/nbt/Tag.dart';
|
||||||
|
import 'package:libac_dart/nbt/impl/ByteArrayTag.dart';
|
||||||
|
import 'package:libac_dart/nbt/impl/IntArrayTag.dart';
|
||||||
|
import 'package:libac_dart/nbt/impl/ListTag.dart';
|
||||||
|
import 'package:libac_dart/nbt/impl/LongArrayTag.dart';
|
||||||
import 'package:nbteditor/Constants.dart';
|
import 'package:nbteditor/Constants.dart';
|
||||||
|
import 'package:nbteditor/pages/EditValue.dart';
|
||||||
|
import 'package:nbteditor/pages/RenamePrompt.dart';
|
||||||
|
|
||||||
|
import '../tags/Tag.dart';
|
||||||
|
|
||||||
class AddPage extends StatefulWidget {
|
class AddPage extends StatefulWidget {
|
||||||
const AddPage({super.key});
|
const AddPage({super.key});
|
||||||
|
@ -10,26 +19,146 @@ class AddPage extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class AddState extends State<AddPage> {
|
class AddState extends State<AddPage> {
|
||||||
|
List<TagType> allowedTagTypes = [];
|
||||||
|
bool canAddAnyType = false;
|
||||||
|
bool isList = false;
|
||||||
|
bool isArray = false;
|
||||||
|
String newTagName = "";
|
||||||
|
dynamic val;
|
||||||
|
Tag? ParentTag;
|
||||||
|
bool singleShot = true;
|
||||||
|
|
||||||
|
Function? didChangeState;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
var args = ModalRoute.of(context)!.settings.arguments as AddElementArgs;
|
var args = ModalRoute.of(context)!.settings.arguments as AddElementArgs;
|
||||||
|
|
||||||
|
canAddAnyType = args.allowAllTagTypes;
|
||||||
|
isList = args.tag.getTagType() == TagType.List;
|
||||||
|
isArray = args.tag.getTagType() == TagType.ByteArray ||
|
||||||
|
args.tag.getTagType() == TagType.IntArray ||
|
||||||
|
args.tag.getTagType() == TagType.LongArray;
|
||||||
|
|
||||||
|
if (isList || isArray) {
|
||||||
|
allowedTagTypes = args.allowedTagTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canAddAnyType) {
|
||||||
|
allowedTagTypes.clear();
|
||||||
|
for (TagType type in TagType.values) {
|
||||||
|
if (type == TagType.End) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
allowedTagTypes.add(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
didChangeState = args.didChangeState;
|
||||||
|
ParentTag = args.tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> processTagType(TagType type) async {
|
||||||
|
if (!(isArray || isList)) {
|
||||||
|
var reply = await showDialog(
|
||||||
|
context: context,
|
||||||
|
routeSettings: RouteSettings(arguments: ""),
|
||||||
|
builder: (builder) {
|
||||||
|
return RenamePrompt();
|
||||||
|
});
|
||||||
|
newTagName = reply as String;
|
||||||
|
}
|
||||||
|
var nTag = Tag.makeTagOfType(type);
|
||||||
|
bool hasValue = true;
|
||||||
|
|
||||||
|
if (type == TagType.List ||
|
||||||
|
type == TagType.ByteArray ||
|
||||||
|
type == TagType.LongArray ||
|
||||||
|
type == TagType.IntArray ||
|
||||||
|
type == TagType.Compound) {
|
||||||
|
hasValue = false;
|
||||||
|
} else {
|
||||||
|
nTag.setKey(newTagName);
|
||||||
|
var reply = await showDialog(
|
||||||
|
context: context,
|
||||||
|
routeSettings: RouteSettings(arguments: nTag),
|
||||||
|
builder: (builder) {
|
||||||
|
return EditValuePrompt();
|
||||||
|
});
|
||||||
|
val = reply;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isArray) {
|
||||||
|
switch (ParentTag!.getTagType()) {
|
||||||
|
case TagType.LongArray:
|
||||||
|
{
|
||||||
|
LongArrayTag LAT = ParentTag! as LongArrayTag;
|
||||||
|
LAT.value.add(val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TagType.IntArray:
|
||||||
|
{
|
||||||
|
IntArrayTag IAT = ParentTag! as IntArrayTag;
|
||||||
|
IAT.value.add(val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TagType.ByteArray:
|
||||||
|
{
|
||||||
|
ByteArrayTag BAT = ParentTag! as ByteArrayTag;
|
||||||
|
BAT.value.add(val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (hasValue) nTag.setValue(val);
|
||||||
|
|
||||||
|
if (isList) {
|
||||||
|
ListTag lst = ParentTag! as ListTag;
|
||||||
|
lst.add(nTag);
|
||||||
|
} else {
|
||||||
|
ParentTag!.asCompoundTag().put(newTagName, nTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
didChangeState!.call();
|
||||||
|
Navigator.pop(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
if (isList || isArray && !canAddAnyType && singleShot) {
|
||||||
|
singleShot = false;
|
||||||
|
|
||||||
|
Future.delayed(Duration(seconds: 2), () {
|
||||||
|
processTagType(allowedTagTypes[0]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text("Add Tag"),
|
title: const Text("Add Tag - Select Tag Type"),
|
||||||
backgroundColor: Constants.TITLEBAR_COLOR,
|
backgroundColor: Constants.TITLEBAR_COLOR,
|
||||||
),
|
),
|
||||||
body: const Padding(
|
body: Padding(
|
||||||
padding: EdgeInsets.all(8),
|
padding: EdgeInsets.all(8),
|
||||||
child: SingleChildScrollView(
|
child: ListView.builder(
|
||||||
child: Column(
|
itemBuilder: (builder, index) {
|
||||||
children: [],
|
return ListTile(
|
||||||
),
|
title: Text(allowedTagTypes[index].name),
|
||||||
),
|
leading: TagExt.getTagIcon(allowedTagTypes[index]),
|
||||||
),
|
onTap: () async {
|
||||||
|
processTagType(allowedTagTypes[index]);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
itemCount: allowedTagTypes.length,
|
||||||
|
)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +167,7 @@ class AddElementArgs {
|
||||||
Tag tag;
|
Tag tag;
|
||||||
bool allowAllTagTypes;
|
bool allowAllTagTypes;
|
||||||
bool isArray;
|
bool isArray;
|
||||||
|
Function didChangeState;
|
||||||
|
|
||||||
List<TagType> allowedTagTypes;
|
List<TagType> allowedTagTypes;
|
||||||
|
|
||||||
|
@ -45,5 +175,6 @@ class AddElementArgs {
|
||||||
{required this.tag,
|
{required this.tag,
|
||||||
required this.allowAllTagTypes,
|
required this.allowAllTagTypes,
|
||||||
required this.isArray,
|
required this.isArray,
|
||||||
this.allowedTagTypes = const []});
|
this.allowedTagTypes = const [],
|
||||||
|
required this.didChangeState});
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,9 @@ class EditValueState extends State<EditValuePrompt> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
var args = ModalRoute.of(context)!.settings.arguments!;
|
var args = ModalRoute.of(context)!.settings.arguments;
|
||||||
|
|
||||||
|
if (args == null) return;
|
||||||
|
|
||||||
if (args is Tag) {
|
if (args is Tag) {
|
||||||
Tag tag = args as Tag;
|
Tag tag = args as Tag;
|
||||||
|
|
|
@ -22,7 +22,7 @@ extension ByteArrayTagExt on ByteArrayTag {
|
||||||
Widget render(BuildContext context, Function didChangeState) {
|
Widget render(BuildContext context, Function didChangeState) {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_ByteArray (${getKey()})"),
|
title: Text("TAG_ByteArray (${getKey()})"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/ByteArray.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
true, canBeNamed(this), false, this, context, didChangeState),
|
true, canBeNamed(this), false, this, context, didChangeState),
|
||||||
|
|
|
@ -14,7 +14,7 @@ extension ByteTagExt on ByteTag {
|
||||||
subtitle: TagExt.getElementDescriptor(
|
subtitle: TagExt.getElementDescriptor(
|
||||||
"$value",
|
"$value",
|
||||||
),
|
),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/Byte.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
false, canBeNamed(this), true, this, context, didChangeState),
|
false, canBeNamed(this), true, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -10,7 +10,7 @@ extension CompoundTagExt on CompoundTag {
|
||||||
subtitle: TagExt.getElementDescriptor(
|
subtitle: TagExt.getElementDescriptor(
|
||||||
"${value.length} tag${value.length > 1 ? "s" : ""}",
|
"${value.length} tag${value.length > 1 ? "s" : ""}",
|
||||||
),
|
),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/Compound.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
true, canBeNamed(this), false, this, context, didChangeState),
|
true, canBeNamed(this), false, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -12,7 +12,7 @@ extension DoubleTagExt on DoubleTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_Double (${getKey()})"),
|
title: Text("TAG_Double (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor("$value"),
|
subtitle: TagExt.getElementDescriptor("$value"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/Double.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
false, canBeNamed(this), true, this, context, didChangeState),
|
false, canBeNamed(this), true, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,7 +13,7 @@ extension FloatTagExt on FloatTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_Float (${getKey()})"),
|
title: Text("TAG_Float (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor("$value"),
|
subtitle: TagExt.getElementDescriptor("$value"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/Float.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
false, canBeNamed(this), true, this, context, didChangeState),
|
false, canBeNamed(this), true, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -24,7 +24,7 @@ extension IntArrayTagExt on IntArrayTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_IntArray (${getKey()})"),
|
title: Text("TAG_IntArray (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/IntegerArray.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
true, canBeNamed(this), false, this, context, didChangeState),
|
true, canBeNamed(this), false, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,7 +13,7 @@ extension IntTagExt on IntTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_Int (${getKey()})"),
|
title: Text("TAG_Int (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor("$value"),
|
subtitle: TagExt.getElementDescriptor("$value"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/Integer.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
false, canBeNamed(this), true, this, context, didChangeState),
|
false, canBeNamed(this), true, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -24,7 +24,7 @@ extension ListTagExt on ListTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_List (${getKey()}) ($type)"),
|
title: Text("TAG_List (${getKey()}) ($type)"),
|
||||||
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/List.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
true, canBeNamed(this), false, this, context, didChangeState),
|
true, canBeNamed(this), false, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -24,7 +24,7 @@ extension LongArrayTagExt on LongArrayTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_LongArray (${getKey()})"),
|
title: Text("TAG_LongArray (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
subtitle: TagExt.getElementDescriptor("${value.length} entries"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/LongArray.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
true, canBeNamed(this), false, this, context, didChangeState),
|
true, canBeNamed(this), false, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,7 +13,7 @@ extension LongTagExt on LongTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_Long (${getKey()})"),
|
title: Text("TAG_Long (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor("$value"),
|
subtitle: TagExt.getElementDescriptor("$value"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/Long.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
false, canBeNamed(this), true, this, context, didChangeState),
|
false, canBeNamed(this), true, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,7 +13,7 @@ extension ShortTagExt on ShortTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_Short (${getKey()})"),
|
title: Text("TAG_Short (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor("$value"),
|
subtitle: TagExt.getElementDescriptor("$value"),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/Short.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
false, canBeNamed(this), true, this, context, didChangeState),
|
false, canBeNamed(this), true, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,7 +13,7 @@ extension StringTagExt on StringTag {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text("TAG_String (${getKey()})"),
|
title: Text("TAG_String (${getKey()})"),
|
||||||
subtitle: TagExt.getElementDescriptor(value),
|
subtitle: TagExt.getElementDescriptor(value),
|
||||||
leading: const Image(image: AssetImage("Icons/PNG/String.png")),
|
leading: TagExt.getTagIcon(getTagType()),
|
||||||
trailing: TagExt.getElementButtons(
|
trailing: TagExt.getElementButtons(
|
||||||
false, canBeNamed(this), true, this, context, didChangeState),
|
false, canBeNamed(this), true, this, context, didChangeState),
|
||||||
);
|
);
|
||||||
|
|
|
@ -190,7 +190,8 @@ class TagExt {
|
||||||
tag: tag,
|
tag: tag,
|
||||||
allowAllTagTypes: allowAllTagTypes,
|
allowAllTagTypes: allowAllTagTypes,
|
||||||
isArray: isArray,
|
isArray: isArray,
|
||||||
allowedTagTypes: allowedTypes));
|
allowedTagTypes: allowedTypes,
|
||||||
|
didChangeState: didChangeState));
|
||||||
},
|
},
|
||||||
icon: Icon(Icons.add)),
|
icon: Icon(Icons.add)),
|
||||||
if (isNamed)
|
if (isNamed)
|
||||||
|
@ -237,6 +238,14 @@ class TagExt {
|
||||||
static Widget getElementDescriptor(String descript) {
|
static Widget getElementDescriptor(String descript) {
|
||||||
return Text(descript);
|
return Text(descript);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String getTagIconPath(TagType type) {
|
||||||
|
return "Icons/PNG/${type.name}.png";
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget getTagIcon(TagType type) {
|
||||||
|
return Image(image: AssetImage(getTagIconPath(type)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool canBeNamed(Tag tag) {
|
bool canBeNamed(Tag tag) {
|
||||||
|
|
|
@ -33,8 +33,8 @@ flutter:
|
||||||
- "Icons/PNG/Compound.png"
|
- "Icons/PNG/Compound.png"
|
||||||
- "Icons/PNG/Double.png"
|
- "Icons/PNG/Double.png"
|
||||||
- "Icons/PNG/Float.png"
|
- "Icons/PNG/Float.png"
|
||||||
- "Icons/PNG/Integer.png"
|
- "Icons/PNG/Int.png"
|
||||||
- "Icons/PNG/IntegerArray.png"
|
- "Icons/PNG/IntArray.png"
|
||||||
- "Icons/PNG/List.png"
|
- "Icons/PNG/List.png"
|
||||||
- "Icons/PNG/Long.png"
|
- "Icons/PNG/Long.png"
|
||||||
- "Icons/PNG/LongArray.png"
|
- "Icons/PNG/LongArray.png"
|
||||||
|
|
Loading…
Reference in a new issue