示例#1
0
    def setup_ui(self):
        layout = QGridLayout()

        table = QTreeWidget()
        table.setHeaderLabels(['name', 'width', 'height', 'ratio'])
        table.setSortingEnabled(True)
        items = []
        for size in self.manager.project.sizes:
            i = ComparingTreeWidgetItem(None, [
                f'{size.width}x{size.height}',
                str(size.width),
                str(size.height),
                str(size.ratio())
            ])
            i.__data__ = size
            items.append(i)
        table.addTopLevelItems(items)

        @table.currentItemChanged.connect
        def _(item, prev):
            del_btn.setEnabled(item is not None)

        layout.addWidget(table, 0, 0, 1, 2)

        add_btn = QPushButton('add new')

        @add_btn.clicked.connect
        def _(*args):
            diag = SizeInput(self.manager.project.sizes, self)
            if diag.exec_() != QDialog.Accepted:
                return
            size = diag.value
            self.manager.add_size(size)
            item = ComparingTreeWidgetItem(None, [
                f'{size.width}x{size.height}',
                str(size.width),
                str(size.height),
                str(size.ratio())
            ])
            table.addTopLevelItem(item)

        layout.addWidget(add_btn, 1, 0)

        del_btn = QPushButton('delete')
        del_btn.setEnabled(False)

        @del_btn.clicked.connect
        def _(*args):
            item = table.currentItem()
            size = item.__data__
            self.manager.del_size(size)
            shiboken2.delete(item)

        layout.addWidget(del_btn, 1, 1)

        self.setLayout(layout)
 def reset_model(self, index):
     """Setup model according to current relationship_class selected in combobox.
     """
     self.class_name, self.object_class_name_list = self.relationship_class_keys[
         index]
     object_class_name_list = self.object_class_name_list.split(",")
     self.model.set_horizontal_header_labels(object_class_name_list)
     self.existing_items_model.set_horizontal_header_labels(
         object_class_name_list)
     self.new_items_model.set_horizontal_header_labels(
         object_class_name_list)
     self.relationship_ids.clear()
     for db_map in self.db_maps:
         relationship_classes = self.db_map_rel_cls_lookup[db_map]
         rel_cls = relationship_classes.get(
             (self.class_name, self.object_class_name_list), None)
         if rel_cls is None:
             continue
         for relationship in self.db_mngr.get_items_by_field(
                 db_map, "relationship", "class_id", rel_cls["id"]):
             key = tuple(relationship["object_name_list"].split(","))
             self.relationship_ids[key] = relationship["id"]
     existing_items = list(self.relationship_ids)
     self.existing_items_model.reset_model(existing_items)
     self.model.refresh()
     self.model.modelReset.emit()
     for wg in self.splitter_widgets():
         wg.deleteLater()
     for name in object_class_name_list:
         tree_widget = QTreeWidget(self)
         tree_widget.setSelectionMode(QAbstractItemView.ExtendedSelection)
         tree_widget.setColumnCount(1)
         tree_widget.setIndentation(0)
         header_item = QTreeWidgetItem([name])
         header_item.setTextAlignment(0, Qt.AlignHCenter)
         tree_widget.setHeaderItem(header_item)
         objects = self.db_mngr.get_items_by_field(self.db_map, "object",
                                                   "class_name", name)
         items = [QTreeWidgetItem([obj["name"]]) for obj in objects]
         tree_widget.addTopLevelItems(items)
         tree_widget.resizeColumnToContents(0)
         self.splitter.addWidget(tree_widget)
     sizes = [wg.columnWidth(0) for wg in self.splitter_widgets()]
     self.splitter.setSizes(sizes)
     for widget in self.hidable_widgets:
         widget.show()
示例#3
0
    def setup_ui(self):
        layout = QGridLayout()

        table = QTreeWidget()
        table.setHeaderLabels(['name', 'type', 'width', 'height'])
        table.setSortingEnabled(True)
        items = []
        for photo in self.manager.project.photos:
            if not photo.is_available():
                w = h = 'N/A!'
            else:
                w, h = photo.raw_size()
            i = ComparingTreeWidgetItem(
                None,
                [str(photo), type(photo).__name__,
                 str(w), str(h)])
            i.__data__ = photo
            items.append(i)
        table.addTopLevelItems(items)

        @table.currentItemChanged.connect
        def _(item, prev):
            del_btn.setEnabled(item is not None)

        layout.addWidget(table, 0, 0)

        del_btn = QPushButton('delete')
        del_btn.setEnabled(False)

        @del_btn.clicked.connect
        def _(*args):
            item = table.currentItem()
            size = item.__data__
            self.manager.del_photo(size)
            shiboken2.delete(item)

        layout.addWidget(del_btn, 1, 0)

        self.setLayout(layout)
