From 7a75e77e9b268d5cfc807e5feaec4f53d0459a39 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Fri, 25 Dec 2020 14:06:27 -0500 Subject: [PATCH] macro_recorder: making UI more dynamic, show current state of changes --- src/main/python/keyboard_comm.py | 5 +++++ src/main/python/macro_recorder.py | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/python/keyboard_comm.py b/src/main/python/keyboard_comm.py index 1fd3160..8306f60 100644 --- a/src/main/python/keyboard_comm.py +++ b/src/main/python/keyboard_comm.py @@ -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 """ diff --git a/src/main/python/macro_recorder.py b/src/main/python/macro_recorder.py index 5e58bfc..c0c7399 100644 --- a/src/main/python/macro_recorder.py +++ b/src/main/python/macro_recorder.py @@ -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()