class ActionSequenceUI(BasicActionUI): actcls = ActionSequence def __init__(self, container, act=None): super().__init__(container, act) self.btn_plus = QToolButton() self.btn_plus.setText("+") self.btn_plus.setToolButtonStyle(Qt.ToolButtonTextOnly) self.btn_plus.clicked.connect(self.on_add) self.layout = FlowLayout() self.layout_container = QWidget() self.layout_container.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) self.layout_container.setLayout(self.layout) self.widgets = [] self.recreate_sequence() def recreate_sequence(self): self.layout.removeWidget(self.btn_plus) for w in self.widgets: self.layout.removeWidget(w) w.deleteLater() self.widgets.clear() for item in self.act.sequence: w = QComboBox() w.view().setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) w.setStyleSheet("QComboBox { combobox-popup: 0; }") w.addItem(tr("MacroEditor", "Remove")) w.insertSeparator(1) for k in MACRO_SEQUENCE_KEYCODES: w.addItem(k.label.replace("\n", "")) w.setCurrentIndex(2 + MACRO_SEQUENCE_KEYCODES.index(item)) w.currentIndexChanged.connect(self.on_change) self.layout.addWidget(w) self.widgets.append(w) self.layout.addWidget(self.btn_plus) def insert(self, row): self.container.addWidget(self.layout_container, row, 2) def remove(self): self.container.removeWidget(self.layout_container) def delete(self): for w in self.widgets: w.deleteLater() self.btn_plus.deleteLater() self.layout_container.deleteLater() def on_add(self): self.act.sequence.append(KC_A) self.recreate_sequence() self.changed.emit() def on_change(self): for x in range(len(self.act.sequence)): index = self.widgets[x].currentIndex() if index == 0: # asked to remove this item del self.act.sequence[x] self.recreate_sequence() break else: self.act.sequence[x] = MACRO_SEQUENCE_KEYCODES[self.widgets[x].currentIndex() - 2] self.changed.emit()
class MacroLine(QObject): changed = pyqtSignal() types = ["Text", "Down", "Up", "Tap"] type_to_cls = [ActionTextUI, ActionDownUI, ActionUpUI, ActionTapUI] def __init__(self, parent, action): super().__init__() self.parent = parent self.container = parent.container if self.parent.parent.keyboard.vial_protocol >= 2: self.types = self.types[:] + ["Delay (ms)"] self.type_to_cls = self.type_to_cls[:] + [ActionDelayUI] self.arrows = QHBoxLayout() self.btn_up = QToolButton() self.btn_up.setText("▲") self.btn_up.setToolButtonStyle(Qt.ToolButtonTextOnly) self.btn_up.clicked.connect(self.on_move_up) self.btn_down = QToolButton() self.btn_down.setText("▼") self.btn_down.clicked.connect(self.on_move_down) self.btn_down.setToolButtonStyle(Qt.ToolButtonTextOnly) self.arrows.addWidget(self.btn_up) self.arrows.addWidget(self.btn_down) self.arrows.setSpacing(0) self.select_type = QComboBox() self.select_type.addItems(self.types) self.select_type.setCurrentIndex(self.type_to_cls.index(type(action))) self.select_type.currentIndexChanged.connect(self.on_change_type) self.action = action self.action.changed.connect(self.on_change) self.row = -1 self.btn_remove = QToolButton() self.btn_remove.setText("×") self.btn_remove.setToolButtonStyle(Qt.ToolButtonTextOnly) self.btn_remove.clicked.connect(self.on_remove_clicked) def insert(self, row): self.row = row self.container.addLayout(self.arrows, row, 0) self.container.addWidget(self.select_type, row, 1) self.container.addWidget(self.btn_remove, row, 3) self.action.insert(row) def remove(self): self.container.removeItem(self.arrows) self.container.removeWidget(self.select_type) self.container.removeWidget(self.btn_remove) self.action.remove() def delete(self): self.action.delete() self.btn_remove.deleteLater() self.select_type.deleteLater() self.arrows.deleteLater() self.btn_up.deleteLater() self.btn_down.deleteLater() def on_change_type(self): self.action.remove() self.action.delete() self.action = self.type_to_cls[self.select_type.currentIndex()]( self.container) self.action.changed.connect(self.on_change) self.action.insert(self.row) self.changed.emit() def on_remove_clicked(self): self.parent.on_remove(self) def on_move_up(self): self.parent.on_move(self, -1) def on_move_down(self): self.parent.on_move(self, 1) def on_change(self): self.changed.emit()