From 6fdcbb05c456650fa9ce28385a30d1867ef9f41e Mon Sep 17 00:00:00 2001 From: zontreck Date: Mon, 25 Dec 2023 16:51:24 -0700 Subject: [PATCH] Initial implementation --- Icons/PNG/Boolean.png | Bin 0 -> 1540 bytes Icons/PNG/Byte.png | Bin 0 -> 1574 bytes Icons/PNG/ByteArray.png | Bin 0 -> 1693 bytes Icons/PNG/Compound.png | Bin 0 -> 2058 bytes Icons/PNG/Double.png | Bin 0 -> 1378 bytes Icons/PNG/Float.png | Bin 0 -> 1251 bytes Icons/PNG/Integer.png | Bin 0 -> 1395 bytes Icons/PNG/IntegerArray.png | Bin 0 -> 1560 bytes Icons/PNG/List.png | Bin 0 -> 1316 bytes Icons/PNG/Long.png | Bin 0 -> 1120 bytes Icons/PNG/LongArray.png | Bin 0 -> 1467 bytes Icons/PNG/Short.png | Bin 0 -> 1477 bytes Icons/PNG/String.png | Bin 0 -> 1516 bytes Icons/SVG/Boolean.svg | 140 +++++ Icons/SVG/Byte.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/ByteArray.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/Compound.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/Double.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/Float.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/IntArray.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/Integer.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/List.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/Long.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/LongArray.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/Short.svg | 1027 ++++++++++++++++++++++++++++++++++++ Icons/SVG/String.svg | 1027 ++++++++++++++++++++++++++++++++++++ lib/Constants.dart | 1 + lib/Editor.dart | 129 +++++ lib/main.dart | 13 +- lib/tags/ByteArrayTag.dart | 67 +++ lib/tags/ByteTag.dart | 53 ++ lib/tags/CompoundTag.dart | 91 ++++ lib/tags/DoubleTag.dart | 53 ++ lib/tags/FloatTag.dart | 53 ++ lib/tags/IntArrayTag.dart | 67 +++ lib/tags/IntTag.dart | 52 ++ lib/tags/ListTag.dart | 100 ++++ lib/tags/LongArrayTag.dart | 67 +++ lib/tags/LongTag.dart | 53 ++ lib/tags/NbtIo.dart | 285 ++++++++++ lib/tags/ShortTag.dart | 53 ++ lib/tags/StringTag.dart | 52 ++ lib/tags/Tag.dart | 229 ++++++++ lib/tags/TagType.dart | 83 +++ pubspec.yaml | 3 + 45 files changed, 13962 insertions(+), 6 deletions(-) create mode 100644 Icons/PNG/Boolean.png create mode 100644 Icons/PNG/Byte.png create mode 100644 Icons/PNG/ByteArray.png create mode 100644 Icons/PNG/Compound.png create mode 100644 Icons/PNG/Double.png create mode 100644 Icons/PNG/Float.png create mode 100644 Icons/PNG/Integer.png create mode 100644 Icons/PNG/IntegerArray.png create mode 100644 Icons/PNG/List.png create mode 100644 Icons/PNG/Long.png create mode 100644 Icons/PNG/LongArray.png create mode 100644 Icons/PNG/Short.png create mode 100644 Icons/PNG/String.png create mode 100644 Icons/SVG/Boolean.svg create mode 100644 Icons/SVG/Byte.svg create mode 100644 Icons/SVG/ByteArray.svg create mode 100644 Icons/SVG/Compound.svg create mode 100644 Icons/SVG/Double.svg create mode 100644 Icons/SVG/Float.svg create mode 100644 Icons/SVG/IntArray.svg create mode 100644 Icons/SVG/Integer.svg create mode 100644 Icons/SVG/List.svg create mode 100644 Icons/SVG/Long.svg create mode 100644 Icons/SVG/LongArray.svg create mode 100644 Icons/SVG/Short.svg create mode 100644 Icons/SVG/String.svg create mode 100644 lib/Editor.dart create mode 100644 lib/tags/ByteArrayTag.dart create mode 100644 lib/tags/ByteTag.dart create mode 100644 lib/tags/CompoundTag.dart create mode 100644 lib/tags/DoubleTag.dart create mode 100644 lib/tags/FloatTag.dart create mode 100644 lib/tags/IntArrayTag.dart create mode 100644 lib/tags/IntTag.dart create mode 100644 lib/tags/ListTag.dart create mode 100644 lib/tags/LongArrayTag.dart create mode 100644 lib/tags/LongTag.dart create mode 100644 lib/tags/NbtIo.dart create mode 100644 lib/tags/ShortTag.dart create mode 100644 lib/tags/StringTag.dart create mode 100644 lib/tags/Tag.dart create mode 100644 lib/tags/TagType.dart diff --git a/Icons/PNG/Boolean.png b/Icons/PNG/Boolean.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba8e3833b8ca76392d3f6a859598e4ad625b0be GIT binary patch literal 1540 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 Y0!O?KlH!C+jQ{`u07*qoM6N<$f=37cIsgCw literal 0 HcmV?d00001 diff --git a/Icons/PNG/ByteArray.png b/Icons/PNG/ByteArray.png new file mode 100644 index 0000000000000000000000000000000000000000..40d5d482ac48364e5a3a9f881f8583fdaa148435 GIT binary patch literal 1693 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 Bq=*0j literal 0 HcmV?d00001 diff --git a/Icons/PNG/IntegerArray.png b/Icons/PNG/IntegerArray.png new file mode 100644 index 0000000000000000000000000000000000000000..c89cc2b4de968f66b2440ad31b620c50ca10c610 GIT binary patch literal 1560 zcmV+z2Iu*SP)Px)(n&-?R9JbFPNZyyCbJ4nP7Vkb@H+6Zx)CTma$b$d!Npf2XDak#NFlDD*Ji zaRe9MxsN~zLbB`F$8^9+;Lv>X$%r>)7_w^Ip0Z{^d5)G{CbVwXWyiIZfYwV!-BckWyfyaQn)B!|U&kn0kNa040we(LQuSJol|N z%%=+m;CE-=;tCHk_G5T^H#;K7aoolCzcl145BCshPRE<)Kjhro7r0iR>N=2S7946N zPTkuFdMuv%(hfKDDMk!(;g+NTDY^o8){nt`CkA&tzuDj8MDtH>*-09Akf`yTzeFxJ zs7!zukH@_Fo7b39BWyqV5CDBf416E+ zhNd9kDJnXZYVV*vnM`>3w}0Rw+l*M{kjEMOfHT`e%p0VPo{JA|P1(8BkT72P>xi>l zXH8dmZf%S0M@yAB<_Ua;dOc@!KIH(6IL-w=&z^74P%-sBKYnVRr@pY(%3Qs9$S+>q z<>G&Cv!@NF^ti11x#pi?k9+6z`GTFA1k0y!EFM`9mHxvGz-fnrddE;U<}F+2}3 zRFnBBpw!7XprT9Pk;t5Cm)YRO9{M|o@s%rP8a*mBBQ)lIhS zeR>+TOsMWY*V^}R%mJmCh7bt&lJ@$+)8FJfY%ylYPkwcoiT8Q%hwpHjvwT9AV{Zh; z3~@bTER_64Ts&GIq>ULe z13kZLbsa{liZS?4M>lQ#PQUft)w)^S2|}5=NdMenx6N{y9EiD=ro5~1-B@qmT=ngLV`d2W5nAeR=uK98BikG3j5UtV_PB9 z1U0f4omSq6Y7WvpT&`C0^5`vVrDP=U4ORI>2^0000< KMNUMnLSTaP&k^|m literal 0 HcmV?d00001 diff --git a/Icons/PNG/List.png b/Icons/PNG/List.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb34e1507d1b7a573620802328674d87d755253 GIT binary patch literal 1316 zcmV+<1>5?GP)Px(-bqA3R9JXLfC`vvx^~WR*6J)K*ZbG;e^^^nw=vgoKbt9t0pXmc z{uSov;#>tp&s+TVmIJ7%1n3e1Nk7zYA_=C@f4RLq0I7t1{uxnI6jVW6{h#(P07|9= zASxh|e0#95U*L~FJph$jVETwAKoS7)9mbc`*W^Q`wpt2s!2iN@Tt|J4=fx(qD9 *oh& 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 VhFRGs&iDWT002ovPDHLkV1m|y!_xo& literal 0 HcmV?d00001 diff --git a/Icons/PNG/Short.png b/Icons/PNG/Short.png new file mode 100644 index 0000000000000000000000000000000000000000..7813249de1c7284b33e7b89bae3e4f4b66d17cde GIT binary patch literal 1477 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 SMcX9+0000 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Icons/SVG/Byte.svg b/Icons/SVG/Byte.svg new file mode 100644 index 0000000..8bc43c8 --- /dev/null +++ b/Icons/SVG/Byte.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/ByteArray.svg b/Icons/SVG/ByteArray.svg new file mode 100644 index 0000000..d6f04b2 --- /dev/null +++ b/Icons/SVG/ByteArray.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/Compound.svg b/Icons/SVG/Compound.svg new file mode 100644 index 0000000..3e749bc --- /dev/null +++ b/Icons/SVG/Compound.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/Double.svg b/Icons/SVG/Double.svg new file mode 100644 index 0000000..af6d335 --- /dev/null +++ b/Icons/SVG/Double.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/Float.svg b/Icons/SVG/Float.svg new file mode 100644 index 0000000..db22047 --- /dev/null +++ b/Icons/SVG/Float.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/IntArray.svg b/Icons/SVG/IntArray.svg new file mode 100644 index 0000000..5af21b6 --- /dev/null +++ b/Icons/SVG/IntArray.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/Integer.svg b/Icons/SVG/Integer.svg new file mode 100644 index 0000000..99f144a --- /dev/null +++ b/Icons/SVG/Integer.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/List.svg b/Icons/SVG/List.svg new file mode 100644 index 0000000..c4ab464 --- /dev/null +++ b/Icons/SVG/List.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/Long.svg b/Icons/SVG/Long.svg new file mode 100644 index 0000000..52173b6 --- /dev/null +++ b/Icons/SVG/Long.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/LongArray.svg b/Icons/SVG/LongArray.svg new file mode 100644 index 0000000..a3bf0ab --- /dev/null +++ b/Icons/SVG/LongArray.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/Short.svg b/Icons/SVG/Short.svg new file mode 100644 index 0000000..c6e64ab --- /dev/null +++ b/Icons/SVG/Short.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Icons/SVG/String.svg b/Icons/SVG/String.svg new file mode 100644 index 0000000..9724bb8 --- /dev/null +++ b/Icons/SVG/String.svg @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/Constants.dart b/lib/Constants.dart index 3c5a616..a811f3a 100644 --- a/lib/Constants.dart +++ b/lib/Constants.dart @@ -2,4 +2,5 @@ import 'package:flutter/material.dart'; class Constants { static const Color TITLEBAR_COLOR = Color.fromARGB(255, 80, 0, 0); + static const Color DRAWER_COLOR = Color.fromARGB(255, 0, 75, 75); } diff --git a/lib/Editor.dart b/lib/Editor.dart new file mode 100644 index 0000000..9bc90aa --- /dev/null +++ b/lib/Editor.dart @@ -0,0 +1,129 @@ +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_treeview/flutter_treeview.dart'; +import 'package:nbteditor/Constants.dart'; +import 'package:nbteditor/tags/CompoundTag.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; + +class Editor extends StatefulWidget { + Editor({super.key}); + + @override + EditorState createState() => EditorState(); +} + +class EditorState extends State { + List nodes = [CompoundTag().getNode("/")]; + bool compressed = false; + + late TreeViewController controller; + + String appendCompressed() { + if (compressed) { + return " - Compressed"; + } else + return ""; + } + + @override + Widget build(BuildContext context) { + controller = TreeViewController(children: nodes); + + return Scaffold( + appBar: AppBar( + backgroundColor: Constants.TITLEBAR_COLOR, + title: Text("Named Binary Tag Editor${appendCompressed()}"), + ), + drawer: Drawer( + backgroundColor: Constants.DRAWER_COLOR, + child: Column(children: [ + DrawerHeader( + child: Column( + children: [ + Text("Named Binary Tag Editor"), + Text("Created by Tara Piccari") + ], + )), + ListTile( + title: Text("N E W"), + subtitle: Text("Create a new NBT Document"), + leading: Icon(Icons.add), + onTap: () { + setState(() { + nodes.clear(); + + // Add a new compound tag as the root + Tag tag = CompoundTag(); + nodes.add(tag.getNode("/")); + }); + }, + ), + ListTile( + title: Text("O P E N"), + leading: Icon(Icons.folder), + subtitle: Text("Open an existing NBT Document for editing"), + onTap: () async { + FilePickerResult? result = await FilePicker.platform.pickFiles(); + String? filePath; + if (result != null) { + filePath = result.files.single.path; + // Do something with the selected file path + print('Selected file path: $filePath'); + } else { + // User canceled the picker + print('File selection canceled.'); + } + if (filePath == null) { + // cancelled + return; + } else { + // String!! + compressed = await NbtIo.read(filePath); + } + + setState(() { + nodes.clear(); + nodes.add(Tag.read(NbtIo.getStream()).getNode("/")); + + controller = TreeViewController(children: nodes); + }); + }, + ) + ]), + ), + body: TreeView( + nodeBuilder: (context, node) { + return (node.data as Tag).render(); + }, + controller: controller, + ), + ); + } +} + +class FileSelectionScreen extends StatelessWidget { + Future openFilePicker(BuildContext context) async { + try {} catch (e) { + // Handle errors + print('Error selecting file: $e'); + } + + Navigator.pop(context); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('File Selection'), + ), + body: Center( + child: ElevatedButton( + onPressed: () => openFilePicker(context), + child: Text('Select File'), + ), + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index a725658..17412a5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:nbteditor/Editor.dart'; void main() { runApp(const MainApp()); @@ -9,12 +10,12 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { - return const MaterialApp( - home: Scaffold( - body: Center( - child: Text('Hello World!'), - ), - ), + return MaterialApp( + theme: ThemeData.dark(), + routes: { + "/": (context) => Editor(), + "/select_file": (context) => FileSelectionScreen() + }, ); } } diff --git a/lib/tags/ByteArrayTag.dart b/lib/tags/ByteArrayTag.dart new file mode 100644 index 0000000..65c4616 --- /dev/null +++ b/lib/tags/ByteArrayTag.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class ByteArrayTag extends Tag { + List _value = []; + + @override + Node getNode(String path) { + List entries = []; + int count = 0; + for (var element in _value) { + entries.add(Node(key: "$path/${count}", label: "${element}")); + count++; + } + + return Node(key: path, label: Name, data: this, children: entries); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + int count = layer.readInt(); + for (int i = 0; i < count; i++) { + _value.add(layer.readByte()); + } + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_ByteArray (${Name})"), + subtitle: Text("${_value.length} entries"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.ByteArray.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeInt(_value.length); + + for (var element in _value) { + layer.writeByte(element); + } + } + + @override + TagType getTagType() { + return TagType.ByteArray; + } +} diff --git a/lib/tags/ByteTag.dart b/lib/tags/ByteTag.dart new file mode 100644 index 0000000..d9685e5 --- /dev/null +++ b/lib/tags/ByteTag.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class ByteTag extends Tag { + int _value = 0; + + @override + Node getNode(String path) { + return Node(key: path, label: "TAG_Byte ${Name}", data: this); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + this._value = layer.readByte(); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_Byte (${Name})"), + subtitle: Text("${_value}"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.Byte.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeByte(this._value); + } + + @override + TagType getTagType() { + return TagType.Byte; + } +} diff --git a/lib/tags/CompoundTag.dart b/lib/tags/CompoundTag.dart new file mode 100644 index 0000000..0790b56 --- /dev/null +++ b/lib/tags/CompoundTag.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_treeview/flutter_treeview.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; +import 'package:uuid/v4.dart'; + +class CompoundTag extends Tag { + UuidV4 v4 = UuidV4(); + Map _children = {}; + + CompoundTag() { + setKey(v4.generate()); + + setName("root"); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_Compound (${Name})"), + subtitle: + Text("${_children.length} tag${_children.length > 1 ? "s" : ""}"), + ); + } + + @override + Node getNode(String path) { + List childTags = []; + + for (var element in _children.entries) { + childTags.add(element.value.getNode(path + "/${element.key}")); + } + Node me = Node(key: path, label: Name, data: this, children: childTags); + return me; + } + + void put(String name, Tag child) { + _children[name] = child.withNick(name); + } + + Tag? get(String name) { + return _children[name]; + } + + void remove(String name) { + _children.remove(name); + } + + @override + void readValue(ByteLayer layer) { + TagType type; + while (true) { + type = Tag.readTagType(layer); + if (type == TagType.End) break; + + Tag tag = Tag.readTag(layer, type, false); + put(tag.Name, tag); + } + } + + @override + void writeValue(ByteLayer layer) { + for (var entry in _children.entries) { + layer.writeTagName(entry.key); + entry.value.writeValue(layer); + } + + layer.writeByte(TagType.End.toByte()); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.Compound.toByte()); + } + + @override + TagType getTagType() { + return TagType.Compound; + } +} diff --git a/lib/tags/DoubleTag.dart b/lib/tags/DoubleTag.dart new file mode 100644 index 0000000..a4d309c --- /dev/null +++ b/lib/tags/DoubleTag.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class DoubleTag extends Tag { + double _value = 0.0; + + @override + Node getNode(String path) { + return Node(key: path, label: "", data: this); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + _value = layer.readDouble(); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_Double (${Name})"), + subtitle: Text("${_value}"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.Double.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeDouble(_value); + } + + @override + TagType getTagType() { + return TagType.Double; + } +} diff --git a/lib/tags/FloatTag.dart b/lib/tags/FloatTag.dart new file mode 100644 index 0000000..c020e51 --- /dev/null +++ b/lib/tags/FloatTag.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class FloatTag extends Tag { + double _value = 0.0; + + @override + Node getNode(String path) { + return Node(key: path, label: "$_value", data: this); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + _value = layer.readFloat(); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_Float (${Name})"), + subtitle: Text("${_value}"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.Float.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeFloat(_value); + } + + @override + TagType getTagType() { + return TagType.Float; + } +} diff --git a/lib/tags/IntArrayTag.dart b/lib/tags/IntArrayTag.dart new file mode 100644 index 0000000..0a6c22f --- /dev/null +++ b/lib/tags/IntArrayTag.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class IntArrayTag extends Tag { + List _value = []; + + @override + Node getNode(String path) { + List entries = []; + int count = 0; + for (var element in _value) { + entries.add(Node(key: "$path/${count}", label: "${element}")); + count++; + } + + return Node(key: path, label: Name, data: this, children: entries); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + int count = layer.readInt(); + for (int i = 0; i < count; i++) { + _value.add(layer.readInt()); + } + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_IntArray (${Name})"), + subtitle: Text("${_value.length} entries"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.IntArray.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeInt(_value.length); + + for (var element in _value) { + layer.writeInt(element); + } + } + + @override + TagType getTagType() { + return TagType.IntArray; + } +} diff --git a/lib/tags/IntTag.dart b/lib/tags/IntTag.dart new file mode 100644 index 0000000..5a1d5ba --- /dev/null +++ b/lib/tags/IntTag.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class IntTag extends Tag { + int _value = 0; + @override + Node getNode(String path) { + return Node(key: path, label: "$_value", data: this); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + _value = layer.readInt(); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_Int (${Name})"), + subtitle: Text("${_value}"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.Int.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeInt(_value); + } + + @override + TagType getTagType() { + return TagType.Int; + } +} diff --git a/lib/tags/ListTag.dart b/lib/tags/ListTag.dart new file mode 100644 index 0000000..73974c3 --- /dev/null +++ b/lib/tags/ListTag.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class ListTag extends Tag { + List _value = []; + + @override + Node getNode(String path) { + List nodes = []; + + int count = 0; + for (var element in _value) { + nodes.add(element.getNode("$path/$count")); + count++; + } + + return Node(key: path, label: Name, data: this, children: nodes); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + bool add(Tag tag) { + if (_value.length > 0) { + if (tag.getTagType() == _value[0].getTagType()) { + _value.add(tag); + + return true; + } else { + return false; + } + } else { + _value.add(tag); + return true; + } + } + + @override + void readValue(ByteLayer layer) { + TagType type = Tag.readTagType(layer); + int count = layer.readInt(); + + if (count == 0) return; + + for (int i = 0; i < count; i++) { + add(Tag.readTag(layer, type, true)); + } + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_List (${Name}) (${getListTagType()})"), + subtitle: Text("${_value.length} entries"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.List.toByte()); + } + + TagType getListTagType() { + if (_value.length > 0) { + return TagType.End; + } else + return _value[0].getTagType(); + } + + @override + void writeValue(ByteLayer layer) { + if (_value.length > 0) { + _value[0].writeTagType(layer); + } else { + layer.writeByte(TagType.End.toByte()); + } + + layer.writeInt(_value.length); + + for (var element in _value) { + element.writeValue(layer); + } + } + + @override + TagType getTagType() { + return TagType.List; + } +} diff --git a/lib/tags/LongArrayTag.dart b/lib/tags/LongArrayTag.dart new file mode 100644 index 0000000..6e65346 --- /dev/null +++ b/lib/tags/LongArrayTag.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class LongArrayTag extends Tag { + List _value = []; + + @override + Node getNode(String path) { + List entries = []; + int count = 0; + for (var element in _value) { + entries.add(Node(key: "$path/${count}", label: "${element}")); + count++; + } + + return Node(key: path, label: Name, data: this, children: entries); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + int count = layer.readInt(); + for (int i = 0; i < count; i++) { + _value.add(layer.readLong()); + } + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_LongArray (${Name})"), + subtitle: Text("${_value.length} entries"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.LongArray.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeInt(_value.length); + + for (var element in _value) { + layer.writeLong(element); + } + } + + @override + TagType getTagType() { + return TagType.LongArray; + } +} diff --git a/lib/tags/LongTag.dart b/lib/tags/LongTag.dart new file mode 100644 index 0000000..b307e8e --- /dev/null +++ b/lib/tags/LongTag.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class LongTag extends Tag { + int _value = 0; + + @override + Node getNode(String path) { + return Node(key: path, label: "$_value", data: this); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + _value = layer.readLong(); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_Long (${Name})"), + subtitle: Text("${_value}"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.Long.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeLong(_value); + } + + @override + TagType getTagType() { + return TagType.Long; + } +} diff --git a/lib/tags/NbtIo.dart b/lib/tags/NbtIo.dart new file mode 100644 index 0000000..90d9e34 --- /dev/null +++ b/lib/tags/NbtIo.dart @@ -0,0 +1,285 @@ +import 'dart:convert'; +import 'dart:ffi'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:nbteditor/tags/TagType.dart'; + +class ByteLayer { + Uint8List _byteBuffer = Uint8List(0); + int _position = 0; + + ByteLayer() { + _byteBuffer = Uint8List(0); // Initial size, can be adjusted + _position = 0; + } + + int get length => _byteBuffer.length; + + int get currentPosition => _position; + + Uint8List get bytes => _byteBuffer.sublist(0, _position); + + void _ensureCapacity(int additionalBytes) { + final requiredCapacity = _position + additionalBytes; + if (requiredCapacity > _byteBuffer.length) { + final newCapacity = + _position * 2 + additionalBytes; // Adjust capacity as needed + final newBuffer = Uint8List(newCapacity); + newBuffer.setAll(0, _byteBuffer); + _byteBuffer = newBuffer; + } + } + + void writeInt(int value) { + _ensureCapacity(4); + _byteBuffer.buffer.asByteData().setInt32(_position, value, Endian.big); + _position += 4; + } + + void writeDouble(double value) { + _ensureCapacity(8); + _byteBuffer.buffer.asByteData().setFloat64(_position, value, Endian.big); + _position += 8; + } + + void writeString(String value) { + final encoded = utf8.encode(value); + writeShort(encoded.length); + _ensureCapacity(encoded.length); + _byteBuffer.setAll(_position, encoded); + _position += encoded.length; + } + + int readInt() { + final value = + _byteBuffer.buffer.asByteData().getInt32(_position, Endian.big); + _position += 4; + return value; + } + + double readDouble() { + final value = + _byteBuffer.buffer.asByteData().getFloat64(_position, Endian.big); + _position += 8; + return value; + } + + String readString() { + final length = readShort(); + final encoded = _byteBuffer.sublist(_position, _position + length); + _position += length; + return utf8.decode(encoded); + } + + void writeIntZigZag(int value) { + final zigzag = (value << 1) ^ (value >> 31); + writeInt(zigzag); + } + + int readIntZigZag() { + final zigzag = readInt(); + final value = (zigzag >> 1) ^ -(zigzag & 1); + return value; + } + + void writeByte(int value) { + _ensureCapacity(1); + _byteBuffer[_position] = value & 0xFF; + _position++; + } + + int readByte() { + final value = _byteBuffer[_position]; + _position++; + return value; + } + + void writeVarInt(int value) { + while ((value & ~0x7F) != 0) { + writeByte((value & 0x7F) | 0x80); + value = (value >> 7) & 0x1FFFFFFF; + } + writeByte(value & 0x7F); + } + + int readVarInt() { + int result = 0; + int shift = 0; + int byte; + do { + byte = readByte(); + result |= (byte & 0x7F) << shift; + if ((byte & 0x80) == 0) { + break; + } + shift += 7; + } while (true); + + return result; + } + + void writeVarIntNoZigZag(int value) { + while ((value & ~0x7F) != 0) { + writeByte((value & 0x7F) | 0x80); + value >>= 7; + } + writeByte(value & 0x7F); + } + + int readVarIntNoZigZag() { + int result = 0; + int shift = 0; + int byte; + do { + byte = readByte(); + result |= (byte & 0x7F) << shift; + if ((byte & 0x80) == 0) { + break; + } + shift += 7; + } while (true); + + return result; + } + + void writeShort(int value) { + _ensureCapacity(2); + _byteBuffer.buffer.asByteData().setInt16(_position, value, Endian.big); + _position += 2; + } + + int readShort() { + final value = + _byteBuffer.buffer.asByteData().getInt16(_position, Endian.big); + _position += 2; + return value; + } + + void writeFloat(double value) { + _ensureCapacity(4); + _byteBuffer.buffer.asByteData().setFloat32(_position, value, Endian.big); + _position += 2; + } + + double readFloat() { + final value = + _byteBuffer.buffer.asByteData().getFloat32(_position, Endian.big); + + _position += 2; + return value; + } + + void writeTagName(String name) { + final encodedName = utf8.encode(name); + writeShort(encodedName.length); + _ensureCapacity(encodedName.length); + _byteBuffer.setAll(_position, encodedName); + _position += encodedName.length; + } + + String readTagName() { + final length = readShort(); + final encodedName = _byteBuffer.sublist(_position, _position + length); + _position += length; + return utf8.decode(encodedName); + } + + void resetPosition() { + _position = 0; + } + + void clear() { + resetPosition(); + _byteBuffer = Uint8List(0); + } + + Future writeToFile(String filePath) async { + final file = File(filePath); + await file.writeAsBytes(bytes); + } + + Future readFromFile(String filePath) async { + final file = File(filePath); + final exists = await file.exists(); + if (!exists) { + print('File does not exist.'); + return; + } + + _byteBuffer = await file.readAsBytes(); + resetPosition(); + } + + Future compress() async { + final gzip = GZipCodec(); + final compressedData = gzip.encode(_byteBuffer); + _byteBuffer = Uint8List.fromList(compressedData); + _position = _byteBuffer.length; + } + + Future decompress() async { + final gzip = GZipCodec(); + final decompressedData = gzip.decode(_byteBuffer); + _byteBuffer = Uint8List.fromList(decompressedData); + _position = _byteBuffer.length; + } + + void writeLong(int value) { + _ensureCapacity(8); + _byteBuffer.buffer.asByteData().setInt64(_position, value, Endian.big); + _position += 8; + } + + int readLong() { + final value = + _byteBuffer.buffer.asByteData().getInt64(_position, Endian.big); + _position += 8; + return value; + } +} + +class NbtIo { + static ByteLayer _io = ByteLayer(); + + // Handle various helper functions here! + + static Future _read(String file) async { + _io = ByteLayer(); + + await _io.readFromFile(file); + } + + // This function will read the file and check if it is infact gzipped + static Future read(String file) async { + await _read(file); + if (_io.readByte() == TagType.Compound.toByte()) { + _io.resetPosition(); + return false; + } else { + // Is likely gzip compressed + await _readCompressed(file); + _io.resetPosition(); + return true; + } + } + + static Future _readCompressed(String file) async { + _io = ByteLayer(); + await _io.readFromFile(file); + await _io.decompress(); + } + + static Future write(String file) async { + await _io.writeToFile(file); + } + + static Future writeCompressed(String file) async { + await _io.compress(); + await _io.writeToFile(file); + } + + static ByteLayer getStream() { + return _io; + } +} diff --git a/lib/tags/ShortTag.dart b/lib/tags/ShortTag.dart new file mode 100644 index 0000000..d16fe93 --- /dev/null +++ b/lib/tags/ShortTag.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class ShortTag extends Tag { + int _value = 0; + + @override + Node getNode(String path) { + return Node(key: path, label: "$_value", data: this); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + _value = layer.readShort(); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_Short (${Name})"), + subtitle: Text("${_value}"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.Short.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeShort(_value); + } + + @override + TagType getTagType() { + return TagType.Short; + } +} diff --git a/lib/tags/StringTag.dart b/lib/tags/StringTag.dart new file mode 100644 index 0000000..685431a --- /dev/null +++ b/lib/tags/StringTag.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_treeview/src/models/node.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/Tag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +class StringTag extends Tag { + String _value = ""; + @override + Node getNode(String path) { + return Node(key: path, label: "$_value", data: this); + } + + @override + void readHeader(ByteLayer layer) { + setName(layer.readTagName()); + } + + @override + void readValue(ByteLayer layer) { + _value = layer.readString(); + } + + @override + Widget render() { + return ListTile( + title: Text("TAG_String (${Name})"), + subtitle: Text("${_value}"), + ); + } + + @override + void writeHeader(ByteLayer layer) { + layer.writeTagName(Name); + } + + @override + void writeTagType(ByteLayer layer) { + layer.writeByte(TagType.String.toByte()); + } + + @override + void writeValue(ByteLayer layer) { + layer.writeString(_value); + } + + @override + TagType getTagType() { + return TagType.String; + } +} diff --git a/lib/tags/Tag.dart b/lib/tags/Tag.dart new file mode 100644 index 0000000..0dc8fd6 --- /dev/null +++ b/lib/tags/Tag.dart @@ -0,0 +1,229 @@ +import 'dart:ffi'; + +import 'package:flutter/material.dart'; +import 'package:flutter_treeview/flutter_treeview.dart'; +import 'package:nbteditor/tags/ByteArrayTag.dart'; +import 'package:nbteditor/tags/ByteTag.dart'; +import 'package:nbteditor/tags/CompoundTag.dart'; +import 'package:nbteditor/tags/DoubleTag.dart'; +import 'package:nbteditor/tags/FloatTag.dart'; +import 'package:nbteditor/tags/IntArrayTag.dart'; +import 'package:nbteditor/tags/IntTag.dart'; +import 'package:nbteditor/tags/ListTag.dart'; +import 'package:nbteditor/tags/LongArrayTag.dart'; +import 'package:nbteditor/tags/LongTag.dart'; +import 'package:nbteditor/tags/NbtIo.dart'; +import 'package:nbteditor/tags/ShortTag.dart'; +import 'package:nbteditor/tags/StringTag.dart'; +import 'package:nbteditor/tags/TagType.dart'; + +abstract class Tag { + String Name = ""; + Tag(); + + late String key; + + void setKey(String key) { + this.key = key; + } + + Widget render(); + + Node getNode(String path); + + ByteTag asByte() { + if (this is ByteTag) + return this as ByteTag; + else + return ByteTag(); + } + + ShortTag asShort() { + if (this is ShortTag) + return this as ShortTag; + else + return ShortTag(); + } + + IntTag asInt() { + if (this is IntTag) + return this as IntTag; + else + return IntTag(); + } + + LongTag asLong() { + if (this is LongTag) + return this as LongTag; + else + return LongTag(); + } + + FloatTag asFloat() { + if (this is FloatTag) + return this as FloatTag; + else + return FloatTag(); + } + + DoubleTag asDouble() { + if (this is DoubleTag) + return this as DoubleTag; + else + return DoubleTag(); + } + + ByteArrayTag asByteArray() { + if (this is ByteArrayTag) + return this as ByteArrayTag; + else + return ByteArrayTag(); + } + + StringTag asString() { + if (this is StringTag) + return this as StringTag; + else + return StringTag(); + } + + ListTag asListTag() { + if (this is ListTag) + return this as ListTag; + else + return ListTag(); + } + + CompoundTag asCompoundTag() { + if (this is CompoundTag) + return this as CompoundTag; + else + return CompoundTag(); + } + + IntArrayTag asIntArrayTag() { + if (this is IntArrayTag) + return this as IntArrayTag; + else + return IntArrayTag(); + } + + LongArrayTag asLongArrayTag() { + if (this is LongArrayTag) + return this as LongArrayTag; + else + return LongArrayTag(); + } + + Tag withNick(String name) { + Name = name; + return this; + } + + void setName(String name) { + Name = name; + } + + static Tag read(ByteLayer layer) { + TagType tagType = readTagType(layer); + return readTag(layer, tagType, false); + } + + static Tag readTag(ByteLayer layer, TagType tagType, bool isList) { + Tag tag; + switch (tagType) { + case TagType.Byte: + { + tag = ByteTag(); + break; + } + case TagType.Short: + { + tag = ShortTag(); + break; + } + case TagType.Int: + { + tag = IntTag(); + break; + } + case TagType.Long: + { + tag = LongTag(); + break; + } + case TagType.Float: + { + tag = FloatTag(); + break; + } + case TagType.Double: + { + tag = DoubleTag(); + break; + } + case TagType.ByteArray: + { + tag = ByteArrayTag(); + break; + } + case TagType.String: + { + tag = StringTag(); + break; + } + case TagType.List: + { + tag = ListTag(); + break; + } + case TagType.Compound: + { + tag = CompoundTag(); + break; + } + case TagType.IntArray: + { + tag = IntArrayTag(); + break; + } + case TagType.LongArray: + { + tag = LongArrayTag(); + break; + } + default: + { + print( + "Unknown tag: ${tagType}, aborting read at ${layer.currentPosition - 1} bytes"); + + throw Exception("Unknown tag, could not deserialize"); + } + } + + print("Read ${tagType}"); + + if (!isList) tag.readHeader(layer); + + print("Name: ${tag.Name}"); + + tag.readValue(layer); + + return tag; + } + + static TagType readTagType(ByteLayer layer) { + int type = layer.readByte(); + TagType tagType = TagTypeExtension.fromByte(type); + + return tagType; + } + + void readHeader(ByteLayer layer); + void readValue(ByteLayer layer); + + TagType getTagType(); + void writeTagType(ByteLayer layer); + void writeHeader(ByteLayer layer); + void writeValue(ByteLayer layer); +} diff --git a/lib/tags/TagType.dart b/lib/tags/TagType.dart new file mode 100644 index 0000000..b397f15 --- /dev/null +++ b/lib/tags/TagType.dart @@ -0,0 +1,83 @@ +enum TagType { + End, + Byte, + Short, + Int, + Long, + Float, + Double, + ByteArray, + String, + List, + Compound, + IntArray, + LongArray +} + +extension TagTypeExtension on TagType { + int toByte() { + switch (this) { + case TagType.End: + return 0; + case TagType.Byte: + return 1; + case TagType.Short: + return 2; + case TagType.Int: + return 3; + case TagType.Long: + return 4; + case TagType.Float: + return 5; + case TagType.Double: + return 6; + case TagType.ByteArray: + return 7; + case TagType.String: + return 8; + case TagType.List: + return 9; + case TagType.Compound: + return 10; + case TagType.IntArray: + return 11; + case TagType.LongArray: + return 12; + default: + throw Exception('Unknown TagType: $this'); + } + } + + static TagType fromByte(int type) { + switch (type) { + case 0: + return TagType.End; + case 1: + return TagType.Byte; + case 2: + return TagType.Short; + case 3: + return TagType.Int; + case 4: + return TagType.Long; + case 5: + return TagType.Float; + case 6: + return TagType.Double; + case 7: + return TagType.ByteArray; + case 8: + return TagType.String; + case 9: + return TagType.List; + case 10: + return TagType.Compound; + case 11: + return TagType.IntArray; + case 12: + return TagType.LongArray; + default: + throw Exception("Unknown TagType $type"); + } + } +} diff --git a/pubspec.yaml b/pubspec.yaml index dfc05be..e5a2e19 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,8 +7,11 @@ environment: sdk: '>=3.1.5 <4.0.0' dependencies: + file_picker: ^6.1.1 flutter: sdk: flutter + flutter_treeview: ^1.0.7+1 + uuid: ^4.2.2 dev_dependencies: flutter_test: