示例#1
0
 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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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()
示例#6
0
 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
示例#7
0
    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
示例#8
0
    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)
示例#9
0
    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()
示例#10
0
 def __init__(self, sprite, pos, metadata=None):
     self.sprite = sprite
     self.pos = pos
     self.metadata = metadata
     self.sig_set_pos = Signal()
示例#11
0
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!")
示例#12
0
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())