macro_recorder: making UI more dynamic, show current state of changes

main
Ilya Zhuravlev 2020-12-25 14:06:27 -05:00
parent e19b0a5a35
commit 7a75e77e9b
2 changed files with 20 additions and 3 deletions

View File

@ -185,6 +185,10 @@ class Keyboard:
sz = min(MACRO_CHUNK, self.macro_memory - x)
data = self.usb_send(self.dev, struct.pack(">BHB", CMD_VIA_MACRO_GET_BUFFER, x, sz))
self.macro += data[4:4+sz]
# macros are stored as NUL-separated strings, so let's clean up the buffer
# ensuring we only get macro_count strings after we split by NUL
macros = self.macro.split(b"\x00") + [b""] * self.macro_count
self.macro = b"\x00".join(macros[:self.macro_count]) + b"\x00"
def set_key(self, layer, row, col, code):
key = (layer, row, col)
@ -211,6 +215,7 @@ class Keyboard:
for x, chunk in enumerate(chunks(data, MACRO_CHUNK)):
off = x * MACRO_CHUNK
self.usb_send(self.dev, struct.pack(">BHB", CMD_VIA_MACRO_SET_BUFFER, off, len(chunk)) + chunk)
self.macro = data
def save_layout(self):
""" Serializes current layout to a binary """

View File

@ -221,13 +221,22 @@ class MacroRecorder(BasicEditor):
for x in range(self.tabs.count()):
self.tabs.removeTab(x)
for x, w in enumerate(self.macro_tab_w[:self.keyboard.macro_count]):
self.tabs.addTab(w, "Macro {}".format(x + 1))
self.tabs.addTab(w, "")
self.update_tab_titles()
# deserialize macros that came from keyboard
self.deserialize(self.keyboard.macro)
self.on_change()
def update_tab_titles(self):
macros = self.keyboard.macro.split(b"\x00")
for x, w in enumerate(self.macro_tab_w[:self.keyboard.macro_count]):
title = "Macro {}".format(x + 1)
if macros[x] != self.macro_tabs[x].serialize():
title += "*"
self.tabs.setTabText(x, title)
def on_record(self, tab, append):
self.recording_tab = tab
self.recording_append = append
@ -266,10 +275,12 @@ class MacroRecorder(BasicEditor):
self.keystrokes.append(keystroke)
def on_change(self):
memory = len(self.serialize())
data = self.serialize()
memory = len(data)
self.lbl_memory.setText("Memory used by macros: {}/{}".format(memory, self.keyboard.macro_memory))
self.btn_save.setEnabled(memory <= self.keyboard.macro_memory)
self.btn_save.setEnabled(data != self.keyboard.macro and memory <= self.keyboard.macro_memory)
self.lbl_memory.setStyleSheet("QLabel { color: red; }" if memory > self.keyboard.macro_memory else "")
self.update_tab_titles()
def deserialize(self, data):
macros = data.split(b"\x00")
@ -291,3 +302,4 @@ class MacroRecorder(BasicEditor):
def on_save(self):
self.keyboard.set_macro(self.serialize())
self.on_change()