Skip to content

Commit 0903182

Browse files
committed
2 parents ad6f462 + 05887f8 commit 0903182

File tree

2 files changed

+50
-99
lines changed

2 files changed

+50
-99
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/dist
22
/build
3-
/bjson/__pycache__
3+
/bjson/__pycache__
4+
/hash_database.json

main.py

Lines changed: 48 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -15,100 +15,81 @@
1515

1616
def getBjsonContent(fp: str|Path):
1717
try:
18-
data = convertBjsonToJson(fp)
18+
data = BJSONFile().open(fp).toPython()
1919
except Exception as e:
2020
tkinter.messagebox.showerror("Unable to load file", f"Could not open the specified file. Error: {e}")
2121
return data
2222

23-
def addDictToTree(tree: ttk.Treeview, root: str, key: str, data: dict, count: int):
23+
def addDictToTree(tree: ttk.Treeview, root: str, key: str, data: dict):
2424
if root == "":
2525
opened = True
2626
else:
2727
opened = False
28-
item_idx = count
29-
sub_node = tree.insert(root, "end", text=key, open=opened, values=["Object", item_idx])
30-
count += 1
28+
sub_node = tree.insert(root, "end", text=key, open=opened, values=["Object"])
3129
for key in data:
3230
if type(data[key]) == dict:
33-
count = addDictToTree(tree, sub_node, key, data[key], count)
31+
addDictToTree(tree, sub_node, key, data[key])
3432
elif type(data[key]) == list:
35-
count = addListToTree(tree, sub_node, key, data[key], count)
33+
addListToTree(tree, sub_node, key, data[key])
3634
else:
37-
addSingleElementToTree(tree, sub_node, key, data[key], count)
38-
count += 1
39-
40-
return count
35+
addSingleElementToTree(tree, sub_node, key, data[key])
4136

42-
def addListToTree(tree: ttk.Treeview, root: str, key: str, data: list, count: int):
37+
def addListToTree(tree: ttk.Treeview, root: str, key: str, data: list):
4338
if root == "":
4439
opened = True
4540
else:
4641
opened = False
47-
item_idx = count
48-
sub_node = tree.insert(root, "end", text=key, open=opened, values=["Array", item_idx])
49-
count += 1
42+
sub_node = tree.insert(root, "end", text=key, open=opened, values=["Array"])
5043
for element in data:
5144
if type(element) == dict:
52-
count = addDictToTree(tree, sub_node, "Object", element, count)
45+
addDictToTree(tree, sub_node, "Object", element)
5346
elif type(element) == list:
54-
count = addListToTree(tree, sub_node, "Array", element, count)
47+
addListToTree(tree, sub_node, "Array", element)
5548
elif type(element) == int or type(element) == float:
56-
addSingleElementToTree(tree, sub_node, "Number", element, count)
57-
count += 1
49+
addSingleElementToTree(tree, sub_node, "Number", element)
5850
elif type(element) == str:
59-
addSingleElementToTree(tree, sub_node, "String", element, count)
60-
count += 1
51+
addSingleElementToTree(tree, sub_node, "String", element)
6152
elif type(element) == bool:
62-
addSingleElementToTree(tree, sub_node, "Boolean", element, count)
63-
count += 1
53+
addSingleElementToTree(tree, sub_node, "Boolean", element)
6454
else:
65-
addSingleElementToTree(tree, sub_node, "null", None, count)
66-
count += 1
67-
68-
return count
55+
addSingleElementToTree(tree, sub_node, "null", None)
6956

70-
def addSingleElementToTree(tree: ttk.Treeview, root: str, key: str, data, count: int):
71-
item_idx = count
57+
def addSingleElementToTree(tree: ttk.Treeview, root: str, key: str, data):
7258
if type(data) == int or type(data) == float:
73-
tree.insert(root, "end", text=key, values=["Number", item_idx, data])
59+
tree.insert(root, "end", text=key, values=["Number", data])
7460
elif type(data) == str:
75-
tree.insert(root, "end", text=key, values=["String", item_idx, data])
61+
tree.insert(root, "end", text=key, values=["String", data])
7662
elif type(data) == bool:
77-
tree.insert(root, "end", text=key, values=["Boolean", item_idx, data])
63+
tree.insert(root, "end", text=key, values=["Boolean", data])
7864
else:
79-
tree.insert(root, "end", text=key, values=["null", item_idx, "null"])
65+
tree.insert(root, "end", text=key, values=["null", "null"])
8066

8167
def populate_tree(tree: ttk.Treeview, data: dict|list):
82-
count = 0
8368
if type(data) == dict:
84-
count = addDictToTree(tree, "", "root", data, count)
69+
addDictToTree(tree, "", "root", data)
8570
elif type(data) == list:
86-
count = addListToTree(tree, "", "root", data, count)
71+
addListToTree(tree, "", "root", data)
8772

