예제 #1
0
 def getNewWindow(cls,
                  targetImage=None,
                  axeSize=500,
                  layer=None,
                  parent=None,
                  mainForm=None,
                  curveType='quadric'):
     newWindow = graphicsToneForm(targetImage=targetImage,
                                  axeSize=axeSize,
                                  layer=layer,
                                  parent=parent,
                                  mainForm=mainForm,
                                  curveType=curveType)
     newWindow.setWindowTitle(layer.name)
     # init marker
     triangle = QPolygonF()
     s = 10
     triangle.append(QPointF(-s, s))
     triangle.append(QPointF(0, 0))
     triangle.append(QPointF(s, s))
     newWindow.inputMarker = QGraphicsPolygonItem(triangle)
     newWindow.scene().addItem(newWindow.inputMarker)
     newWindow.inputMarker.setBrush(QBrush(Qt.white))
     return newWindow
예제 #2
0
    def __init__(self, boxManager):
        super().__init__()
        # Variables
        self.message     = ''
        self.imageData   = None
        self.boxes       = []
        self.drawingRect = None
        self.drawing     = False

        # Objects
        self.image              = None
        self.messageResetTimer  = QTimer()
        self.brush              = QBrush()
        self.pen                = QPen()
        self.font               = QFont('Arial', 8)
        self.boxManager         = boxManager

        # Styling
        self.setMinimumSize(QSize(850, 725))
        self.messageResetTimer.setInterval(3000)
        self.messageResetTimer.setSingleShot(True)
        
        # Connections
        self.messageResetTimer.timeout.connect(self.resetMessage)
예제 #3
0
    def __init__(self, parent, config):
        super(DigitalBarHorizontal, self).__init__(parent)

        self.config = config
        self.value = config["min"]

        self.font      = QFont()
        self.note_font = QFont()
        self.color     = QColor(config["color"])
        self.red_color = QColor(config["redline_color"])
        self.no_color  = QColor()
        self.no_color.setAlpha(0)

        self.brush     = QBrush(self.color)
        self.red_brush = QBrush(self.red_color)

        self.pen       = QPen(self.color)
        self.red_pen   = QPen(self.red_color)
        self.no_pen    = QPen(self.no_color)

        self.font_db  = QFontDatabase()
        self.font_id  = self.font_db.addApplicationFont("fonts/DS-DIGI.TTF")
        self.families = self.font_db.applicationFontFamilies(self.font_id)
        #print [str(f) for f in self.families] #DS-Digital

        self.font         = QFont("DS-Digital")
        self.note_font    = QFont("DS-Digital")
        self.title_font   = QFont("DS-Digital")
        self.color        = QColor(config["color"])
        self.pen_color    = QColor(Qt.black)
        self.red_color    = QColor(config["redline_color"])
        self.brush        = QBrush(self.color)
        self.brush_bg     = QBrush(QColor("#555555"))
        self.brush_red    = QBrush(self.red_color)
        self.brush_red_bg = QBrush(QColor("#73311c"))
        self.pen          = QPen(self.pen_color)
        self.red_pen      = QPen(self.red_color)
        self.text_pen     = QPen(self.color)

        self.font.setPixelSize(self.config["font_size"])
        self.note_font.setPixelSize(self.config["note_font_size"])
        self.pen.setWidth(3)
        self.red_pen.setWidth(3)
예제 #4
0
    customPlot.setWindowTitle('Sinc Scatter Demo')

    customPlot.legend.setVisible(True)
    customPlot.legend.setFont(QFont("Helvetica", 9))
    # set locale to english, so we get english decimal separator:
    customPlot.setLocale(QLocale(QLocale.English, QLocale.UnitedKingdom))

    # add confidence band graphs:
    customPlot.addGraph()
    pen = QPen()
    pen.setStyle(Qt.DotLine)
    pen.setWidth(1)
    pen.setColor(QColor(180, 180, 180))
    customPlot.graph(0).setName("Confidence Band 68%")
    customPlot.graph(0).setPen(pen)
    customPlot.graph(0).setBrush(QBrush(QColor(255, 50, 30, 20)))
    customPlot.addGraph()
    customPlot.legend.removeItem(customPlot.legend.itemCount() - 1)
    customPlot.graph(1).setPen(pen)
    customPlot.graph(0).setChannelFillGraph(customPlot.graph(1))
    # add theory curve graph:
    customPlot.addGraph()
    pen.setStyle(Qt.DashLine)
    pen.setWidth(2)
    pen.setColor(Qt.red)
    customPlot.graph(2).setPen(pen)
    customPlot.graph(2).setName("Theory Curve")
    # add data point graph:
    customPlot.addGraph()
    customPlot.graph(3).setPen(QPen(Qt.blue))
    customPlot.graph(3).setLineStyle(QCPGraph.lsNone)
예제 #5
0
 def popTableMenu(self, pos):
     self.subtitle.cellChanged.disconnect(self.subEdit)
     pos = QPoint(pos.x() + 55, pos.y() + 30)
     menu = QMenu()
     copy = menu.addAction('复制')
     paste = menu.addAction('粘贴')
     setSpan = menu.addAction('合并')
     clrSpan = menu.addAction('拆分')
     addSub = menu.addAction('导入字幕')
     cutSub = menu.addAction('裁剪字幕')
     action = menu.exec_(self.subtitle.mapToGlobal(pos))
     selected = self.subtitle.selectionModel().selection().indexes()
     yList = [selected[0].row(), selected[-1].row()]
     xSet = set()
     for i in range(len(selected)):
         xSet.add(selected[i].column())
     if action == copy:
         for x in xSet:
             self.clipBoard = []
             for y in range(yList[0], yList[1] + 1):
                 if self.subtitle.item(y, x):
                     self.clipBoard.append(self.subtitle.item(y, x).text())
                 else:
                     self.clipBoard.append('')
             break
     elif action == paste:
         self.subtitle.cellChanged.connect(self.subEdit)
         for x in xSet:
             for cnt, text in enumerate(self.clipBoard):
                 self.subtitle.setItem(yList[0] + cnt, x, QTableWidgetItem(text))
                 self.subtitleDict[x][(yList[0] + cnt) * self.globalInterval] = [self.globalInterval, text]
         self.subtitle.cellChanged.disconnect(self.subEdit)
     elif action == setSpan:
         for x in xSet:
             if not self.subtitle.item(yList[0], x):
                 firstItem = ''
             else:
                 firstItem = self.subtitle.item(yList[0], x).text()
             for y in range(yList[0], yList[1] + 1):
                 self.subtitle.setSpan(y, x, 1, 1)
                 self.subtitle.setItem(y, x, QTableWidgetItem(firstItem))
                 self.subtitle.item(y, x).setBackground(QBrush(QColor('#35545d')))
                 if y * self.globalInterval in self.subtitleDict[x]:
                     del self.subtitleDict[x][y * self.globalInterval]
         for x in xSet:
             self.subtitle.setSpan(yList[0], x, yList[1] - yList[0] + 1, 1)
         self.setSubtitleDict(yList[0], x, yList[1] - yList[0] + 1, firstItem)
     elif action == clrSpan:
         for x in xSet:
             if not self.subtitle.item(yList[0], x):
                 firstItem = ''
             else:
                 firstItem = self.subtitle.item(yList[0], x).text()
             for cnt, y in enumerate(range(yList[0], yList[1] + 1)):
                 self.subtitle.setSpan(y, x, 1, 1)
                 if not cnt:
                     self.subtitle.setItem(yList[0], x, QTableWidgetItem(firstItem))
                     if firstItem:
                         self.subtitle.item(y, x).setBackground(QBrush(QColor('#35545d')))
                     else:
                         self.subtitle.item(y, x).setBackground(QBrush(QColor('#232629')))
                 else:
                     self.subtitle.setItem(y, x, QTableWidgetItem(''))
                     self.subtitle.item(y, x).setBackground(QBrush(QColor('#232629')))
                 self.setSubtitleDict(yList[0], x, yList[1] - yList[0] + 1, firstItem)
             break
     elif action == addSub:
         self.subtitle.cellChanged.connect(self.subEdit)
         for x in xSet:
             self.addSubtitle(x)
         self.subtitle.cellChanged.disconnect(self.subEdit)
     elif action == cutSub:
         for x in xSet:
             start = yList[0] * self.globalInterval
             end = yList[1] * self.globalInterval
             self.exportSubWindow(start, end, x + 1)
     self.subtitle.cellChanged.connect(self.subEdit)
예제 #6
0
    def build_func_tree(self):
        """ Build the function target display tree """
        self._func_tree.setSortingEnabled(False)
        self.model.clear()
        self.model.setHorizontalHeaderLabels([
            "Function Name",
            "File",
            "File Offset",
            "Order Seen",
            "Calling Module",
            # "Return Address",
            "Targeting Mode",
        ])

        self.model.horizontalHeaderItem(0).setToolTip(
            "The name of a fuzzable function")
        self.model.horizontalHeaderItem(1).setToolTip(
            "The name of the file (if any) the function tried to read")
        self.model.horizontalHeaderItem(2).setToolTip(
            "The bytes in the file that the program tried to read (if available)"
        )
        self.model.horizontalHeaderItem(3).setToolTip(
            "The order in which the wizard encountered this function")
        self.model.horizontalHeaderItem(4).setToolTip(
            "Which part of the program called this function. .exe modules are generally the most promising"
        )
        self.model.horizontalHeaderItem(5).setToolTip(
            "How we re-identify whether we're calling this function again")

        for index, option in enumerate(self.target_data):
            funcname_widget = CheckboxTreeWidgetItem(
                self._func_tree, index, "{func_name}".format(**option))
            filename_widget = QStandardItem(option.get("source", None))
            filename_widget.setEditable(False)
            offset_widget = QStandardItem(
                "0x{:x} - 0x{:x}".format(option["start"], option["end"]) if (
                    "end" in option and "start" in option) else None)
            offset_widget.setEditable(False)
            funcname_widget.setCheckState(
                Qt.Checked if option["selected"] else Qt.Unchecked)
            funcname_widget.setColumnCount(3)

            add = []
            hx = []
            asc = []
            for address in range(0, min(len(option["buffer"]), 16 * 5), 16):
                add.append("0x%04X" % address)
                hx.append(" ".join("{:02X}".format(c)
                                   for c in option["buffer"][address:address +
                                                             16]))
                asc.append("".join(
                    (chr(c) if c in range(31, 127) else ".")
                    for c in option["buffer"][address:address + 16]))
            addr = QStandardItem("\n".join(add))
            hexstr = QStandardItem("\n".join(hx))
            asciistr = QStandardItem("\n".join(asc))
            addr.setEditable(False)
            hexstr.setEditable(False)
            asciistr.setEditable(False)
            addr.setFont(QFontDatabase.systemFont(QFontDatabase.FixedFont))
            hexstr.setFont(QFontDatabase.systemFont(QFontDatabase.FixedFont))
            asciistr.setFont(QFontDatabase.systemFont(QFontDatabase.FixedFont))
            funcname_widget.appendRow([addr, hexstr, asciistr])

            idx_widget = QStandardItem(str(index))
            idx_widget.setEditable(False)
            mod_widget = QStandardItem(str(option.get("called_from", None)))
            mod_widget.setEditable(False)

            addr_widget = QStandardItem(str(option.get("retAddrOffset", None)))
            addr_widget.setEditable(False)

            mode_widget = QStandardItem(mode_labels[option.get("mode")])
            mode_widget.setData(option.get("mode"), role=Qt.UserRole)
            mode_widget.setData(index, role=Qt.UserRole + 1)
            mode_widget.setData(QBrush(QColor(0, 0, 0, 16)),
                                role=Qt.BackgroundRole)

            self.model.appendRow([
                funcname_widget,
                filename_widget,
                offset_widget,
                idx_widget,
                mod_widget,
                # addr_widget,
                mode_widget,
            ])
            # self._func_tree.edit(self.model.indexFromItem(mode_widget))

        self._func_tree.expandAll()
        self._func_tree.resizeColumnToContents(0)
        self._func_tree.resizeColumnToContents(1)
        self._func_tree.resizeColumnToContents(2)
        self._func_tree.resizeColumnToContents(3)

        self._func_tree.sortByColumn(3, Qt.AscendingOrder)
        self._func_tree.setSortingEnabled(True)
예제 #7
0
 def paint(self, painter, styleoptions, parent=None):
     brush = QBrush()
     brush.setColor(self.color)
     painter.setBrush(self.color)
     painter.drawRect(self._bounding_rect)
예제 #8
0
    def handle_packet(self, packet, writer):
        """
        处理抓到的数据包
        :parma packet: 需要处理分类的包
        """
        unkown = False
        try:
            # 如果暂停,则不对列表进行更新操作
            if not self.pause_flag and packet.name == "Ethernet":
                protocol = None
                if self.packet_id == 1:
                    self.start_timestamp = packet.time
                packet_time = packet.time - self.start_timestamp
                # 网络层
                net = packet.payload
                network_layer = net.name
                version_add = ""
                # IPv4
                if network_layer == "IP":
                    source = packet[IP].src
                    destination = packet[IP].dst
                    self.counter["ipv4"] += 1
                # IPv6
                elif network_layer == "IPv6":
                    source = packet[IPv6].src
                    destination = packet[IPv6].dst
                    version_add = "v6"
                    self.counter["ipv6"] += 1
                # ARP
                elif network_layer == "ARP":
                    self.counter["arp"] += 1
                    protocol = network_layer
                    source = packet[Ether].src
                    destination = packet[Ether].dst
                    if destination == "ff:ff:ff:ff:ff:ff":
                        destination = "Broadcast"
                else:
                    try:
                        protocol = network_layer
                        unkown = True
                    except:
                        # 其他协议不处理
                        return
                if network_layer != "ARP" and not unkown:
                    # 传输层
                    trans = net.payload
                    protocol = trans.name
                    sport = None
                    dport = None
                    if protocol == "TCP":
                        sport = packet[TCP].sport
                        dport = packet[TCP].dport
                        protocol += version_add
                        self.counter["tcp"] += 1
                    elif protocol == "UDP":
                        sport = packet[UDP].sport
                        dport = packet[UDP].dport
                        protocol += version_add
                        self.counter["udp"] += 1
                    elif len(protocol) >= 4 and protocol[0:4] == "ICMP":
                        protocol = "ICMP" + version_add
                        self.counter["icmp"] += 1
                    else:
                        return
                    if trans.haslayer(HTTPRequest) or trans.haslayer(
                            HTTPResponse):
                        protocol = "HTTP" + version_add
                    elif trans.haslayer(TLS):
                        protocol = https_version[trans[TLS].version]

                    if sport and dport:
                        if sport in ports:
                            protocol = ports[sport] + version_add
                        elif dport in ports:
                            protocol = ports[dport] + version_add
                item = QTreeWidgetItem(self.main_window.packet_tree)
                # 根据协议类型不同设置颜色
                try:
                    color = color_dict[protocol]
                except:
                    color = "#ff80c0"
                for i in range(7):
                    item.setBackground(i, QBrush(QColor(color)))
                # 添加行内容
                item.setData(0, Qt.DisplayRole, self.packet_id)
                item.setText(1, f"{packet_time:.6f}")
                item.setText(2, source)
                item.setText(3, destination)
                item.setText(4, protocol)
                item.setData(5, Qt.DisplayRole, len(packet))
                item.setText(6, packet.summary())
                # 时间栏右对齐,为了格式化后不影响排序
                # item.setTextAlignment(1, Qt.AlignRight)
                self.packet_id += 1
                if writer:
                    writer.write(packet)
        except:
            pass
예제 #9
0
 def testQColor(self):
     #QGraphicsAbstractShapeItem.setBrush(QColor)
     self.item.setBrush(self.color)
     self.assertEqual(QBrush(self.color), self.item.brush())
예제 #10
0
    def _updateAll(self, newGroup=None):
        try:
            self.chSelector.itemChanged.disconnect(self.itemChanged)
            self.sSelector.itemChanged.disconnect(self.itemChanged)
        except:
            pass
        if newGroup == '':
            return
        
        chStruct = self.chartData[newGroup]
        sStruct = self.chartData[newGroup].getColStructure()
        
        self.chSelector.clear()
        for ws in chStruct:
            gparent = QTreeWidgetItem(self.chSelector)
            gparent.setText(0, ws)
            gparent.setBackgroundColor(0, Qt.white)
            gparent.setFlags(Qt.ItemIsEnabled)
            for key in chStruct[ws]:
                parent = QTreeWidgetItem(gparent)
                parent.setText(0, key)
                if chStruct[ws][key][0] == True:
                    dataNames = chStruct[ws][key][3]
                    sColor = QColor(chStruct[ws][key][4])
                    sColor.setAlpha(100)
                    parent.setBackgroundColor(0, sColor)
                else:
                    dataNames = ','.join(chStruct[ws][key][2])
                    sColor = QColor(chStruct[ws][key][3])
                    sColor.setAlpha(100)
                    parent.setBackgroundColor(0, sColor)
                    
                parent.setText(1, dataNames)
                if chStruct[ws][key][1] == True:
                    parent.setCheckState(0, Qt.Checked)
                else:
                    parent.setCheckState(0, Qt.Unchecked)
                parent.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
        
        self.sSelector.clear()
        self.gSelector.clear()
        for ws in sStruct:
            firstChannel = sStruct[ws][0]
            isOneSignal = self.chartData[newGroup][firstChannel][ws][0]
            if isOneSignal:
                gparent = QTreeWidgetItem(self.sSelector)
                gparent.setText(0, ws)
                gparent.setFlags(Qt.ItemIsEnabled | Qt.ItemIsDragEnabled
                                 | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable)
                if True:
