コード例 #1
0
    def sizeHint(self, option: 'QStyleOptionViewItem', index: QModelIndex) -> QSize:
        if not index.isValid():
            return QSize()

        playlist = index.model().at(index.row())

        font = QApplication.font()
        title_fm = QFontMetrics(font)

        playlist_rec = title_fm.boundingRect(0, 0, option.rect.width() - PlaylistDelegate.icon_diameter,
                                             0,
                                             Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap, playlist.name)
        title_rect = title_fm.boundingRect(option.rect.left() + PlaylistDelegate.pad_horizontal,
                                           playlist_rec.bottom() + PlaylistDelegate.pad_vertical,
                                           playlist_rec.width(),
                                           0,
                                           Qt.AlignHCenter | Qt.AlignTop | Qt.TextWordWrap,
                                           playlist.name)

        playlist_size = QSize(PlaylistDelegate.icon_diameter, playlist_rec.height() + PlaylistDelegate.pad_vertical + title_rect.height())

        if playlist_size.height() < PlaylistDelegate.icon_diameter:
            playlist_size.setHeight(PlaylistDelegate.icon_diameter)

        return playlist_size
コード例 #2
0
ファイル: tilestamp.py プロジェクト: theall/Python-Tiled
 def maxSize(self):
     size = QSize()
     for variation in self.d.variations:
         size.setWidth(max(size.width(), variation.map.width()))
         size.setHeight(max(size.height(), variation.map.height()))
     
     return size
コード例 #3
0
    def sizeHint(self, option: 'QStyleOptionViewItem',
                 index: QtCore.QModelIndex) -> QtCore.QSize:
        if not index.isValid():
            return QSize()

        context = index.model().chat_message_contexts()[index.row()]

        msg_text = index.data(Qt.DisplayRole)
        msg_font = QApplication.font()
        msg_fm = QFontMetrics(msg_font)

        msg_rect = msg_fm.boundingRect(
            0, 0,
            option.rect.width() - MessageItemDelegate.total_pfp_width +
            MessageItemDelegate.profile_padding, 0,
            Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap, msg_text)

        msg_size = QSize(
            option.rect.width(),
            msg_rect.height() + MessageItemDelegate.padding +
            MessageItemDelegate.profile_padding)

        if msg_size.height() < MessageItemDelegate.icon_radius:
            msg_size.setHeight(MessageItemDelegate.icon_radius)

        return msg_size
コード例 #4
0
    def maxSize(self):
        size = QSize()
        for variation in self.d.variations:
            size.setWidth(max(size.width(), variation.map.width()))
            size.setHeight(max(size.height(), variation.map.height()))

        return size
コード例 #5
0
class jobWidget(QWidget):
    WORKER_DATA = Qt.UserRole
    ACTIVE_FLAG = Qt.UserRole + 1
    active = False

    def __init__(self, processList, name, worker):
        QWidget.__init__(self)
        self.worker = worker
        self.nameOP = 'Operation: ' + name
        self.drawWidget()
        self.jobWidgetItem = QListWidgetItem(processList)
        self.jobWidgetItem.setData(self.WORKER_DATA, worker)
        self.jobWidgetItem.setData(self.ACTIVE_FLAG, self.active)

        self.sizer = QSize()
        self.sizer.setHeight(26)

        self.jobWidgetItem.setSizeHint(self.sizer)
        self.jobWidgetItem.setIcon(
            QIcon(os.path.join(os.path.dirname(__file__),
                               'icons4\stop-1.png')))

    def setActive(self):
        self.active = True
        self.jobWidgetItem.setData(self.ACTIVE_FLAG, self.active)
        self.jobWidgetItem.setIcon(
            QIcon(
                os.path.join(os.path.dirname(__file__),
                             'icons4\hourglass-3.png')))
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(0)

    def updateProgress(self, progress):
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(progress)

    def drawWidget(self):
        #self.setMaximumHeight(40)

        self.layout = QGridLayout()
        self.layout.setSpacing(1)
        self.setContentsMargins(0, 0, 0, 0)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.nameFont = QFont()
        self.nameFont.setPointSize(8)
        self.nameWidget = QLabel(self.nameOP)
        self.nameWidget.setFont(self.nameFont)

        self.progressBar = QProgressBar(self)
        self.progressBar.setMaximumHeight(16)

        self.layout.addWidget(self.nameWidget, 0, 0)
        self.layout.addWidget(self.progressBar, 1, 0)

        self.setLayout(self.layout)

    def getJobWidgetItem(self):
        return self.jobWidgetItem
コード例 #6
0
 def sizeHint(self):
     s = QSize()
     if self._minimum_rows:
         s.setHeight(self.count() * self.sizeHintForRow(0) + self.frameWidth() * 2)
     else:
         s.setHeight(super().sizeHint().height())
     s.setWidth(max(self.sizeHintForColumn(0) + self.frameWidth() * 2, self._minimum_width))
     return s
コード例 #7
0
 def makeTitleStyleBox(self) -> QComboBox:
     """
     Create Title Style Drop Down
     """
     # ComboBox for title style
     self.combo_title_style = QComboBox(self)
     view = QListView(self.combo_title_style)
     view.setStyleSheet("QListView::item { height : 23 px; }"
                        "selection-background-color: rgba(0,0,0,0.2);")
     self.combo_title_style.setView(view)
     self.combo_title_style.setToolTip('Styles')
     self.combo_title_style.addItems(self.doc_props.dict_title_styles)
     # traverses through combo_title_style items index
     for x in range(view.model().rowCount()):
         # mods by two to get the index with titles else gives "update" titles index
         # changes font to be bold for if and italic for else
         if x % 2 == 0:
             font = QFont()
             font.setWeight(QFont.Bold)
             self.combo_title_style.setItemData(x, font, Qt.FontRole)
         else:
             font = QFont()
             color = QBrush()
             font.setItalic(True)
             color.setColor(QColor("gray"))
             self.combo_title_style.setItemData(x, font, Qt.FontRole)
             self.combo_title_style.setItemData(x, color, Qt.ForegroundRole)
     # adds separators to clean up look of QComboBox
     for x in range(2, 23, 3):
         size = QSize()
         size.setHeight(10)
         separator = QStandardItem()
         separator.setSizeHint(size)
         view.model().insertRow(x, separator)
         view.model().item(x).setEnabled(False)
     self.combo_title_style.setFocusPolicy(Qt.NoFocus)
     self.combo_title_style.setMaxVisibleItems(view.model().rowCount())
     self.combo_title_style.setItemData(0, "test", QtCore.Qt.ToolTipRole)
     numKey = Qt.Key_1
     index = 0
     title_list = list(self.doc_props.dict_title_styles.keys())
     for key in range(0, 13, 2):
         shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.ALT + numKey), self)
         shortcut.activated.connect(
             partial(self.titleStyleHelper, title_list[key]))
         self.combo_title_style.setItemData(
             index, "Ctrl+Alt+" + str(numKey - Qt.Key_1 + 1),
             QtCore.Qt.ToolTipRole)
         index += 3
         numKey += 1
     shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.ALT + Qt.Key_0), self)
     shortcut.activated.connect(
         partial(self.titleStyleHelper,
                 self.document.doc_props.text_reset_title))
     self.combo_title_style.setItemData(index, "Ctrl+Alt+0",
                                        QtCore.Qt.ToolTipRole)
     self.combo_title_style.textActivated.connect(self.titleStyleHelper)
     return self.combo_title_style
