def test_signal_connect(self): signal = Signal() mock1 = unittest.mock.Mock() mock2 = unittest.mock.Mock() signal.connect(mock1) signal.connect(mock2) signal() mock1.assert_called_with() mock2.assert_called_with() self.assertEqual(mock1.call_count, 1) self.assertEqual(mock2.call_count, 1)
def __init__(self, tabbed=True, parent=None): EditorMapComponent.current = self self.workspace = Workspace() self.gc_state = GraphicContextState() if tabbed: self.tab_widget = QTabWidget(parent) self.widget = QWidget(self.tab_widget) self.tab_widget.addTab(self.widget, "A Label") else: self.tab_widget = None self.widget = QWidget(parent) self.layout = QGridLayout(self.widget) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setHorizontalSpacing(0) self.layout.setVerticalSpacing(0) self.scroll_horz = QScrollBar(Qt.Horizontal) self.scroll_vert = QScrollBar(Qt.Vertical) self.editormap_widget = EditorMapWidget(self, None) self.scroll_horz.valueChanged.connect(self.move_to_x) self.scroll_vert.valueChanged.connect(self.move_to_y) self.layout.addWidget(self.editormap_widget, 0, 0) self.layout.addWidget(self.scroll_horz, 1, 0) self.layout.addWidget(self.scroll_vert, 0, 1) self.sig_drop = Signal() self.editormap_widget.sig_drop.connect(self.on_drop)
def __init__(self, parent): super().__init__(parent) self.items = [] self.vbox = QVBoxLayout() self.layout = QFormLayout() self.vbox.addLayout(self.layout) self.setLayout(self.vbox) self.setMinimumWidth(300) # Called in many cases. This should have functions connected # which cause the changes in the widget to be applied # Called by hitting "Apply", "Ok" or "Finish" self.call_signal = Signal() self.call_signal.connect(self.call_callbacks)
def init_gui(self): # Clear from previous: self.heading_label.setVisible(False) self.label.setVisible(False) self.toolbar = QToolBar() self.toolbar.setStyleSheet('QToolBar{spacing:0px;}') package_icon = QIcon("data/images/icons16/addon_package-16.png") add_icon = QIcon("data/images/supertux/plus.png") self.toolbar.addAction(package_icon, 'Package add-on...', self.package_addon) self.toolbar.addAction(add_icon, "Add content...", self.add_content) self.tree_view = QTreeView() self.vbox.addWidget(self.toolbar) self.model = QFileSystemModel() # self.data = [ # ("SuperTux addon", [ # ("levels", []), # ("images", []), # ("sounds", []), # ("music", []), # ("scripts", []), # ("metadata", []) # ])] # self.model = QStandardItemModel() # self.add_items(self.model, self.data) self.tree_view.setModel(self.model) self.tree_view.doubleClicked.connect(self.on_tree_view_double_click) self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu) self.tree_view.customContextMenuRequested.connect(self.on_context_menu) self.vbox.addWidget(self.tree_view) self.layout = QFormLayout() self.vbox.addLayout(self.layout) self.setLayout(self.vbox) self.setMinimumWidth(300) # Called in many cases. This should have functions connected # which cause the changes in the widget to be applied # Called by hitting "Apply", "Ok" or "Finish" self.call_signal = Signal() self.call_signal.connect(self.call_callbacks)
def __init__(self, comp, parent): super().__init__(parent) self.setMouseTracking(True) self.comp = comp self.workspace = comp.get_workspace() self.gc_state = comp.get_gc_state() self.painter = QPainter() self.gc = GraphicContext(self.painter, self.gc_state) pal = self.palette() pal.setColor(self.backgroundRole(), QColor(100, 0, 100)) self.setPalette(pal) self.setAutoFillBackground(True) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setAcceptDrops(True) self.sig_drop = Signal() self.sig_mouse_move = Signal()
def __init__(self): self.background_color = Color(100, 80, 100) self.foreground_color = Color(255, 80, 255) self.modified = False self.serial = 0 self._has_bounding_rect = False self.bounding_rect = Rect(0, 0, 0, 0) self.layers = [] self.redo_stack = [] self.undo_stack = [] # Index in undo_stack + redo_stack, all with index <= are saved. self.save_pointer = 0 self.sig_change = Signal() self.metadata = None self.draw_grid = False
def sig_on_key(self, keyseq_str): key_sequence = QKeySequence(keyseq_str) if key_sequence.isEmpty(): raise RuntimeError("invalid key binding: '%s'" % keyseq_str) shortcut = QShortcut(key_sequence, self.editormap_widget) signal = Signal() def on_key(*args): pos = self.editormap_widget.mapFromGlobal(QCursor.pos()) # pos = self.gc_state.screen2world(Point.from_qt(pos)) signal(pos.x(), pos.y()) shortcut.activated.connect(on_key) return signal
def __init__(self, parent, title): super().__init__(parent) self.setWindowTitle(title) self.pages = [] self.finish_callback = Signal() def on_finish(): self.finish_callback(*self.get_values()) for page in self.pages: page.call() self.hide() def on_cancel(): self.hide() self.finished.connect(on_finish) self.rejected.connect(on_cancel)
def __init__(self, gui_manager): super().__init__() self.manager = gui_manager self.state = ObjMapSelectTool.STATE_NONE # Left click + drag rectangle self.drag_start = Pointf(0, 0) self.selection_rect = Rectf(0, 0, 0, 0) # For selected objects do: self.context.object_selection self.deselected = [] # Objects that were selected before self.offset = Pointf(0, 0) self.move_command = None self.control_point = None self.context = ToolContext.current # Never used: # self.sig_popup_menu_display = Signal() self.sig_right_click = Signal()
def __init__(self, sprite, pos, metadata=None): self.sprite = sprite self.pos = pos self.metadata = metadata self.sig_set_pos = Signal()
class ProjectWidget(QWidget): """ A widget for displaying & editing properties of objects etc. Also see the properties this likes to display: also see: supertux/property.py """ def __init__(self, parent): super().__init__(parent) self.items = [] self.addon = None self.vbox = QVBoxLayout() self.vbox.setSpacing(0) self.vbox.setContentsMargins(0, 0, 0, 0) self.heading_label = QLabel("No project") self.label = QLabel( "Create a project by selecting File > New > Project...") self.vbox.addWidget(self.heading_label) self.vbox.addWidget(self.label) self.setLayout(self.vbox) def init_gui(self): # Clear from previous: self.heading_label.setVisible(False) self.label.setVisible(False) self.toolbar = QToolBar() self.toolbar.setStyleSheet('QToolBar{spacing:0px;}') package_icon = QIcon("data/images/icons16/addon_package-16.png") add_icon = QIcon("data/images/supertux/plus.png") self.toolbar.addAction(package_icon, 'Package add-on...', self.package_addon) self.toolbar.addAction(add_icon, "Add content...", self.add_content) self.tree_view = QTreeView() self.vbox.addWidget(self.toolbar) self.model = QFileSystemModel() # self.data = [ # ("SuperTux addon", [ # ("levels", []), # ("images", []), # ("sounds", []), # ("music", []), # ("scripts", []), # ("metadata", []) # ])] # self.model = QStandardItemModel() # self.add_items(self.model, self.data) self.tree_view.setModel(self.model) self.tree_view.doubleClicked.connect(self.on_tree_view_double_click) self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu) self.tree_view.customContextMenuRequested.connect(self.on_context_menu) self.vbox.addWidget(self.tree_view) self.layout = QFormLayout() self.vbox.addLayout(self.layout) self.setLayout(self.vbox) self.setMinimumWidth(300) # Called in many cases. This should have functions connected # which cause the changes in the widget to be applied # Called by hitting "Apply", "Ok" or "Finish" self.call_signal = Signal() self.call_signal.connect(self.call_callbacks) def call_callbacks(self, *args): for item in self.items: if item.callback is not None: item.callback(item.get_value()) def add_callback(self, callback): """Adds a callback to the callback signal""" self.call_signal.connect(callback) def add_items(self, parent, elements): for text, children in elements: item = QStandardItem(text) parent.appendRow(item) if children: self.add_items(item, children) def call(self): self.call_signal(*self.get_values()) def on_tree_view_double_click(self, item): print("double-clicked!") def on_context_menu(self, position): menu = QMenu() menu.addAction(self.tr("Add image...")) menu.addAction(self.tr("Add sound...")) menu.addAction(self.tr("Add level...")) menu.addAction(self.tr("Add script...")) menu.exec_(self.tree_view.viewport().mapToGlobal(position)) def set_project_directory(self, project_dir): self.tree_view.setRootIndex(self.model.setRootPath(project_dir)) def set_addon(self, addon): self.addon = addon # We now have an add-on set, initialize the GUI self.init_gui() def package_addon(self): print("Package add-on!") def add_content(self): print("Add content to add-on!")
class PropertiesWidget(QWidget): """ A widget for displaying & editing properties of objects etc. Also see the properties this likes to display: also see: supertux/property.py """ def __init__(self, parent): super().__init__(parent) self.items = [] self.vbox = QVBoxLayout() self.layout = QFormLayout() self.vbox.addLayout(self.layout) self.setLayout(self.vbox) self.setMinimumWidth(300) # Called in many cases. This should have functions connected # which cause the changes in the widget to be applied # Called by hitting "Apply", "Ok" or "Finish" self.call_signal = Signal() self.call_signal.connect(self.call_callbacks) def clear_properties(self): # Clear Items self.items = [] # Remove all widgets for i in range(self.layout.count()): self.layout.layout().takeAt(0).widget().setParent(None) def set_properties(self, props): # Clear previous properties self.clear_properties() # Add all properties for prop in props: prop.property_dialog(self) def add_label(self, text): label = QLabel(text) self.layout.addRow(label) self.items.append(Item(Item.KIND_LABEL, label, None, None)) def add_bool(self, name, value, callback): label = QLabel(name) checkbox = QCheckBox() self.layout.addRow(label, checkbox) if value: checkbox.setCheckState(Qt.Checked) self.items.append(Item(Item.KIND_BOOL, label, checkbox, callback=callback)) def add_int(self, name, value, callback=None): label = QLabel(name) inputbox = QSpinBox() self.layout.addRow(label, inputbox) inputbox.setValue(value) self.items.append(Item(Item.KIND_INT, label, inputbox, callback=callback)) def add_float(self, name, value, callback=None): label = QLabel(name) inputbox = QLineEdit() self.layout.addRow(label, inputbox) inputbox.setText(str(value)) self.items.append(Item(Item.KIND_FLOAT, label, inputbox, callback=callback)) def add_string(self, name, value, callback=None, placeholder=None): label = QLabel(name) inputbox = QLineEdit() self.layout.addRow(label, inputbox) inputbox.setText(value) if placeholder is not None: inputbox.setPlaceholderText(placeholder) self.items.append(Item(Item.KIND_STRING, label, inputbox, callback=callback)) def add_file(self, label, default, ret_rel_to=None, show_rel_to=None, open_in=None, filters=("All Files (*)",), callback=None): """Open a FileDialog for the user to select a file :param ret_rel_to: Path to which the param. of callback(value) will be relative to :param show_rel_to: Path to which the displayed text (in input box) will be relative to :param open_in: Where the open file dialog will begin :param callback: Method/function to call upon file being chosen. :param filters: A tuple containing filters for filenames. They should appear like this: Name of Filter (*.txt) ^ Only show .txt files All Files (*) C++ Files (*.cpp *.h *.hpp *.cxx) """ label = QLabel(label) inputbox = QLineEdit(default) browse = QPushButton("Browse...") def file_selected(path): """Called whenever file is selected""" # actual_path = path if show_rel_to and path[:len(show_rel_to)] == show_rel_to: inputbox.setText(path[len(show_rel_to):]) else: inputbox.setText(path) def browse_files(): """Called when Browse... button clicked""" dialog = OpenFileDialog("Open File") dialog.set_directory(open_in if open_in else Config.current.datadir) dialog.run(file_selected) browse.clicked.connect(browse_files) # Connect the above to click signal self.layout.addRow(label, inputbox) self.layout.addRow(browse) self.items.append(Item(Item.KIND_STRING, label, inputbox, callback=callback)) def add_enum(self, name, values, current_value=0, callback=None): label = QLabel(name) drop_down = QComboBox() for value in values: drop_down.addItem(value) drop_down.setCurrentIndex(current_value) self.layout.addRow(label, drop_down) self.items.append(Item(Item.KIND_ENUM, label, drop_down, callback=callback, group=None)) def add_radio(self, name, values, current_value=0, callback=None): label = QLabel(name) group = QButtonGroup() for i, value in enumerate(values): radio = QRadioButton(value) radio.setChecked(current_value == i) if i == 0: self.layout.addRow(label, radio) else: self.layout.addRow(None, radio) group.addButton(radio) self.items.append(Item(Item.KIND_ENUM, label, None, callback=callback, group=group)) def add_color(self, name, color, callback=None): """Not fully implemented according to Item class at the top.""" label = QLabel(name) pixmap = QPixmap(32, 32) pixmap.fill(color.to_qt()) icon = QIcon(pixmap) colorbutton = QPushButton(icon, color.to_hex()) def on_color(qcolor): pixmap.fill(qcolor) icon.addPixmap(pixmap) colorbutton.setIcon(icon) colorbutton.setText(qcolor.name()) self.layout.addRow(label, colorbutton) self.items.append(Item(Item.KIND_COLOR, label, colorbutton, callback=callback)) def call_callbacks(self, *args): for item in self.items: if item.callback is not None: item.callback(item.get_value()) def get_values(self): result = [] for item in self.items: value = item.get_value() if value is not None: result.append(value) return result def add_callback(self, callback): """Adds a callback to the callback signal""" self.call_signal.connect(callback) def call(self): self.call_signal(*self.get_values())