##                if chStruct['CH1'][ws][5] == True:
                    gparent.setCheckState(0, Qt.Checked) 
                else:
                    gparent.setCheckState(0, Qt.Unchecked)
                    
                for key in sStruct[ws]:
                    parent = QTreeWidgetItem(gparent)
                    parent.setText(0, key)
                    if chStruct[key][ws][2] == True:
                        parent.setCheckState(0, Qt.Checked)
                    else:
                        parent.setCheckState(0, Qt.Unchecked)
                    parent.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
                    sColor = QColor(chStruct[key][ws][4])
                    sColor.setAlpha(100)
                    sGradient = QLinearGradient(0, 0, 100, 10)
                    sGradient.setColorAt(0, sColor)
                    sGradient.setColorAt(1, Qt.white)
                    sBrush = QBrush(sGradient)
                    sBrush.setStyle(Qt.LinearGradientPattern)
                    sBrush.setColor(sColor)
                    gparent.setBackground(0, sBrush)
                    
            else:
                gparent = QTreeWidgetItem(self.gSelector)
                gparent.setText(0, ws)
                gparent.setFlags(Qt.ItemIsEnabled | Qt.ItemIsDropEnabled
                                 | Qt.ItemIsUserCheckable)
                if chStruct['CH1'][ws][5] == True:
                    gparent.setCheckState(0, Qt.Checked)
                else:
                    gparent.setCheckState(0, Qt.Unchecked)
                
                signalNames = chStruct[key][ws][2]
                sColor = QColor(chStruct[key][ws][3])
                sColor.setAlpha(100)
                gparent.setBackgroundColor(0, sColor)
                for signal in signalNames:
                    parent = QTreeWidgetItem(gparent)
                    parent.setText(0, signal)
                    parent.setFlags(Qt.ItemIsEnabled)

                    for key in sStruct[signal]:
                        sColor = QColor(chStruct[key][signal][4])
                        sColor.setAlpha(100)
                        parent.setBackgroundColor(0, sColor)
                        break                   
            
        self.chSelector.itemChanged.connect(self.itemChanged)
        self.sSelector.itemChanged.connect(self.itemChanged)
        self.curSelect = None
예제 #11
0
파일: Main.py 프로젝트: zorowyw/VaspStudio
    def update_xsd_files_information(self):
        '''
        update 函数直接与vs类关联,得到所有的文件类,这样只用update就能更新最新
        :return:
        '''

        if self.vsp == None:
            QMessageBox.information(self.main_window, "提示", "没有加载项目,无法获得xsd文件")
            return
        self.xsd_files_item = []

        try:
            filenames = list(self.vsp.relative_path_XVI_dict.keys())
            filenames = sorted(filenames)
            tw = self.main_window_ui.xsdFileTreeWidget

            index = 0
            tw.clear()
            # TODO :这里让用户自选显示的顺序和内容
            tw.setHeaderLabels(self.xsd_file_headers)
            tw.setColumnCount(len(self.xsd_file_headers))
            file_name_item_dict = {}
            root = QTreeWidgetItem(tw)
            root.setText(0, self.vsp.local_project_dir)

            for file in filenames:

                l = [root]
                trees = file.split("/")[1:]  # 第一个元素是“”,是root

                # 按照文件目录树进行,如果能够获取到子集就开始增加内容,否则增加child
                for i in range(len(trees) + 1):  # 对于剩下的child
                    node_name = "/".join(trees[:i])
                    try:  # 尝试找到这个node,如果没有就创建
                        node = file_name_item_dict[node_name]

                    except:
                        # 创建child node,加入到字典中
                        node = QTreeWidgetItem(l[-1])
                        index += 1
                        node.setText(0, node_name.split("/")[-1])
                        file_name_item_dict[node_name] = node
                        try:
                            # 这里面的每个显示都是直接从xvi信息中获取,然后设置
                            # 这里如果node能够获取到文件,就开始加上文件信息,否则就是空的只作为有内容的node的parent
                            xvi_item = self.vsp.relative_path_XVI_dict[
                                "/" + node_name]
                            for i in range(len(self.xsd_file_contents)):
                                #if getattr(xvi_item,"type","") == "":xvi_item.type = Type.Origin
                                node.setText(
                                    i + 1,
                                    getattr(xvi_item,
                                            self.xsd_file_contents[i], "None"))
                                if self.xsd_file_contents[i] == "status":
                                    # 这些set使用index进行的,所以先判断是不是在相应的列,也可改成名称为key,value为index
                                    node.setBackground(
                                        i + 1,
                                        QBrush(STATUS_COLOR[xvi_item.status]))
                                if self.xsd_file_contents[i] == "type":
                                    try:
                                        node.setBackground(
                                            i + 1,
                                            QBrush(Type_Color[xvi_item.type]))
                                    except:  # 这个是应对之前没有这个attr的项目,之后可以删除此
                                        node.setBackground(
                                            i + 1,
                                            QBrush(Type_Color[Type.Origin]))
                                if self.xsd_file_contents[i] == "mark_text":
                                    node.setText(
                                        i + 1,
                                        getattr(xvi_item,
                                                self.xsd_file_contents[i],
                                                "None"))
                                    try:
                                        node.setBackground(
                                            i + 1,
                                            QBrush(QColor(
                                                xvi_item.mark_color)))

                                    except:
                                        traceback.print_exc()
                                        node.setBackground(
                                            i + 1,
                                            QBrush(QColor(255, 255, 255)))

                            node.file_path = "/" + node_name  # 这里强行给这个实例增加了属性,之后直接调用,这里相当于继承
                            self.xsd_files_item.append(node)
                        except KeyError:
                            pass
                        except:
                            traceback.print_exc()
                    l.append(node)

                    l[-2].addChild(l[-1])

            def load_column_status():
                # 这里设置列的长度,首先用一个变量去存储这些列,存储在save project中
                try:
                    info = self.vsp.xsd_tree_widget_param["column_status"]
                    for i in range(tw.columnCount()):
                        tw.setColumnWidth(i, info[i])
                except:
                    return

            load_column_status()
            # 把node的信息存储一下!用于接下来搞node的扩展
            self.tree_node_widget_item_info = file_name_item_dict

            # 这里我们用一个与tree node widget 。。key一模一样的字典去存储node的expand信息,之后
            # 用这个key去获取node以及node的expand信息然后修改!
            def expand():  # 存储各个列的expand情况
                try:
                    info = self.vsp.xsd_tree_widget_param["expanded_status"]
                    tw.expandAll()
                    for key in self.tree_node_widget_item_info.keys():
                        try:
                            self.tree_node_widget_item_info[key].setExpanded(
                                info[key])
                        except:
                            continue
                except:
                    pass

            expand()
            print(tw.rootIndex())
            return

        except:
            QMessageBox.information(self.main_window, "提示", "No xsd files.")
            traceback.print_exc()
            return
예제 #12
0
 def createRoundRect(self, scene):
     item = RoundRectItem(10, 10, 100, 100)
     item.setBrush(QBrush(QColor(255, 0, 0)))
     scene.addItem(item)
     return item
예제 #13
0
    def _subscribe_select_ins(self, **kwargs): # pylint: disable=unused-argument
        if self.poi_trace.am_none:
            return

        if self.mark is not None:
            for i in self.mark.childItems():
                self.mark.removeFromGroup(i)
                self.traceScene.removeItem(i)
            self.traceScene.removeItem(self.mark)

        self.mark = QGraphicsItemGroup()
        self.traceScene.addItem(self.mark)

        if self.selected_ins:
            addr = next(iter(self.selected_ins))
            positions = self.poi_trace.get_positions(addr)
            if positions: #if addr is in list of positions
                # handle case where insn was selected from disas view
                if not self._use_precise_position:
                    self.curr_position = positions[0] - self.poi_trace.count
                for p in positions:
                    color = self._get_mark_color(p, self.poi_trace.count)
                    y = self._get_mark_y(p)

                    if p == self.poi_trace.count + self.curr_position: #add thicker line for 'current' mark
                        self.mark.addToGroup(self.traceScene.addRect(self.MARK_X, y, self.MARK_WIDTH,
                                                                     self.MARK_HEIGHT*4,
                                                                     QPen(QColor('black')), QBrush(color)))
                    else:
                        self.mark.addToGroup(self.traceScene.addRect(self.MARK_X, y, self.MARK_WIDTH,
                                                                     self.MARK_HEIGHT, QPen(color), QBrush(color)))

                self.traceScene.update() #force redraw of the traceScene
                self.scroll_to_position(self.curr_position)
예제 #14
0
    def paintEvent(self, arg__1: PySide2.QtGui.QPaintEvent):
        """
        PaintEvent draws the contents of this QFrame when called upon
        :param arg__1: the QPaintEvent object that the framework provides
        :return: None
        """
        painter = QPainter(self)
        # The QPaintEvent includes a rectangle (x, y, width, height) that tells us the area we need to draw
        start_drawing_x = arg__1.rect().x()
        stop_drawing_x = start_drawing_x + arg__1.rect().width()
        # We have to paint the area from start_drawing_x until stop_drawing_x
        # The painter uses the pen to draw the rectangle outline
        painter.setPen(QPen(self.__rectangleOutlineColor, 0, Qt.NoPen))
        # The painter uses the brush to fill the rectangle
        painter.setBrush(QBrush(self.getAlignmentInfo().getColor()))

        pixels_per_nucleotide = (
            float(self.width()) /
            float(self.getAlignmentInfo().getSeqPaddedLen()))

        for shaded_area in self.getAlignmentInfo().getShadedAreas():
            # It loops over every shaded area

            # For this shaded area we should shade starting from index nucleotide_start for a width of nucleotide_width
            # These are measured in nucleotides
            nucleotide_start = shaded_area[0]
            nucleotide_width = shaded_area[1]

            logging.debug("Processing shaded area " + str(nucleotide_start) +
                          ":" + str(nucleotide_width))

            # The relative_start, _width, _end are measured in pixels
            relative_start = nucleotide_start * pixels_per_nucleotide
            relative_width = nucleotide_width * pixels_per_nucleotide
            relative_end = relative_start + relative_width

            # If the rectangle is completely to the left of the area to be painted, just skip to the next one
            if relative_start < start_drawing_x and relative_end < start_drawing_x:
                logging.debug("Not drawing because " + str(relative_start) +
                              " - " + str(relative_end) +
                              " is to the left of the visible area")
                continue
            # Elif the rectangle is completely to the right of the area to be painted, we're done
            elif relative_start > stop_drawing_x and relative_end > stop_drawing_x:
                logging.debug("Not drawing because " + str(relative_start) +
                              " - " + str(relative_end) +
                              " is to the right of the visible area")
                break
            else:
                logging.debug("Drawing " + str(relative_start) + " - " +
                              str(relative_end) +
                              " because it's in the visible area")

                # Start drawing from the greater of the start of the rectangle, or the start of the visible area
                relative_start = max(relative_start, start_drawing_x)
                # Stop drawing at the lesser of the end of the rectangle, or the end of the visible area
                relative_end = min(relative_end, stop_drawing_x)
                # Adjust the width (in case start/end changed above)
                relative_width = relative_end - relative_start

                painter.drawRect(relative_start, 0, relative_width,
                                 self.height())
