from copy import deepcopy from .pyside import QtWidgets, QtCore from .templates import COMMAND, MENU_COMMAND from .qtutils import icon from .dialog import CommandEditorDialog, MenuCommandEditorDialog class CommandItemWidget(QtWidgets.QWidget): editRequested = QtCore.Signal(object) deletedRequested = QtCore.Signal(object) def __init__(self, command, parent=None): super(CommandItemWidget, self).__init__(parent) self.command = command self.label = QtWidgets.QLabel(self.get_label()) self.edit = QtWidgets.QPushButton(icon('edit2.png'), '') self.edit.released.connect(lambda: self.editRequested.emit(self)) self.edit.setFixedSize(25, 25) self.delete = QtWidgets.QPushButton(icon('delete2.png'), '') self.delete.setFixedSize(25, 25) self.delete.released.connect(lambda: self.deletedRequested.emit(self)) layout = QtWidgets.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(self.edit) layout.addWidget(self.delete) layout.addSpacing(10) layout.addWidget(self.label) def get_label(self): language = '({0})'.format( self.command['language']) touchs = [self.command['button'] + 'Click'] touchs.extend([m for m in ('ctrl', 'shift') if self.command[m]]) return '{} {}'.format('+'.join(touchs), language) def update_label(self): self.label.setText(self.get_label()) class MenuCommandItemWidget(CommandItemWidget): def get_label(self): language = '({0})'.format( self.command['language']) return '{} {}'.format(self.command['caption'], language) class CommandsEditor(QtWidgets.QWidget): valueSet = QtCore.Signal(object) edit_dialog_constructor = CommandEditorDialog picker_command_key = 'action.commands' template = COMMAND item_constructor = CommandItemWidget def __init__(self, parent=None): super(CommandsEditor, self).__init__(parent) self.warning = QtWidgets.QLabel('Select only one shape') self.commands = QtWidgets.QListWidget() self.commands.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) self.commands.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.commands.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff) self.add_command = QtWidgets.QPushButton('Add command') self.add_command.released.connect(self.call_create_command) self.add_command.setEnabled(False) layout = QtWidgets.QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(self.warning) layout.addWidget(self.commands) layout.addWidget(self.add_command) def set_options(self, options): self.commands.clear() if len(options) != 1: self.warning.setVisible(True) self.add_command.setEnabled(False) return self.warning.setVisible(False) self.add_command.setEnabled(True) for command in options[0][self.picker_command_key]: self.call_add_command(command) def call_create_command(self): command = deepcopy(self.template) dialog = self.edit_dialog_constructor(command) if not dialog.exec_(): return self.call_add_command(dialog.command_data()) self.valueSet.emit(self.commands_data()) def call_add_command(self, command=None): widget = self.item_constructor(command) widget.editRequested.connect(self.edit_command) widget.deletedRequested.connect(self.delete_command) item = QtWidgets.QListWidgetItem() item.widget = widget item.setSizeHint( QtCore.QSize( self.commands.width() - self.commands.verticalScrollBar().width(), widget.sizeHint().height())) self.commands.addItem(item) self.commands.setItemWidget(item, widget) def edit_command(self, widget): for r in range(self.commands.count()): item = self.commands.item(r) if item.widget != widget: continue dialog = self.edit_dialog_constructor(item.widget.command) if not dialog.exec_(): return widget.command = dialog.command_data() widget.update_label() self.valueSet.emit(self.commands_data()) def delete_command(self, widget): for r in range(self.commands.count()): item = self.commands.item(r) if item.widget != widget: continue self.commands.takeItem(r) self.valueSet.emit(self.commands_data()) return def commands_data(self): return [ self.commands.item(r).widget.command for r in range(self.commands.count())] class MenuCommandsEditor(CommandsEditor): edit_dialog_constructor = MenuCommandEditorDialog picker_command_key = 'action.menu_commands' template = MENU_COMMAND item_constructor = MenuCommandItemWidget class GlobalCommandsEditor(CommandsEditor): edit_dialog_constructor = MenuCommandEditorDialog picker_command_key = 'menu_commands' template = MENU_COMMAND item_constructor = MenuCommandItemWidget def __init__(self, parent=None): super(GlobalCommandsEditor, self).__init__(parent) self.warning.hide() self.add_command.setEnabled(True) def set_options(self, options): self.commands.clear() for command in options[self.picker_command_key]: self.call_add_command(command)