class SALErrorCodeWidget(QWidget): """Displays errorCode messages.""" def __init__(self, comm): super().__init__() layout = QVBoxLayout() self.plainText = QPlainTextEdit() self.plainText.setReadOnly(True) self.plainText.setLineWrapMode(QPlainTextEdit.NoWrap) self.plainText.setCenterOnScroll(True) font = QFont("Monospace") font.setStyleHint(QFont.TypeWriter) self.plainText.setFont(font) layout.addWidget(self.plainText) self.setLayout(layout) comm.errorCode.connect(self.errorCode) @Slot() def errorCode(self, data): date = datetime.fromtimestamp(data.private_sndStamp).isoformat( sep=" ", timespec="milliseconds") self.plainText.appendHtml( f"{date} [<b>{data.errorCode:06X}</b>] <span style='color:{'green' if data.errorCode==0 else 'red'}'>{data.errorReport}</span>" ) self.plainText.ensureCursorVisible()
class EditWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.logData: Class.LogInfo = None self.resultMap = dict() self._initUI() self._initData() def getLogData(self): return self.logData def setLogData(self, data: Class.LogInfo): self.logData = data self.topText.setPlainText(self.logData.data) def toPlainText(self): return self.topText.toPlainText() def _initUI(self): self.mainLayout = QVBoxLayout(self) self.topText = QPlainTextEdit(self) self.topText.setLineWrapMode(QPlainTextEdit.NoWrap) self.topText.setCenterOnScroll(True) self.topText.setAcceptDrops(False) self.topText.verticalScrollBar() self.bottomText = QTabWidget(self) self.bottomText.setDocumentMode(True) self.bottomText.setMovable(True) self.bottomText.setTabsClosable(True) self.bottomText.tabCloseRequested.connect(self.tabCloseRequested) self.mainLayout.addWidget(self.topText, 1) self.mainLayout.addWidget(self.bottomText, 1) self.setLayout(self.mainLayout) def tabCloseRequested(self, index): self.bottomText.removeTab(index) def _initData(self): pass # self.topText.setPlainText('''10-18 16:52:37.542544 13034 13073 D _V_CommonModel: [VivoVideo]onLoaded # 10-18 16:52:37.545425 13034 13034 D EventBus: No subscribers registered for event class com.vivo.video.baselibrary.lifecycle.PlayerStateChangeEvent # 10-18 16:52:37.545536 13034 13034 D EventBus: No subscribers registered for event class org.greenrobot.eventbus.g # 10-18 16:52:37.559381 2359 2359 I _V_MainThreadMonitor: scheduleCheck true, true, 900 # 10-18 16:52:37.561130 13034 13034 D _V_LiveTabFragment: [VivoVideo]liveCategory load onsuccess # 10-18 16:52:37.561572 714 791 D BufferLayer: triger signalLayerUpdate # 10-18 16:52:37.561937 13034 13034 D _V_LiveCategoryFragmentAdapter: [VivoVideo]com.vivo.video.app.home.HomeActivity@489a20a # 10-18 16:52:37.565738 13034 13034 D _V_BaseFragment: [VivoVideo]init onCreateView # 10-18 16:52:37.576986 13034 13034 I RepluginBridge: getApi,clazz:interface com.unionyy.mobile.vivo.api.VV2YYInfoAction # 10-18 16:52:37.577233 13034 13034 I RepluginBridge: getApi,clazz:interface com.unionyy.mobile.vivo.api.VV2YYAuthAction # 10-18 16:52:37.577331 13034 13034 I RepluginBridge: getApi,clazz:interface com.unionyy.mobile.vivo.api.VV2YYInfoAction # 10-18 16:52:37.577359 13034 13034 I RepluginBridge: getApi,clazz:interface com.unionyy.mobile.vivo.api.VV2YYAuthAction''') def cursorPositionChanged(self): print("cursorPositionChanged") def handlerFilterResult(self, filterResult): result = self.resultMap.get(filterResult.orgTag) if result: print("已存在%s" % filterResult.orgTag) result.setPlainText(filterResult.value) else: print("未存在%s" % filterResult.orgTag) filterResultView = QPlainTextEdit(self) highlighter = LogQSyntaxHighlighter(filterResultView.document()) highlighter.setHighlignterTags(filterResult.tag) filterResultView.setPlainText(filterResult.value) filterResultView.setLineWrapMode(QPlainTextEdit.NoWrap) filterResultView.cursorPositionChanged.connect( self.cursorPositionChanged) self.bottomText.addTab(filterResultView, filterResult.orgTag) self.bottomText.setCurrentIndex(self.bottomText.count() - 1) self.resultMap.setdefault(filterResult.orgTag, filterResultView) def destroy(self, destroyWindow: bool = ..., destroySubWindows: bool = ...): RxBus.instance.unRegister(self) super.destroy(destroyWindow, destroySubWindows) print("destroy") def create(self, arg__1: int = ..., initializeWindow: bool = ..., destroyOldWindow: bool = ...): super.create(arg__1, initializeWindow, destroyOldWindow) print("create")
class Editor(QWidget): changed = Signal() def __init__(self, parent): super(Editor, self).__init__(parent) self.path = Path(__file__).parent / 'shaders' self.project = None self.programName = None self.vertexShader = '' self.fragmentShader = '' self.colorEditor = QLineEdit() self.colorEditor.setEnabled(False) self.colorEditor.textChanged.connect(self.updateColorHex) self.updateColor((0.5, 0.5, 0.5, 1.0)) self.pickButton = QPushButton('Pick') self.pickButton.setEnabled(False) self.pickButton.clicked.connect(self.pickColor) colorContainer = QWidget() colorContainer.setLayout(QHBoxLayout()) colorContainer.layout().setMargin(0) colorContainer.layout().addWidget(self.colorEditor) colorContainer.layout().addWidget(self.pickButton) self.displayRatioSlider = QSlider(Qt.Horizontal) self.displayRatioSlider.setRange(0, 1000) self.displayRatioSlider.setEnabled(False) self.displayRatioSlider.setSingleStep(1) self.displayRatioSlider.setPageStep(10) self.displayRatioSlider.valueChanged.connect(self.updateDisplayRatio) self.pointSizeSlider = QSlider(Qt.Horizontal) self.pointSizeSlider.setRange(0, 500) self.pointSizeSlider.setEnabled(False) self.pointSizeSlider.setSingleStep(1) self.pointSizeSlider.setPageStep(10) self.pointSizeSlider.valueChanged.connect(self.updatePointSize) self.distanceSlider = QSlider(Qt.Horizontal) self.distanceSlider.setRange(0, 1000) self.distanceSlider.setEnabled(False) self.distanceSlider.setSingleStep(1) self.distanceSlider.setPageStep(10) self.distanceSlider.valueChanged.connect(self.updateDistanceRange) self.vertexEditor = QPlainTextEdit() self.vertexEditor.setStyleSheet( "QPlainTextEdit { background: #393939; color: #b6dede; font: 1rem 'monospace'; }" ) self.vertexEditor.setLineWrapMode(QPlainTextEdit.NoWrap) self.vertexEditor.setWordWrapMode(QTextOption.NoWrap) self.vertexEditor.setTabStopWidth(2) self.vertexEditor.setTabChangesFocus(False) self.vertexEditor.setCenterOnScroll(True) self.vertexEditor.setEnabled(False) self.vertexEditor.textChanged.connect(self.saveVertex) self.fragmentEditor = QPlainTextEdit() self.fragmentEditor.setStyleSheet( "QPlainTextEdit { background: #393939; color: #b6dede; font: 1rem 'monospace'; }" ) self.fragmentEditor.setLineWrapMode(QPlainTextEdit.NoWrap) self.fragmentEditor.setWordWrapMode(QTextOption.NoWrap) self.fragmentEditor.setTabStopWidth(2) self.fragmentEditor.setTabChangesFocus(False) self.fragmentEditor.setCenterOnScroll(True) self.fragmentEditor.setEnabled(False) self.fragmentEditor.textChanged.connect(self.saveFragment) self.setLayout(QVBoxLayout()) self.layout().addWidget(QLabel("Display (%):")) self.layout().addWidget(self.displayRatioSlider) self.layout().addWidget(QLabel("Mask Point size (px):")) self.layout().addWidget(self.pointSizeSlider) self.layout().addWidget(QLabel("Mask Distance range:")) self.layout().addWidget(self.distanceSlider) self.layout().addWidget(QLabel("Clear color:")) self.layout().addWidget(colorContainer) self.layout().addWidget(QLabel("Vertex shader:")) self.layout().addWidget(self.vertexEditor) self.layout().addWidget(QLabel("Fragment shader:")) self.layout().addWidget(self.fragmentEditor) def setProject(self, project): self.project = project if project: self.displayRatioSlider.setValue(project.displayRatio * 1000) self.displayRatioSlider.setEnabled(True) self.pointSizeSlider.setValue(project.maskPointSize * 10) self.pointSizeSlider.setEnabled(True) self.distanceSlider.setValue(project.maskDistanceRange[1] * 10) self.distanceSlider.setEnabled(True) self.updateColor(project.clearColor) self.loadShader(project.cloudShaderName) self.colorEditor.setEnabled(True) self.pickButton.setEnabled(True) self.vertexEditor.setEnabled(True) self.fragmentEditor.setEnabled(True) else: self.displayRatioSlider.setValue(1000) self.displayRatioSlider.setEnabled(False) self.pointSizeSlider.setValue(10) self.pointSizeSlider.setEnabled(False) self.distanceSlider.setValue(10) self.distanceSlider.setEnabled(False) self.updateColor((0.5, 0.5, 0.5, 1.0)) self.clearShader() self.colorEditor.setEnabled(False) self.pickButton.setEnabled(False) self.vertexEditor.setEnabled(False) self.fragmentEditor.setEnabled(False) def parseColorHex(self, value): m = re.compile('#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})' ).match(value) if not m: return None return (min(max(int(m.group(1), base=16), 0), 255) / 255.0, min(max(int(m.group(2), base=16), 0), 255) / 255.0, min(max(int(m.group(3), base=16), 0), 255) / 255.0, min(max(int(m.group(4), base=16), 0), 255) / 255.0) def pickColor(self): color = QColor() color.setRgbF(*self.parseColorHex(self.colorEditor.text())) color = QColorDialog.getColor(color, parent=self, title="Background Color", options=QColorDialog.ShowAlphaChannel) if not color.isValid(): return self.updateColor( (color.redF(), color.greenF(), color.blueF(), color.alphaF())) def updateColorHex(self, value): self.updateColor(self.parseColorHex(value)) def updateColor(self, color): def formatChannel(value): return "%02x" % int(min(max(value * 255.0, 0.0), 255.0)) bg = "#%s%s%s" % (formatChannel(color[0]), formatChannel( color[1]), formatChannel(color[2])) fg = "#ffffff" if sum(color) / 3 < 0.5 else "#000000" self.colorEditor.setStyleSheet( "QLineEdit { color: %s; background: %s; }" % (fg, bg)) text = bg + formatChannel(color[3]) if self.colorEditor.text() != text: self.colorEditor.setText(text) if self.project: self.project.setClearColor(color) # self.changed.emit() def updateDisplayRatio(self, value): if self.project: self.project.setDisplayRatio(value / 1000.0) # self.changed.emit() def updatePointSize(self, value): if self.project: self.project.setMaskPointSize(value / 10.0) # self.changed.emit() def updateDistanceRange(self, value): if self.project: self.project.setMaskDistanceRange(value / 10.0) # self.changed.emit() def clearShader(self): self.programName = None self.vertexShader = '' self.fragmentShader = '' self.vertexEditor.setPlainText('') self.fragmentEditor.setPlainText('') def loadShader(self, name): self.programName = name self.vertexShader = '' self.fragmentShader = '' try: with io.open(self.path / (self.programName + '.vs'), 'r') as f: self.vertexShader = f.read() except Exception as e: print(e) try: with io.open(self.path / (self.programName + '.fs'), 'r') as f: self.fragmentShader = f.read() except Exception as e: print(e) self.vertexEditor.setPlainText(self.vertexShader) self.fragmentEditor.setPlainText(self.fragmentShader) def saveVertex(self): value = self.vertexEditor.toPlainText() if not self.programName or self.vertexShader == value: return with io.open(self.path / (self.programName + '.vs'), 'w') as f: f.write(value) self.vertexShader = value self.changed.emit() def saveFragment(self): value = self.fragmentEditor.toPlainText() if not self.programName or self.fragmentShader == value: return with io.open(self.path / (self.programName + '.fs'), 'w') as f: f.write(value) self.fragmentShader = value self.changed.emit()