예제 #15
0
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(799, 408)
        icon = QIcon()
        icon.addFile(u":/newPrefix/cup.png", QSize(), QIcon.Normal, QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet(
            u"QMainWindow{background: url(:/backgrouns/backgrouns/colorful-paint-splash-hd-wallpapers-66011-1930804.png)}"
        )
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.centralwidget.setMinimumSize(QSize(100, 357))
        self.centralwidget.setMaximumSize(QSize(800, 357))
        palette = QPalette()
        brush = QBrush(QColor(255, 255, 255, 255))
        brush.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.WindowText, brush)
        brush1 = QBrush(QColor(37, 42, 86, 255))
        brush1.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Button, brush1)
        brush2 = QBrush(QColor(55, 63, 129, 255))
        brush2.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Light, brush2)
        brush3 = QBrush(QColor(46, 52, 107, 255))
        brush3.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Midlight, brush3)
        brush4 = QBrush(QColor(18, 21, 43, 255))
        brush4.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Dark, brush4)
        brush5 = QBrush(QColor(24, 28, 57, 255))
        brush5.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Mid, brush5)
        palette.setBrush(QPalette.Active, QPalette.Text, brush)
        palette.setBrush(QPalette.Active, QPalette.BrightText, brush)
        palette.setBrush(QPalette.Active, QPalette.ButtonText, brush)
        brush6 = QBrush(QColor(0, 0, 0, 255))
        brush6.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Base, brush6)
        palette.setBrush(QPalette.Active, QPalette.Window, brush1)
        palette.setBrush(QPalette.Active, QPalette.Shadow, brush6)
        palette.setBrush(QPalette.Active, QPalette.AlternateBase, brush4)
        brush7 = QBrush(QColor(255, 255, 220, 255))
        brush7.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.ToolTipBase, brush7)
        palette.setBrush(QPalette.Active, QPalette.ToolTipText, brush6)
        brush8 = QBrush(QColor(255, 255, 255, 128))
        brush8.setStyle(Qt.SolidPattern)
        #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)

        #endif
        palette.setBrush(QPalette.Inactive, QPalette.WindowText, brush)
        palette.setBrush(QPalette.Inactive, QPalette.Button, brush1)
        palette.setBrush(QPalette.Inactive, QPalette.Light, brush2)
        palette.setBrush(QPalette.Inactive, QPalette.Midlight, brush3)
        palette.setBrush(QPalette.Inactive, QPalette.Dark, brush4)
        palette.setBrush(QPalette.Inactive, QPalette.Mid, brush5)
        palette.setBrush(QPalette.Inactive, QPalette.Text, brush)
        palette.setBrush(QPalette.Inactive, QPalette.BrightText, brush)
        palette.setBrush(QPalette.Inactive, QPalette.ButtonText, brush)
        palette.setBrush(QPalette.Inactive, QPalette.Base, brush6)
        palette.setBrush(QPalette.Inactive, QPalette.Window, brush1)
        palette.setBrush(QPalette.Inactive, QPalette.Shadow, brush6)
        palette.setBrush(QPalette.Inactive, QPalette.AlternateBase, brush4)
        palette.setBrush(QPalette.Inactive, QPalette.ToolTipBase, brush7)
        palette.setBrush(QPalette.Inactive, QPalette.ToolTipText, brush6)
        #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)

        #endif
        palette.setBrush(QPalette.Disabled, QPalette.WindowText, brush4)
        palette.setBrush(QPalette.Disabled, QPalette.Button, brush1)
        palette.setBrush(QPalette.Disabled, QPalette.Light, brush2)
        palette.setBrush(QPalette.Disabled, QPalette.Midlight, brush3)
        palette.setBrush(QPalette.Disabled, QPalette.Dark, brush4)
        palette.setBrush(QPalette.Disabled, QPalette.Mid, brush5)
        palette.setBrush(QPalette.Disabled, QPalette.Text, brush4)
        palette.setBrush(QPalette.Disabled, QPalette.BrightText, brush)
        palette.setBrush(QPalette.Disabled, QPalette.ButtonText, brush4)
        palette.setBrush(QPalette.Disabled, QPalette.Base, brush1)
        palette.setBrush(QPalette.Disabled, QPalette.Window, brush1)
        palette.setBrush(QPalette.Disabled, QPalette.Shadow, brush6)
        palette.setBrush(QPalette.Disabled, QPalette.AlternateBase, brush1)
        palette.setBrush(QPalette.Disabled, QPalette.ToolTipBase, brush7)
        palette.setBrush(QPalette.Disabled, QPalette.ToolTipText, brush6)
        #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)

        #endif
        self.centralwidget.setPalette(palette)
        self.centralwidget.setAutoFillBackground(False)
        self.centralwidget.setStyleSheet(
            u"centralwidget{background: url(:/backgrouns/wallpaper.jpg)}")
        self.horizontalLayoutWidget = QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setObjectName(u"horizontalLayoutWidget")
        self.horizontalLayoutWidget.setGeometry(QRect(10, 0, 781, 351))
        self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout = QVBoxLayout()
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.groupBox = QGroupBox(self.horizontalLayoutWidget)
        self.groupBox.setObjectName(u"groupBox")
        self.groupBox.setMinimumSize(QSize(375, 0))
        self.groupBox.setAutoFillBackground(False)
        self.groupBox.setStyleSheet(
            u"QGroupBox{background: url(:/backgrouns/Abstract_Background_with_Blue_Triangles.jpg)}"
        )
        self.groupBox.setFlat(False)
        self.scalePortList = QComboBox(self.groupBox)
        self.scalePortList.setObjectName(u"scalePortList")
        self.scalePortList.setGeometry(QRect(20, 61, 111, 21))
        self.pumpPortList = QComboBox(self.groupBox)
        self.pumpPortList.setObjectName(u"pumpPortList")
        self.pumpPortList.setGeometry(QRect(190, 61, 121, 21))
        self.pumpPortList.setAutoFillBackground(True)
        self.label = QLabel(self.groupBox)
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(20, 30, 81, 21))
        font = QFont()
        font.setPointSize(10)
        self.label.setFont(font)
        self.label_2 = QLabel(self.groupBox)
        self.label_2.setObjectName(u"label_2")
        self.label_2.setGeometry(QRect(230, 30, 81, 21))
        self.label_2.setFont(font)
        self.label_2.setStyleSheet(u"")

        self.verticalLayout.addWidget(self.groupBox)

        self.groupBox_2 = QGroupBox(self.horizontalLayoutWidget)
        self.groupBox_2.setObjectName(u"groupBox_2")
        self.groupBox_2.setAutoFillBackground(False)
        self.groupBox_2.setStyleSheet(
            u"QGroupBox{background:url(:/backgrouns/fractalvisual.jpg)}")
        self.groupBox_2.setFlat(False)
        self.expStart = QPushButton(self.groupBox_2)
        self.expStart.setObjectName(u"expStart")
        self.expStart.setGeometry(QRect(250, 70, 91, 31))
        icon1 = QIcon()
        icon1.addFile(u":/newPrefix/resultset_next.png", QSize(), QIcon.Normal,
                      QIcon.Off)
        self.expStart.setIcon(icon1)
        self.expStart.setCheckable(True)
        self.weightBox = QLineEdit(self.groupBox_2)
        self.weightBox.setObjectName(u"weightBox")
        self.weightBox.setGeometry(QRect(210, 30, 113, 22))
        self.stopButton = QPushButton(self.groupBox_2)
        self.stopButton.setObjectName(u"stopButton")
        self.stopButton.setEnabled(False)
        self.stopButton.setGeometry(QRect(190, 70, 51, 31))
        icon2 = QIcon()
        icon2.addFile(u":/newPrefix/stop.png", QSize(), QIcon.Normal,
                      QIcon.Off)
        self.stopButton.setIcon(icon2)
        self.label_3 = QLabel(self.groupBox_2)
        self.label_3.setObjectName(u"label_3")
        self.label_3.setGeometry(QRect(120, 30, 91, 21))
        palette1 = QPalette()
        brush9 = QBrush(QColor(193, 177, 55, 255))
        brush9.setStyle(Qt.SolidPattern)
        palette1.setBrush(QPalette.Active, QPalette.WindowText, brush9)
        brush10 = QBrush(QColor(168, 162, 90, 255))
        brush10.setStyle(Qt.SolidPattern)
        palette1.setBrush(QPalette.Active, QPalette.Text, brush10)
        brush11 = QBrush(QColor(189, 177, 47, 255))
        brush11.setStyle(Qt.SolidPattern)
        palette1.setBrush(QPalette.Active, QPalette.ToolTipText, brush11)
        brush12 = QBrush(QColor(168, 162, 90, 128))
        brush12.setStyle(Qt.SolidPattern)
        #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)

        #endif
        palette1.setBrush(QPalette.Inactive, QPalette.WindowText, brush9)
        palette1.setBrush(QPalette.Inactive, QPalette.Text, brush10)
        palette1.setBrush(QPalette.Inactive, QPalette.ToolTipText, brush11)
        #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)

        #endif
        brush13 = QBrush(QColor(120, 120, 120, 255))
        brush13.setStyle(Qt.SolidPattern)
        palette1.setBrush(QPalette.Disabled, QPalette.WindowText, brush13)
        palette1.setBrush(QPalette.Disabled, QPalette.Text, brush13)
        palette1.setBrush(QPalette.Disabled, QPalette.ToolTipText, brush11)
        brush14 = QBrush(QColor(0, 0, 0, 128))
        brush14.setStyle(Qt.SolidPattern)
        #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)

        #endif
        self.label_3.setPalette(palette1)
        self.label_3.setFont(font)

        self.verticalLayout.addWidget(self.groupBox_2)

        self.horizontalLayout.addLayout(self.verticalLayout)

        self.verticalLayout_3 = QVBoxLayout()
        self.verticalLayout_3.setSpacing(26)
        self.verticalLayout_3.setObjectName(u"verticalLayout_3")
        self.resultBox = QPlainTextEdit(self.horizontalLayoutWidget)
        self.resultBox.setObjectName(u"resultBox")
        self.resultBox.setMaximumSize(QSize(400, 400))
        self.resultBox.setReadOnly(True)

        self.verticalLayout_3.addWidget(self.resultBox)

        self.progressBar = QProgressBar(self.horizontalLayoutWidget)
        self.progressBar.setObjectName(u"progressBar")
        self.progressBar.setMaximumSize(QSize(400, 16777215))
        self.progressBar.setValue(24)

        self.verticalLayout_3.addWidget(self.progressBar)

        self.horizontalLayout.addLayout(self.verticalLayout_3)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 799, 26))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.expStart.toggled.connect(self.stopButton.setEnabled)
        self.stopButton.clicked.connect(self.expStart.setEnabled)
        self.expStart.toggled.connect(self.expStart.setDisabled)
        self.stopButton.clicked.connect(self.expStart.setChecked)

        QMetaObject.connectSlotsByName(MainWindow)
예제 #16
0
 def data_background(self, row, column):
     if column == 3:
         if self._data[row][self.COL_UNRECONCILED] > 15:
             return QBrush(CustomColor.LightRed)
         if self._data[row][self.COL_UNRECONCILED] > 7:
             return QBrush(CustomColor.LightYellow)
예제 #17
0
    def __init__(self, *args, **kwargs):
        super(ExchangeSpiderUI, self).__init__(*args, **kwargs)
        layout = QVBoxLayout()
        layout.setContentsMargins(QMargins(2, 0, 2, 1))
        main_splitter = QSplitter(self)
        main_splitter.setHandleWidth(1)
        self.tree_widget = ExchangeLibTree(self)
        main_splitter.addWidget(self.tree_widget)

        action_splitter = QSplitter(Qt.Vertical, self)
        action_splitter.setHandleWidth(1)

        spider_widget = QWidget(self)
        spider_widget.setAutoFillBackground(True)
        palette = QPalette()
        pix = QPixmap("images/spider_bg.png")
        pix = pix.scaled(QSize(700, 700), Qt.KeepAspectRatio)
        palette.setBrush(QPalette.Background, QBrush(pix))
        spider_widget.setPalette(palette)

        spider_layout = QVBoxLayout()

        tips_layout = QHBoxLayout()
        tips_layout.setSpacing(1)
        tips_layout.addWidget(QLabel("当前交易所:", self))
        self.spider_exchange_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.spider_exchange_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("当前操作:", self))
        self.spider_action_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.spider_action_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("选择日期:", self))
        self.spider_date_edit = QDateEdit(QDate.currentDate(), self)
        self.spider_date_edit.setCalendarPopup(True)
        self.spider_date_edit.setDisplayFormat("yyyy-MM-dd")
        tips_layout.addWidget(self.spider_date_edit)

        tips_layout.addWidget(QLabel(self))
        self.spider_start_button = QPushButton("开始", self)
        tips_layout.addWidget(self.spider_start_button)
        tips_layout.addStretch()

        spider_layout.addLayout(tips_layout)

        self.spider_status = QLabel("等待开始抓取", self)
        self.spider_status.setWordWrap(True)
        self.spider_status.setAlignment(Qt.AlignCenter)

        spider_layout.addWidget(self.spider_status)

        spider_widget.setLayout(spider_layout)

        action_splitter.addWidget(spider_widget)

        # 解析部分
        parser_widget = QWidget(self)
        parser_widget.setAutoFillBackground(True)
        palette = QPalette()
        pix = QPixmap("images/parser_bg.png")
        pix = pix.scaled(QSize(700, 700), Qt.KeepAspectRatio)
        palette.setBrush(QPalette.Background, QBrush(pix))
        parser_widget.setPalette(palette)

        parser_layout = QVBoxLayout()

        tips_layout = QHBoxLayout()
        tips_layout.setSpacing(1)
        tips_layout.addWidget(QLabel("当前交易所:", self))
        self.parser_exchange_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.parser_exchange_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("当前操作:", self))
        self.parser_action_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.parser_action_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("选择日期:", self))
        self.parser_date_edit = QDateEdit(QDate.currentDate(), self)
        self.parser_date_edit.setCalendarPopup(True)
        self.parser_date_edit.setDisplayFormat("yyyy-MM-dd")
        tips_layout.addWidget(self.parser_date_edit)

        tips_layout.addWidget(QLabel(self))
        self.parser_start_button = QPushButton("开始", self)
        tips_layout.addWidget(self.parser_start_button)
        tips_layout.addStretch()

        parser_layout.addLayout(tips_layout)

        self.parser_status = QLabel("等待开始解析", self)
        self.parser_status.setAlignment(Qt.AlignCenter)
        parser_layout.addWidget(self.parser_status)

        parser_widget.setLayout(parser_layout)

        action_splitter.addWidget(parser_widget)

        main_splitter.addWidget(action_splitter)

        main_splitter.setStretchFactor(0, 4)
        main_splitter.setStretchFactor(1, 6)

        layout.addWidget(main_splitter)
        self.setLayout(layout)

        main_splitter.setObjectName("mainSplitter")
        action_splitter.setObjectName("actionSplitter")

        self.spider_exchange_button.setObjectName("tipButton")
        self.spider_action_button.setObjectName("tipButton")
        self.spider_status.setObjectName("spiderStatus")

        self.parser_exchange_button.setObjectName("tipButton")
        self.parser_action_button.setObjectName("tipButton")
        self.parser_status.setObjectName("parserStatus")

        self.setStyleSheet(
            "#mainSplitter::handle{background-color:rgba(50,50,50,100)}"
            "#actionSplitter::handle{background-color:rgba(50,50,50,100)}"
            "#tipButton{border:none;color:rgb(220,100,100)}"
            "#spiderStatus,#parserStatus{font-size:16px;font-weight:bold;color:rgb(230,50,50)}"
        )
예제 #18
0
import itertools

from PySide2.QtGui import QPen, QBrush, QColor

colors = ["#D34C75", "#E9C13B", "#0A92AC", "#8662EA"]
pens = [QPen(QColor(color)) for color in colors]
brushes = [QBrush(QColor(color)) for color in colors]

COLOR_BKG_EMPTY = "#1D1D1D"
QCOLOR_BKG_EMPTY = QColor(COLOR_BKG_EMPTY)
BRUSH_EMPTY = QBrush(QCOLOR_BKG_EMPTY)

COLOR_EMPTY = "#4D4D4D"
QCOLOR_EMPTY = QColor(COLOR_EMPTY)
PEN_EMPTY = QPen(QCOLOR_EMPTY)
PEN_BLACK = QPen(QColor("#000"))
PEN_BCK = QPen("#2D2D2D")
PEN_LIGHT = QPen("#8A9199")
PEN_WARNING = QPen("#C3486B")

next_pen = itertools.cycle(pens)
next_brush = itertools.cycle(brushes)
예제 #19
0
      dataRandomY[i] = uniform(0.0,1.0)-0.5+dataRandomY[max(0,i-1)]
    
    rMax = max (dataRandomY)
    rMin = min(dataRandomY)
    rAbs = max(abs(rMax),abs(rMin))
    rInt = int(round(rAbs))

    x3 = [1,2,3,4]
    y3 = [2.0,2.5, 4.0,1.5]

    # create and configure plottables:
    mainGraphCos = customPlot.addGraph(wideAxisRect.axis(QCPAxis.atBottom), wideAxisRect.axis(QCPAxis.atLeft))
    mainGraphCos.setData(dataCosX, dataCosY)
    mainGraphCos.valueAxis().setRange(-1, 1)
    mainGraphCos.rescaleKeyAxis()
    mainGraphCos.setScatterStyle(QCPScatterStyle(QCPScatterStyle.ssCircle, QPen(Qt.black), QBrush(Qt.white), 6))
    mainGraphCos.setPen(QPen(QColor(120, 120, 120), 2))


    mainGraphGauss = customPlot.addGraph(wideAxisRect.axis(QCPAxis.atBottom), wideAxisRect.axis(QCPAxis.atLeft, 1))
    mainGraphGauss.setData(dataGaussX, dataGaussY)
    mainGraphGauss.setPen(QPen(QColor("#8070B8"), 2))
    mainGraphGauss.setBrush(QColor(110, 170, 110, 30))
    mainGraphCos.setChannelFillGraph(mainGraphGauss)
    mainGraphCos.setBrush(QColor(255, 161, 0, 50))
    mainGraphGauss.valueAxis().setRange(0, 1000)
    mainGraphGauss.rescaleKeyAxis()

    subGraphRandom = customPlot.addGraph(subRectLeft.axis(QCPAxis.atBottom), subRectLeft.axis(QCPAxis.atLeft))
    subGraphRandom.setData(dataRandomX, dataRandomY)
    subGraphRandom.setLineStyle(QCPGraph.lsImpulse)
예제 #20
0
    def _paint_regions(self):

        cfb = self.instance.cfb_container.am_obj

        if cfb is None:
            return

        # colors
        func_color = Conf.feature_map_color_regular_function
        data_color = Conf.feature_map_color_data
        unknown_color = Conf.feature_map_color_unknown
        delimiter_color = Conf.feature_map_color_delimiter
        if self._total_size is None:
            # calculate the total number of bytes
            b = 0
            self._addr_to_region.clear()
            self._regionaddr_to_offset.clear()
            for mr in cfb.regions:
                self._addr_to_region[mr.addr] = mr
                self._regionaddr_to_offset[mr.addr] = b
                self._offset_to_regionaddr[b] = mr.addr
                b += self._adjust_region_size(mr)
            self._total_size = b

        # iterate through all items and draw the image
        offset = 0
        total_width = self.width()
        current_region = None
        height = self.height()
        print(total_width)
        for addr, obj in cfb.ceiling_items():

            # are we in a new region?
            new_region = False
            if current_region is None or not (
                    current_region.addr <= addr <
                    current_region.addr + current_region.size):
                current_region_addr = next(
                    self._addr_to_region.irange(maximum=addr, reverse=True))
                current_region = self._addr_to_region[current_region_addr]
                new_region = True

            # adjust size
            adjusted_region_size = self._adjust_region_size(current_region)
            adjusted_size = min(
                obj.size, current_region.addr + adjusted_region_size - addr)
            if adjusted_size <= 0:
                continue

            pos = offset * total_width // self._total_size
            length = adjusted_size * total_width // self._total_size
            offset += adjusted_size

            # draw a rectangle
            if isinstance(obj, Unknown):
                pen = QPen(data_color)
                brush = QBrush(data_color)
            elif isinstance(obj, Block):
                # TODO: Check if it belongs to a function or not
                pen = QPen(func_color)
                brush = QBrush(func_color)
            else:
                pen = QPen(unknown_color)
                brush = QBrush(unknown_color)
            rect = QRectF(pos, 0, length, height)
            self.view._scene.addRect(rect, pen, brush)

            # if at the beginning of a new region, draw a line
            if new_region:
                pen = QPen(delimiter_color)
                self.view._scene.addLine(pos, 0, pos, height, pen)
예제 #21
0
    def __init__(self):
        CG = self.ColorGroup
        CR = self.ColorRole

        self._brush = {}

        self._brush[CG.Active] = {
            CR.Background: QBrush(QColor.fromRgb(240, 240, 240)),
            CR.Base: QBrush(Qt.white),
            CR.Frame: QBrush(Qt.black),
            CR.Edge: QBrush(Qt.black),
            CR.Text: QBrush(Qt.black)
        }

        self._brush[CG.Selected] = {
            CR.Background: QBrush(Qt.white),
            CR.Base: QBrush(QColor.fromRgb(247, 247, 255)),
            CR.Frame: QBrush(QColor.fromRgb(0, 0, 200)),
            CR.Edge: QBrush(QColor.fromRgb(0, 0, 200)),
            CR.Text: QBrush(Qt.black)
        }

        self._brush[CG.Disabled] = {}
        self._brush[CG.Inactive] = {}

        # Copy Active group to other ones
        for key in self._brush[CG.Active]:
            self._brush[CG.Disabled][key] = QBrush(self._brush[CG.Active][key])
            self._brush[CG.Inactive][key] = QBrush(self._brush[CG.Active][key])

        self._current_color_group = CG.Active