class AddOrManageObjectGroupDialog(QDialog):
    def __init__(self, parent, object_class_item, db_mngr, *db_maps):
        """
        Args:
            parent (SpineDBEditor): data store widget
            object_class_item (ObjectClassItem)
            db_mngr (SpineDBManager)
            *db_maps: database mappings
        """
        super().__init__(parent)
        self.object_class_item = object_class_item
        self.db_mngr = db_mngr
        self.db_maps = db_maps
        self.db_map = db_maps[0]
        self.db_maps_by_codename = {
            db_map.codename: db_map
            for db_map in db_maps
        }
        self.db_combo_box = QComboBox(self)
        self.header_widget = QWidget(self)
        self.group_name_line_edit = QLineEdit(self)
        header_layout = QHBoxLayout(self.header_widget)
        header_layout.addWidget(QLabel(f"Group name: "))
        header_layout.addWidget(self.group_name_line_edit)
        header_layout.addSpacing(32)
        header_layout.addWidget(QLabel("Database"))
        header_layout.addWidget(self.db_combo_box)
        self.non_members_tree = QTreeWidget(self)
        self.non_members_tree.setHeaderLabel("Non members")
        self.non_members_tree.setSelectionMode(QTreeWidget.ExtendedSelection)
        self.non_members_tree.setColumnCount(1)
        self.non_members_tree.setIndentation(0)
        self.members_tree = QTreeWidget(self)
        self.members_tree.setHeaderLabel("Members")
        self.members_tree.setSelectionMode(QTreeWidget.ExtendedSelection)
        self.members_tree.setColumnCount(1)
        self.members_tree.setIndentation(0)
        self.add_button = QToolButton()
        self.add_button.setToolTip("<p>Add selected non-members.</p>")
        self.add_button.setIcon(QIcon(":/icons/menu_icons/cube_plus.svg"))
        self.add_button.setIconSize(QSize(24, 24))
        self.add_button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self.add_button.setText(">>")
        self.remove_button = QToolButton()
        self.remove_button.setToolTip("<p>Remove selected members.</p>")
        self.remove_button.setIcon(QIcon(":/icons/menu_icons/cube_minus.svg"))
        self.remove_button.setIconSize(QSize(24, 24))
        self.remove_button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        self.remove_button.setText("<<")
        self.vertical_button_widget = QWidget()
        vertical_button_layout = QVBoxLayout(self.vertical_button_widget)
        vertical_button_layout.addStretch()
        vertical_button_layout.addWidget(self.add_button)
        vertical_button_layout.addWidget(self.remove_button)
        vertical_button_layout.addStretch()
        self.button_box = QDialogButtonBox(self)
        self.button_box.setStandardButtons(QDialogButtonBox.Cancel
                                           | QDialogButtonBox.Ok)
        layout = QGridLayout(self)
        layout.addWidget(self.header_widget, 0, 0, 1, 3, Qt.AlignHCenter)
        layout.addWidget(self.non_members_tree, 1, 0)
        layout.addWidget(self.vertical_button_widget, 1, 1)
        layout.addWidget(self.members_tree, 1, 2)
        layout.addWidget(self.button_box, 2, 0, 1, 3)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.db_combo_box.addItems(list(self.db_maps_by_codename))
        self.db_map_object_ids = {
            db_map: {
                x["name"]: x["id"]
                for x in self.db_mngr.get_items_by_field(
                    self.db_map, "object", "class_id",
                    self.object_class_item.db_map_id(db_map))
            }
            for db_map in db_maps
        }
        self.reset_list_widgets(db_maps[0].codename)
        self.connect_signals()

    def connect_signals(self):
        """Connect signals to slots."""
        self.button_box.accepted.connect(self.accept)
        self.button_box.rejected.connect(self.reject)
        self.db_combo_box.currentTextChanged.connect(self.reset_list_widgets)
        self.add_button.clicked.connect(self.add_members)
        self.remove_button.clicked.connect(self.remove_members)

    def reset_list_widgets(self, database):
        self.db_map = self.db_maps_by_codename[database]
        object_ids = self.db_map_object_ids[self.db_map]
        members = []
        non_members = []
        for obj_name, obj_id in object_ids.items():
            if obj_id in self.initial_member_ids():
                members.append(obj_name)
            elif obj_id != self.initial_entity_id():
                non_members.append(obj_name)
        member_items = [QTreeWidgetItem([obj_name]) for obj_name in members]
        non_member_items = [
            QTreeWidgetItem([obj_name]) for obj_name in non_members
        ]
        self.members_tree.addTopLevelItems(member_items)
        self.non_members_tree.addTopLevelItems(non_member_items)

    def initial_member_ids(self):
        raise NotImplementedError()

    def initial_entity_id(self):
        raise NotImplementedError()

    @Slot(bool)
    def add_members(self, checked=False):
        indexes = sorted([
            self.non_members_tree.indexOfTopLevelItem(x)
            for x in self.non_members_tree.selectedItems()
        ],
                         reverse=True)
        items = [
            self.non_members_tree.takeTopLevelItem(ind) for ind in indexes
        ]
        self.members_tree.addTopLevelItems(items)

    @Slot(bool)
    def remove_members(self, checked=False):
        indexes = sorted([
            self.members_tree.indexOfTopLevelItem(x)
            for x in self.members_tree.selectedItems()
        ],
                         reverse=True)
        items = [self.members_tree.takeTopLevelItem(ind) for ind in indexes]
        self.non_members_tree.addTopLevelItems(items)

    def _check_validity(self):
        if not self.members_tree.topLevelItemCount():
            self.parent().msg_error.emit(
                "Please select at least one member object.")
            return False
        return True