8873
def loadFileDataFromBjson(root, tree: ttk.Treeview, fp: str|Path):
8974
loading_label = tkinter.Label(root, text="Loading file...")
9075
loading_label.grid(row=0, column=0)
9176
try:
92-
json_str = getBjsonContent(fp)
93-
if json_str == None:
94-
tkinter.messagebox.showerror("Unable to load file", "The file could not be loaded. The format may be incorrect or unsupported.")
95-
loading_label.grid_remove()
96-
return
97-
bjson_dict = json.loads(json_str)
98-
99-
populate_tree(tree, bjson_dict)
100-
if not hasattr(tree, 'icons'):
101-
tree.icons = {}
102-
tree.icons["objectLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/object.png"))
103-
tree.icons["arrayLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/array.png"))
104-
tree.icons["textLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/text.png"))
105-
tree.icons["numberLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/number.png"))
106-
tree.icons["booleanLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/boolean.png"))
107-
tree.icons["nullLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/null.png"))
108-
setIcons(tree, tree.icons)
109-
tree.grid(row=0, column=0, sticky="wesn")
110-
inputPath = Path(fp)
111-
root.title(f"MC3DS BJSON Editor - {inputPath.name}")
77+
bjson_dict = getBjsonContent(fp)
78+
79+
if bjson_dict:
80+
populate_tree(tree, bjson_dict)
81+
if not hasattr(tree, 'icons'):
82+
tree.icons = {}
83+
tree.icons["objectLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/object.png"))
84+
tree.icons["arrayLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/array.png"))
85+
tree.icons["textLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/text.png"))
86+
tree.icons["numberLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/number.png"))
87+
tree.icons["booleanLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/boolean.png"))
88+
tree.icons["nullLogo"] = tkinter.PhotoImage(file=os.path.join(root.app_path, "assets/null.png"))
89+
setIcons(tree, tree.icons)
90+
tree.grid(row=0, column=0, sticky="wesn")
91+
inputPath = Path(fp)
92+
root.title(f"MC3DS BJSON Editor - {inputPath.name}")
11293
except:
11394
pass
11495

@@ -211,16 +192,14 @@ def __init__(self, fp = None):
211192

212193
self.lastValue = None
213194
self.filePath = fp
214-
self.changes = []
215-
self.actualIndex = None
195+
self.selectedItem = None
216196

217197
if fp != None:
218198
threading.Thread(target=partial(loadFileDataFromBjson, self, self.tree, fp)).start()
219199

220200
self.saved = True
221201

222202
def registerChange(self):
223-
index = self.actualIndex
224203
dataType = self.dataTypeStringVar.get()
225204
newValue = self.valueStringVar.get()
226205
if dataType == "Number":
@@ -239,39 +218,17 @@ def registerChange(self):
239218
tkinter.messagebox.showwarning(title="Invalid value", message="Boolean values only accept 'true' or 'false'")
240219
return
241220
if (type(newValue) == type(self.lastValue)) or ((type(newValue) == int or type(newValue) == float) and dataType == "Number"):
242-
for element in self.changes:
243-
if element[0] == index:
244-
self.changes.remove(element)
245-
newItem = [index, dataType, newValue]
246-
self.changes.append(newItem)
247-
print("Change registered")
248-
self.saved = False
221+
if self.selectedItem:
222+
self.tree.item(self.selectedItem, values=[dataType, newValue])
223+
print("Change registered")
224+
self.saved = False
249225
else:
250226
tkinter.messagebox.showwarning(title="Invalid value", message="The value entered is not valid for this instance")
251227

252228
def saveChanges(self):
253229
if type(self.filePath) == str:
254-
with open(self.filePath, "rb") as f:
255-
fileContent = list(f.read())
256-
for element in self.changes:
257-
idx = element[0] * 3 + 1
258-
if element[1] == "Number":
259-
if type(element[2]) == int:
260-
data_id = list(uint_to_bytes(2, "little"))
261-
value = list(int_to_bytes(element[2], "little"))
262-
else:
263-
data_id = list(uint_to_bytes(3, "little"))
264-
value = list(float_to_bytes(element[2], "little"))
265-
elif element[1] == "Boolean":
266-
if element[2] == "true":
267-
data_id = list(uint_to_bytes(1, "little"))
268-
value = list(int_to_bytes(1, "little"))
269-
else:
270-
data_id = list(uint_to_bytes(1, "little"))
271-
value = list(int_to_bytes(0, "little"))
272-
if element[1] == "Number" or element[1] == "Boolean":
273-
fileContent[idx*4:idx*4+4] = data_id
274-
fileContent[idx*4+4:idx*4+8] = value
230+
# TODO: Convert treeview to json
231+
fileContent = []
275232
outputPath = tkinter.filedialog.asksaveasfilename(defaultextension=".bjson", filetypes=[("BJSON Files", ".bjson")])
276233
if outputPath != "":
277234
with open(outputPath, "wb") as f:
@@ -283,8 +240,6 @@ def saveChanges(self):
283240
self.valueStringVar.set("")
284241
self.dataTypeStringVar.set("")
285242
self.lastValue = None
286-
self.changes = []
287-
self.actualIndex = None
288243
self.filePath = outputPath
289244
self.saved = True
290245

@@ -300,8 +255,6 @@ def openFile(self):
300255
self.dataTypeStringVar.set("")
301256
self.saveButton.configure(state="disabled")
302257
self.lastValue = None
303-
self.changes = []
304-
self.actualIndex = None
305258
self.filePath = inputFp
306259
self.saved = True
307260

@@ -312,16 +265,13 @@ def clearTreeview(self):
312265
def itemSelected(self, event):
313266
for selected_item in self.tree.selection():
314267
item = self.tree.item(selected_item)
268+
self.selectedItem = selected_item
315269
record = item['values']
316270
self.dataTypeStringVar.set(record[0])
317-
self.actualIndex = record[1]
318-
if len(record) > 2:
319-
for element in self.changes:
320-
if element[0] == record[1]:
321-
record[2] = element[2]
271+
if len(record) > 1:
322272
if record[0] != "Boolean":
323-
self.valueStringVar.set(record[2])
324-
self.lastValue = record[2]
273+
self.valueStringVar.set(record[1])
274+
self.lastValue = record[1]
325275
else:
326276
if record[2] == True:
327277
self.valueStringVar.set("true")

0 commit comments

Comments
 (0)