예제 #22
0
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1353, 736)
        MainWindow.setMinimumSize(QSize(1353, 736))
        MainWindow.setMaximumSize(QSize(1353, 736))
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.wave_form_group_box = QGroupBox(self.centralwidget)
        self.wave_form_group_box.setObjectName(u"wave_form_group_box")
        self.wave_form_group_box.setGeometry(QRect(261, 13, 841, 491))
        font = QFont()
        font.setFamily(u"\u9ed1\u4f53")
        font.setPointSize(12)
        self.wave_form_group_box.setFont(font)
        self.wave_form_group_box.setAlignment(Qt.AlignCenter)
        self.tabWidget = QTabWidget(self.wave_form_group_box)
        self.tabWidget.setObjectName(u"tabWidget")
        self.tabWidget.setGeometry(QRect(10, 20, 821, 461))
        self.tabWidget.setFont(font)
        self.tabWidget.setMovable(True)
        self.dialysis_widget = QWidget()
        self.dialysis_widget.setObjectName(u"dialysis_widget")
        self.dialysis_pressure_plot_view = PlotWidget(self.dialysis_widget)
        self.dialysis_pressure_plot_view.setObjectName(u"dialysis_pressure_plot_view")
        self.dialysis_pressure_plot_view.setGeometry(QRect(10, 10, 801, 411))
        self.tabWidget.addTab(self.dialysis_widget, "")
        self.dialysis_flow_widget = QWidget()
        self.dialysis_flow_widget.setObjectName(u"dialysis_flow_widget")
        self.dialysis_flow_plot_view = PlotWidget(self.dialysis_flow_widget)
        self.dialysis_flow_plot_view.setObjectName(u"dialysis_flow_plot_view")
        self.dialysis_flow_plot_view.setGeometry(QRect(10, 10, 801, 411))
        self.tabWidget.addTab(self.dialysis_flow_widget, "")
        self.pluse_widget = QWidget()
        self.pluse_widget.setObjectName(u"pluse_widget")
        self.pluse_plot_view = PlotWidget(self.pluse_widget)
        self.pluse_plot_view.setObjectName(u"pluse_plot_view")
        self.pluse_plot_view.setGeometry(QRect(10, 10, 801, 411))
        self.tabWidget.addTab(self.pluse_widget, "")
        self.weight_view = QWidget()
        self.weight_view.setObjectName(u"weight_view")
        self.weight_plot_view = PlotWidget(self.weight_view)
        self.weight_plot_view.setObjectName(u"weight_plot_view")
        self.weight_plot_view.setGeometry(QRect(10, 10, 801, 411))
        self.tabWidget.addTab(self.weight_view, "")
        self.tmp_widget = QWidget()
        self.tmp_widget.setObjectName(u"tmp_widget")
        self.tmp_plot_view = PlotWidget(self.tmp_widget)
        self.tmp_plot_view.setObjectName(u"tmp_plot_view")
        self.tmp_plot_view.setGeometry(QRect(10, 10, 801, 411))
        self.tabWidget.addTab(self.tmp_widget, "")
        self.value_group_box = QGroupBox(self.centralwidget)
        self.value_group_box.setObjectName(u"value_group_box")
        self.value_group_box.setGeometry(QRect(1113, 14, 231, 681))
        self.value_group_box.setFont(font)
        self.gridLayoutWidget_2 = QWidget(self.value_group_box)
        self.gridLayoutWidget_2.setObjectName(u"gridLayoutWidget_2")
        self.gridLayoutWidget_2.setGeometry(QRect(10, 29, 211, 641))
        self.gridLayout_2 = QGridLayout(self.gridLayoutWidget_2)
        self.gridLayout_2.setObjectName(u"gridLayout_2")
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.waste_flow_label = QLabel(self.gridLayoutWidget_2)
        self.waste_flow_label.setObjectName(u"waste_flow_label")
        self.waste_flow_label.setFont(font)
        self.waste_flow_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.waste_flow_label, 6, 0, 1, 1)

        self.fresh_flow_label = QLabel(self.gridLayoutWidget_2)
        self.fresh_flow_label.setObjectName(u"fresh_flow_label")
        self.fresh_flow_label.setFont(font)

        self.gridLayout_2.addWidget(self.fresh_flow_label, 4, 0, 1, 1)

        self.waste_flow_value = QLabel(self.gridLayoutWidget_2)
        self.waste_flow_value.setObjectName(u"waste_flow_value")
        self.waste_flow_value.setFont(font)
        self.waste_flow_value.setStyleSheet(u"background-color: rgb(255, 255, 255);\n"
"color: rgb(30, 71, 255);")
        self.waste_flow_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.waste_flow_value, 6, 1, 1, 1)

        self.fresh_pressure_value = QLabel(self.gridLayoutWidget_2)
        self.fresh_pressure_value.setObjectName(u"fresh_pressure_value")
        self.fresh_pressure_value.setFont(font)
        self.fresh_pressure_value.setStyleSheet(u"background-color: rgb(255, 255, 255);")
        self.fresh_pressure_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.fresh_pressure_value, 1, 1, 1, 1)

        self.artery_pressure_value = QLabel(self.gridLayoutWidget_2)
        self.artery_pressure_value.setObjectName(u"artery_pressure_value")
        self.artery_pressure_value.setFont(font)
        self.artery_pressure_value.setStyleSheet(u"background-color: rgb(255, 255, 255);")
        self.artery_pressure_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.artery_pressure_value, 9, 1, 1, 1)

        self.fresh_pressure_label = QLabel(self.gridLayoutWidget_2)
        self.fresh_pressure_label.setObjectName(u"fresh_pressure_label")
        self.fresh_pressure_label.setFont(font)
        self.fresh_pressure_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.fresh_pressure_label, 1, 0, 1, 1)

        self.process_temperature_label = QLabel(self.gridLayoutWidget_2)
        self.process_temperature_label.setObjectName(u"process_temperature_label")
        self.process_temperature_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.process_temperature_label, 16, 0, 1, 1)

        self.artery_pressure_label = QLabel(self.gridLayoutWidget_2)
        self.artery_pressure_label.setObjectName(u"artery_pressure_label")
        self.artery_pressure_label.setFont(font)
        self.artery_pressure_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.artery_pressure_label, 9, 0, 1, 1)

        self.waste_pressure_vlue = QLabel(self.gridLayoutWidget_2)
        self.waste_pressure_vlue.setObjectName(u"waste_pressure_vlue")
        self.waste_pressure_vlue.setFont(font)
        self.waste_pressure_vlue.setStyleSheet(u"background-color: rgb(255, 255, 255);\n"
"color: rgb(30, 71, 255);")
        self.waste_pressure_vlue.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.waste_pressure_vlue, 3, 1, 1, 1)

        self.vein_pressure_value = QLabel(self.gridLayoutWidget_2)
        self.vein_pressure_value.setObjectName(u"vein_pressure_value")
        self.vein_pressure_value.setFont(font)
        self.vein_pressure_value.setStyleSheet(u"background-color: rgb(255, 255, 255);\n"
"color: rgb(30, 71, 255);")
        self.vein_pressure_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.vein_pressure_value, 10, 1, 1, 1)

        self.fresh_flow_value = QLabel(self.gridLayoutWidget_2)
        self.fresh_flow_value.setObjectName(u"fresh_flow_value")
        self.fresh_flow_value.setFont(font)
        self.fresh_flow_value.setStyleSheet(u"background-color: rgb(255, 255, 255);")
        self.fresh_flow_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.fresh_flow_value, 4, 1, 1, 1)

        self.vein_pressure_label = QLabel(self.gridLayoutWidget_2)
        self.vein_pressure_label.setObjectName(u"vein_pressure_label")
        self.vein_pressure_label.setFont(font)
        self.vein_pressure_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.vein_pressure_label, 10, 0, 1, 1)

        self.waste_pressure_label = QLabel(self.gridLayoutWidget_2)
        self.waste_pressure_label.setObjectName(u"waste_pressure_label")
        self.waste_pressure_label.setFont(font)
        self.waste_pressure_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.waste_pressure_label, 3, 0, 1, 1)

        self.initial_temperature_label = QLabel(self.gridLayoutWidget_2)
        self.initial_temperature_label.setObjectName(u"initial_temperature_label")
        self.initial_temperature_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.initial_temperature_label, 15, 0, 1, 1)

        self.ultrafiltration_show_label = QLabel(self.gridLayoutWidget_2)
        self.ultrafiltration_show_label.setObjectName(u"ultrafiltration_show_label")
        self.ultrafiltration_show_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.ultrafiltration_show_label, 17, 0, 1, 1)

        self.initial_temperature_value = QLabel(self.gridLayoutWidget_2)
        self.initial_temperature_value.setObjectName(u"initial_temperature_value")
        self.initial_temperature_value.setStyleSheet(u"background-color: rgb(255, 255, 255);\n"
"color: rgb(30, 71, 255);")
        self.initial_temperature_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.initial_temperature_value, 15, 1, 1, 1)

        self.process_temperature_value = QLabel(self.gridLayoutWidget_2)
        self.process_temperature_value.setObjectName(u"process_temperature_value")
        self.process_temperature_value.setStyleSheet(u"background-color: rgb(255, 255, 255);")
        self.process_temperature_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.process_temperature_value, 16, 1, 1, 1)

        self.ultrafiltration_show_value = QLabel(self.gridLayoutWidget_2)
        self.ultrafiltration_show_value.setObjectName(u"ultrafiltration_show_value")
        self.ultrafiltration_show_value.setStyleSheet(u"background-color: rgb(255, 255, 255);\n"
"color: rgb(30, 71, 255);")
        self.ultrafiltration_show_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.ultrafiltration_show_value, 17, 1, 1, 1)

        self.blood_flow_label = QLabel(self.gridLayoutWidget_2)
        self.blood_flow_label.setObjectName(u"blood_flow_label")
        self.blood_flow_label.setFont(font)
        self.blood_flow_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.blood_flow_label, 7, 0, 1, 1)

        self.blood_flow_value = QLabel(self.gridLayoutWidget_2)
        self.blood_flow_value.setObjectName(u"blood_flow_value")
        self.blood_flow_value.setFont(font)
        self.blood_flow_value.setStyleSheet(u"background-color: rgb(255, 255, 255);")
        self.blood_flow_value.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.blood_flow_value, 7, 1, 1, 1)

        self.setting_group_box = QGroupBox(self.centralwidget)
        self.setting_group_box.setObjectName(u"setting_group_box")
        self.setting_group_box.setGeometry(QRect(10, 510, 1091, 181))
        font1 = QFont()
        font1.setFamily(u"\u9ed1\u4f53")
        font1.setPointSize(12)
        font1.setBold(False)
        font1.setWeight(50)
        self.setting_group_box.setFont(font1)
        self.setting_group_box.setAlignment(Qt.AlignCenter)
        self.setting_group_box.setFlat(False)
        self.setting_group_box.setCheckable(False)
        self.horizontalLayout = QHBoxLayout(self.setting_group_box)
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.gridLayout_6 = QGridLayout()
        self.gridLayout_6.setObjectName(u"gridLayout_6")
        self.fresh_waste_forward_button = QPushButton(self.setting_group_box)
        self.fresh_waste_forward_button.setObjectName(u"fresh_waste_forward_button")
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.fresh_waste_forward_button.sizePolicy().hasHeightForWidth())
        self.fresh_waste_forward_button.setSizePolicy(sizePolicy)
        self.fresh_waste_forward_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_6.addWidget(self.fresh_waste_forward_button, 3, 0, 1, 1)

        self.fresh_waste_edit = QLineEdit(self.setting_group_box)
        self.fresh_waste_edit.setObjectName(u"fresh_waste_edit")
        self.fresh_waste_edit.setAlignment(Qt.AlignCenter)

        self.gridLayout_6.addWidget(self.fresh_waste_edit, 2, 0, 1, 2)

        self.fresh_waste_label = QLabel(self.setting_group_box)
        self.fresh_waste_label.setObjectName(u"fresh_waste_label")
        self.fresh_waste_label.setFont(font1)
        self.fresh_waste_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_6.addWidget(self.fresh_waste_label, 1, 0, 1, 2)

        self.fresh_waste_reverse_button = QPushButton(self.setting_group_box)
        self.fresh_waste_reverse_button.setObjectName(u"fresh_waste_reverse_button")
        sizePolicy.setHeightForWidth(self.fresh_waste_reverse_button.sizePolicy().hasHeightForWidth())
        self.fresh_waste_reverse_button.setSizePolicy(sizePolicy)
        self.fresh_waste_reverse_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_6.addWidget(self.fresh_waste_reverse_button, 3, 1, 1, 1)

        self.fresh_waste_stop_button = QPushButton(self.setting_group_box)
        self.fresh_waste_stop_button.setObjectName(u"fresh_waste_stop_button")
        sizePolicy.setHeightForWidth(self.fresh_waste_stop_button.sizePolicy().hasHeightForWidth())
        self.fresh_waste_stop_button.setSizePolicy(sizePolicy)
        self.fresh_waste_stop_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_6.addWidget(self.fresh_waste_stop_button, 4, 0, 1, 2)


        self.horizontalLayout.addLayout(self.gridLayout_6)

        self.gridLayout_7 = QGridLayout()
        self.gridLayout_7.setObjectName(u"gridLayout_7")
        self.fresh_forward_button = QPushButton(self.setting_group_box)
        self.fresh_forward_button.setObjectName(u"fresh_forward_button")
        sizePolicy.setHeightForWidth(self.fresh_forward_button.sizePolicy().hasHeightForWidth())
        self.fresh_forward_button.setSizePolicy(sizePolicy)
        self.fresh_forward_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_7.addWidget(self.fresh_forward_button, 3, 0, 1, 1)

        self.fresh_edit = QLineEdit(self.setting_group_box)
        self.fresh_edit.setObjectName(u"fresh_edit")
        self.fresh_edit.setAlignment(Qt.AlignCenter)

        self.gridLayout_7.addWidget(self.fresh_edit, 2, 0, 1, 2)

        self.fresh_label = QLabel(self.setting_group_box)
        self.fresh_label.setObjectName(u"fresh_label")
        self.fresh_label.setFont(font1)
        self.fresh_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_7.addWidget(self.fresh_label, 1, 0, 1, 2)

        self.fresh_reverse_button = QPushButton(self.setting_group_box)
        self.fresh_reverse_button.setObjectName(u"fresh_reverse_button")
        sizePolicy.setHeightForWidth(self.fresh_reverse_button.sizePolicy().hasHeightForWidth())
        self.fresh_reverse_button.setSizePolicy(sizePolicy)
        self.fresh_reverse_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_7.addWidget(self.fresh_reverse_button, 3, 1, 1, 1)

        self.fresh_stop_button = QPushButton(self.setting_group_box)
        self.fresh_stop_button.setObjectName(u"fresh_stop_button")
        sizePolicy.setHeightForWidth(self.fresh_stop_button.sizePolicy().hasHeightForWidth())
        self.fresh_stop_button.setSizePolicy(sizePolicy)
        self.fresh_stop_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_7.addWidget(self.fresh_stop_button, 4, 0, 1, 2)


        self.horizontalLayout.addLayout(self.gridLayout_7)

        self.gridLayout_8 = QGridLayout()
        self.gridLayout_8.setObjectName(u"gridLayout_8")
        self.waste_forward_button = QPushButton(self.setting_group_box)
        self.waste_forward_button.setObjectName(u"waste_forward_button")
        sizePolicy.setHeightForWidth(self.waste_forward_button.sizePolicy().hasHeightForWidth())
        self.waste_forward_button.setSizePolicy(sizePolicy)
        self.waste_forward_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_8.addWidget(self.waste_forward_button, 3, 0, 1, 1)

        self.waste_edit = QLineEdit(self.setting_group_box)
        self.waste_edit.setObjectName(u"waste_edit")
        self.waste_edit.setAlignment(Qt.AlignCenter)

        self.gridLayout_8.addWidget(self.waste_edit, 2, 0, 1, 2)

        self.waste_label = QLabel(self.setting_group_box)
        self.waste_label.setObjectName(u"waste_label")
        self.waste_label.setFont(font1)
        self.waste_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_8.addWidget(self.waste_label, 1, 0, 1, 2)

        self.waste_reverse_button = QPushButton(self.setting_group_box)
        self.waste_reverse_button.setObjectName(u"waste_reverse_button")
        sizePolicy.setHeightForWidth(self.waste_reverse_button.sizePolicy().hasHeightForWidth())
        self.waste_reverse_button.setSizePolicy(sizePolicy)
        self.waste_reverse_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_8.addWidget(self.waste_reverse_button, 3, 1, 1, 1)

        self.waste_stop_button = QPushButton(self.setting_group_box)
        self.waste_stop_button.setObjectName(u"waste_stop_button")
        sizePolicy.setHeightForWidth(self.waste_stop_button.sizePolicy().hasHeightForWidth())
        self.waste_stop_button.setSizePolicy(sizePolicy)
        self.waste_stop_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_8.addWidget(self.waste_stop_button, 4, 0, 1, 2)


        self.horizontalLayout.addLayout(self.gridLayout_8)

        self.gridLayout_9 = QGridLayout()
        self.gridLayout_9.setObjectName(u"gridLayout_9")
        self.blood_forward_button = QPushButton(self.setting_group_box)
        self.blood_forward_button.setObjectName(u"blood_forward_button")
        sizePolicy.setHeightForWidth(self.blood_forward_button.sizePolicy().hasHeightForWidth())
        self.blood_forward_button.setSizePolicy(sizePolicy)
        self.blood_forward_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_9.addWidget(self.blood_forward_button, 3, 0, 1, 1)

        self.blood_edit = QLineEdit(self.setting_group_box)
        self.blood_edit.setObjectName(u"blood_edit")
        self.blood_edit.setAlignment(Qt.AlignCenter)

        self.gridLayout_9.addWidget(self.blood_edit, 2, 0, 1, 2)

        self.blood_label = QLabel(self.setting_group_box)
        self.blood_label.setObjectName(u"blood_label")
        self.blood_label.setFont(font1)
        self.blood_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_9.addWidget(self.blood_label, 1, 0, 1, 2)

        self.blood_reverse_button = QPushButton(self.setting_group_box)
        self.blood_reverse_button.setObjectName(u"blood_reverse_button")
        sizePolicy.setHeightForWidth(self.blood_reverse_button.sizePolicy().hasHeightForWidth())
        self.blood_reverse_button.setSizePolicy(sizePolicy)
        self.blood_reverse_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_9.addWidget(self.blood_reverse_button, 3, 1, 1, 1)

        self.blood_stop_button = QPushButton(self.setting_group_box)
        self.blood_stop_button.setObjectName(u"blood_stop_button")
        sizePolicy.setHeightForWidth(self.blood_stop_button.sizePolicy().hasHeightForWidth())
        self.blood_stop_button.setSizePolicy(sizePolicy)
        self.blood_stop_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_9.addWidget(self.blood_stop_button, 4, 0, 1, 2)


        self.horizontalLayout.addLayout(self.gridLayout_9)

        self.gridLayout_5 = QGridLayout()
        self.gridLayout_5.setObjectName(u"gridLayout_5")
        self.ultrafiltration_label = QLabel(self.setting_group_box)
        self.ultrafiltration_label.setObjectName(u"ultrafiltration_label")
        self.ultrafiltration_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_5.addWidget(self.ultrafiltration_label, 0, 0, 1, 2)

        self.ultrafiltration_reverse_button = QPushButton(self.setting_group_box)
        self.ultrafiltration_reverse_button.setObjectName(u"ultrafiltration_reverse_button")
        sizePolicy.setHeightForWidth(self.ultrafiltration_reverse_button.sizePolicy().hasHeightForWidth())
        self.ultrafiltration_reverse_button.setSizePolicy(sizePolicy)
        self.ultrafiltration_reverse_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_5.addWidget(self.ultrafiltration_reverse_button, 2, 1, 1, 1)

        self.ultrafiltration_forward_button = QPushButton(self.setting_group_box)
        self.ultrafiltration_forward_button.setObjectName(u"ultrafiltration_forward_button")
        sizePolicy.setHeightForWidth(self.ultrafiltration_forward_button.sizePolicy().hasHeightForWidth())
        self.ultrafiltration_forward_button.setSizePolicy(sizePolicy)
        self.ultrafiltration_forward_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_5.addWidget(self.ultrafiltration_forward_button, 2, 0, 1, 1)

        self.ultrafiltration_edit = QLineEdit(self.setting_group_box)
        self.ultrafiltration_edit.setObjectName(u"ultrafiltration_edit")
        self.ultrafiltration_edit.setAlignment(Qt.AlignCenter)

        self.gridLayout_5.addWidget(self.ultrafiltration_edit, 1, 0, 1, 2)

        self.ultrafiltration_stop_button = QPushButton(self.setting_group_box)
        self.ultrafiltration_stop_button.setObjectName(u"ultrafiltration_stop_button")
        sizePolicy.setHeightForWidth(self.ultrafiltration_stop_button.sizePolicy().hasHeightForWidth())
        self.ultrafiltration_stop_button.setSizePolicy(sizePolicy)
        self.ultrafiltration_stop_button.setMinimumSize(QSize(50, 30))

        self.gridLayout_5.addWidget(self.ultrafiltration_stop_button, 3, 0, 1, 2)


        self.horizontalLayout.addLayout(self.gridLayout_5)

        self.gridLayout_3 = QGridLayout()
        self.gridLayout_3.setObjectName(u"gridLayout_3")
        self.debug_send_button = QPushButton(self.setting_group_box)
        self.debug_send_button.setObjectName(u"debug_send_button")
        sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum)
        sizePolicy1.setHorizontalStretch(0)
        sizePolicy1.setVerticalStretch(0)
        sizePolicy1.setHeightForWidth(self.debug_send_button.sizePolicy().hasHeightForWidth())
        self.debug_send_button.setSizePolicy(sizePolicy1)
        self.debug_send_button.setMinimumSize(QSize(50, 25))

        self.gridLayout_3.addWidget(self.debug_send_button, 2, 0, 1, 2)

        self.debug_send_label = QLabel(self.setting_group_box)
        self.debug_send_label.setObjectName(u"debug_send_label")
        self.debug_send_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_3.addWidget(self.debug_send_label, 0, 0, 1, 2)

        self.debug_send_edit = QLineEdit(self.setting_group_box)
        self.debug_send_edit.setObjectName(u"debug_send_edit")
        self.debug_send_edit.setAlignment(Qt.AlignCenter)

        self.gridLayout_3.addWidget(self.debug_send_edit, 1, 0, 1, 2)


        self.horizontalLayout.addLayout(self.gridLayout_3)

        self.serial_group_box = QGroupBox(self.centralwidget)
        self.serial_group_box.setObjectName(u"serial_group_box")
        self.serial_group_box.setGeometry(QRect(10, 12, 241, 491))
        self.serial_group_box.setFont(font)
        self.gridLayoutWidget = QWidget(self.serial_group_box)
        self.gridLayoutWidget.setObjectName(u"gridLayoutWidget")
        self.gridLayoutWidget.setGeometry(QRect(7, 26, 231, 461))
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setObjectName(u"gridLayout")
        self.gridLayout.setSizeConstraint(QLayout.SetDefaultConstraint)
        self.gridLayout.setHorizontalSpacing(3)
        self.gridLayout.setVerticalSpacing(10)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.all_send_button = QPushButton(self.gridLayoutWidget)
        self.all_send_button.setObjectName(u"all_send_button")
        self.all_send_button.setFont(font)

        self.gridLayout.addWidget(self.all_send_button, 3, 1, 1, 2)

        self.open_serial_button = QPushButton(self.gridLayoutWidget)
        self.open_serial_button.setObjectName(u"open_serial_button")
        self.open_serial_button.setFont(font)
        self.open_serial_button.setIconSize(QSize(20, 40))

        self.gridLayout.addWidget(self.open_serial_button, 1, 2, 1, 1)

        self.find_port_button = QPushButton(self.gridLayoutWidget)
        self.find_port_button.setObjectName(u"find_port_button")
        self.find_port_button.setFont(font)

        self.gridLayout.addWidget(self.find_port_button, 2, 1, 1, 2)

        self.system_status_label = QLabel(self.gridLayoutWidget)
        self.system_status_label.setObjectName(u"system_status_label")
        palette = QPalette()
        brush = QBrush(QColor(128, 128, 128, 255))
        brush.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Button, brush)
        palette.setBrush(QPalette.Active, QPalette.Base, brush)
        palette.setBrush(QPalette.Active, QPalette.Window, brush)
        palette.setBrush(QPalette.Inactive, QPalette.Button, brush)
        palette.setBrush(QPalette.Inactive, QPalette.Base, brush)
        palette.setBrush(QPalette.Inactive, QPalette.Window, brush)
        palette.setBrush(QPalette.Disabled, QPalette.Button, brush)
        palette.setBrush(QPalette.Disabled, QPalette.Base, brush)
        palette.setBrush(QPalette.Disabled, QPalette.Window, brush)
        self.system_status_label.setPalette(palette)
        self.system_status_label.setStyleSheet(u"background-color: gray;")
        self.system_status_label.setProperty("isOn", True)

        self.gridLayout.addWidget(self.system_status_label, 5, 1, 1, 1)

        self.port_combo_box = QComboBox(self.gridLayoutWidget)
        self.port_combo_box.setObjectName(u"port_combo_box")
        font2 = QFont()
        font2.setFamily(u"\u5b8b\u4f53")
        font2.setPointSize(11)
        self.port_combo_box.setFont(font2)
        self.port_combo_box.setIconSize(QSize(30, 20))

        self.gridLayout.addWidget(self.port_combo_box, 0, 2, 1, 1)

        self.port_status_label = QLabel(self.gridLayoutWidget)
        self.port_status_label.setObjectName(u"port_status_label")
        palette1 = QPalette()
        palette1.setBrush(QPalette.Active, QPalette.Button, brush)
        palette1.setBrush(QPalette.Active, QPalette.Base, brush)
        palette1.setBrush(QPalette.Active, QPalette.Window, brush)
        palette1.setBrush(QPalette.Inactive, QPalette.Button, brush)
        palette1.setBrush(QPalette.Inactive, QPalette.Base, brush)
        palette1.setBrush(QPalette.Inactive, QPalette.Window, brush)
        palette1.setBrush(QPalette.Disabled, QPalette.Button, brush)
        palette1.setBrush(QPalette.Disabled, QPalette.Base, brush)
        palette1.setBrush(QPalette.Disabled, QPalette.Window, brush)
        self.port_status_label.setPalette(palette1)
        self.port_status_label.setStyleSheet(u"background-color: gray;")
        self.port_status_label.setProperty("isOn", True)

        self.gridLayout.addWidget(self.port_status_label, 1, 1, 1, 1)

        self.start_stop_button = QPushButton(self.gridLayoutWidget)
        self.start_stop_button.setObjectName(u"start_stop_button")
        self.start_stop_button.setFont(font)

        self.gridLayout.addWidget(self.start_stop_button, 5, 2, 1, 1)

        self.port_label = QLabel(self.gridLayoutWidget)
        self.port_label.setObjectName(u"port_label")
        self.port_label.setFont(font)

        self.gridLayout.addWidget(self.port_label, 0, 1, 1, 1)

        self.receive_button = QPushButton(self.gridLayoutWidget)
        self.receive_button.setObjectName(u"receive_button")
        self.receive_button.setFont(font)
        self.receive_button.setIconSize(QSize(16, 16))

        self.gridLayout.addWidget(self.receive_button, 4, 1, 1, 2)

        self.quit_button = QPushButton(self.gridLayoutWidget)
        self.quit_button.setObjectName(u"quit_button")
        self.quit_button.setFont(font)

        self.gridLayout.addWidget(self.quit_button, 14, 1, 2, 2)

        self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)

        self.gridLayout.addItem(self.verticalSpacer, 13, 1, 1, 2)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 1353, 26))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        self.tabWidget.setCurrentIndex(0)


        QMetaObject.connectSlotsByName(MainWindow)
