macro_recorder: repair "record" button

main
Ilya Zhuravlev 2020-12-24 23:39:04 -05:00
parent ce11e97ce3
commit 63fe1aa6f6
2 changed files with 78 additions and 34 deletions

View File

@ -2,12 +2,12 @@
from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtWidgets import QPushButton, QGridLayout, QHBoxLayout, QToolButton, QVBoxLayout, \ from PyQt5.QtWidgets import QPushButton, QGridLayout, QHBoxLayout, QToolButton, QVBoxLayout, \
QTabWidget, QWidget, QLabel QTabWidget, QWidget, QLabel, QMenu
from basic_editor import BasicEditor from basic_editor import BasicEditor
from keycodes import find_keycode from keycodes import find_keycode
from macro_action import ActionText, ActionSequence, ActionTap from macro_action import ActionText, ActionTap, ActionDown, ActionUp
from macro_key import KeyString from macro_key import KeyString, KeyDown, KeyUp, KeyTap
from macro_line import MacroLine from macro_line import MacroLine
from macro_optimizer import macro_optimize from macro_optimizer import macro_optimize
from macro_recorder_linux import LinuxRecorder from macro_recorder_linux import LinuxRecorder
@ -18,6 +18,8 @@ from vial_device import VialKeyboard
class MacroTab(QVBoxLayout): class MacroTab(QVBoxLayout):
changed = pyqtSignal() changed = pyqtSignal()
record = pyqtSignal(object, bool)
record_stop = pyqtSignal()
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@ -26,30 +28,38 @@ class MacroTab(QVBoxLayout):
self.container = QGridLayout() self.container = QGridLayout()
btn_record = QToolButton() menu_record = QMenu()
btn_record.setText(tr("MacroRecorder", "Record macro")) menu_record.addAction(tr("MacroRecorder", "Append to current"))\
btn_record.setToolButtonStyle(Qt.ToolButtonTextOnly) .triggered.connect(lambda: self.record.emit(self, True))
# btn_record.clicked.connect(self.on_record) menu_record.addAction(tr("MacroRecorder", "Replace everything"))\
.triggered.connect(lambda: self.record.emit(self, False))
btn_add = QToolButton() self.btn_record = QPushButton(tr("MacroRecorder", "Record macro"))
btn_add.setText(tr("MacroRecorder", "Add action")) self.btn_record.setMenu(menu_record)
btn_add.setToolButtonStyle(Qt.ToolButtonTextOnly)
btn_add.clicked.connect(self.on_add)
btn_tap_enter = QToolButton() self.btn_record_stop = QPushButton(tr("MacroRecorder", "Stop recording"))
btn_tap_enter.setText(tr("MacroRecorder", "Tap Enter")) self.btn_record_stop.clicked.connect(lambda: self.record_stop.emit())
btn_tap_enter.setToolButtonStyle(Qt.ToolButtonTextOnly) self.btn_record_stop.hide()
btn_tap_enter.clicked.connect(self.on_tap_enter)
self.btn_add = QToolButton()
self.btn_add.setText(tr("MacroRecorder", "Add action"))
self.btn_add.setToolButtonStyle(Qt.ToolButtonTextOnly)
self.btn_add.clicked.connect(self.on_add)
self.btn_tap_enter = QToolButton()
self.btn_tap_enter.setText(tr("MacroRecorder", "Tap Enter"))
self.btn_tap_enter.setToolButtonStyle(Qt.ToolButtonTextOnly)
self.btn_tap_enter.clicked.connect(self.on_tap_enter)
layout_buttons = QHBoxLayout() layout_buttons = QHBoxLayout()
layout_buttons.addStretch() layout_buttons.addStretch()
layout_buttons.addWidget(btn_add) layout_buttons.addWidget(self.btn_add)
layout_buttons.addWidget(btn_tap_enter) layout_buttons.addWidget(self.btn_tap_enter)
layout_buttons.addWidget(btn_record) layout_buttons.addWidget(self.btn_record)
layout_buttons.addWidget(self.btn_record_stop)
self.addLayout(self.container) self.addLayout(self.container)
self.addLayout(layout_buttons) self.addLayout(layout_buttons)
self.addWidget(btn_add)
self.addStretch() self.addStretch()
def add_action(self, act): def add_action(self, act):
@ -74,6 +84,10 @@ class MacroTab(QVBoxLayout):
line.insert(x) line.insert(x)
self.changed.emit() self.changed.emit()
def clear(self):
for line in self.lines[:]:
self.on_remove(line)
def on_move(self, obj, offset): def on_move(self, obj, offset):
if offset == 0: if offset == 0:
return return
@ -100,6 +114,18 @@ class MacroTab(QVBoxLayout):
def on_tap_enter(self): def on_tap_enter(self):
self.add_action(ActionTap(self.container, [find_keycode(0x28)])) self.add_action(ActionTap(self.container, [find_keycode(0x28)]))
def pre_record(self):
self.btn_record.hide()
self.btn_add.hide()
self.btn_tap_enter.hide()
self.btn_record_stop.show()
def post_record(self):
self.btn_record.show()
self.btn_add.show()
self.btn_tap_enter.show()
self.btn_record_stop.hide()
class MacroRecorder(BasicEditor): class MacroRecorder(BasicEditor):
@ -114,10 +140,15 @@ class MacroRecorder(BasicEditor):
self.recorder.stopped.connect(self.on_stop) self.recorder.stopped.connect(self.on_stop)
self.recording = False self.recording = False
self.recording_tab = None
self.recording_append = False
self.tabs = QTabWidget() self.tabs = QTabWidget()
for x in range(32): for x in range(32):
tab = MacroTab() tab = MacroTab()
tab.changed.connect(self.on_change) tab.changed.connect(self.on_change)
tab.record.connect(self.on_record)
tab.record_stop.connect(self.on_tab_stop)
self.macro_tabs.append(tab) self.macro_tabs.append(tab)
w = QWidget() w = QWidget()
w.setLayout(tab) w.setLayout(tab)
@ -144,26 +175,39 @@ class MacroRecorder(BasicEditor):
if not self.valid(): if not self.valid():
return return
def on_record(self): def on_record(self, tab, append):
if not self.recording: self.recording_tab = tab
self.recording = True self.recording_append = append
self.keystrokes = []
self.recorder.start() self.recording_tab.pre_record()
else:
self.recording = False for x, w in enumerate(self.macro_tabs):
self.recorder.stop() if tab != w:
self.tabs.tabBar().setTabEnabled(x, False)
self.recording = True
self.keystrokes = []
self.recorder.start()
def on_tab_stop(self):
self.recorder.stop()
def on_stop(self): def on_stop(self):
for x in range(len(self.macro_tabs)):
self.tabs.tabBar().setTabEnabled(x, True)
if not self.recording_append:
self.recording_tab.clear()
self.recording_tab.post_record()
self.keystrokes = macro_optimize(self.keystrokes) self.keystrokes = macro_optimize(self.keystrokes)
for k in self.keystrokes: for k in self.keystrokes:
if isinstance(k, KeyString): if isinstance(k, KeyString):
self.lines.append(MacroLine(self, ActionText(self.container, k.string))) self.recording_tab.add_action(ActionText(self.recording_tab.container, k.string))
else: else:
self.lines.append(MacroLine(self, ActionSequence(self.container, [k]))) cls = {KeyDown: ActionDown, KeyUp: ActionUp, KeyTap: ActionTap}[type(k)]
self.recording_tab.add_action(cls(self.recording_tab.container, [k.keycode]))
for x, line in enumerate(self.lines):
line.insert(x)
print(self.keystrokes)
def on_keystroke(self, keystroke): def on_keystroke(self, keystroke):
self.keystrokes.append(keystroke) self.keystrokes.append(keystroke)

View File

@ -109,6 +109,7 @@ class LinuxRecorder(QWidget):
super().__init__() super().__init__()
self.process = QProcess() self.process = QProcess()
self.process.readyReadStandardOutput.connect(self.on_output)
self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.X11BypassWindowManagerHint) self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.X11BypassWindowManagerHint)
@ -132,7 +133,6 @@ class LinuxRecorder(QWidget):
args += sys.argv args += sys.argv
args += ["--linux-recorder"] args += ["--linux-recorder"]
self.process.readyReadStandardOutput.connect(self.on_output)
self.process.start("pkexec", args, QProcess.Unbuffered | QProcess.ReadWrite) self.process.start("pkexec", args, QProcess.Unbuffered | QProcess.ReadWrite)
def on_stop(self): def on_stop(self):