コード例 #8
0
 def height_for_width(self, icon: QIcon, height: int) -> QSize:
     size = QSize()
     size.setWidth(height)
     size.setHeight(height)
     actual = icon.actualSize(size)
     if actual.height() != height:
         ratio = actual.width() / actual.height()
         width = int(ratio * height)
         size.setWidth(width)
         size.setHeight(height)
     return size
コード例 #9
0
    def minimumSize(self):
        size = QSize()
        for item in self.itemList:
            size = size.expandedTo(item.sizeHint())

        margin, _, _, _ = self.getContentsMargins()

        size += QSize(2 * margin, 2 * margin)

        layoutSize = self.contentsRect()
        if self.hasHeightForWidth():
            size.setHeight(self.heightForWidth(layoutSize.width()))
        return size
 def overread(self,msize):
     moutdata = ""
     img = Snapshot.snapshot(width = msize.width(), height = msize.height()).scaled(msize.width(),msize.height(),Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
     moutdata = moutdata + ";"+(hex(msize.width())[2:]).rjust(4,'0')+(hex(msize.height())[2:]).rjust(4,'0')+"\r\n"
     pos = QSize(0,0)
     for ypos in range(0,img.height()):
         qrgb = ";"
         for xpos in range(0,img.width()):
             data = img.pixel(xpos,ypos)
             pos.setWidth(pos.width()+1)
             qrgb = qrgb + (hex(((data & 0x00F80000) >> 8 ) | ((data & 0x0000FC00) >> 5 ) | ((data & 0x000000F8) >> 3 ))[2:]).rjust(4,'0')
         pos.setWidth(0)
         pos.setHeight(pos.height()+1)
         moutdata = moutdata + qrgb + "\r\n"
     return moutdata
コード例 #11
0
 def mapSize(self):
     p = RenderParams(self.map())
     # The map size is the same regardless of which indexes are shifted.
     if (p.staggerX):
         size = QSize(self.map().width() * p.columnWidth + p.sideOffsetX,
                    self.map().height() * (p.tileHeight + p.sideLengthY))
         if (self.map().width() > 1):
             size.setHeight(size.height() + p.rowHeight)
         return size
     else:
         size = QSize(self.map().width() * (p.tileWidth + p.sideLengthX),
                    self.map().height() * p.rowHeight + p.sideOffsetY)
         if (self.map().height() > 1):
             size.setWidth(size.width() + p.columnWidth)
         return size
コード例 #12
0
 def mapSize(self):
     p = RenderParams(self.map())
     # The map size is the same regardless of which indexes are shifted.
     if (p.staggerX):
         size = QSize(self.map().width() * p.columnWidth + p.sideOffsetX,
                      self.map().height() * (p.tileHeight + p.sideLengthY))
         if (self.map().width() > 1):
             size.setHeight(size.height() + p.rowHeight)
         return size
     else:
         size = QSize(self.map().width() * (p.tileWidth + p.sideLengthX),
                      self.map().height() * p.rowHeight + p.sideOffsetY)
         if (self.map().height() > 1):
             size.setWidth(size.width() + p.columnWidth)
         return size
コード例 #13
0
ファイル: video.py プロジェクト: xlongfeng/bigeye
 def requestImage(self, id, requestedSize):
     if self._recorder.width == 1024:
         size = QSize(self._recorder.width * 7 / 8,
                      self._recorder.height * 7 / 8)
     elif self._recorder.width == 1280:
         size = QSize(self._recorder.width * 3 / 4,
                      self._recorder.height * 3 / 4)
     else:
         size = QSize(self._recorder.width, self._recorder.height)
     if requestedSize.width() > 0:
         size.setWidth(requestedSize.width())
     if requestedSize.height() > 0:
         size.setHeight(requestedSize.height())
     image = VideoRecorder.instance().frame.scaled(size, Qt.KeepAspectRatio,
                                                   Qt.SmoothTransformation)
     return image, size
コード例 #14
0
ファイル: snapshot.py プロジェクト: xlongfeng/bigeye
 def requestImage(self, id, requestedSize):
     image = self._snapshot.image
     if self._snapshot.width == 1024:
         size = QSize(self._snapshot.width * 7 / 8,
                      self._snapshot.height * 7 / 8)
     elif self._snapshot.width == 1280:
         size = QSize(self._snapshot.width * 3 / 4,
                      self._snapshot.height * 3 / 4)
     else:
         size = QSize(self._snapshot.width, self._snapshot.height)
     if requestedSize.width() > 0:
         size.setWidth(requestedSize.width())
     if requestedSize.height() > 0:
         size.setHeight(requestedSize.height())
     image = image.scaled(size, Qt.KeepAspectRatio, Qt.SmoothTransformation)
     return image, size
コード例 #15
0
    def calculate_size(self):
        """Determine size by calculating the space of the visible items"""

        visible_items = min(self.model().rowCount(), self.MAX_VISIBLE_ITEMS)
        first_visible_row = self.verticalScrollBar().value()
        option = self.viewOptions()
        size_hint = QSize()
        for index in range(visible_items):
            tmp_size = self.itemDelegate().sizeHint(
                option, self.model().index(index + first_visible_row, 0))
            if size_hint.width() < tmp_size.width():
                size_hint = tmp_size

        height = size_hint.height()
        height *= visible_items
        size_hint.setHeight(height)
        return size_hint
コード例 #16
0
ファイル: ColorButton.py プロジェクト: sunnyLF/LRSMSingle
    def _update_icon(self):
        icon_size = QSize(self.iconSize())
        icon_size.setWidth(icon_size.width() - 2)
        icon_size.setHeight(icon_size.height() - 2)

        pix_map = QPixmap(icon_size)
        pix_map.fill(self._color)

        painter = QPainter()
        painter.begin(pix_map)
        border_color = QColor(Qt.black)
        border_color.setAlpha(128)
        painter.setPen(border_color)
        painter.drawRect(0, 0, pix_map.width() - 1, pix_map.height() - 1)
        painter.end()

        self.setIcon(QIcon(pix_map))
コード例 #17
0
    def calculate_size(self):
        """Determine size by calculating the space of the visible items"""

        visible_items = min(self.model().rowCount(), self.MAX_VISIBLE_ITEMS)
        first_visible_row = self.verticalScrollBar().value()
        option = self.viewOptions()
        size_hint = QSize()
        for index in range(visible_items):
            tmp_size = self.itemDelegate().sizeHint(
                option, self.model().index(index + first_visible_row, 0))
            if size_hint.width() < tmp_size.width():
                size_hint = tmp_size

        height = size_hint.height()
        height *= visible_items
        size_hint.setHeight(height)
        return size_hint
コード例 #18
0
 def sectionSizeFromContents(self, logicalIndex: int) -> QSize:
     if self._pd.headerModel:
         curLeafIndex = QModelIndex(self._pd.leafIndex(logicalIndex))
         if curLeafIndex.isValid():
             styleOption = QStyleOptionHeader(
                 self.styleOptionForCell(logicalIndex))
             s = QSize(self._pd.cellSize(curLeafIndex, self, styleOption))
             curLeafIndex = curLeafIndex.parent()
             while curLeafIndex.isValid():
                 if self.orientation() == Qt.Horizontal:
                     s.setHeight(s.height() + self._pd.cellSize(
                         curLeafIndex, self, styleOption).height())
                 else:
                     s.setWidth(s.width() + self._pd.cellSize(
                         curLeafIndex, self, styleOption).width())
                 curLeafIndex = curLeafIndex.parent()
             return s
     return super().sectionSizeFromContents(logicalIndex)
コード例 #19
0
    def construct_array(self):
        rec1 = QRect(
            self.start_x, self.start_y, self.actuator[0].w,
            self.row * self.actuator[0].h + (self.row - 1) * self.gap_h)
        self.rec.append(rec1)

        size = QSize()
        size.setHeight(self.actuator[1].h)
        size.setWidth(self.actuator[1].w)

        for i in range(0, self.row):
            for j in range(0, self.col):
                index = i * self.col + j + 1
                x = self.start_x + \
                    self.actuator[index].w+self.gap_w + \
                    self.actuator[index].w*j+self.gap_w*j
                y = self.start_y + self.actuator[index].h * i + self.gap_h * i
                temp = QPoint(x, y)
                self.rec.append(QRect(temp, size))
コード例 #20
0
ファイル: colorbutton.py プロジェクト: theall/Python-Tiled
 def setColor(self, color):
     if type(color) != QColor:
         color = QColor(color)
     if (self.mColor == color or not color.isValid()):
         return
     self.mColor = color
     size = QSize(self.iconSize())
     size.setWidth(size.width() - 2)
     size.setHeight(size.height() - 2)
     pixmap = QPixmap(size)
     pixmap.fill(self.mColor)
     painter = QPainter(pixmap)
     border = QColor(Qt.black)
     border.setAlpha(128)
     painter.setPen(border)
     painter.drawRect(0, 0, pixmap.width() - 1, pixmap.height() - 1)
     painter.end()
     self.setIcon(QIcon(pixmap))
     self.colorChanged.emit(color)
コード例 #21
0
ファイル: borderlayout.py プロジェクト: Axel-Erfurt/pyqt5
    def calculateSize(self, sizeType):
        totalSize = QSize()

        for wrapper in self.list:
            position = wrapper.position
            itemSize = QSize()

            if sizeType == self.MinimumSize:
                itemSize = wrapper.item.minimumSize()
            else: # sizeType == self.SizeHint
                itemSize = wrapper.item.sizeHint()

            if position in (self.North, self.South, self.Center):
                totalSize.setHeight(totalSize.height() + itemSize.height())

            if position in (self.West, self.East, self.Center):
                totalSize.setWidth(totalSize.width() + itemSize.width())

        return totalSize
コード例 #22
0
ファイル: colorbutton.py プロジェクト: theall/Python-Tiled
 def setColor(self, color):
     if type(color)!=QColor:
         color = QColor(color)
     if (self.mColor == color or not color.isValid()):
         return
     self.mColor = color
     size = QSize(self.iconSize())
     size.setWidth(size.width()-2)
     size.setHeight(size.height()-2)
     pixmap = QPixmap(size)
     pixmap.fill(self.mColor)
     painter = QPainter(pixmap)
     border = QColor(Qt.black)
     border.setAlpha(128)
     painter.setPen(border)
     painter.drawRect(0, 0, pixmap.width() - 1, pixmap.height() - 1)
     painter.end()
     self.setIcon(QIcon(pixmap))
     self.colorChanged.emit(color)
コード例 #23
0
ファイル: borderlayout.py プロジェクト: zwlyn/pyqt5try
    def calculateSize(self, sizeType):
        totalSize = QSize()

        for wrapper in self.list:
            position = wrapper.position
            itemSize = QSize()

            if sizeType == self.MinimumSize:
                itemSize = wrapper.item.minimumSize()
            else: # sizeType == self.SizeHint
                itemSize = wrapper.item.sizeHint()

            if position in (self.North, self.South, self.Center):
                totalSize.setHeight(totalSize.height() + itemSize.height())

            if position in (self.West, self.East, self.Center):
                totalSize.setWidth(totalSize.width() + itemSize.width())

        return totalSize
コード例 #24
0
ファイル: Plotter.py プロジェクト: wiratmoko11/CNN
    def plot_testing(self, x_batch, predict, list_widget):
        list_widget.clear()
        """

        :param x_batch:
        :param predict:
        :return:
        """
        for i in range(len(x_batch)):
            top_3_predict = numpy.argsort(predict[i])[::-1][:3]
            #print(predict)
            result_widget = ResultWidget()
            result_widget.label_number.setText(str(i + 1))
            category_1 = self.CIFAR10_LABELS_LIST.__getitem__(top_3_predict[0])
            value_1 = predict[i][top_3_predict[0]]
            category_2 = self.CIFAR10_LABELS_LIST.__getitem__(top_3_predict[1])
            value_2 = predict[i][top_3_predict[1]]
            category_3 = self.CIFAR10_LABELS_LIST.__getitem__(top_3_predict[2])
            value_3 = predict[i][top_3_predict[2]]
            result_widget.label_prediksi_1.setText(category_1 + " - " +
                                                   str(value_1) + "")
            result_widget.label_prediksi_2.setText(category_2 + " - " +
                                                   str(value_2) + "")
            result_widget.label_prediksi_3.setText(category_3 + " - " +
                                                   str(value_3) + "")

            # result_widget.canvas_image.
            ax = result_widget.figure_image.add_subplot(111)
            ax.imshow(
                self.dataset.to_channel_last(x_batch[i], shape=(32, 32, 3)))
            ax.set_position([0.1, 0.2, 0.8, 0.8])
            ax.set_axis_off()
            result_widget.canvas_image.draw()
            list_item_widget = QListWidgetItem(list_widget)
            # print(result_widget.sizeHint())
            list_size = QSize()
            list_size.setHeight(100)
            list_size.setWidth(502)
            list_item_widget.setSizeHint(list_size)

            list_widget.addItem(list_item_widget)
            list_widget.setItemWidget(list_item_widget, result_widget)
コード例 #25
0
ファイル: image.py プロジェクト: Zelly/ImageViewerPyQt
 def gif(self):
     if self.movie:
         # Movie is already created
         self.movie.start()
         return
     print("Creating movie for", str(self.iv_image.path))
     self.movie = QMovie(str(self.iv_image.path))
     image = QImage(str(self.iv_image.path))
     if image.height() > imageviewer.settings.IMAGE_HEIGHT or image.width() > imageviewer.settings.IMAGE_WIDTH:
         # scale the movie if it doesn't fit in the frame
         # the frame is big enough we don't need the gif at full size to see what is going on
         image2 = image.scaled(imageviewer.settings.IMAGE_WIDTH,
                               imageviewer.settings.IMAGE_HEIGHT,
                               Qt.KeepAspectRatio)
         size = QSize()
         size.setHeight(image2.height())
         size.setWidth(image2.width())
         self.movie.setScaledSize(size)
         print("Scaled movie size")
     self.setMovie(self.movie)
     self.movie.start()
コード例 #26
0
class SkillsView(QListView):
    def __init__(self, parent=None):
        QListView.__init__(self, parent)
        palette = QPalette(self.palette())
        palette.setColor(QPalette.Base, QColor(0, 0, 0, 0))
        palette.setBrush(QPalette.Base, QBrush(QColor(0, 0, 0, 0)))
        self.setPalette(palette)
        self.sizehint = QSize(QListView.sizeHint(self))

    def sizeHint(self):
        return QSize(self.sizehint)

    def setSizeHint(self, width, height=None):
        if isinstance(width, QSize) and height is None:
            self.sizehint = width
        else:
            self.sizehint = QSize(width, height)
        self.bestFit()

    def bestFit(self):
        self.rowheight = self.sizeHintForRow(0)

        if self.rowheight < 1:
            return

        bestheight = self.sizehint.height()

        if (self.horizontalScrollBarPolicy() != Qt.ScrollBarAlwaysOff):
            scrollheight = self.horizontalScrollBar().sizeHint().height() + 1

        else:
            scrollheight = 0

        bestheight -= scrollheight
        rows = (bestheight + 4) / self.rowheight
        bestheight = (rows * self.rowheight) + scrollheight
        minheight = self.rowheight * 3 + scrollheight
        self.sizehint.setHeight(bestheight)
        self.setMinimumHeight(minheight)
コード例 #27
0
    def sizeHint(self, option: 'QStyleOptionViewItem',
                 index: QModelIndex) -> QSize:
        if not index.isValid():
            return QSize()

        font = QApplication.font()
        msg_fm = QFontMetrics(font)

        if index.data(Qt.DecorationRole):
            # Displaying an auditory media
            title_rect = msg_fm.boundingRect(
                0, 0,
                option.rect.width() - ItemDelegate.icon_diameter, 0,
                Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap,
                index.data(Qt.DisplayRole))
            item_size = QSize(
                option.rect.width(),
                title_rect.height() + (2 * ItemDelegate.icon_padding))

            if item_size.height() < ItemDelegate.icon_diameter:
                item_size.setHeight(ItemDelegate.icon_diameter)

            return item_size
        else:
            # Displaying a sub-auditory media item
            title_rect = msg_fm.boundingRect(
                0, 0, option.rect.width(), 0,
                Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap,
                index.data(Qt.DisplayRole))
            subtitle_rect = msg_fm.boundingRect(
                0, 0, option.rect.width(), 0,
                Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap,
                index.data(Qt.UserRole))

            return QSize(option.rect.width(),
                         title_rect.height() + subtitle_rect.height())
コード例 #28
0
ファイル: MailBox.py プロジェクト: zkycaesar/MailBox
    def sizeHint(self, option, index):
        headerFont = QFont("times", 10)
        headerFont.setBold(True)
        subjectFont = QFont("times", 10)
        headerFm = QFontMetrics(headerFont)
        subjectFm = QFontMetrics(subjectFont)

        headerRect = headerFm.boundingRect(
            0, 0,
            option.rect.width() - self.iconSize.width(), 0,
            Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap,
            index.data(roles['from']))
        subheaderRect = subjectFm.boundingRect(
            0, 0,
            option.rect.width() - self.iconSize.width(), 0,
            Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap,
            index.data(roles['subject']))
        size = QSize(
            option.rect.width(),
            headerRect.height() + subheaderRect.height() + 3 * self.padding)

        if size.height() < self.iconSize.height():
            size.setHeight(self.iconSize.height())
        return size
コード例 #29
0
ファイル: main.py プロジェクト: zhukequan/scene_detection
    def paintEvent(self, event):
        self.drawLabel1.clear()
        self.drawLabel2.clear()
        size = self.widget_4.size()
        size1 = QSize()
        size2 = QSize()
        size2.setHeight(size.height() * 0.45)
        size2.setWidth(size.width())
        size1.setHeight(size.height() * 0.45)
        size1.setHeight(size.height() * 0.45)
        size1.setWidth(size.width())
        self.drawLabel1.resize(size1)
        self.drawLabel2.resize(size2)
        if not self.image1 is None:

            size1 = self.drawLabel1.size()
            qimage1 = QImage(self.image1.tobytes(), self.image1.shape[1],
                             self.image1.shape[0], QImage.Format_RGB888)
            pixmap1 = QPixmap(qimage1)
            pixmap1 = pixmap1.scaled(size1.width(), size1.height(),
                                     Qt.KeepAspectRatio,
                                     Qt.SmoothTransformation)
            self.drawLabel1.setPixmap(pixmap1)
            self.drawLabel1.setAlignment(Qt.AlignCenter)
        if not self.image2 is None:
            self.drawLabel2.clear()
            size2 = self.drawLabel2.size()
            qimage2 = QImage(self.image2.tobytes(), self.image2.shape[1],
                             self.image2.shape[0], QImage.Format_RGB888)
            pixmap2 = QPixmap(qimage2)
            pixmap2 = pixmap2.scaled(size2.width(), size2.height(),
                                     Qt.KeepAspectRatio,
                                     Qt.SmoothTransformation)
            self.drawLabel2.setPixmap(pixmap2)
            self.drawLabel2.setAlignment(Qt.AlignCenter)
        QMainWindow.paintEvent(self, event)
コード例 #30
0
ファイル: EditorContent.py プロジェクト: lihaochen910/Candy
	def getMinimumSizeForOrientation ( self, orientation ) -> QSize:
		isDefaultOrientation = orientation == self.editor.GetDefaultOrientation ()
		contentMinSize = self.content.layout ().minimumSize ()

		topArea = self.toolBarAreaManager.getWidget ( CToolBarAreaManagerArea.Top )
		bottomArea = self.toolBarAreaManager.getWidget ( CToolBarAreaManagerArea.Bottom )
		leftArea = self.toolBarAreaManager.getWidget ( CToolBarAreaManagerArea.Left )
		rightArea = self.toolBarAreaManager.getWidget ( CToolBarAreaManagerArea.Right )

		result = QSize ( 0, 0 )
		if isDefaultOrientation:
			# Take width from left and right areas if we're switching to the editor's default orientation
			result.setWidth ( result.width () + leftArea.getLargestItemMinimumSize ().width () )
			result.setWidth ( result.width () + rightArea.getLargestItemMinimumSize ().width () )

			# Use top and bottom area to calculate min height
			result.setHeight ( result.height () + leftArea.getLargestItemMinimumSize ().height () )
			result.setHeight ( result.height () + rightArea.getLargestItemMinimumSize ().height () )

			# Add content min size
			result += contentMinSize

			# Take the area layout size hints into account. Expand the current result with the toolbar area layout's size hint.
			# We use size hint rather than minimum size since toolbar area item's size policy is set to preferred.
			result = result.expandedTo ( QSize ( topArea.layout ().sizeHint ().height (), leftArea.layout ().sizeHint ().width () ) )
			result = result.expandedTo ( QSize ( bottomArea.layout ().sizeHint ().height (), rightArea.layout ().sizeHint ().width () ) )
		else:
			# If we're not switching to the default orientation, then we need to use the top and bottom toolbar areas' width
			# since these areas will be placed at the left and right of the editor content in this case of adaptive layouts
			result.setWidth ( result.width () + topArea.getLargestItemMinimumSize ().width () )
			result.setWidth ( result.width () + bottomArea.getLargestItemMinimumSize ().width () )

			# We must also flip where we get toolbar area min height from
			result.setHeight ( result.height () + leftArea.getLargestItemMinimumSize ().height () )
			result.setHeight ( result.height () + rightArea.getLargestItemMinimumSize ().height () )

			# Add flipped content min size
			result += QSize ( contentMinSize.height (), contentMinSize.width () )

			result = result.expandedTo ( QSize ( leftArea.layout ().sizeHint ().height (), topArea.layout ().sizeHint ().width () ) )
			result = result.expandedTo ( QSize ( rightArea.layout ().sizeHint ().height (), bottomArea.layout ().sizeHint ().width () ) )

		return result
コード例 #31
0
class ResizeHelper(QWidget):
    offsetChanged = pyqtSignal(QPoint)
    offsetXChanged = pyqtSignal(int)
    offsetYChanged = pyqtSignal(int)
    offsetBoundsChanged = pyqtSignal(QRect)

    def __init__(self, parent=None):
        super().__init__(parent)

        self.mMouseAnchorPoint = QPoint()
        self.mOffset = QPoint()
        self.mOldSize = QSize()
        self.mDragging = False
        self.mOffsetBounds = QRect()
        self.mScale = 0.0
        self.mNewSize = QSize()
        self.mOrigOffset = QPoint()

        self.setMinimumSize(20, 20)
        self.setOldSize(QSize(1, 1))

    def oldSize(self):
        return self.mOldSize

    def newSize(self):
        return self.mNewSize

    def offset(self):
        return self.mOffset

    def offsetBounds(self):
        return self.mOffsetBounds

    def setOldSize(self, size):
        self.mOldSize = size
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    def setNewSize(self, size):
        self.mNewSize = size
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    def setOffset(self, offset):
        # Clamp the offset within the offset bounds
        newOffset = QPoint(
            min(self.mOffsetBounds.right(),
                max(self.mOffsetBounds.left(), offset.x())),
            min(self.mOffsetBounds.bottom(),
                max(self.mOffsetBounds.top(), offset.y())))
        if (self.mOffset != newOffset):
            xChanged = self.mOffset.x() != newOffset.x()
            yChanged = self.mOffset.y() != newOffset.y()
            self.mOffset = newOffset
            if (xChanged):
                self.offsetXChanged.emit(self.mOffset.x())
            if (yChanged):
                self.offsetYChanged.emit(self.mOffset.y())
            self.offsetChanged.emit(self.mOffset)
            self.update()

    ## Method to set only the X offset, provided for convenience. */
    def setOffsetX(self, x):
        self.setOffset(QPoint(x, self.mOffset.y()))

    ## Method to set only the Y offset, provided for convenience. */
    def setOffsetY(self, y):
        self.setOffset(QPoint(self.mOffset.x(), y))

    ## Method to set only new width, provided for convenience. */
    def setNewWidth(self, width):
        self.mNewSize.setWidth(width)
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    ## Method to set only new height, provided for convenience. */
    def setNewHeight(self, height):
        self.mNewSize.setHeight(height)
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    def paintEvent(self, event):
        _size = self.size() - QSize(2, 2)
        if (_size.isEmpty()):
            return
        origX = (_size.width() - self.mNewSize.width() * self.mScale) / 2 + 0.5
        origY = (_size.height() -
                 self.mNewSize.height() * self.mScale) / 2 + 0.5
        oldRect = QRect(self.mOffset, self.mOldSize)
        painter = QPainter(self)
        painter.translate(origX, origY)
        painter.scale(self.mScale, self.mScale)
        pen = QPen(Qt.black)
        pen.setCosmetic(True)
        painter.setPen(pen)
        painter.drawRect(QRect(QPoint(0, 0), self.mNewSize))
        pen.setColor(Qt.white)
        painter.setPen(pen)
        painter.setBrush(Qt.white)
        painter.setOpacity(0.5)
        painter.drawRect(oldRect)
        pen.setColor(Qt.black)
        pen.setStyle(Qt.DashLine)
        painter.setOpacity(1.0)
        painter.setBrush(Qt.NoBrush)
        painter.setPen(pen)
        painter.drawRect(oldRect)
        painter.end()

    def mousePressEvent(self, event):
        self.mMouseAnchorPoint = event.pos()
        self.mOrigOffset = self.mOffset
        self.mDragging = event.button() == Qt.LeftButton

    def mouseMoveEvent(self, event):
        if (not self.mDragging):
            return
        pos = event.pos()
        if (pos != self.mMouseAnchorPoint):
            self.setOffset(self.mOrigOffset +
                           (pos - self.mMouseAnchorPoint) / self.mScale)
            self.offsetChanged.emit(self.mOffset)

    def resizeEvent(self, event):
        self.recalculateScale()

    def recalculateScale(self):
        _size = self.size() - QSize(2, 2)
        if (_size.isEmpty()):
            return
        if self.mOldSize.width() < self.mNewSize.width():
            width = self.mNewSize.width()
        else:
            width = 2 * self.mOldSize.width() - self.mNewSize.width()
        if self.mOldSize.height() < self.mNewSize.height():
            height = self.mNewSize.height()
        else:
            height = 2 * self.mOldSize.height() - self.mNewSize.height()

        # Pick the smallest scale
        scaleW = _size.width() / width
        scaleH = _size.height() / height
        if scaleW < scaleH:
            self.mScale = scaleW
        else:
            self.mScale = scaleH

        self.update()

    def recalculateMinMaxOffset(self):
        offsetBounds = self.mOffsetBounds
        if (self.mOldSize.width() <= self.mNewSize.width()):
            offsetBounds.setLeft(0)
            offsetBounds.setRight(self.mNewSize.width() -
                                  self.mOldSize.width())
        else:
            offsetBounds.setLeft(self.mNewSize.width() - self.mOldSize.width())
            offsetBounds.setRight(0)

        if (self.mOldSize.height() <= self.mNewSize.height()):
            offsetBounds.setTop(0)
            offsetBounds.setBottom(self.mNewSize.height() -
                                   self.mOldSize.height())
        else:
            offsetBounds.setTop(self.mNewSize.height() -
                                self.mOldSize.height())
            offsetBounds.setBottom(0)

        if (self.mOffsetBounds != offsetBounds):
            self.mOffsetBounds = offsetBounds
            self.offsetBoundsChanged.emit(self.mOffsetBounds)
コード例 #32
0
 def sizeHint(self):
     s = QSize()
     s.setHeight(super(CustomList, self).sizeHint().height())
     s.setWidth(self.sizeHintForColumn(0) + 25)
     return s
コード例 #33
0
ファイル: resizehelper.py プロジェクト: theall/Python-Tiled
class ResizeHelper(QWidget):
    offsetChanged = pyqtSignal(QPoint)
    offsetXChanged = pyqtSignal(int)
    offsetYChanged = pyqtSignal(int)
    offsetBoundsChanged = pyqtSignal(QRect)

    def __init__(self, parent = None):
        super().__init__(parent)
        
        self.mMouseAnchorPoint = QPoint()
        self.mOffset = QPoint()
        self.mOldSize = QSize()
        self.mDragging = False
        self.mOffsetBounds = QRect()
        self.mScale = 0.0
        self.mNewSize = QSize()
        self.mOrigOffset = QPoint()
        
        self.setMinimumSize(20, 20)
        self.setOldSize(QSize(1, 1))

    def oldSize(self):
        return self.mOldSize

    def newSize(self):
        return self.mNewSize

    def offset(self):
        return self.mOffset

    def offsetBounds(self):
        return self.mOffsetBounds

    def setOldSize(self, size):
        self.mOldSize = size
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    def setNewSize(self, size):
        self.mNewSize = size
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    def setOffset(self, offset):
        # Clamp the offset within the offset bounds
        newOffset = QPoint(min(self.mOffsetBounds.right(),
                            max(self.mOffsetBounds.left(), offset.x())),
                                min(self.mOffsetBounds.bottom(),
                                    max(self.mOffsetBounds.top(), offset.y())))
        if (self.mOffset != newOffset):
            xChanged = self.mOffset.x() != newOffset.x()
            yChanged = self.mOffset.y() != newOffset.y()
            self.mOffset = newOffset
            if (xChanged):
                self.offsetXChanged.emit(self.mOffset.x())
            if (yChanged):
                self.offsetYChanged.emit(self.mOffset.y())
            self.offsetChanged.emit(self.mOffset)
            self.update()

    ## Method to set only the X offset, provided for convenience. */
    def setOffsetX(self, x):
        self.setOffset(QPoint(x, self.mOffset.y()))

    ## Method to set only the Y offset, provided for convenience. */
    def setOffsetY(self, y):
        self.setOffset(QPoint(self.mOffset.x(), y))

    ## Method to set only new width, provided for convenience. */
    def setNewWidth(self, width):
        self.mNewSize.setWidth(width)
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    ## Method to set only new height, provided for convenience. */
    def setNewHeight(self, height):
        self.mNewSize.setHeight(height)
        self.recalculateMinMaxOffset()
        self.recalculateScale()

    def paintEvent(self, event):
        _size = self.size() - QSize(2, 2)
        if (_size.isEmpty()):
            return
        origX = (_size.width() - self.mNewSize.width() * self.mScale) / 2 + 0.5
        origY = (_size.height() - self.mNewSize.height() * self.mScale) / 2 + 0.5
        oldRect = QRect(self.mOffset, self.mOldSize)
        painter = QPainter(self)
        painter.translate(origX, origY)
        painter.scale(self.mScale, self.mScale)
        pen = QPen(Qt.black)
        pen.setCosmetic(True)
        painter.setPen(pen)
        painter.drawRect(QRect(QPoint(0, 0), self.mNewSize))
        pen.setColor(Qt.white)
        painter.setPen(pen)
        painter.setBrush(Qt.white)
        painter.setOpacity(0.5)
        painter.drawRect(oldRect)
        pen.setColor(Qt.black)
        pen.setStyle(Qt.DashLine)
        painter.setOpacity(1.0)
        painter.setBrush(Qt.NoBrush)
        painter.setPen(pen)
        painter.drawRect(oldRect)
        painter.end()

    def mousePressEvent(self, event):
        self.mMouseAnchorPoint = event.pos()
        self.mOrigOffset = self.mOffset
        self.mDragging = event.button() == Qt.LeftButton

    def mouseMoveEvent(self, event):
        if (not self.mDragging):
            return
        pos = event.pos()
        if (pos != self.mMouseAnchorPoint):
            self.setOffset(self.mOrigOffset + (pos - self.mMouseAnchorPoint) / self.mScale)
            self.offsetChanged.emit(self.mOffset)

    def resizeEvent(self, event):
        self.recalculateScale()

    def recalculateScale(self):
        _size = self.size() - QSize(2, 2)
        if (_size.isEmpty()):
            return
        if self.mOldSize.width() < self.mNewSize.width():
            width = self.mNewSize.width()
        else:
            width = 2 * self.mOldSize.width() - self.mNewSize.width()
        if self.mOldSize.height() < self.mNewSize.height():
            height = self.mNewSize.height()
        else:
            height = 2 * self.mOldSize.height() - self.mNewSize.height()

        # Pick the smallest scale
        scaleW = _size.width() / width
        scaleH = _size.height() / height
        if scaleW < scaleH:
            self.mScale = scaleW
        else:
            self.mScale = scaleH

        self.update()

    def recalculateMinMaxOffset(self):
        offsetBounds = self.mOffsetBounds
        if (self.mOldSize.width() <= self.mNewSize.width()):
            offsetBounds.setLeft(0)
            offsetBounds.setRight(self.mNewSize.width() - self.mOldSize.width())
        else:
            offsetBounds.setLeft(self.mNewSize.width() - self.mOldSize.width())
            offsetBounds.setRight(0)

        if (self.mOldSize.height() <= self.mNewSize.height()):
            offsetBounds.setTop(0)
            offsetBounds.setBottom(self.mNewSize.height() - self.mOldSize.height())
        else:
            offsetBounds.setTop(self.mNewSize.height() - self.mOldSize.height())
            offsetBounds.setBottom(0)

        if (self.mOffsetBounds != offsetBounds):
            self.mOffsetBounds = offsetBounds
            self.offsetBoundsChanged.emit(self.mOffsetBounds)
コード例 #34
0
class Widget(QWidget):
    """
    Encapsulates a QWindow into a widget

    QWindow is preferred for rendering over a QWidget because there is more control over OpenGL. A QOpenGLWidget
    limitations impose undesirable effects onto WindowProxy. To use QOpenGLWidget, WindowProxy would need to draw to
    a QOffscreenSurface and blit the result onto the QOpenGLWidget at appropriate times.

    Attributes
    ----------
    _size_hint : QSize
        The hint that this widget provides to Qt for sizing

    """
    def __init__(self, window_type=Window):
        """
        Instantiates a widget that creates a new object of window_type and encapsulates it

        Attributes
        ----------
        window_type : class, optional
            The class type to encapsulated by this widget, default class is Window.

        """
        super().__init__()

        self._size_hint = QSize(DEFAULT_WIDTH, DEFAULT_HEIGHT)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        window = window_type()
        container = QWidget.createWindowContainer(window, self)
        self.setLayout(QGridLayout())
        self.layout().addWidget(container)

    def sizeHint(self):
        """
        Overrides QWidget.sizeHint() to provide the user set size hint

        Returns
        -------
        QSize
            Size hint to Qt

        """
        return self._size_hint

    def set_size_hint(self, width, height):
        """
        Set the preferred size for this widget

        The default size policy is QSizePolicy.Expanding. Therefore, Qt tries to make this widget as large as possible.
        Under this policy, Qt is allowed to shrink the widget below this size if necessary.

        Parameters
        ----------
        width : int
            The desired width
        height : int
            The desired height

        References
        ----------
        [1] https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

        """
        self._size_hint.setWidth(width)
        self._size_hint.setHeight(height)
コード例 #35
0
ファイル: tilelayer.py プロジェクト: theall/Python-Tiled
class TileLayer(Layer):
    ##
    # Constructor.
    ##
    def __init__(self, name, x, y, width, height):
        super().__init__(Layer.TileLayerType, name, x, y, width, height)
        self.mMaxTileSize = QSize(0, 0)
        self.mGrid = QVector()
        for i in range(width * height):
            self.mGrid.append(Cell())
        self.mOffsetMargins = QMargins()

    def __iter__(self):
        return self.mGrid.__iter__()
        
    ##
    # Returns the maximum tile size of this layer.
    ##
    def maxTileSize(self):
        return self.mMaxTileSize

    ##
    # Returns the margins that have to be taken into account while drawing
    # this tile layer. The margins depend on the maximum tile size and the
    # offset applied to the tiles.
    ##
    def drawMargins(self):
        return QMargins(self.mOffsetMargins.left(),
                        self.mOffsetMargins.top() + self.mMaxTileSize.height(),
                        self.mOffsetMargins.right() + self.mMaxTileSize.width(),
                        self.mOffsetMargins.bottom())

    ##
    # Recomputes the draw margins. Needed after the tile offset of a tileset
    # has changed for example.
    #
    # Generally you want to call Map.recomputeDrawMargins instead.
    ##
    def recomputeDrawMargins(self):
        maxTileSize = QSize(0, 0)
        offsetMargins = QMargins()
        i = 0
        while(i<self.mGrid.size()):
            cell = self.mGrid.at(i)
            tile = cell.tile
            if tile:
                size = tile.size()
                if (cell.flippedAntiDiagonally):
                    size.transpose()
                offset = tile.offset()
                maxTileSize = maxSize(size, maxTileSize)
                offsetMargins = maxMargins(QMargins(-offset.x(),
                                                     -offset.y(),
                                                     offset.x(),
                                                     offset.y()),
                                            offsetMargins)
            i += 1

        self.mMaxTileSize = maxTileSize
        self.mOffsetMargins = offsetMargins
        if (self.mMap):
            self.mMap.adjustDrawMargins(self.drawMargins())

    ##
    # Returns whether (x, y) is inside this map layer.
    ##
    def contains(self, *args):
        l = len(args)
        if l==2:
            x, y = args
            return x >= 0 and y >= 0 and x < self.mWidth and y < self.mHeight
        elif l==1:
            point = args[0]
            return self.contains(point.x(), point.y())

    ##
    # Calculates the region of cells in this tile layer for which the given
    # \a condition returns True.
    ##
    def region(self, *args):
        l = len(args)
        if l==1:
            condition = args[0]
            region = QRegion()
            for y in range(self.mHeight):
                for x in range(self.mWidth):
                    if (condition(self.cellAt(x, y))):
                        rangeStart = x
                        x += 1
                        while(x<=self.mWidth):
                            if (x == self.mWidth or not condition(self.cellAt(x, y))):
                                rangeEnd = x
                                region += QRect(rangeStart + self.mX, y + self.mY,
                                                rangeEnd - rangeStart, 1)
                                break
                            x += 1

            return region
        elif l==0:
            ##
            # Calculates the region occupied by the tiles of this layer. Similar to
            # Layer.bounds(), but leaves out the regions without tiles.
            ##
            return self.region(lambda cell:not cell.isEmpty())

    ##
    # Returns a read-only reference to the cell at the given coordinates. The
    # coordinates have to be within this layer.
    ##
    def cellAt(self, *args):
        l = len(args)
        if l==2:
            x, y = args
            return self.mGrid.at(x + y * self.mWidth)
        elif l==1:
            point = args[0]
            return self.cellAt(point.x(), point.y())

    ##
    # Sets the cell at the given coordinates.
    ##
    def setCell(self, x, y, cell):
        if (cell.tile):
            size = cell.tile.size()
            if (cell.flippedAntiDiagonally):
                size.transpose()
            offset = cell.tile.offset()
            self.mMaxTileSize = maxSize(size, self.mMaxTileSize)
            self.mOffsetMargins = maxMargins(QMargins(-offset.x(),
                                                 -offset.y(),
                                                 offset.x(),
                                                 offset.y()),
                                        self.mOffsetMargins)
            if (self.mMap):
                self.mMap.adjustDrawMargins(self.drawMargins())

        self.mGrid[x + y * self.mWidth] = cell

    ##
    # Returns a copy of the area specified by the given \a region. The
    # caller is responsible for the returned tile layer.
    ##
    def copy(self, *args):
        l = len(args)
        if l==1:
            region = args[0]
            if type(region) != QRegion:
                region = QRegion(region)
            area = region.intersected(QRect(0, 0, self.width(), self.height()))
            bounds = region.boundingRect()
            areaBounds = area.boundingRect()
            offsetX = max(0, areaBounds.x() - bounds.x())
            offsetY = max(0, areaBounds.y() - bounds.y())
            copied = TileLayer(QString(), 0, 0, bounds.width(), bounds.height())
            for rect in area.rects():
                for x in range(rect.left(), rect.right()+1):
                    for y in range(rect.top(), rect.bottom()+1):
                        copied.setCell(x - areaBounds.x() + offsetX,
                                        y - areaBounds.y() + offsetY,
                                        self.cellAt(x, y))
            return copied
        elif l==4:
            x, y, width, height = args

            return self.copy(QRegion(x, y, width, height))

    ##
    # Merges the given \a layer onto this layer at position \a pos. Parts that
    # fall outside of this layer will be lost and empty tiles in the given
    # layer will have no effect.
    ##
    def merge(self, pos, layer):
        # Determine the overlapping area
        area = QRect(pos, QSize(layer.width(), layer.height()))
        area &= QRect(0, 0, self.width(), self.height())
        for y in range(area.top(), area.bottom()+1):
            for x in range(area.left(), area.right()+1):
                cell = layer.cellAt(x - pos.x(), y - pos.y())
                if (not cell.isEmpty()):
                    self.setCell(x, y, cell)

    ##
    # Removes all cells in the specified region.
    ##
    def erase(self, area):
        emptyCell = Cell()
        for rect in area.rects():
            for x in range(rect.left(), rect.right()+1):
                for y in range(rect.top(), rect.bottom()+1):
                    self.setCell(x, y, emptyCell)

    ##
    # Sets the cells starting at the given position to the cells in the given
    # \a tileLayer. Parts that fall outside of this layer will be ignored.
    #
    # When a \a mask is given, only cells that fall within this mask are set.
    # The mask is applied in local coordinates.
    ##
    def setCells(self, x, y, layer, mask = QRegion()):
        # Determine the overlapping area
        area = QRegion(QRect(x, y, layer.width(), layer.height()))
        area &= QRect(0, 0, self.width(), self.height())
        if (not mask.isEmpty()):
            area &= mask
        for rect in area.rects():
            for _x in range(rect.left(), rect.right()+1):
                for _y in range(rect.top(), rect.bottom()+1):
                    self.setCell(_x, _y, layer.cellAt(_x - x, _y - y))

    ##
    # Flip this tile layer in the given \a direction. Direction must be
    # horizontal or vertical. This doesn't change the dimensions of the
    # tile layer.
    ##
    def flip(self, direction):
        newGrid = QVector()
        for i in range(self.mWidth * self.mHeight):
            newGrid.append(Cell())
        for y in range(self.mHeight):
            for x in range(self.mWidth):
                dest = newGrid[x + y * self.mWidth]
                if (direction == FlipDirection.FlipHorizontally):
                    source = self.cellAt(self.mWidth - x - 1, y)
                    dest = source
                    dest.flippedHorizontally = not source.flippedHorizontally
                elif (direction == FlipDirection.FlipVertically):
                    source = self.cellAt(x, self.mHeight - y - 1)
                    dest = source
                    dest.flippedVertically = not source.flippedVertically

        self.mGrid = newGrid

    ##
    # Rotate this tile layer by 90 degrees left or right. The tile positions
    # are rotated within the layer, and the tiles themselves are rotated. The
    # dimensions of the tile layer are swapped.
    ##
    def rotate(self, direction):
        rotateRightMask = [5, 4, 1, 0, 7, 6, 3, 2]
        rotateLeftMask  = [3, 2, 7, 6, 1, 0, 5, 4]
        if direction == RotateDirection.RotateRight:
            rotateMask = rotateRightMask
        else:
            rotateMask = rotateLeftMask
        newWidth = self.mHeight
        newHeight = self.mWidth
        newGrid = QVector(newWidth * newHeight)
        for y in range(self.mHeight):
            for x in range(self.mWidth):
                source = self.cellAt(x, y)
                dest = source
                mask = (dest.flippedHorizontally << 2) | (dest.flippedVertically << 1) | (dest.flippedAntiDiagonally << 0)
                mask = rotateMask[mask]
                dest.flippedHorizontally = (mask & 4) != 0
                dest.flippedVertically = (mask & 2) != 0
                dest.flippedAntiDiagonally = (mask & 1) != 0
                if (direction == RotateDirection.RotateRight):
                    newGrid[x * newWidth + (self.mHeight - y - 1)] = dest
                else:
                    newGrid[(self.mWidth - x - 1) * newWidth + y] = dest

        t = self.mMaxTileSize.width()
        self.mMaxTileSize.setWidth(self.mMaxTileSize.height())
        self.mMaxTileSize.setHeight(t)
        self.mWidth = newWidth
        self.mHeight = newHeight
        self.mGrid = newGrid

    ##
    # Computes and returns the set of tilesets used by this tile layer.
    ##
    def usedTilesets(self):
        tilesets = QSet()
        i = 0
        while(i<self.mGrid.size()):
            tile = self.mGrid.at(i).tile
            if tile:
                tilesets.insert(tile.tileset())
            i += 1
        return tilesets

    ##
    # Returns whether this tile layer has any cell for which the given
    # \a condition returns True.
    ##
    def hasCell(self, condition):
        i = 0
        for cell in self.mGrid:
            if (condition(cell)):
                return True
            i += 1
        return False

    ##
    # Returns whether this tile layer is referencing the given tileset.
    ##
    def referencesTileset(self, tileset):
        i = 0
        while(i<self.mGrid.size()):
            tile = self.mGrid.at(i).tile
            if (tile and tile.tileset() == tileset):
                return True
            i += 1
        return False

    ##
    # Removes all references to the given tileset. This sets all tiles on this
    # layer that are from the given tileset to null.
    ##
    def removeReferencesToTileset(self, tileset):
        i = 0
        while(i<self.mGrid.size()):
            tile = self.mGrid.at(i).tile
            if (tile and tile.tileset() == tileset):
                self.mGrid.replace(i, Cell())
            i += 1

    ##
    # Replaces all tiles from \a oldTileset with tiles from \a newTileset.
    ##
    def replaceReferencesToTileset(self, oldTileset, newTileset):
        i = 0
        while(i<self.mGrid.size()):
            tile = self.mGrid.at(i).tile
            if (tile and tile.tileset() == oldTileset):
                self.mGrid[i].tile = newTileset.tileAt(tile.id())
            i += 1

    ##
    # Resizes this tile layer to \a size, while shifting all tiles by
    # \a offset.
    ##
    def resize(self, size, offset):
        if (self.size() == size and offset.isNull()):
            return
        newGrid = QVector()
        for i in range(size.width() * size.height()):
            newGrid.append(Cell())
        # Copy over the preserved part
        startX = max(0, -offset.x())
        startY = max(0, -offset.y())
        endX = min(self.mWidth, size.width() - offset.x())
        endY = min(self.mHeight, size.height() - offset.y())
        for y in range(startY, endY):
            for x in range(startX, endX):
                index = x + offset.x() + (y + offset.y()) * size.width()
                newGrid[index] = self.cellAt(x, y)

        self.mGrid = newGrid
        self.setSize(size)

    ##
    # Offsets the tiles in this layer within \a bounds by \a offset,
    # and optionally wraps them.
    #
    # \sa ObjectGroup.offset()
    ##
    def offsetTiles(self, offset, bounds, wrapX, wrapY):
        newGrid = QVector()
        for i in range(self.mWidth * self.mHeight):
            newGrid.append(Cell())
        for y in range(self.mHeight):
            for x in range(self.mWidth):
                # Skip out of bounds tiles
                if (not bounds.contains(x, y)):
                    newGrid[x + y * self.mWidth] = self.cellAt(x, y)
                    continue

                # Get position to pull tile value from
                oldX = x - offset.x()
                oldY = y - offset.y()
                # Wrap x value that will be pulled from
                if (wrapX and bounds.width() > 0):
                    while oldX < bounds.left():
                        oldX += bounds.width()
                    while oldX > bounds.right():
                        oldX -= bounds.width()

                # Wrap y value that will be pulled from
                if (wrapY and bounds.height() > 0):
                    while oldY < bounds.top():
                        oldY += bounds.height()
                    while oldY > bounds.bottom():
                        oldY -= bounds.height()

                # Set the new tile
                if (self.contains(oldX, oldY) and bounds.contains(oldX, oldY)):
                    newGrid[x + y * self.mWidth] = self.cellAt(oldX, oldY)
                else:
                    newGrid[x + y * self.mWidth] = Cell()

        self.mGrid = newGrid

    def canMergeWith(self, other):
        return other.isTileLayer()

    def mergedWith(self, other):
        o = other
        unitedBounds = self.bounds().united(o.bounds())
        offset = self.position() - unitedBounds.topLeft()
        merged = self.clone()
        merged.resize(unitedBounds.size(), offset)
        merged.merge(o.position() - unitedBounds.topLeft(), o)
        return merged

    ##
    # Returns the region where this tile layer and the given tile layer
    # are different. The relative positions of the layers are taken into
    # account. The returned region is relative to this tile layer.
    ##
    def computeDiffRegion(self, other):
        ret = QRegion()
        dx = other.x() - self.mX
        dy = other.y() - self.mY
        r = QRect(0, 0, self.width(), self.height())
        r &= QRect(dx, dy, other.width(), other.height())
        for y in range(r.top(), r.bottom()+1):
            for x in range(r.left(), r.right()+1):
                if (self.cellAt(x, y) != other.cellAt(x - dx, y - dy)):
                    rangeStart = x
                    while (x <= r.right() and self.cellAt(x, y) != other.cellAt(x - dx, y - dy)):
                        x += 1

                    rangeEnd = x
                    ret += QRect(rangeStart, y, rangeEnd - rangeStart, 1)

        return ret

    ##
    # Returns True if all tiles in the layer are empty.
    ##
    def isEmpty(self):
        i = 0
        while(i<self.mGrid.size()):
            if (not self.mGrid.at(i).isEmpty()):
                return False
            i += 1
        return True

    ##
    # Returns a duplicate of this TileLayer.
    #
    # \sa Layer.clone()
    ##
    def clone(self):
        return self.initializeClone(TileLayer(self.mName, self.mX, self.mY, self.mWidth, self.mHeight))

    def begin(self):
        return self.mGrid.begin()
    
    def end(self):
        return self.mGrid.end()
        
    def initializeClone(self, clone):
        super().initializeClone(clone)
        clone.mGrid = self.mGrid
        clone.mMaxTileSize = self.mMaxTileSize
        clone.mOffsetMargins = self.mOffsetMargins
        return clone
コード例 #36
0
ファイル: lip_test.py プロジェクト: koojagyum/objviewer
class FaceView(QQuickGLItem):

    requestUpdate = pyqtSignal()
    setFloatParam = pyqtSignal(str, float)

    def __init__(self, parent=None):
        super(FaceView, self).__init__(parent=parent)

        self._params = {}
        self._size = QSize()
        self.detector = FaceDetector()

        lip_faces = np.array([
            [54, 55, 64],
            [55, 65, 64],
            [55, 56, 65],
            [56, 66, 65],
            [56, 57, 66],
            [57, 67, 66],
            [57, 58, 67],
            [58, 59, 67],
            [59, 60, 67],
            [59, 48, 60],
        ],
                             dtype=np.uint8)

        lm_model = ColorModel(name='facelm_model',
                              color=np.array([1.0, 0.3, 0.3],
                                             dtype=np.float32),
                              faces=lip_faces,
                              draw_point=False)
        self.lm_model = lm_model

        self.requestUpdate.connect(self._requestUpdate)
        self.setFloatParam.connect(self._setFloatParam)

        # Fixme: workaround...
        QTimer.singleShot(500, lambda: self.update())

    def geometryChanged(self, newGeometry, oldGeometry):
        if not newGeometry.isEmpty():
            if newGeometry.width() != self._size.width() or \
               newGeometry.height() != self._size.height():
                self._update_size(newGeometry.width(), newGeometry.height())
                self.update()

    def _update_size(self, w=0, h=0):
        if self.provider is None:
            return

        if w <= 0 or h <= 0:
            w, h = self.width(), self.height()

        w, h = geo.scale(1.0, self.provider.aspect_ratio, w, h, True)

        self._size.setWidth(w)
        self._size.setHeight(h)
        self.setWidth(w)
        self.setHeight(h)

    def _update_frame(self, image):
        if image is None:
            return None

        _, shapes = self.detector.detect(image)
        if shapes.shape[0] > 0:
            v_ndc = geo.to_ndc(shapes[0].astype(np.float32),
                               (image.shape[1], image.shape[0]))
            self.lm_model.vertices = v_ndc

        return image

    def _requestUpdate(self):
        self.update()

    def _setFloatParam(self, key, value):
        self._params[key] = value
        self.update()
コード例 #37
0
 def sizeHint(self):
     """ Set a reasonable size for the list widget. """
     s = QSize()
     s.setHeight(super(ListWidget, self).sizeHint().height())
     s.setWidth(self.sizeHintForColumn(0))
     return s