예제 #23
0
 def __setBrushColor(self, item):  ##设置填充颜色
     color = item.brush().__color()
     color = QColorDialog.getColor(color, self,
                                   self._tr("MainWindow", "选择填充颜色"))
     if color.isValid():
         item.setBrush(QBrush(color))
예제 #24
0
 def paintEvent(self, e):
     """
     Overrides QLabel paintEvent().
     Displays the presentation layer of a vImage object,
     with its current offset and zooming coefficient.
     @param e: paint event
     @type e:
     """
     mimg = self.img
     if mimg is None:
         return
     r = mimg.resize_coeff(self)
     qp = self.qp
     window = self.window
     qp.begin(self)
     # smooth painting
     qp.setRenderHint(QPainter.SmoothPixmapTransform)  # TODO may be useless
     # fill background
     qp.fillRect(QRect(0, 0, self.width(), self.height()),
                 vImage.defaultBgColor)
     # draw presentation layer.
     # As offsets can be float numbers, we use a QRectF instead of a QRect.
     # r is relative to the full resolution image, so we use mimg width and height
     w, h = mimg.width() * r, mimg.height() * r
     rectF = QRectF(mimg.xOffset, mimg.yOffset, w, h)
     # draw a checker background to view (semi-)transparent images
     qp.fillRect(rectF, imageLabel.checkerBrush)
     px = mimg.prLayer.qPixmap
     if px is not None:
         qp.drawPixmap(rectF, px, px.rect())
     else:
         currentImage = mimg.prLayer.getCurrentImage()
         qp.drawImage(
             rectF, currentImage, QImage.rect(currentImage)
         )  # CAUTION : vImage.rect() is overwritten by the attribute rect
     # draw selection rectangle and cloning marker of the active layer, if any
     layer = mimg.getActiveLayer()
     rect, mark = layer.rect, layer.marker
     if layer.visible:
         if rect is not None:
             qp.setPen(Qt.green)
             qp.drawRect(rect.left() * r + mimg.xOffset,
                         rect.top() * r + mimg.yOffset,
                         rect.width() * r,
                         rect.height() * r)
         if not (mark is None or layer.sourceFromFile):
             qp.setPen(Qt.white)
             qp.drawEllipse(mark.x() * r + mimg.xOffset,
                            mark.y() * r + mimg.yOffset, 10, 10)
     # draw the cropping marks
     lm, rm, tm, bm = 0, 0, 0, 0
     if mimg.isCropped:
         c = QColor(128, 128, 128, 192)
         lm = window.cropTool.btnDict['left'].margin * r
         rm = window.cropTool.btnDict['right'].margin * r
         tm = window.cropTool.btnDict['top'].margin * r
         bm = window.cropTool.btnDict['bottom'].margin * r
         qp.fillRect(QRectF(mimg.xOffset, mimg.yOffset, lm, h), c)  # left
         qp.fillRect(QRectF(mimg.xOffset + lm, mimg.yOffset, w - lm, tm),
                     c)  # top
         qp.fillRect(
             QRectF(mimg.xOffset + w - rm, mimg.yOffset + tm, rm, h - tm),
             c)  # right
         qp.fillRect(
             QRectF(mimg.xOffset + lm, mimg.yOffset + h - bm, w - lm - rm,
                    bm), c)  # bottom
     # draw rulers
     if mimg.isRuled:
         deltaX, deltaY = (w - lm - rm) // 3, (h - tm - bm) // 3
         qp.drawLine(lm + mimg.xOffset, deltaY + tm + mimg.yOffset,
                     w - rm + mimg.xOffset, deltaY + tm + mimg.yOffset)
         qp.drawLine(lm + mimg.xOffset, 2 * deltaY + tm + mimg.yOffset,
                     w - rm + mimg.xOffset, 2 * deltaY + tm + mimg.yOffset)
         qp.drawLine(deltaX + lm + mimg.xOffset, tm + mimg.yOffset,
                     deltaX + lm + mimg.xOffset, h - bm + mimg.yOffset)
         qp.drawLine(2 * deltaX + lm + mimg.xOffset, tm + mimg.yOffset,
                     2 * deltaX + lm + mimg.xOffset, h - bm + mimg.yOffset)
     # tag before/after views
     name = self.objectName()
     if name == "label_2" or name == "label_3":
         # draw filled rect
         qp.fillPath(qp.markPath, QBrush(Qt.gray))
         # draw text
         qp.setPen(Qt.white)
         qp.setFont(qp.font)
         qp.drawText(qp.markRect, Qt.AlignCenter | Qt.AlignVCenter,
                     "Before" if name == "label_2" else "After")
     qp.end()
예제 #25
0
 def addSubtitle(self, index):
     subtitlePath = QFileDialog.getOpenFileName(self, "请选择字幕", None, "字幕文件 (*.srt *.vtt *.ass *.ssa)")[0]
     if subtitlePath:
         self.initProcess.show()
         self.subtitle.cellChanged.disconnect(self.subEdit)
         if subtitlePath.endswith('.ass') or subtitlePath.endswith('.ssa'):
             p = subprocess.Popen(['utils/ffmpeg.exe', '-y', '-i', subtitlePath, 'temp_sub.srt'])
             p.wait()
             subtitlePath = 'temp_sub.srt'
         subData = {}
         with open(subtitlePath, 'r', encoding='utf-8') as f:
             f = f.readlines()
         subText = ''
         YoutubeAutoSub = False
         for l in f:
             if '<c>' in l:
                 YoutubeAutoSub = True
                 break
         for cnt, l in enumerate(f):
             if '<c>' in l:
                 lineData = l.split('c>')
                 if len(lineData) > 3:
                     subText, start, _ = lineData[0].split('<')
                     start = calSubTime(start[:-1]) // self.globalInterval * self.globalInterval
                     if start not in self.subtitleDict[index]:
                         end = calSubTime(lineData[-3][1:-2]) // self.globalInterval * self.globalInterval
                         for i in range(len(lineData) // 2):
                             subText += lineData[i * 2 + 1][:-2]
                         subData[start] = [end - start, subText]
                 else:
                     subText, start, _ = lineData[0].split('<')
                     start = calSubTime(start[:-1]) // self.globalInterval * self.globalInterval
                     if start not in self.subtitleDict[index]:
                         subText += lineData[1][:-2]
                         subData[start] = [self.globalInterval, subText]
             elif '-->' in l and f[cnt + 2].strip() and '<c>' not in f[cnt + 2]:
                 subText = f[cnt + 2][:-1]
                 start = calSubTime(l[:12]) // self.globalInterval * self.globalInterval
                 if start not in self.subtitleDict[index]:
                     end = calSubTime(l[17:29]) // self.globalInterval * self.globalInterval
                     subData[start] = [end - start, subText]
             if '-->' in l and f[cnt + 1].strip() and not YoutubeAutoSub:
                 start = calSubTime(l[:12]) // self.globalInterval * self.globalInterval
                 if start not in self.subtitleDict[index]:
                     end = calSubTime(l[17:29]) // self.globalInterval * self.globalInterval
                     delta = end - start
                     if delta > 10:
                         if '<b>' in f[cnt + 1]:
                             subData[start] = [delta, f[cnt + 1].split('<b>')[1].split('<')[0]]
                         else:
                             subData[start] = [delta, f[cnt + 1][:-1]]
         self.subtitleDict[index].update(subData)
         maxRow = 0
         for _, v in self.subtitleDict.items():
             startMax = max(v.keys())
             rowCount = (startMax + v[startMax][0]) // self.globalInterval
             if rowCount > maxRow:
                 maxRow = rowCount
         if maxRow < self.duration // self.globalInterval + 1:
             maxRow = self.duration // self.globalInterval
         else:
             self.duration = maxRow * self.globalInterval
         self.subtitle.setRowCount(maxRow)
         self.subtitle.setVerticalHeaderLabels([cnt2Time2(i, self.globalInterval) for i in range(self.subtitle.rowCount())])
         for start, rowData in subData.items():
             startRow = start // self.globalInterval
             endRow = startRow + rowData[0] // self.globalInterval
             for row in range(startRow, endRow):
                 self.subtitle.setItem(row, index, QTableWidgetItem(rowData[1]))
                 self.subtitle.item(row, index).setBackground(QBrush(QColor('#35545d')))
             self.subtitle.setSpan(startRow, index, endRow - startRow, 1)
         self.refreshComboBox()
         self.subtitle.cellChanged.connect(self.subEdit)
         self.initProcess.hide()
예제 #26
0
class imageLabel(QLabel):

    qp = QPainter()
    qp.font = QFont("Arial", 8)
    qp.markPath = QPainterPath()
    qp.markRect = QRect(0, 0, 50, 20)
    qp.markPath.addRoundedRect(qp.markRect, 5, 5)

    checkerBrush = QBrush(checkeredImage())

    def brushUpdate(self):
        """
        Sync the current brush/eraser with self.State
        and update the current brush sample.
        """
        bSpacing, bJitter, bOrientation = 1.0, 0.0, 0
        current = self.State.get('brush', None)
        if current is not None:
            bSpacing = current['spacing']
            bJitter = current['jitter']
            bOrientation = current['orientation']
        s = self.sender()
        if s is not None:
            name = s.objectName()
            if name == 'spacingSlider':
                bSpacing = s.value() / 10
            elif name == 'jitterSlider':
                bJitter = s.value() / 10
            elif name == 'orientationSlider':
                bOrientation = s.value() - 180
        window = self.window
        bSize = window.verticalSlider1.value()
        bOpacity = window.verticalSlider2.value() / 100
        bHardness = window.verticalSlider3.value() / 100
        bFlow = window.verticalSlider4.value() / 100
        if getattr(window, 'colorChooser', None):
            bColor = window.colorChooser.selectedColor()
        else:
            bColor = Qt.black
        if window.btnValues['eraserButton']:
            self.State[''] = window.brushes[-1].getBrush(
                bSize, bOpacity, bColor, bHardness, bFlow)
        else:
            pattern = window.patternCombo.currentData()
            self.State['brush'] = window.brushCombo.currentData().getBrush(
                bSize,
                bOpacity,
                bColor,
                bHardness,
                bFlow,
                spacing=bSpacing,
                jitter=bJitter,
                orientation=bOrientation,
                pattern=pattern)
        # record current brush into layer brushDict
        if self.img is not None:
            layer = self.img.getActiveLayer()
            if layer.isDrawLayer():
                layer.brushDict = self.State['brush'].copy()
                grForm = layer.getGraphicsForm()
                if grForm is not None:
                    grForm.updateSample()

    def syncBrush(self, zooming):
        """
        Sync current brush with tool bar and zoom coeff.
        Overrides or changes the application cursor.
        @param zooming:
        @type zooming: float
        """
        minSize = 16
        # bSize = self.brushUpdate()
        bSize = self.State['brush']['size']  # TODO modified 26/01/20 validate
        w = bSize * zooming
        if w >= minSize:
            cursor = QCursor(self.State['brush']['cursor'].scaled(w, w),
                             hotX=w / 2,
                             hotY=w / 2)
        else:
            d = int((minSize - w) / 2)
            cursor = QCursor(self.State['brush']['cursor'].scaled(
                minSize, minSize),
                             hotX=d,
                             hotY=d)
        if QApplication.overrideCursor():
            QApplication.changeOverrideCursor(cursor)
        else:
            QApplication.setOverrideCursor(cursor)

    def __init__(self,
                 mainForm=None,
                 splitWin=None,
                 enterAndLeave=False,
                 parent=None):
        super().__init__(parent=parent)
        self.window = mainForm
        self.splitWin = splitWin
        self.enterAndLeave = enterAndLeave
        # global state variables used in mouseEvent.
        self.pressed = False
        self.clicked = True
        self.State = {
            'ix': 0,
            'iy': 0,
            'ix_begin': 0,
            'iy_begin': 0,
            'cloning': ''
        }
        self.img = None

    def paintEvent(self, e):
        """
        Overrides QLabel paintEvent().
        Displays the presentation layer of a vImage object,
        with its current offset and zooming coefficient.
        @param e: paint event
        @type e:
        """
        mimg = self.img
        if mimg is None:
            return
        r = mimg.resize_coeff(self)
        qp = self.qp
        window = self.window
        qp.begin(self)
        # smooth painting
        qp.setRenderHint(QPainter.SmoothPixmapTransform)  # TODO may be useless
        # fill background
        qp.fillRect(QRect(0, 0, self.width(), self.height()),
                    vImage.defaultBgColor)
        # draw presentation layer.
        # As offsets can be float numbers, we use a QRectF instead of a QRect.
        # r is relative to the full resolution image, so we use mimg width and height
        w, h = mimg.width() * r, mimg.height() * r
        rectF = QRectF(mimg.xOffset, mimg.yOffset, w, h)
        # draw a checker background to view (semi-)transparent images
        qp.fillRect(rectF, imageLabel.checkerBrush)
        px = mimg.prLayer.qPixmap
        if px is not None:
            qp.drawPixmap(rectF, px, px.rect())
        else:
            currentImage = mimg.prLayer.getCurrentImage()
            qp.drawImage(
                rectF, currentImage, QImage.rect(currentImage)
            )  # CAUTION : vImage.rect() is overwritten by the attribute rect
        # draw selection rectangle and cloning marker of the active layer, if any
        layer = mimg.getActiveLayer()
        rect, mark = layer.rect, layer.marker
        if layer.visible:
            if rect is not None:
                qp.setPen(Qt.green)
                qp.drawRect(rect.left() * r + mimg.xOffset,
                            rect.top() * r + mimg.yOffset,
                            rect.width() * r,
                            rect.height() * r)
            if not (mark is None or layer.sourceFromFile):
                qp.setPen(Qt.white)
                qp.drawEllipse(mark.x() * r + mimg.xOffset,
                               mark.y() * r + mimg.yOffset, 10, 10)
        # draw the cropping marks
        lm, rm, tm, bm = 0, 0, 0, 0
        if mimg.isCropped:
            c = QColor(128, 128, 128, 192)
            lm = window.cropTool.btnDict['left'].margin * r
            rm = window.cropTool.btnDict['right'].margin * r
            tm = window.cropTool.btnDict['top'].margin * r
            bm = window.cropTool.btnDict['bottom'].margin * r
            qp.fillRect(QRectF(mimg.xOffset, mimg.yOffset, lm, h), c)  # left
            qp.fillRect(QRectF(mimg.xOffset + lm, mimg.yOffset, w - lm, tm),
                        c)  # top
            qp.fillRect(
                QRectF(mimg.xOffset + w - rm, mimg.yOffset + tm, rm, h - tm),
                c)  # right
            qp.fillRect(
                QRectF(mimg.xOffset + lm, mimg.yOffset + h - bm, w - lm - rm,
                       bm), c)  # bottom
        # draw rulers
        if mimg.isRuled:
            deltaX, deltaY = (w - lm - rm) // 3, (h - tm - bm) // 3
            qp.drawLine(lm + mimg.xOffset, deltaY + tm + mimg.yOffset,
                        w - rm + mimg.xOffset, deltaY + tm + mimg.yOffset)
            qp.drawLine(lm + mimg.xOffset, 2 * deltaY + tm + mimg.yOffset,
                        w - rm + mimg.xOffset, 2 * deltaY + tm + mimg.yOffset)
            qp.drawLine(deltaX + lm + mimg.xOffset, tm + mimg.yOffset,
                        deltaX + lm + mimg.xOffset, h - bm + mimg.yOffset)
            qp.drawLine(2 * deltaX + lm + mimg.xOffset, tm + mimg.yOffset,
                        2 * deltaX + lm + mimg.xOffset, h - bm + mimg.yOffset)
        # tag before/after views
        name = self.objectName()
        if name == "label_2" or name == "label_3":
            # draw filled rect
            qp.fillPath(qp.markPath, QBrush(Qt.gray))
            # draw text
            qp.setPen(Qt.white)
            qp.setFont(qp.font)
            qp.drawText(qp.markRect, Qt.AlignCenter | Qt.AlignVCenter,
                        "Before" if name == "label_2" else "After")
        qp.end()

    def mousePressEvent(self, event):
        """
        Mouse event handlers.
        The handlers implement mouse actions on an imImage displayed in a QLabel.
        It handles image positioning, zooming, and
        tool actions.
        NOTE. Due to wheeelEvent, xOffset and yOffset are float numbers
        @param event: mouse event
        @type event: QMouseEvent
        """
        State = self.State
        window = self.window
        eventType = event.type()
        # no context menu
        if eventType == QContextMenuEvent:
            return
        # get image and active layer
        img = self.img
        layer = img.getActiveLayer()
        r = img.resize_coeff(self)
        ############################################################
        # get mouse x, y coordinates (relative to widget).
        # The mouse coordinates relative to the (full size) image are
        # (x - img.xOffset) / r, (y - img.yOffset) / r
        #############################################################
        x, y = event.x(), event.y()
        modifiers = event.modifiers()
        # Mouse hover generates mouse move events,
        # so, we set pressed to select only non hovering events
        self.pressed = True
        if event.button() == Qt.LeftButton:
            # no move yet
            self.clicked = True
        State['ix'], State['iy'] = x, y
        State['ix_begin'], State['iy_begin'] = x, y
        State['x_imagePrecPos'], State['y_imagePrecPos'] = (
            x - img.xOffset) // r, (y - img.yOffset) // r
        if layer.isDrawLayer():
            layer.history.addItem(layer.sourceImg.copy())
            if window.btnValues['brushButton'] or window.btnValues['bucket']:
                # starting a new stroke : save initial image for atomic stroke painting  and init intermediate layer
                layer.strokeDest = layer.sourceImg.copy()
                layer.stroke.fill(QColor(0, 0, 0, 0))
                if window.btnValues['brushButton']:
                    self.syncBrush(r)
        # add current mask to history
        if window.btnValues['drawFG'] or window.btnValues['drawBG']:
            if layer.maskIsEnabled:
                layer.historyListMask.addItem(layer.mask.copy())
        # dragBtn or arrow
        if layer.isCloningLayer():
            if not (window.btnValues['drawFG'] or window.btnValues['drawBG']):
                if modifiers == Qt.ControlModifier | Qt.AltModifier:  # prevent unwanted clicks
                    if layer.cloningState == 'continue':
                        dlgWarn(
                            'Layer already cloned',
                            'To start a new cloning operation, add another cloning layer'
                        )
                        return
                    # set source starting point (coordinates are relative to full size image)
                    layer.sourceX, layer.sourceY = (x - img.xOffset) / r, (
                        y - img.yOffset) / r
                    layer.cloningState = 'start'
            elif layer.cloningState == 'start':
                # set the virtual layer translation (relative to full size image)
                layer.xAltOffset, layer.yAltOffset = (x - img.xOffset) / r - layer.sourceX,\
                                                     (y - img.yOffset) / r - layer.sourceY
                layer.cloningState = 'continue'
                layer.updateCloningMask()
                layer.updateSourcePixmap()

    def mouseMoveEvent(self, event):
        """
       Mouse event handlers.
       The handlers implement mouse actions on an imImage displayed in a QLabel.
       It handles image positioning, zooming, and
       tool actions.
       NOTE 1. Mouse hover generates mouse move events
       NOTE 2. Due to wheeelEvent, xOffset and yOffset are float numbers
       @param event: mouse event
       @type event: QMouseEvent
       """
        window = self.window
        State = self.State
        qp = self.qp
        eventType = event.type()
        # no context menu
        if eventType == QContextMenuEvent:
            return
        # get image and active layer
        img = self.img
        layer = img.getActiveLayer()
        r = img.resize_coeff(self)
        ############################################################
        # get mouse x, y coordinates (relative to widget).
        # The mouse coordinates relative to the (full size) image are
        # (x - img.xOffset) / r, (y - img.yOffset) / r
        #############################################################
        x, y = event.x(), event.y()
        modifiers = event.modifiers()
        # hover event
        if not self.pressed:
            x_img, y_img = (x - img.xOffset) / r, (y - img.yOffset) / r
            # read input and current colors from active layer (coordinates are relative to the full-sized image)
            clr = img.getActivePixel(x_img, y_img, qcolor=True)
            clrC = img.getActivePixel(x_img,
                                      y_img,
                                      fromInputImg=False,
                                      qcolor=True)
            window.infoView.setText(clr, clrC)
            if layer.isCloningLayer():
                if layer.cloningState == 'continue':
                    mx, my = x_img - layer.xAltOffset, y_img - layer.yAltOffset
                elif layer.cloningState == 'start':
                    mx, my = layer.sourceX, layer.sourceY
                else:
                    mx, my = x_img, y_img
                if layer.sourceFromFile:
                    pxmp = layer.getGraphicsForm().sourcePixmap
                    mx, my = mx * pxmp.width() / layer.width(
                    ), my * pxmp.height() / layer.height()
                layer.marker = QPointF(mx, my)
                window.label.repaint()
                if layer.sourceFromFile:
                    layer.getGraphicsForm().widgetImg.repaint()
            return
        self.clicked = False
        if img.isMouseSelectable:
            # don't draw on a non visible layer
            if window.btnValues['rectangle'] or window.btnValues[
                    'drawFG'] or window.btnValues['drawBG']:
                if not layer.visible:
                    dlgWarn('Select a visible layer for drawing or painting')
                    self.pressed = False
                    return
                elif not window.btnValues[
                        'rectangle'] and not layer.maskIsEnabled:
                    dlgWarn('Enable the mask before painting')
                    self.pressed = False
                    return
            # marquee tool
            if window.btnValues['rectangle']:
                # rectangle coordinates are relative to full image
                x_img = (min(State['ix_begin'], x) - img.xOffset) // r
                y_img = (min(State['iy_begin'], y) - img.yOffset) // r
                w = abs(State['ix_begin'] - x) // r
                h = abs(State['iy_begin'] - y) // r
                layer.rect = QRect(x_img, y_img, w, h)
            # drawing
            elif layer.isDrawLayer() and (window.btnValues['brushButton']
                                          or window.btnValues['eraserButton']):
                self.__strokePaint(layer, x, y, r)
            # mask
            elif window.btnValues['drawFG'] or window.btnValues['drawBG']:
                if layer.maskIsEnabled:
                    if layer.isCloningLayer:
                        layer.vlChanged = True  # TODO added 16/12/19
                        # layer.setMaskEnabled(color=True)  # set mask to color mask
                    toolOpacity = window.verticalSlider2.value() / 100
                    if modifiers == Qt.NoModifier:
                        if layer.isSegmentLayer():
                            color = vImage.defaultColor_UnMasked_SM if \
                                window.btnValues['drawFG'] else vImage.defaultColor_Masked_SM
                        else:
                            color = vImage.defaultColor_UnMasked if \
                                window.btnValues['drawFG'] else vImage.defaultColor_Masked
                    else:
                        color = vImage.defaultColor_UnMasked_Invalid
                    qp.begin(layer.mask)
                    # get pen width (relative to image)
                    w_pen = window.verticalSlider1.value() // r
                    # mode source : result is source (=pen) pixel color and opacity
                    qp.setCompositionMode(qp.CompositionMode_Source)
                    tmp_x = (x - img.xOffset) // r
                    tmp_y = (y - img.yOffset) // r
                    qp.setPen(QPen(color, w_pen))
                    qp.setOpacity(toolOpacity)
                    # paint the brush tips spaced by 0.25 * w_pen
                    # use 1-norm for performance
                    a_x, a_y = tmp_x - State['x_imagePrecPos'], tmp_y - State[
                        'y_imagePrecPos']
                    d = abs(a_x) + abs(a_y)
                    x, y = State['x_imagePrecPos'], State['y_imagePrecPos']
                    radius = w_pen / 2
                    if d == 0:
                        qp.drawEllipse(
                            QPointF(x, y), radius, radius
                        )  # center, radius : QPointF mandatory, else bounding rect topleft and size
                    else:
                        step = w_pen * 0.25 / d
                        for i in range(int(1 / step) + 1):
                            qp.drawEllipse(
                                QPointF(x, y), radius, radius
                            )  # center, radius : QPointF mandatory, else bounding rect topleft and size
                            x, y = x + a_x * step, y + a_y * step
                    qp.end()
                    if layer.isCloningLayer():
                        if not layer.sourceFromFile:
                            layer.marker = QPointF(tmp_x - layer.xAltOffset,
                                                   tmp_y - layer.yAltOffset)
                        else:
                            pxmp = layer.getGraphicsForm().sourcePixmap
                            layer.marker = QPointF(
                                (tmp_x - layer.xAltOffset) * pxmp.width() /
                                layer.width(), (tmp_y - layer.yAltOffset) *
                                pxmp.height() / layer.height())
                            layer.getGraphicsForm().widgetImg.repaint()
                    State['x_imagePrecPos'], State[
                        'y_imagePrecPos'] = tmp_x, tmp_y
                    ############################
                    # update upper stack
                    # should be layer.applyToStack() if any upper layer visible : too slow
                    # layer.applyToStack()
                    layer.updatePixmap()
                    img.prLayer.update()  # =applyNone()
                    #############################
                    window.label.repaint()
            # dragBtn or arrow
            else:
                # drag image
                if modifiers == Qt.NoModifier:
                    img.xOffset += x - State['ix']
                    img.yOffset += y - State['iy']
                    if window.btnValues['Crop_Button']:
                        window.cropTool.drawCropTool(img)
                # drag active layer only
                elif modifiers == Qt.ControlModifier:
                    layer.xOffset += (x - State['ix'])
                    layer.yOffset += (y - State['iy'])
                    layer.updatePixmap()
                    img.prLayer.update()  # =applyNone()
                # drag cloning virtual layer
                elif modifiers == Qt.ControlModifier | Qt.AltModifier:
                    if layer.isCloningLayer():
                        layer.xAltOffset += (x - State['ix'])
                        layer.yAltOffset += (y - State['iy'])
                        layer.vlChanged = True
                        if layer.maskIsSelected or not layer.maskIsEnabled:
                            layer.setMaskEnabled(
                                color=False)  # set to opacity mask
                        layer.applyCloning(seamless=False,
                                           showTranslated=True,
                                           moving=True)
        # not mouse selectable widget : probably before window alone !
        else:
            if modifiers == Qt.NoModifier:
                img.xOffset += (x - State['ix'])
                img.yOffset += (y - State['iy'])
            elif modifiers == Qt.ControlModifier:
                layer.xOffset += (x - State['ix'])
                layer.yOffset += (y - State['iy'])
                layer.updatePixmap()
        # update current coordinates
        State['ix'], State['iy'] = x, y
        if layer.isGeomLayer():
            layer.tool.moveRotatingTool()
        # updates
        self.repaint()
        # sync split views
        linked = True
        if self.objectName() == 'label_2':
            self.splitWin.syncSplitView(window.label_3, window.label_2, linked)
            window.label_3.repaint()
        elif self.objectName() == 'label_3':
            self.splitWin.syncSplitView(window.label_2, window.label_3, linked)
            window.label_2.repaint()

    def mouseReleaseEvent(self, event):
        """
       Mouse event handlers.
       The handlers implement mouse actions on an imImage displayed in a QLabel.
       It handles image positioning, zooming, and
       tool actions.
       @param event: mouse event
       @type event: QMouseEvent
       """
        window = self.window
        eventType = event.type()
        # no context menu
        if eventType == QContextMenuEvent:
            return
        # get image and active layer
        img = self.img
        layer = img.getActiveLayer()
        r = img.resize_coeff(self)
        ############################################################
        # get mouse x, y coordinates (relative to widget).
        # The mouse coordinates relative to the (full size) image are
        # (x - img.xOffset) / r, (y - img.yOffset) / r
        #############################################################
        x, y = event.x(), event.y()
        modifiers = event.modifiers()
        self.pressed = False
        if event.button() == Qt.LeftButton:
            if layer.maskIsEnabled \
                    and layer.getUpperVisibleStackIndex() != -1 \
                    and (window.btnValues['drawFG'] or window.btnValues['drawBG']):
                layer.applyToStack()
            if img.isMouseSelectable:
                # click event
                if self.clicked:
                    x_img, y_img = (x - img.xOffset) / r, (y - img.yOffset) / r
                    # read input and current colors from active layer (coordinates are relative to the full-sized image)
                    clr = img.getActivePixel(x_img, y_img, qcolor=True)
                    clrC = img.getActivePixel(x_img,
                                              y_img,
                                              fromInputImg=False,
                                              qcolor=True)
                    red, green, blue = clr.red(), clr.green(), clr.blue()
                    # read color from presentation layer
                    redP, greenP, blueP = img.getPrPixel(x_img, y_img)
                    # color chooser : when visible the colorPicked signal is not emitted
                    if getattr(window, 'colorChooser',
                               None) and window.colorChooser.isVisible():
                        if modifiers == Qt.ControlModifier | Qt.ShiftModifier:  # (modifiers & Qt.ControlModifier) and (modifiers & Qt.ShiftModifier):
                            window.colorChooser.setCurrentColor(clr)
                        elif modifiers == Qt.ControlModifier:  # modifiers & Qt.ControlModifier:
                            window.colorChooser.setCurrentColor(clrC)
                        else:
                            window.colorChooser.setCurrentColor(
                                QColor(redP, greenP, blueP))
                    else:
                        # emit colorPicked signal
                        layer.colorPicked.sig.emit(x_img, y_img, modifiers)
                        # select grid node for 3DLUT form
                        if layer.is3DLUTLayer():
                            movedNodes = layer.getGraphicsForm(
                            ).selectGridNode(red, green, blue)
                            if movedNodes:
                                layer.applyToStack()
                        # rectangle selection
                        if window.btnValues['rectangle'] and (
                                modifiers == Qt.ControlModifier):
                            layer.rect = None
                            layer.selectionChanged.sig.emit()
                        # Flood fill tool
                        if layer.isDrawLayer() and window.btnValues['bucket']:
                            if getattr(window, 'colorChooser', None):
                                bucketColor = window.colorChooser.selectedColor(
                                )
                            else:
                                bucketColor = Qt.black
                            bLUeFloodFill(layer, int(x_img), int(y_img),
                                          bucketColor)
                            layer.applyToStack()
                        """
                        # for raw layer, set multipliers to get selected pixel as White Point : NOT USED YET
                        if layer.isRawLayer() and window.btnValues['colorPicker']:
                            # get demosaic buffer and sample raw pixels
                            bufRaw = layer.parentImage.demosaic
                            nb = QRect(x_img-2, y_img-2, 4, 4)
                            r = QImage.rect(layer.parentImage).intersected(nb)
                            if not r.isEmpty():
                                color = np.sum(bufRaw[r.top():r.bottom()+1, r.left():r.right()+1], axis=(0, 1))/(r.width()*r.height())
                            else:
                                color = bufRaw[y_img, x_img, :]
                            color = [color[i] - layer.parentImage.rawImage.black_level_per_channel[i] for i in range(3)]
                            form = layer.getGraphicsForm()
                            if form.sampleMultipliers:
                                row, col = 3*y_img//layer.height(), 3*x_img//layer.width()
                                if form.samples:
                                    form.setRawMultipliers(*form.samples[3*row + col], sampling=False)
                            else:
                                form.setRawMultipliers(1/color[0], 1/color[1], 1/color[2], sampling=True)
                        """
                else:  # not clicked
                    if window.btnValues['rectangle']:
                        layer.selectionChanged.sig.emit()
                    # cloning layer
                    elif layer.isCloningLayer():
                        if layer.vlChanged:
                            # the virtual layer was moved : clone
                            layer.applyCloning(seamless=True,
                                               showTranslated=True,
                                               moving=True)
                            layer.vlChanged = False
        # updates
        self.repaint()
        # sync split views
        linked = True
        if self.objectName() == 'label_2':
            self.splitWin.syncSplitView(window.label_3, window.label_2, linked)
            window.label_3.repaint()
        elif self.objectName() == 'label_3':
            self.splitWin.syncSplitView(window.label_2, window.label_3, linked)
            window.label_2.repaint()

    def wheelEvent(self, event):
        """
        Mouse wheel event handler : zooming
        for imImage objects.
        @param event: mouse wheel event
        @type event: QWheelEvent
        """
        img = self.img
        window = self.window
        pos = event.pos()
        modifiers = event.modifiers()
        # delta unit is 1/8 of degree
        # Most mice have a resolution of 15 degrees
        numSteps = event.delta() / 1200.0
        layer = img.getActiveLayer()
        if modifiers == Qt.NoModifier:
            img.Zoom_coeff *= (1.0 + numSteps)
            # max Zoom for previews
            if img.Zoom_coeff > MAX_ZOOM:
                img.Zoom_coeff /= (1.0 + numSteps)
                return
            # correct image offset to keep unchanged the image point
            # under the cursor : (pos - offset) / resize_coeff is invariant
            img.xOffset = -pos.x() * numSteps + (1.0 + numSteps) * img.xOffset
            img.yOffset = -pos.y() * numSteps + (1.0 + numSteps) * img.yOffset
            if layer.isDrawLayer() and (window.btnValues['brushButton']
                                        or window.btnValues['eraserButton']):
                self.syncBrush(img.resize_coeff(self))
            if window.btnValues['Crop_Button']:
                window.cropTool.drawCropTool(img)
            if layer.isGeomLayer():
                # layer.view.widget().tool.moveRotatingTool()
                layer.tool.moveRotatingTool()
        elif modifiers == Qt.ControlModifier:
            layer.Zoom_coeff *= (1.0 + numSteps)
            layer.updatePixmap()
        # cloning layer zoom
        elif layer.isCloningLayer(
        ) and modifiers == Qt.ControlModifier | Qt.AltModifier:
            layer.AltZoom_coeff *= (1.0 + numSteps)
            layer.applyCloning(
                seamless=False, showTranslated=True,
                moving=True)  # autocloning (seamless=true) too slow
        self.repaint()
        # sync split views
        linked = True
        if self.objectName() == 'label_2':
            self.splitWin.syncSplitView(window.label_3, window.label_2, linked)
            window.label_3.repaint()
        elif self.objectName() == 'label_3':
            self.splitWin.syncSplitView(window.label_2, window.label_3, linked)
            window.label_2.repaint()

    def enterEvent(self, event):
        """
        Mouse enter event handler
        @param event:
        @type event
        """
        if not self.enterAndLeave:
            return
        window = self.window
        if QApplication.overrideCursor():
            # don't stack multiple cursors
            return
        # tool cursors
        w = window.verticalSlider1.value()
        layer = window.label.img.getActiveLayer()
        if window.btnValues['drawFG'] or window.btnValues['drawBG']:
            if w > 10:
                QApplication.setOverrideCursor(
                    QCursor(window.cursor_Circle_Pixmap.scaled(
                        w * 2.0, w * 2.0),
                            hotX=w,
                            hotY=w))
            else:
                QApplication.setOverrideCursor(Qt.CrossCursor)
        elif layer.isDrawLayer() and (window.btnValues['brushButton']
                                      or window.btnValues['eraserButton']):
            self.syncBrush(self.img.resize_coeff(self))
        elif window.btnValues['drag']:
            QApplication.setOverrideCursor(Qt.OpenHandCursor)
        elif window.btnValues['colorPicker']:
            if layer.isAdjustLayer():
                if layer.view.isVisible():
                    QApplication.setOverrideCursor(window.cursor_EyeDropper)

    def leaveEvent(self, event):
        if not self.enterAndLeave:
            return
        QApplication.restoreOverrideCursor()

    """
    def __movePaint(self, x, y, r, radius, pxmp=None):
        
        Private drawing function.
        Base function for painting tools. The radius and pixmap
        of the tool are passed by the parameters radius and pxmp.
        Starting coordinates of the move are recorded in State, ending coordinates
        are passed by parameters x, y.
        Brush tips are drawn on the intermediate layer self.stroke,
        using self.qp.
        Successive brush tips, spaced by 0.25 * radius, are paint on qp.
        Note that self.qp must have been previously activated.
        @param x: move event x-coord
        @type x: float
        @param y: move event y-coord
        @type y: float
        @param r: image resizing coeff
        @type r: float
        @param radius: tool radius
        @type radius: float
        @param pxmp: brush pixmap
        @type pxmp: QPixmap
        @return: last painted position
        @rtype: 2-uple of float
        
        img = self.img
        State = self.State
        qp = self.qp
        tmp_x = (x - img.xOffset) // r
        tmp_y = (y - img.yOffset) // r
        # vector of the move
        a_x, a_y = tmp_x - State['x_imagePrecPos'], tmp_y - State['y_imagePrecPos']
        # move length : use 1-norm for performance
        d = sqrt(a_x * a_x + a_y * a_y)
        spacing, jitter = State['brush']['spacing'], State['brush']['jitter']
        step = 1 if d == 0 else radius * 0.3 * spacing / d  # 0.25
        if jitter != 0.0:
            step *= (1.0 + choice(brushFamily.jitterRange) * jitter / 100.0)
        p_x, p_y = State['x_imagePrecPos'], State['y_imagePrecPos']
        if d != 0.0:
            cosTheta, sinTheta = a_x / d, a_y / d
            transform = QTransform(cosTheta, sinTheta, -sinTheta, cosTheta, 0, 0)  # Caution: angles > 0 correspond to counterclockwise rotations of pxmp
            pxmp = pxmp.transformed(transform)
        count = 0
        maxCount = int( 1.0 / step)
        while count < maxCount:
            count += 1
            if pxmp is None:
                qp.drawEllipse(QPointF(p_x, p_y), radius, radius)
            else:
                qp.drawPixmap(QPointF(p_x - radius, p_y - radius), pxmp)  # TODO radius added 19/03/20 validate
            p_x, p_y = p_x + a_x * step, p_y + a_y * step
        # return last painted position
        return p_x, p_y
    """

    def __strokePaint(self, layer, x, y, r):
        """
        Private drawing function. Should be called only by the mouse event handler
        @param layer:
        @type layer:
        @param x:
        @type x:
        @param y:
        @type y:
        @param r:
        @type r:
        """
        img = self.img
        State = self.State
        qp = self.qp
        # get image coordinates
        x_img = (x - img.xOffset) // r
        y_img = (y - img.yOffset) // r
        # draw the stroke
        if self.window.btnValues['brushButton']:
            # drawing onto stroke intermediate layer
            qp.begin(layer.stroke)
            qp.setCompositionMode(qp.CompositionMode_SourceOver)
            # draw move
            State['x_imagePrecPos'], State[
                'y_imagePrecPos'] = brushFamily.brushStrokeSeg(
                    qp, State['x_imagePrecPos'], State['y_imagePrecPos'],
                    x_img, y_img, State['brush'])
            qp.end()
            # draw texture aligned with image
            strokeTex = layer.stroke
            p = State['brush']['pattern']
            if p is not None:
                if p.pxmp is not None:
                    strokeTex = layer.stroke.copy()
                    qp1 = QPainter(strokeTex)
                    qp1.setCompositionMode(qp.CompositionMode_DestinationIn)
                    qp1.setBrush(QBrush(p.pxmp))
                    qp1.fillRect(
                        QRect(0, 0, strokeTex.width(), strokeTex.height()),
                        QBrush(p.pxmp))
                    qp1.end()
            # restore source image and paint
            # the whole stroke with current brush opacity.
            # Restoring source image enables iterative calls showing
            # stroke progress
            qp.begin(layer.sourceImg)
            qp.setCompositionMode(qp.CompositionMode_Source)
            qp.drawImage(QPointF(), layer.strokeDest)
            qp.setOpacity(State['brush']['opacity'])
            qp.setCompositionMode(qp.CompositionMode_SourceOver)
            qp.drawImage(QPointF(), strokeTex)  # layer.stroke)
            qp.end()
        elif self.window.btnValues['eraserButton']:
            qp.begin(layer.sourceImg)
            qp.setCompositionMode(qp.CompositionMode_DestinationIn)
            State['x_imagePrecPos'], State[
                'y_imagePrecPos'] = brushFamily.brushStrokeSeg(
                    qp, State['x_imagePrecPos'], State['y_imagePrecPos'],
                    x_img, y_img, State['brush'])
            qp.end()
        # update layer - should be layer.applyToStack() if any upper layer visible : too slow !
        layer.execute()
        img.prLayer.update()
        self.window.label.repaint()
예제 #27
0
class RegisterView(QWidget, DockContextHandler):

    dirty_color = QBrush(QColor(255, 153, 51))
    symbolic_color = QBrush(QColor(245, 66, 72))
    no_color = QBrush(QColor(255, 255, 255))

    def __init__(self, parent, name, data):
        QWidget.__init__(self, parent)
        DockContextHandler.__init__(self, self, name)

        self.parent = parent
        self.arch = None
        self.current_state = None
        self.symb_idx = 0
        self.reg_to_index = dict()
        self.index_to_reg = dict()
        self.reg_cache = dict()
        self.data = data
        self.tab_name = None

        self.actionHandler = UIActionHandler()
        self.actionHandler.setupActionHandler(self)

        self._layout = QVBoxLayout()

        # Set up register table
        self._table = QTableWidget()
        self._table.setColumnCount(2)
        self._table.setHorizontalHeaderLabels(['Register', 'Value'])
        self._table.horizontalHeader().setStretchLastSection(True)
        self._table.verticalHeader().setVisible(False)

        self._table.setContextMenuPolicy(Qt.CustomContextMenu)
        self._table.customContextMenuRequested.connect(
            self.on_customContextMenuRequested)
        self._table.doubleClicked.connect(self.on_doubleClick)

        self._layout.addWidget(self._table)

        self.setLayout(self._layout)

    def reset(self):
        self.tab_name = None
        self.arch = None
        self.reg_to_index = dict()
        self.symb_idx = 0
        self._table.setRowCount(0)

    def init(self, arch, state):
        self.arch = arch
        self.tab_name = _normalize_tab_name(self.parent.getTabName())

        regs = self.arch.reg_names()

        self._table.setRowCount(len(regs))
        for i, reg in enumerate(regs):
            self.reg_to_index[reg] = i
            self.index_to_reg[i] = reg
            self._table.setItem(i, 0, _makewidget(self, reg))
            self._table.setItem(i, 1, _makewidget(self, ""))

        self.set_reg_values(state)

    def set_reg_value(self, reg, value, color=None):
        assert self.arch is not None

        idx = self.reg_to_index[reg]

        if symbolic(value):
            if isinstance(value, BVS):
                val_str = value.name
            else:
                val_str = "< symbolic expression >"
                if color is None:
                    color = RegisterView.symbolic_color
        else:
            val_str = "0x{obj:0{width}x}".format(obj=value.value,
                                                 width=(value.size + 3) // 4)

        self.reg_cache[reg] = val_str
        table_item = self._table.item(idx, 1)
        table_item.setText(val_str)
        if color is not None:
            table_item.setForeground(color)
        else:
            table_item.setForeground(self.no_color)

    def set_reg_values(self, state):
        self.current_state = state
        for reg in self.reg_to_index:
            val = getattr(state.regs, reg)
            self.set_reg_value(reg, val)

    # right click menu
    def on_customContextMenuRequested(self, pos):
        item = self._table.itemAt(pos)
        if item is None:
            return
        row_idx = item.row()

        if self.index_to_reg[row_idx] == self.arch.getip_reg():
            return

        expr = getattr(self.current_state.regs, self.index_to_reg[row_idx])

        menu = QMenu()
        show_reg_expr = menu.addAction(
            "Show reg expression") if not isinstance(expr, BVV) else None
        make_reg_symb = menu.addAction("Make reg symbolic") if isinstance(
            expr, BVV) else None
        set_reg_value = menu.addAction("Set reg value")
        eval_with_sol = menu.addAction(
            "Evaluate with solver") if not isinstance(expr, BVV) else None
        eval_upto_with_sol = menu.addAction(
            "Evaluate upto with solver") if not isinstance(expr, BVV) else None
        concretize = menu.addAction("Concretize") if not isinstance(
            expr, BVV) else None
        copy = menu.addAction("Copy to clipboard") if not isinstance(
            expr, BVS) else None
        bind_to_buffer = menu.addAction("Bind to symbolic buffer")

        action = menu.exec_(self._table.viewport().mapToGlobal(pos))
        if action is None:
            return

        if action == bind_to_buffer:
            buffer_names = [
                b[0].name for b in self.current_state.symbolic_buffers
            ]
            if len(buffer_names) == 0:
                return
            buff_id = get_choice_input("Select a buffer", "choices",
                                       buffer_names)
            address = self.current_state.symbolic_buffers[buff_id][1]
            buff_p = BVV(address, self.current_state.arch.bits())
            setattr(self.current_state.regs, self.index_to_reg[row_idx],
                    buff_p)
            self.set_reg_value(self.index_to_reg[row_idx], buff_p,
                               RegisterView.dirty_color)
        if action == show_reg_expr:
            show_message_box("Reg Expression", str(expr.z3obj.sexpr()))
        if action == make_reg_symb:
            new_expr = BVS('symb_injected_through_ui_%d' % self.symb_idx,
                           expr.size)
            setattr(self.current_state.regs, self.index_to_reg[row_idx],
                    new_expr)
            self.set_reg_value(self.index_to_reg[row_idx], new_expr,
                               RegisterView.dirty_color)
            self.symb_idx += 1
        if action == set_reg_value:
            self.on_doubleClick(item)
        if action == eval_with_sol:
            expr = getattr(self.current_state.regs, self.index_to_reg[row_idx])
            if not self.current_state.solver.symbolic(expr):
                new_expr = self.current_state.solver.evaluate(expr)
                setattr(self.current_state.regs, self.index_to_reg[row_idx],
                        new_expr)
                self.set_reg_value(self.index_to_reg[row_idx], new_expr,
                                   RegisterView.dirty_color)
                show_message_box(
                    "Reg Value (with solver)",
                    "The value was indeed concrete! State modified")
            else:
                show_message_box(
                    "Reg Value (with solver)",
                    hex(self.current_state.solver.evaluate(expr).value))
        if action == eval_upto_with_sol:
            expr = getattr(self.current_state.regs, self.index_to_reg[row_idx])
            if not self.current_state.solver.symbolic(expr):
                new_expr = self.current_state.solver.evaluate(expr)
                setattr(self.current_state.regs, self.index_to_reg[row_idx],
                        new_expr)
                self.set_reg_value(self.index_to_reg[row_idx], new_expr,
                                   RegisterView.dirty_color)
                show_message_box(
                    "Reg Value (with solver)",
                    "The value was indeed concrete! State modified")
            else:
                n_eval = get_int_input("How many values (upto) ?",
                                       "Number of distinct values")
                r = ""
                for i, v in enumerate(
                        self.current_state.solver.evaluate_upto(expr, n_eval)):
                    r += "solution %d: %s\n" % (i, hex(v.value))
                show_message_box("Reg Value (with solver)", r)
        if action == concretize:
            expr = getattr(self.current_state.regs, self.index_to_reg[row_idx])
            new_expr = self.current_state.solver.evaluate(expr)
            res = get_choice_input(
                "Concretize %s to %s?" %
                (self.index_to_reg[row_idx], hex(new_expr.value)),
                "Concretize", ["Yes", "No"])
            if res == 0:
                setattr(self.current_state.regs, self.index_to_reg[row_idx],
                        new_expr)
                self.current_state.solver.add_constraints(expr == new_expr)
                self.set_reg_value(self.index_to_reg[row_idx], new_expr,
                                   RegisterView.dirty_color)

        if action == copy:
            mime = QMimeData()
            if isinstance(expr, BVV):
                mime.setText(hex(expr.value))
            else:
                mime.setText(str(expr.z3obj.sexpr()))
            QApplication.clipboard().setMimeData(mime)

    # double click event
    def on_doubleClick(self, item):
        row_idx = item.row()
        if self.index_to_reg[row_idx] == self.arch.getip_reg():
            return

        old_expr = getattr(self.current_state.regs, self.index_to_reg[row_idx])
        new_val = get_int_input("value for %s" % self.index_to_reg[row_idx],
                                "Set Reg")
        if new_val is None:
            return
        new_expr = BVV(new_val, old_expr.size)
        setattr(self.current_state.regs, self.index_to_reg[row_idx], new_expr)
        self.set_reg_value(self.index_to_reg[row_idx], new_expr,
                           RegisterView.dirty_color)

    def notifyOffsetChanged(self, offset):
        pass

    def shouldBeVisible(self, view_frame):
        if view_frame is None:
            return False
        elif self.tab_name is None:
            return False
        elif _normalize_tab_name(view_frame.getTabName()) != self.tab_name:
            return False
        return True

    def notifyViewChanged(self, view_frame):
        if view_frame is None:
            pass
        else:
            pass

    def contextMenuEvent(self, event):
        self.m_contextMenuManager.show(self.m_menu, self.actionHandler)
예제 #28
0
 def __strokePaint(self, layer, x, y, r):
     """
     Private drawing function. Should be called only by the mouse event handler
     @param layer:
     @type layer:
     @param x:
     @type x:
     @param y:
     @type y:
     @param r:
     @type r:
     """
     img = self.img
     State = self.State
     qp = self.qp
     # get image coordinates
     x_img = (x - img.xOffset) // r
     y_img = (y - img.yOffset) // r
     # draw the stroke
     if self.window.btnValues['brushButton']:
         # drawing onto stroke intermediate layer
         qp.begin(layer.stroke)
         qp.setCompositionMode(qp.CompositionMode_SourceOver)
         # draw move
         State['x_imagePrecPos'], State[
             'y_imagePrecPos'] = brushFamily.brushStrokeSeg(
                 qp, State['x_imagePrecPos'], State['y_imagePrecPos'],
                 x_img, y_img, State['brush'])
         qp.end()
         # draw texture aligned with image
         strokeTex = layer.stroke
         p = State['brush']['pattern']
         if p is not None:
             if p.pxmp is not None:
                 strokeTex = layer.stroke.copy()
                 qp1 = QPainter(strokeTex)
                 qp1.setCompositionMode(qp.CompositionMode_DestinationIn)
                 qp1.setBrush(QBrush(p.pxmp))
                 qp1.fillRect(
                     QRect(0, 0, strokeTex.width(), strokeTex.height()),
                     QBrush(p.pxmp))
                 qp1.end()
         # restore source image and paint
         # the whole stroke with current brush opacity.
         # Restoring source image enables iterative calls showing
         # stroke progress
         qp.begin(layer.sourceImg)
         qp.setCompositionMode(qp.CompositionMode_Source)
         qp.drawImage(QPointF(), layer.strokeDest)
         qp.setOpacity(State['brush']['opacity'])
         qp.setCompositionMode(qp.CompositionMode_SourceOver)
         qp.drawImage(QPointF(), strokeTex)  # layer.stroke)
         qp.end()
     elif self.window.btnValues['eraserButton']:
         qp.begin(layer.sourceImg)
         qp.setCompositionMode(qp.CompositionMode_DestinationIn)
         State['x_imagePrecPos'], State[
             'y_imagePrecPos'] = brushFamily.brushStrokeSeg(
                 qp, State['x_imagePrecPos'], State['y_imagePrecPos'],
                 x_img, y_img, State['brush'])
         qp.end()
     # update layer - should be layer.applyToStack() if any upper layer visible : too slow !
     layer.execute()
     img.prLayer.update()
     self.window.label.repaint()
예제 #29
0
    app = QApplication(sys.argv)

    customPlot = QCustomPlot()
    customPlot.resize(800, 600)
    customPlot.setWindowTitle('Scatter Pixmap Demo')

    customPlot.axisRect().setBackground(QPixmap("./solarpanels.jpg"))
    customPlot.addGraph()
    customPlot.graph().setLineStyle(QCPGraph.lsLine)

    pen = QPen()
    pen.setColor(QColor(255, 200, 20, 200))
    pen.setStyle(Qt.DashLine)
    pen.setWidthF(2.5)
    customPlot.graph().setPen(pen)
    customPlot.graph().setBrush(QBrush(QColor(255, 200, 20, 70)))
    customPlot.graph().setScatterStyle(QCPScatterStyle(QPixmap("./sun.png")))
    # set graph name, will show up in legend next to icon:
    customPlot.graph().setName("Data from Photovoltaic\nenergy barometer 2011")
    # set data:
    year = [2005, 2006, 2007, 2008, 2009, 2010, 2011]
    value = [2.17, 3.42, 4.94, 10.38, 15.86, 29.33, 52.1]
    customPlot.graph().setData(year, value)

    font = QFont("sans", 12, QFont.Bold)
    text = QCPTextElement(customPlot, "Regenerative Energies", font)
    # set title of plot:
    customPlot.plotLayout().insertRow(0)
    customPlot.plotLayout().addElement(0, 0, text)
    # axis configurations:
    customPlot.xAxis.setLabel("Year")
예제 #30
0
    def draw(self, qp, fps, objs, x0, y0, image):
        #qp.setWindow(x0, y0, self.w_,self.h_)  # 设置窗口
        # 画框架背景
        qp.setBrush(QColor('#cecece'))  # 框架背景色
        qp.setPen(Qt.NoPen)
        rect = QRect(x0, y0, self.w_, self.h_)
        qp.drawRect(rect)

        sw, sh = self.w_, self.h_  # 图像窗口宽高
        sh -= 40
        pw, ph = 0, 0  # 缩放后的QPixmap大小

        # 画图
        yh = 0
        if image is not None:
            ih, iw, _ = image.shape
            self.scale = sw / iw if sw / iw < sh / ih else sh / ih  # 缩放比例
            yh = round((self.h_ - 40 - ih * self.scale) / 2)
            #print(yh)
            qimage = QImage(image.data, iw, ih, 3 * iw,
                            QImage.Format_RGB888)  # 转QImage
            qpixmap = QPixmap.fromImage(
                qimage.scaled(self.w_, self.h_ - 40,
                              Qt.KeepAspectRatio))  # 转QPixmap
            pw, ph = qpixmap.width(), qpixmap.height()
            #print(pw,ph)
            qp.drawPixmap(0 + x0, y0 + yh + 40, qpixmap)

        font = QFont()
        font.setFamily('Microsoft YaHei')
        if fps > 0:
            font.setPointSize(14)
            qp.setFont(font)
            pen = QPen()
            pen.setColor(Qt.white)
            qp.setPen(pen)
            qp.drawText(self.w_ - 150 + x0, y0 + 20,
                        'FPS: ' + str(round(fps, 2)))

        # 画目标框
        pen = QPen()
        pen.setWidth(2)  # 边框宽度
        person = 0
        hat = 0
        for obj in objs:
            if obj["class"] == "person":
                person += 1
            else:
                hat += 1
            font.setPointSize(10)
            qp.setFont(font)
            rgb = [round(c) for c in obj['color']]
            pen.setColor(QColor(rgb[0], rgb[1], rgb[2]))  # 边框颜色
            brush1 = QBrush(Qt.NoBrush)  # 内部不填充
            qp.setBrush(brush1)
            qp.setPen(pen)
            # 坐标 宽高
            tx, ty = round(pw * obj['x']), yh + round(ph * obj['y'])
            tw, th = round(pw * obj['w']), round(ph * obj['h'])
            obj_rect = QRect(tx + x0, y0 + ty + 40, tw, th)
            qp.drawRect(obj_rect)  # 画矩形框
            # 画 类别 和 置信度
            qp.drawText(x0 + tx, y0 + ty + 40 - 5,
                        str(obj['class']) + str(round(obj['confidence'], 2)))
        if fps > 0:
            pen = QPen()
            pen.setColor(Qt.red)
            font.setPointSize(14)
            qp.setFont(font)
            qp.setPen(pen)
            qp.drawText(0 + x0, y0 + 20,
                        "there are {0} person".format(person + hat))
            qp.drawText(
                x0 + 0, y0 + 40,
                "{0} people did not wear safety helmets".format(person))