keyboard_comm: save and restore layout/macros in save_layout/restore_layout

main
Ilya Zhuravlev 2020-12-26 20:29:22 -05:00
parent 5d40bec15b
commit b11e0be700
2 changed files with 22 additions and 13 deletions

View File

@ -1,5 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
import base64
import struct import struct
import json import json
import lzma import lzma
@ -175,6 +175,7 @@ class Keyboard:
self.macro_memory = struct.unpack(">H", data[1:3])[0] self.macro_memory = struct.unpack(">H", data[1:3])[0]
self.macro = b"" self.macro = b""
if self.macro_memory:
# now retrieve the entire buffer, MACRO_CHUNK bytes at a time, as that is what fits into a packet # now retrieve the entire buffer, MACRO_CHUNK bytes at a time, as that is what fits into a packet
for x in range(0, self.macro_memory, BUFFER_FETCH_CHUNK): for x in range(0, self.macro_memory, BUFFER_FETCH_CHUNK):
sz = min(BUFFER_FETCH_CHUNK, self.macro_memory - x) sz = min(BUFFER_FETCH_CHUNK, self.macro_memory - x)
@ -216,6 +217,7 @@ class Keyboard:
""" Serializes current layout to a binary """ """ Serializes current layout to a binary """
# TODO: increase version before release # TODO: increase version before release
# TODO: store keyboard UID here as well
data = {"version": 0} data = {"version": 0}
layout = [] layout = []
for l in range(self.layers): for l in range(self.layers):
@ -228,7 +230,8 @@ class Keyboard:
val = self.layout.get((l, r, c), -1) val = self.layout.get((l, r, c), -1)
row.append(val) row.append(val)
data["layout"] = layout data["layout"] = layout
# TODO: this should also save/restore macros, when implemented data["layout_options"] = self.layout_options
data["macro"] = base64.b64encode(self.macro).decode("utf-8")
return json.dumps(data).encode("utf-8") return json.dumps(data).encode("utf-8")
def restore_layout(self, data): def restore_layout(self, data):
@ -240,3 +243,5 @@ class Keyboard:
for c, col in enumerate(row): for c, col in enumerate(row):
if (l, r, c) in self.layout: if (l, r, c) in self.layout:
self.set_key(l, r, c, col) self.set_key(l, r, c, col)
self.set_layout_options(data["layout_options"])
self.set_macro(base64.b64decode(data["macro"]))

View File

@ -90,6 +90,7 @@ class MainWindow(QMainWindow):
with open(dialog.selectedFiles()[0], "rb") as inf: with open(dialog.selectedFiles()[0], "rb") as inf:
data = inf.read() data = inf.read()
self.keymap_editor.restore_layout(data) self.keymap_editor.restore_layout(data)
self.rebuild()
def on_layout_save(self): def on_layout_save(self):
dialog = QFileDialog() dialog = QFileDialog()
@ -118,11 +119,14 @@ class MainWindow(QMainWindow):
if self.current_device is not None: if self.current_device is not None:
self.current_device.open(self.sideload_json if self.current_device.sideload else None) self.current_device.open(self.sideload_json if self.current_device.sideload else None)
for e in [self.layout_editor, self.keymap_editor, self.firmware_flasher, self.macro_recorder]: self.rebuild()
e.rebuild(self.current_device)
self.refresh_tabs() self.refresh_tabs()
def rebuild(self):
for e in [self.layout_editor, self.keymap_editor, self.firmware_flasher, self.macro_recorder]:
e.rebuild(self.current_device)
def refresh_tabs(self): def refresh_tabs(self):
self.tabs.clear() self.tabs.clear()
for container, lbl in self.editors: for container, lbl in self.editors: