class CentralWidget(QWidget): def __init__(self, communicator): super().__init__() self.initUI(communicator) self.setStyleSheet("QWidget {border: 0;}") def initUI(self, communicator): self.questionBlock = Questions(communicator) self.lectionBlock = Lection(communicator) layout = QHBoxLayout() layout.setSpacing(0) self.splitter = QSplitter(Qt.Horizontal) self.splitter.addWidget(self.lectionBlock) self.splitter.addWidget(self.questionBlock) self.splitter.setHandleWidth(0) self.splitter.setStretchFactor(0, 5) self.splitter.setStretchFactor(1, 2) self.splitter.setStyleSheet( "QWidget {background-color: #78aef9;border:0;}") layout.addWidget(self.splitter) self.setContentsMargins(-10, -10, -10, -10) self.setLayout(layout) QApplication.setStyle(QStyleFactory.create('Cleanlooks')) def closeEvent(self, event): os.exit(0)
def loadAndShow(): app = QApplication(sys.argv) # Create a Qt application, first thing mainpanes = QSplitter(Qt.Vertical) mainpanes.setWindowTitle('SMD channel design tables') specsFile = sys.argv[1] if len(sys.argv) > 1 else './smd-channels3.xml' etree = loadData(specsFile) # Get etree of data from .xml file styleBlob = ''' QHeaderView { background-color: darkgray; color: white; text-align: center; font-size:18px; } QTableCornerButton { background-color: "pink"; gridline-color: "green"; } QTableWidget { font: bold 16pt; text-align: center; background-color: #202800; color: "lightcyan"; } QPushButton { min-width: "23"; font: bold 23pt Helvetica; background-color: orange; color: navy; }''' mainpanes.setStyleSheet(styleBlob) # Make pushbuttons PBNames = CallData.buttonLabels() wib, hib, mb = 180, 75, 14 tab0 = QWidget(mainpanes) tab0.setMinimumSize(len(PBNames) * (mb + wib), hib + 2 * mb) for k, txt in enumerate(PBNames): u = QPushButton(txt, tab0) u.move(mb + (mb + wib) * k, mb) u.resize(wib, hib) u.clicked.connect(CallData.makeClickFunc(etree, mainpanes, u, k)) mainpanes.tab1 = mainpanes.tab2 = mainpanes.tab3 = mainpanes.tab4 = None makeTables(mainpanes, etree) # Make tables per .xml data CallData.calcVols(mainpanes) # Update volumes-of-parts cells mainpanes.show() # Show the window app.exec_() # Run the app
def buildUI(self): self.fig = Figure() self.zoom = 1 self.mapCanvas = FigureCanvas(self.fig) self.mapCanvas.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) main_splitter = QSplitter(Qt.Vertical) self.map_settings_widget = IPMapSettingsWidget() main_splitter.addWidget(self.map_settings_widget) main_splitter.addWidget(self.mapCanvas) main_splitter.setStretchFactor(0, 0) main_splitter.setStretchFactor(1, 1) # I want to make sure the splitter handle is easily seen... main_splitter.setStyleSheet( "QSplitter::handle{ background-color: #444444}") main_splitter.setHandleWidth(2) main_layout = QVBoxLayout() main_layout.addWidget(main_splitter) self.setLayout(main_layout) self.compute_initial_figure() self.connect_signals_and_slots()
def init_window(self): self.setWindowIcon(QtGui.QIcon(self.iconName)) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) hbox = QHBoxLayout() left = QFrame() left.setFrameShape(QFrame.StyledPanel) # left.setStyleSheet("background-color:violet") bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) # bottom.setStyleSheet("background-color:brown") line_edit = QLineEdit() line_edit.setStyleSheet("background-color:orange") splitter1 = QSplitter(Qt.Horizontal) splitter1.setStyleSheet("background-color:violet") splitter1.addWidget(left) splitter1.addWidget(line_edit) splitter1.setSizes([200, 200]) splitter2 = QSplitter(Qt.Vertical) splitter2.setStyleSheet("background-color:brown") splitter2.addWidget(splitter1) splitter2.addWidget(bottom) hbox.addWidget(splitter2) self.setLayout(hbox) self.show()
class MyMainWindow(QWidget): def __init__(self): super().__init__() self.title = "PyQt5 Splitter" self.top = 200 self.left = 500 self.width = 400 self.height = 300 hbox = QHBoxLayout() self.widg_1 = QFrame() self.widg_1.setFrameShape(QFrame.StyledPanel) self.my_splitter = QSplitter(Qt.Horizontal) self.widg_2 = QLineEdit() self.my_splitter.addWidget(self.widg_1) self.my_splitter.addWidget(self.widg_2) self.my_splitter.setSizes([200, 200]) hbox.addWidget(self.my_splitter) # Note: splitter handle 0 is always hidden and handle 1 is between the widgets 1 & 2 self.my_splitter_handle = self.my_splitter.handle(1) self.my_splitter.setStyleSheet( "QSplitter::handle {background: 3px blue};") self.setLayout(hbox) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.show()
def __init__(self): super().__init__() self.title = "PyQt5 Splitter" self.top = 200 self.left = 500 self.width = 400 self.height = 400 hbox = QHBoxLayout() left = QFrame() left.setFrameShape(QFrame.StyledPanel) bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) splitter1 = QSplitter(Qt.Horizontal) splitter1.setStyleSheet('background-color:red') lineedit = QLineEdit() lineedit.setStyleSheet('background-color:green') splitter1.addWidget(left) splitter1.addWidget(lineedit) splitter1.setSizes([300, 400]) spliiter2 = QSplitter(Qt.Vertical) spliiter2.addWidget(splitter1) spliiter2.addWidget(bottom) spliiter2.setStyleSheet('background-color:yellow') hbox.addWidget(spliiter2) self.setLayout(hbox) self.setWindowIcon(QtGui.QIcon("avatar.png")) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.show()
def InitWindow(self): self.setWindowIcon(QtGui.QIcon(self.iconName)) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) hbox = QHBoxLayout() left = QFrame() left.setFrameShape(QFrame.StyledPanel) bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) splitter1 = QSplitter(Qt.Horizontal) lineedit = QLineEdit() lineedit.setStyleSheet('background-color:green') splitter1.addWidget(left) splitter1.addWidget(lineedit) splitter1.setSizes([200, 200]) splitter1.setStyleSheet('background-color:red') splitter2 = QSplitter(Qt.Vertical) splitter2.addWidget(splitter1) splitter2.addWidget(bottom) splitter2.setStyleSheet('background-color:yellow') hbox.addWidget(splitter2) self.setLayout(hbox) self.show()
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.fileList = ui.FileList.FileList(self) self.fileListLabel = self.getLabel(self.fileList, "项目列表") self.imageArea = ui.ImageArea.ImageArea(self) self.imageAreaLabel = self.getLabel(self.imageArea, "图像预览") self.infoTable = ui.InfoTable.InfoTable(self) self.infoTableLabel = self.getLabel(self.infoTable, "输出列表") self.staBar = QStatusBar() self.staBar.setStyleSheet(uiConfig.STATUSBAR_S) self.setStatusBar(self.staBar) # 创建一个QSplitter,用来分割窗口 self.splitter = QSplitter(self) self.splitter.addWidget(self.fileListLabel) self.splitter.addWidget(self.imageAreaLabel) self.splitter.addWidget(self.infoTableLabel) self.splitter.setStretchFactor(0, 1) self.splitter.setStretchFactor(1, 3) self.splitter.setStretchFactor(2, 2) # QSplitter按照垂直分割 self.splitter.setStyleSheet(uiConfig.SPLITER_S) self.splitter.setOrientation(Qt.Horizontal) self.setCentralWidget(self.splitter) self.setWindowTitle("地图坐标拾取系统") # self.setStyleSheet("QMainWindow::separator { background: rgb(190,231,233) }") # self.setWindowFlag(Qt.WindowMaximizeButtonHint, False) # self.setWindowFlags(Qt.FramelessWindowHint) self.setWindowState(Qt.WindowMaximized) size = QDesktopWidget().screenGeometry(-1) self.setFixedSize(size.width(), size.height()) self.setWindowIcon(QIcon("ui/images/logo.png")) self.setStyleSheet(uiConfig.MAINWINDOW_S) def getLabel(self, mWidget, text): qLabel = QLabel() qLabel.setStyleSheet(uiConfig.GRANDLABEL_S) vLayout = QVBoxLayout() textLabel = QLabel() textLabel.setStyleSheet(uiConfig.TEXTLABEL_S) textLabel.setText(" " + text) textLabel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) mWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) vLayout.setContentsMargins(0, 0, 0, 0) vLayout.setSpacing(0) vLayout.addWidget(textLabel) vLayout.addWidget(mWidget) qLabel.setLayout(vLayout) return qLabel
def set_splitter_stylesheet(splitter: QSplitter): splitter.setHandleWidth(4) bgcolor = constants.BGCOLOR.lighter(150) r, g, b, a = bgcolor.red(), bgcolor.green(), bgcolor.blue(), bgcolor.alpha() splitter.setStyleSheet("QSplitter::handle:vertical {{margin: 4px 0px; " "background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, " "stop:0.2 rgba(255, 255, 255, 0)," "stop:0.5 rgba({0}, {1}, {2}, {3})," "stop:0.8 rgba(255, 255, 255, 0));" "image: url(:/icons/icons/splitter_handle_horizontal.svg);}}" "QSplitter::handle:horizontal {{margin: 4px 0px; " "background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, " "stop:0.2 rgba(255, 255, 255, 0)," "stop:0.5 rgba({0}, {1}, {2}, {3})," "stop:0.8 rgba(255, 255, 255, 0));" "image: url(:/icons/icons/splitter_handle_vertical.svg);}}".format(r, g, b, a))
def set_splitter_stylesheet(splitter: QSplitter): splitter.setHandleWidth(6) bgcolor = constants.BGCOLOR.lighter(120) r, g, b = bgcolor.red(), bgcolor.green(), bgcolor.blue() splitter.setStyleSheet("QSplitter::handle:vertical {{margin: 4px 0px; " "background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, " "stop:0 rgba(255, 255, 255, 0)," "stop:0.5 rgba({0}, {1}, {2}, 255)," "stop:1 rgba(255, 255, 255, 0));" "image: url(:/icons/icons/splitter_handle_horizontal.svg);}}" "QSplitter::handle:horizontal {{margin: 4px 0px; " "background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, " "stop:0 rgba(255, 255, 255, 0)," "stop:0.5 rgba({0}, {1}, {2}, 255)," "stop:1 rgba(255, 255, 255, 0));" "image: url(:/icons/icons/splitter_handle_vertical.svg);}}".format(r, g, b))
def Splitter(self): hbox = QHBoxLayout() left = QFrame() left.setFrameShape(QFrame.StyledPanel) bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) splitter1 = QSplitter(Qt.Horizontal) splitter1.setStyleSheet('background-color:red') lineedit = QLineEdit() lineedit.setStyleSheet('background-color:green') splitter1.addWidget(left) splitter1.addWidget(lineedit) splitter1.setSizes([200, 200]) spliiter2 = QSplitter(Qt.Vertical) spliiter2.addWidget(splitter1) spliiter2.addWidget(bottom) spliiter2.setStyleSheet('background-color:yellow') hbox.addWidget(spliiter2) self.setLayout(hbox)
def __init__(self): super().__init__() self.title = "PyQt5 - Splitters" self.left = 500 self.top = 200 self.width = 200 self.height = 200 self.iconName = "_imagens/mouse.ico" self.setWindowTitle(self.title) self.setWindowIcon(QtGui.QIcon(self.iconName)) self.setGeometry(self.left, self.top, self.width, self.height) hbox = QHBoxLayout() left = QFrame() left.setFrameShape(QFrame.StyledPanel) bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) splitter1 = QSplitter(Qt.Horizontal) lineedit = QLineEdit() lineedit.setStyleSheet('background-color:lightblue') splitter1.addWidget(left) splitter1.addWidget(lineedit) splitter1.setSizes([200, 200]) splitter1.setStyleSheet('background-color:lightgray') splitter2 = QSplitter(Qt.Vertical) splitter2.addWidget(splitter1) splitter2.addWidget(bottom) hbox.addWidget(splitter2) self.setLayout(hbox) self.show()
def __init__(self): super().__init__() self.title = "Pyqt5 Frame class" self.top = 500 self.left = 500 self.width = 600 self.height = 200 self.iconName = "transistor.jpg" self.setWindowIcon(QtGui.QIcon(self.iconName)) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) hbox = QHBoxLayout() left = QFrame() left.setFrameShape(QFrame.StyledPanel) bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) splitter1 = QSplitter(Qt.Horizontal) lineedit = QLineEdit() lineedit.setStyleSheet("background-color:green") splitter1.addWidget(left) splitter1.addWidget(lineedit) splitter1.setSizes([200, 200]) splitter1.setStyleSheet("background-color:blue") splitter2 = QSplitter(Qt.Vertical) splitter2.addWidget(splitter1) splitter2.addWidget(bottom) splitter2.setStyleSheet("background-color:blue") hbox.addWidget(splitter2) self.setLayout(hbox) self.show()
class TestWindow(QWidget): TMPDIR = "tmp" TMPHTMLFILE = os.path.join(TMPDIR,'tmptext.html') def __init__(self,parent = None): QWidget.__init__(self,parent) if os.path.isdir(TestWindow.TMPDIR) == False: os.mkdir(TestWindow.TMPDIR) self.textEditor = TextEditor(self) self.webViewer = QWebView(self) self.setupUI() self.textEditor.textChangeSignal.connect(self.reloadText) def reloadText(self,dataDict): if self.webViewer.isVisible() == False: self.webViewer.show() with codecs.open( ResourceManager.getResourceAbsPath('template.html'),'r','utf-8' ) as templateFileObj: templateStr = templateFileObj.read() with open( TestWindow.TMPHTMLFILE,'wb' ) as tempFileObj: tempFileObj.write( (templateStr % dataDict[TextEditor.KEY_ORIGINALTXET]).encode('utf-8') ) self.webViewer.load(QUrl( "file:///%s" % os.path.abspath( TestWindow.TMPHTMLFILE ) )) def setupUI(self): self.webViewer.hide() layout = QHBoxLayout(self) self.splitter = QSplitter(self) self.splitter.addWidget(self.textEditor) self.splitter.addWidget(self.webViewer) layout.addWidget(self.splitter) self.textEditor.resize(400,600) self.webViewer.resize(400,600) self.resize(800,600) self.splitter.setStyleSheet("background-color:green;") self.textEditor.setStyleSheet("background-color:white;border:none;") self.webViewer.setStyleSheet("background-color:white;")
def __init__(self): super().__init__() self.title = "PyQt5 QButton Group" self.top = 200 self.left = 500 self.width = 400 self.height = 300 self.setWindowTitle(self.title) self.setWindowIcon(QtGui.QIcon("pyqt.png")) self.setGeometry(self.left, self.top, self.width, self.height) self.setStyleSheet("background-color:yellow") hbox=QHBoxLayout() frame1=QFrame() frame1.setFrameShape(QFrame.StyledPanel) frame2 = QFrame() frame2.setFrameShape(QFrame.StyledPanel) linedit = QLineEdit() linedit.setStyleSheet("background-color:green") spliter1 = QSplitter(QtCore.Qt.Horizontal) spliter1.addWidget(frame1) spliter1.addWidget(linedit) spliter1.setStyleSheet("background-color:red") spliter2 = QSplitter(QtCore.Qt.Vertical) spliter2.addWidget(spliter1) spliter2.addWidget(frame2) hbox.addWidget(spliter2) self.setLayout(hbox) self.show()
class CenterWindow(QWidget): def __init__(self, app, *args, **kwargs): super().__init__(*args, **kwargs) self.app = app centr_grid = QGridLayout() self.setLayout(centr_grid) self.setStyleSheet("background-color: gray") self.splitter = QSplitter(Qt.Horizontal) self.splitter.setStyleSheet('background-color:green') centr_grid.addWidget(self.splitter) self.note = Tabs(center_widget=self) self.left = left_part.left1(self) self.splitter.addWidget(self.left) self.right = right2(self) self.splitter.addWidget(self.right) grid_right = QGridLayout() self.right.setLayout(grid_right) grid_right.addWidget(self.note, 0, 0) self.splitter.setSizes([splitter_parameters['lefty'], splitter_parameters['righty']])
class IPWaveformWidget(QWidget): """ The IPWaveformWidget holds the waveform and inventory data. The IPPlotViewer plots the data, The IPFilterSettingsWidget holds the filter settings and tells the WaveformWidget when to update that data. The IPStatsView displays the trace data, and the IPStationView displays the station data. """ _sts = None # streams _sts_filtered = None # filtered streams _inv = None # inventory def __init__(self, parent=None, pool=None, project=None): super().__init__(parent) self._parent = parent self.settings = parent.settings self._mp_pool = pool self.buildUI() def buildUI(self): self.stationViewer = IPStationView.IPStationView(self) self.statsViewer = IPStatsView.IPStatsView(self) self.info_tabs = QTabWidget() self.info_tabs.addTab(self.statsViewer, 'Trace Info') self.info_tabs.addTab(self.stationViewer, 'Station Info') self.filterSettingsWidget = IPFilterSettingsWidget.IPFilterSettingsWidget(self) self.spectraWidget = IPPSDWidget.IPPSDWidget(self) self.plotViewer = IPPlotViewer.IPPlotViewer(self, self.filterSettingsWidget) self.lh_splitter = QSplitter(Qt.Vertical) self.lh_splitter.setStyleSheet("QSplitter::handle{ background-color: #DDD}") self.lh_splitter.addWidget(self.plotViewer) self.lh_splitter.addWidget(self.info_tabs) self.rh_splitter = QSplitter(Qt.Vertical) self.rh_splitter.setStyleSheet("QSplitter::handle{ background-color: #DDD}") self.rh_splitter.addWidget(self.spectraWidget) self.rh_splitter.addWidget(self.filterSettingsWidget) self.main_splitter = QSplitter(Qt.Horizontal) self.main_splitter.setStyleSheet("QSplitter::handle{ background-color: #DDD}") self.main_splitter.addWidget(self.lh_splitter) self.main_splitter.addWidget(self.rh_splitter) main_layout = QGridLayout() main_layout.addWidget(self.main_splitter) self.setLayout(main_layout) self.connect_signals_and_slots() def connect_signals_and_slots(self): self.filterSettingsWidget.sig_filter_changed.connect(self.update_filtered_data) self.filterSettingsWidget.sig_filter_display_changed.connect(self.plotViewer.show_hide_lines) self.statsViewer.removeTrace.connect(self.remove_trace) self.plotViewer.lr_settings_widget.noiseSpinsChanged.connect(self._parent.beamformingWidget.bottomSettings.setNoiseValues) self.plotViewer.lr_settings_widget.signalSpinsChanged.connect(self._parent.beamformingWidget.bottomSettings.setSignalValues) self.plotViewer.lr_settings_widget.signalSpinsChanged.connect(self._parent.beamformingWidget.updateWaveformRange) self.plotViewer.pl_widget.sig_active_plot_changed.connect(self.update_widgets) self.spectraWidget.f1_Spin.valueChanged.connect(self._parent.beamformingWidget.bottomSettings.setFmin) self.spectraWidget.f2_Spin.valueChanged.connect(self._parent.beamformingWidget.bottomSettings.setFmax) self.spectraWidget.psdPlot.getFreqRegion().sigRegionChanged.connect(self._parent.beamformingWidget.bottomSettings.setFreqValues) def get_project(self): return self._parent.getProject() def errorPopup(self, message, title="Oops..."): msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Information) msgBox.setText(message) msgBox.setWindowTitle(title) msgBox.exec_() @pyqtSlot(obspy.core.stream.Stream, obspy.core.inventory.inventory.Inventory) def appendTraces(self, newTraces, newInventory): if newTraces is None: return if self._sts is None: self._sts = newTraces else: self._sts += newTraces self.update_inventory(newInventory) for trace in self._sts: trace.data = trace.data - np.mean(trace.data) self._sts.merge(fill_value=0) # it's possible, if the open failed, that self.waveformWidget._sts is still None, so if it is, bail out # if not populate the trace stats viewer and plot the traces if self._sts is not None: # TODO...is there a better way of doing this? self._parent.beamformingWidget.setStreams(self._sts) self.stationViewer.setInventory(self._inv) self.statsViewer.setStats(self._sts) self.update_streams(self._sts) self._parent.setStatus("Ready", 5000) else: return @pyqtSlot(obspy.core.stream.Stream, obspy.core.inventory.inventory.Inventory) def replaceTraces(self, newTraces, newInventory): # same as append, just clear out the old traces and inventory first self._sts = None self._inv = None self.stationViewer.setInventory(self._inv) self.appendTraces(newTraces, newInventory) @pyqtSlot(Inventory) def update_inventory(self, new_inventory): if self._inv is None: self._inv = new_inventory else: self._inv += new_inventory self.stationViewer.setInventory(self._inv) def remove_from_inventory(self, net, sta, loc, cha): self.inv_remove(self._inv, network=net, station=sta, location=loc, channel=cha, keep_empty=False) self.update_inventory(new_inventory) def get_streams(self): return self._sts def get_filtered_streams(self): return self._sts_filtered def get_inventory(self): return self._inv def set_inventory(self, new_inv): self._inv = new_inv def getTraceName(self, trace): traceName = trace.stats['network'] + '.' + trace.stats['station'] + \ '.' + trace.stats['location'] + '.' + trace.stats['channel'] return traceName def get_earliest_start_time(self): return self.plotViewer.pl_widget.earliest_start_time @pyqtSlot(Stream) def update_streams(self, new_stream): # this should be called when you load new streams, or remove traces self._sts = new_stream self._sts_filtered = self.filter_stream(self._sts, self.filterSettingsWidget.get_filter_settings()) self.plotViewer.set_streams(self._sts, self._sts_filtered, self.filterSettingsWidget.get_filter_display_settings()) self.statsViewer.setStats(new_stream) def debug_trace(self): # for debugging, you have to call pyqtRemoveInputHook before set_trace() from PyQt5.QtCore import pyqtRemoveInputHook from pdb import set_trace pyqtRemoveInputHook() set_trace() @pyqtSlot(dict) def update_filtered_data(self, filter_settings): # this should be called when settings in the filter widget are changed if self._sts is None: # Nothing to filter, clear out the filtered_streams and return self._sts_filtered = None return self._sts_filtered = self.filter_stream(self._sts, filter_settings) self.plotViewer.pl_widget.update_filtered_line_data(self._sts_filtered) index = self.plotViewer.pl_widget.get_active_plot() self.update_widgets(index, self.plotViewer.get_plot_lines(), self.plotViewer.get_filtered_plot_lines(), self.plotViewer.pl_widget.plot_list[index].getSignalRegionRange()) def filter_stream(self, stream, cfs): # cfs: Current Filter Settings if stream is None: # nothing to do return None filtered_stream = Stream() for trace in stream: filtered_trace = trace.copy() filtType = cfs['type'] if filtType == 'High Pass': try: filtered_trace.filter('highpass', freq=cfs['F_high'], corners=cfs['order'], zerophase=cfs['zphase']) except ValueError as e: self.errorPopup(str(e)) elif filtType == 'Low Pass': try: filtered_trace.filter('lowpass', freq=cfs['F_low'], corners=cfs['order'], zerophase=cfs['zphase']) except ValueError as e: self.errorPopup(str(e)) elif filtType == 'Band Pass': try: filtered_trace.filter('bandpass', freqmin=cfs['F_high'], freqmax=cfs['F_low'], corners=cfs['order'], zerophase=cfs['zphase']) except ValueError as e: self.errorPopup(str(e)) else: self.errorPopup(filtType + ' filter not implemented yet') return filtered_stream += filtered_trace return filtered_stream def saveWindowGeometrySettings(self): self._parent.settings.beginGroup('WaveformWidget') self._parent.settings.setValue("main_splitterSettings", self.main_splitter.saveState()) self._parent.settings.setValue("rh_splitterSettings", self.rh_splitter.saveState()) self._parent.settings.setValue("lh_splitterSettings", self.lh_splitter.saveState()) self._parent.settings.setValue("plotviewer_splitterSettings", self.plotViewer.saveState()) self._parent.settings.endGroup() def restoreWindowGeometrySettings(self): # Restore settings self._parent.settings.beginGroup('WaveformWidget') main_splitterSettings = self._parent.settings.value("main_splitterSettings") if main_splitterSettings: self.main_splitter.restoreState(main_splitterSettings) rh_splitterSettings = self._parent.settings.value("rh_splitterSettings") if rh_splitterSettings: self.rh_splitter.restoreState(rh_splitterSettings) lh_splitterSettings = self._parent.settings.value("lh_splitterSettings") if lh_splitterSettings: self.lh_splitter.restoreState(lh_splitterSettings) pv_splitterSettings = self._parent.settings.value("plotviewer_splitterSettings") if pv_splitterSettings: self.plotViewer.restoreState(pv_splitterSettings) else: pv_width = self.plotViewer.width() wsw = pv_width//6 pww = pv_width - wsw self.plotViewer.setSizes([wsw, pww]) self._parent.settings.endGroup() @QtCore.pyqtSlot(str) def remove_trace(self, trace_id): for trace in self._sts.select(id=trace_id): self._sts.remove(trace) self.removeStation(trace.stats['network'], trace.stats['station']) self.statsViewer.setStats(self._sts) if len(self._sts) == 0: self._sts = None self.update_streams(self._sts) def removeStation(self, net_id, station_id): if self._inv is not None: try: self._inv = self.inv_remove(self._inv, network=net_id, station=station_id) except AttributeError as e: print(e) self.stationViewer.setInventory(self._inv) def inv_remove(self, _inventory, network='*', station='*', location='*', channel='*', keep_empty=False): selected = _inventory.select(network=network, station=station, location=location, channel=channel) selected_networks = [net for net in selected] selected_stations = [sta for net in selected_networks for sta in net] selected_channels = [cha for net in selected_networks for sta in net for cha in sta] networks = [] for net in _inventory: if net in selected_networks and station == '*' and \ location == '*' and channel == '*': continue stations = [] for sta in net: if sta in selected_stations and location == '*' and channel == '*': continue channels = [] for cha in sta: if cha in selected_channels: continue channels.append(cha) if not channels and not keep_empty: continue sta = copy.copy(sta) sta.channels = channels stations.append(sta) if not stations and not keep_empty: continue net = copy.copy(net) net.stations = stations networks.append(net) return obspy.core.inventory.inventory.Inventory(networks, 'source') def clearWaveforms(self): # empty out the streams self._sts = None self._sts_filtered = None # empty out the child widgets self.statsViewer.clear() self.stationViewer.clear() self.plotViewer.clear() self.spectraWidget.clearPlot() @pyqtSlot(object) def update_signal_PSD(self, signal_region_item): if len(self._sts) == 0: self.spectraWidget.clearPlot() return signal_region = signal_region_item.getRegion() active_plot = self.plotViewer.pl_widget.get_active_plot() # calculate the PSD of the ---------------------------tart and finish dt = self._sts[active_plot].stats.delta start = int(signal_region[0] / dt) stop = int(signal_region[1] / dt) self.spectraWidget.updateSignalPSD(self._sts[active_plot][start:stop]) @pyqtSlot(object) def update_noise_PSD(self, noise_region_item): if len(self._sts) == 0: self.spectraWidget.clearPlot() return noise_region = noise_region_item.getRegion() active_plot = self.plotViewer.pl_widget.get_active_plot() # calculate the PSD of the data in the current noise region dt = self._sts[active_plot].stats.delta start = int(noise_region[0] / dt) stop = int(noise_region[1] / dt) self.spectraWidget.updateNoisePSD(self._sts[active_plot][start:stop]) @pyqtSlot(int, list, list, tuple) def update_widgets(self, index, lines, filtered_lines, signal_region): # the -1 is sent if none of the plots are visible if len(self._sts) < 1 or index == -1: self.spectraWidget.set_title('...') self.spectraWidget.clearPlot() else: self.spectraWidget.set_title(self._sts[index].id) self.spectraWidget.set_fs(self._sts[index].stats.sampling_rate) # self.spectraWidget.updateSignalPSD() # self.spectraWidget.updateNoiesPSD() noise_region_item = self.plotViewer.pl_widget.plot_list[index].getNoiseRegion() noise_region_item.sigRegionChanged.emit(noise_region_item) signal_region_item = self.plotViewer.pl_widget.plot_list[index].getSignalRegion() signal_region_item.sigRegionChanged.emit(signal_region_item) current_filter_display_settings = self.filterSettingsWidget.get_filter_display_settings() if current_filter_display_settings['apply']: self._parent.beamformingWidget.setWaveform(filtered_lines[index], signal_region) else: self._parent.beamformingWidget.setWaveform(lines[index], signal_region)
class Ui_MainWindow(QMainWindow): def __init__(self): super().__init__() # self.initUI() self.init_ui() self.generateData() self.UI_style() def init_ui(self): self.setFixedSize(1200, 700) self.setWindowTitle('STalking') self.setWindowIcon(QIcon("icon/stlogo.ico")) self.main_widget = QtWidgets.QWidget() # 创建窗口主部件 self.main_widget.setObjectName('main_widget') self.main_layout = QtWidgets.QGridLayout() # 创建主部件的网格布局 self.main_widget.setLayout(self.main_layout) # 设置窗口主部件布局为网格布局 self.left_widget = QtWidgets.QWidget() # 创建左侧部件 左侧为功能按钮 self.left_widget.setObjectName('left_widget') self.left_layout = QtWidgets.QGridLayout() # 创建左侧部件的网格布局层 self.left_widget.setLayout(self.left_layout) # 设置左侧部件布局为网格 self.center_Splitter = QSplitter(Qt.Horizontal) self.center_Splitter.setObjectName('center_Splitter') self.center_layout = QtWidgets.QGridLayout() self.center_Splitter.setLayout(self.center_layout) # 设置右侧部件布局为网格 self.main_layout.addWidget(self.left_widget, 0, 0, 16, 3) # 左侧部件在第0行第0列,占8行3列 # self.main_layout.addWidget(self.center_QWidget, 0, 3, 16, 17) # 左侧部件在第0行第3列,占8行3列 self.main_layout.addWidget(self.center_Splitter, 0, 3, 16, 17) # 左侧部件在第0行第3列,占8行3列 self.setCentralWidget(self.main_widget) # 设置窗口主部件 self.icon_button = QtWidgets.QToolButton() self.icon_button.setIcon(QtGui.QIcon('icon/stlogo.ico')) # 设置按钮图标 self.icon_button.setIconSize(QtCore.QSize(150, 100)) # 设置图标大小 self.left_label_1 = QtWidgets.QPushButton("模型选择") self.left_label_1.setObjectName('left_label') self.left_label_2 = QtWidgets.QPushButton("保存与设置") self.left_label_2.setObjectName('left_label') self.left_label_3 = QtWidgets.QPushButton("其他") self.left_label_3.setObjectName('left_label') self.left_button_1 = QtWidgets.QPushButton( qtawesome.icon('fa.database', color='gray'), "选择GMM") self.left_button_1.setObjectName('left_button') self.left_button_2 = QtWidgets.QPushButton( qtawesome.icon('fa.file', color='gray'), "选择UBM") self.left_button_2.setObjectName('left_button') self.left_button_3 = QtWidgets.QPushButton( qtawesome.icon('fa.plus-circle', color='gray'), "选择视频") self.left_button_3.setObjectName('left_button') self.left_button_4 = QtWidgets.QPushButton( qtawesome.icon('fa.save', color='gray'), "保存模型") self.left_button_4.setObjectName('left_button') self.left_button_5 = QtWidgets.QPushButton( qtawesome.icon('fa.file', color='gray'), "模型路径") self.left_button_5.setObjectName('left_button') self.left_button_6 = QtWidgets.QPushButton( qtawesome.icon('fa.folder-open', color='gray'), "文件路径") self.left_button_6.setObjectName('left_button') self.left_button_7 = QtWidgets.QPushButton( qtawesome.icon('fa.comment', color='gray'), "使用向导") self.left_button_7.setObjectName('left_button') self.left_button_8 = QtWidgets.QPushButton( qtawesome.icon('fa.star', color='gray'), "版权说明") self.left_button_8.setObjectName('left_button') self.left_button_9 = QtWidgets.QPushButton( qtawesome.icon('fa.question', color='gray'), "关于我们") self.left_button_9.setObjectName('left_button') self.left_xxx = QtWidgets.QPushButton(" ") self.left_layout.addWidget(self.icon_button, 0, 0.5, 1, 3) self.left_layout.addWidget(self.left_label_1, 1, 0, 1, 3) self.left_layout.addWidget(self.left_button_1, 2, 0, 1, 3) self.left_layout.addWidget(self.left_button_2, 3, 0, 1, 3) self.left_layout.addWidget(self.left_button_3, 4, 0, 1, 3) self.left_layout.addWidget(self.left_label_2, 5, 0, 1, 3) self.left_layout.addWidget(self.left_button_4, 6, 0, 1, 3) self.left_layout.addWidget(self.left_button_5, 7, 0, 1, 3) self.left_layout.addWidget(self.left_button_6, 8, 0, 1, 3) self.left_layout.addWidget(self.left_label_3, 9, 0, 1, 3) self.left_layout.addWidget(self.left_button_7, 10, 0, 1, 3) self.left_layout.addWidget(self.left_button_8, 11, 0, 1, 3) self.left_layout.addWidget(self.left_button_9, 12, 0, 1, 3) self.model_list_widget = QtWidgets.QWidget() self.model_list_widget.setObjectName('model_widget') self.model_list_layout = QtWidgets.QGridLayout() # 创建左侧部件的网格布局层 self.model_list_widget.setLayout(self.model_list_layout) # 设置左侧部件布局为网格 self.model_list_label = QtWidgets.QLabel("模型列表") self.model_list_label.setObjectName('my_lable') self.model_view_list = QListWidget() # 文件列表 self.model_view_list.setObjectName('my_list') # self.model_view_list.setFixedWidth(200) self.right_Splitter = QSplitter(Qt.Vertical) self.right_Splitter.setObjectName('right_Splitter') self.model_list_layout.addWidget(self.model_list_label, 0, 0, 1, 1) self.model_list_layout.addWidget(self.model_view_list, 1, 0, 9, 1) self.center_Splitter.addWidget(self.model_list_widget) self.center_Splitter.addWidget(self.right_Splitter) self.center_Splitter.setStretchFactor(0, 2) self.center_Splitter.setStretchFactor(1, 8) self.result_label = QtWidgets.QLabel("数据分析") self.result_label.setFixedHeight(80) self.result_label.setObjectName('my_lable') self.right_html_page_TabWidget = QtWidgets.QTabWidget() self.right_html_page_TabWidget.setObjectName( 'right_html_page_TabWidget') self.right_log_widget = QtWidgets.QWidget() # log 框 = button + log self.right_log_widget.setObjectName('right_log_widget') self.right_log_layout = QtWidgets.QGridLayout() self.right_log_widget.setLayout(self.right_log_layout) # 设置右侧部件布局为网格 self.right_Splitter.addWidget(self.result_label) self.right_Splitter.addWidget(self.right_html_page_TabWidget) self.right_Splitter.addWidget(self.right_log_widget) self.right_Splitter.setStretchFactor(0, 1) self.right_Splitter.setStretchFactor(1, 9) self.right_Splitter.setStretchFactor(2, 1) self.right_log_toolbar = QToolBar() self.right_log_toolbar.setObjectName('right_log_toolbar') self.right_log_toolbar.setOrientation(Qt.Vertical) # self.right_button_layout.addWidget(self.toolbarGmm) delete_action = QAction(QIcon('icon/delete-gray.png'), '清空日志', self) self.right_log_toolbar.addAction(delete_action) export_action = QAction(QIcon('icon/save_m.png'), '导出日志', self) self.right_log_toolbar.addAction(export_action) # self.right_log_layout.setSpacing(0) self.right_log_contend = QListWidget() # self.right_log_contend.setFixedHeight(100) self.right_log_contend.setObjectName('my_list') self.right_log_layout.addWidget(self.right_log_toolbar, 0, 0, 1, 3) self.right_log_layout.addWidget(self.right_log_contend, 0, 1, 1, 18) # 定义 css def UI_style(self): self.main_widget.setStyleSheet(''' QWidget#main_widget{ background:#EBEBEB; border-top:1px solid #EBEBEB; border-bottom:1px solid #EBEBEB; border-left:1px solid #EBEBEB; border-top-left-radius:10px; border-bottom-left-radius:10px; } ''') self.result_label.setStyleSheet(''' QLabel{ border:none; background:#EBEBEB; font-size:20px; font-weight:900; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } ''') self.model_list_label.setStyleSheet(''' QLabel{ border:none; background:#EBEBEB; font-size:20px; font-weight:900; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } ''') self.icon_button.setStyleSheet(''' QToolButton{ border:none; background:#EBEBEB; } ''') self.main_widget.setStyleSheet(''' QWidget#center_QWidget{ color:#232C51; background:#EBEBEB; border-top:1px solid #EBEBEB; border-bottom:1px solid #EBEBEB; border-right:1px solid #EBEBEB; border-top-right-radius:10px; border-bottom-right-radius:10px; } QWidget#left_widget{ background:#EBEBEB; border-top:1px solid #EBEBEB; border-bottom:1px solid #EBEBEB; border-left:1px solid #EBEBEB; border-top-left-radius:10px; border-bottom-left-radius:10px; } ''') self.model_list_widget.setStyleSheet(''' QListWidget#my_list{ background:light white; border:none; width:300px; border-radius:10px; padding:2px 4px; } ''') self.left_widget.setStyleSheet(''' QPushButton{border:none;color:gray;font-size:18px;font-weight:700;} QPushButton#left_label{ border:none; border-bottom:1px solid dark gray; font-size:20px; font-weight:900; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } QPushButton#left_button:hover{border-left:4px solid red;font-weight:700;} ''') self.center_Splitter.setStyleSheet(''' QSplitter#center_Splitter{ background:#EBEBEB; } QSplitter#right_Splitter{ background:#EBEBEB; } QTabWidget#right_html_page_TabWidget{ width:300px; border-radius:10px; padding:2px 4px; border:none; font-size:16px; font-weight:700; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } } QLabel#my_lable{ background-color:#EBEBEB; border:none; font-size:20px; font-weight:bold; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } QToolBar#right_log_toolbar{ border:none; background-color: #EBEBEB; } QListWidget#my_list{ background:light white; border:none; width:300px; border-radius:10px; padding:2px 4px; } ''') self.model_list_label.setAlignment(Qt.AlignCenter) self.result_label.setAlignment(Qt.AlignCenter) self.model_list_label.setStyleSheet(''' QLabel{ background-color:light gray; border:none; font-size:20px; font-weight:bold; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } ''') self.right_log_widget.setStyleSheet(''' QListWidget#right_log_widget{ width:300px; border-radius:10px; padding:2px 4px; } QToolBar#right_log_toolbar{ border:none; background-color: light gray; } QListWidget#right_log_contend{ background:#EBEBEB; border:none; border:1px solid gray; width:300px; border-radius:10px; padding:2px 4px; } ''') # self.setWindowOpacity(1) # 设置窗口透明度 # self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 设置窗口背景透明 # self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # 隐藏边框 # self.main_layout.setSpacing(0) def generateData(self): for group in range(1, 100): self.model_view_list.addItem("model_{0}".format(group)) for group in range(1, 100): self.right_log_contend.addItem( (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + " : operation_{0}").format(group)) for group in range(1, 4): self.tabItem = QTextBrowser() self.right_html_page_TabWidget.addTab(self.tabItem, "page_{0}".format(group)) self.tabItem.setHtml("""<table bgcolor=yellow> <tr><td>Groups:</td><td>comp.lang.python.announce</td></tr> <tr><td>From:</td><td>"Fuzzyman" <[email protected]></td></tr> <tr><td>Subject:</td><td><b>[ANN] Movable Python 2.0.0 Final Available</b></td></tr> </table> <h3>Movable Python 2.0.0 Final</h3> <p> <a href="http://www.voidspace.org.uk/python/movpy/"> http://www.voidspace.org.uk/python/movpy/</a> is now available. <p> The new binaries are available for download from the groups page : <p>Movable Python Groups Page <a href="http://voidspace.tradebit.com/groups.php"> http://voidspace.tradebit.com/groups.php</a> <p> Binaries are uploaded for Python 2.2.3, 2.3.5, 2.4.4, 2.5 and the MegaPack <a href="http://www.voidspace.org.uk/python/movpy/megapack.html"> http://www.voidspace.org.uk/python/movpy/megapack.html</a>. <p> There is also a fresh version of the free demo, based on Python 2.3.5: <p>Movable Python Trial Version <a href="http://voidspace.tradebit.com/files.php/7007"> http://voidspace.tradebit.com/files.php/7007</a> <h3>What is Movable Python</h3> <p> <b><i>Movable Python</i></b> is a distribution of Python, for Windows, that can run without being installed. It means you can carry a full development environment round on a USB stick. <p> It is also useful for testing programs with a 'clean Python install', and testing programs with multiple versions of Python. <p> The GUI program launcher makes it a useful programmers tool, including features like : <ul> <li>Log the output of all Python scripts run <li>Enable Psyco for all scripts <li>Quick Launch buttons for commonly used programs <li>Configure multiple interpreters for use from a single interface </ul> <p> It comes with the Pythonwin IDE and works fine with other IDEs like SPE <a href="http://developer.berlios.de/projects/python/"> http://developer.berlios.de/projects/python/</a>. <p> Plus many other features and bundled libraries.""")
def __init__(self): # Set up all the window related stuff self._app = QApplication(sys.argv) self._window = QMainWindow() size = self._app.primaryScreen().size() self._window.resize(int(size.width()*0.7), int(size.height()*0.8)) self._window.setObjectName("PyGUIno") self._window.setWindowTitle('PyGUIno') self._window.setWindowIcon(QIcon('resources\\assets\\etsi.png')) self._centralwidget = QWidget(self._window) self._window.setCentralWidget(self._centralwidget) self._centralwidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.layout = QHBoxLayout() self._centralwidget.setLayout(self.layout) # Create the toolbar and the actions self.toolbar = QToolBar() save_action = QAction(QIcon('resources\\assets\\ic_save_3x.png'), 'Guardar', self._window) save_action.setStatusTip('Guarda la configuración de las gráficas actuales') load_action = QAction(QIcon('resources\\assets\\ic_open_in_new_18pt_3x.png'), 'Cargar', self._window) load_action.setStatusTip('Cargar la configuración de gráficas') self.connect_menu = QAction(QIcon('resources\\assets\\ic_settings_black_48dp.png'), 'Conectar', self._window) self.connect_menu.setStatusTip('Configuración de la conexión a Arduino') self.start_action = QAction(QIcon('resources\\assets\\ic_play_arrow_3x.png'), 'Comenzar', self._window) self.start_action.setEnabled(False) self.start_action.setStatusTip('Comienza la conexión con Arduino') self.stop_action = QAction(QIcon('resources\\assets\\ic_stop_3x.png'), 'Detener', self._window) self.stop_action.setEnabled(False) self.stop_action.setStatusTip('Detiene la conexión con Arduino') add_plot = QAction(QIcon('resources\\assets\\ic_timeline_48pt_3x.png'), 'Añadir gráfica', self._window) add_plot.setStatusTip('Añadir gráfica') board_selector = QComboBox() self.board_choices = [] self.current_board = None schemas = os.listdir("resources\\schemas") self.widgetCoord = WidgetCoordinator() for schema in schemas: fd = open("resources\\schemas\\" + schema, 'r') data = json.load(fd) board_selector.addItem(data['name']) tmp = list() # añadir al dict los pines digitales for x in range(0, data['digital']): tmp.append(x) # añadir al dict los pines analogicos for x in range(data['digital'], data['digital'] + data['analog']): tmp.append("A"+str(x-data['digital'])) self.board_choices.append((tmp, data["data_size"])) self.widgetCoord.data_size = data["data_size"] self.widgetCoord.pin_list = tmp self.current_board = tmp fd.close() # Signal handlers save_action.triggered.connect(self.save) load_action.triggered.connect(self.load) add_plot.triggered.connect(self.ini_graph_dialog) self.connect_menu.triggered.connect(self.comm_config) self.start_action.triggered.connect(self.start) self.stop_action.triggered.connect(self.stop) board_selector.currentIndexChanged.connect(self.switch_board) self.toolbar.addAction(save_action) self.toolbar.addAction(load_action) self.toolbar.addAction(add_plot) self.toolbar.addAction(self.connect_menu) self.toolbar.addAction(self.start_action) self.toolbar.addAction(self.stop_action) self.toolbar.addWidget(board_selector) self._window.addToolBar(self.toolbar) # Create status bar self.statusbar = QStatusBar(self._window) self._window.setStatusBar(self.statusbar) # Create Workspace area left_layout = QVBoxLayout() right_layout = QVBoxLayout() left_layout.setContentsMargins(0, 0, 0, 0) right_layout.setContentsMargins(0, 0, 0, 0) top_left_side = self.widgetCoord.plot_container top_right_side = self.widgetCoord.user_vars_table low_left_side = self.widgetCoord.debug_vars_widget low_right_side = self.widgetCoord.log_container # Prepare horizontal splitter and left and right vertical splitters horizontal_splitter = QSplitter(Qt.Horizontal) horizontal_splitter.setStyleSheet('background-color:rgb(239, 239, 239)') left_vertical_splitter = QSplitter(Qt.Vertical) left_vertical_splitter.setStyleSheet('background-color:rgb(239, 239, 239)') right_vertical_splitter = QSplitter(Qt.Vertical) right_vertical_splitter.setStyleSheet('background-color:rgb(239, 239, 239)') # First add left then add right left_vertical_splitter.addWidget(top_left_side) left_vertical_splitter.addWidget(low_left_side) left_layout.addWidget(left_vertical_splitter) # The same but on the right side right_vertical_splitter.addWidget(top_right_side) right_vertical_splitter.addWidget(low_right_side) right_layout.addWidget(right_vertical_splitter) # Finally add the vertical splitters to the horizontal splitter # And add it to the horizontal layout horizontal_splitter.addWidget(left_vertical_splitter) horizontal_splitter.addWidget(right_vertical_splitter) self.layout.addWidget(horizontal_splitter) self.layout.setContentsMargins(0, 0, 0, 0)
class SignalTabController(QWidget): frame_closed = pyqtSignal(SignalFrameController) not_show_again_changed = pyqtSignal() signal_created = pyqtSignal(Signal) files_dropped = pyqtSignal(list) frame_was_dropped = pyqtSignal(int, int) @property def num_frames(self): return self.splitter.count() - 1 @property def signal_frames(self): """ :rtype: list of SignalFrameController """ return [self.splitter.widget(i) for i in range(self.num_frames)] @property def signal_undo_stack(self): return self.undo_stack def __init__(self, project_manager, parent=None): super().__init__(parent) self.ui = Ui_Interpretation() self.ui.setupUi(self) self.splitter = QSplitter() self.splitter.setStyleSheet( "QSplitter::handle:vertical {\nmargin: 4px 0px; background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, \nstop:0 rgba(255, 255, 255, 0), \nstop:0.5 rgba(100, 100, 100, 100), \nstop:1 rgba(255, 255, 255, 0));\n image: url(:/icons/data/icons/splitter_handle.png);\n}" ) self.splitter.setOrientation(Qt.Vertical) self.splitter.setChildrenCollapsible(True) self.splitter.setHandleWidth(6) placeholder_widget = QWidget() placeholder_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) self.undo_stack = QUndoStack() self.project_manager = project_manager self.splitter.addWidget(placeholder_widget) self.signal_vlay = QVBoxLayout() self.signal_vlay.setContentsMargins(0, 0, 0, 0) self.signal_vlay.addWidget(self.splitter) self.ui.scrlAreaSignals.setLayout(self.signal_vlay) self.drag_pos = None def on_files_dropped(self, files): self.files_dropped.emit(files) def close_frame(self, frame: SignalFrameController): self.frame_closed.emit(frame) def add_signal_frame(self, proto_analyzer): sig_frame = SignalFrameController(proto_analyzer, self.undo_stack, self.project_manager, parent=self) sframes = self.signal_frames if len(proto_analyzer.signal.filename) == 0: # new signal from "create signal from selection" sig_frame.ui.btnSaveSignal.show() self.__create_connects_for_signal_frame(signal_frame=sig_frame) sig_frame.signal_created.connect(self.signal_created.emit) sig_frame.not_show_again_changed.connect( self.not_show_again_changed.emit) sig_frame.ui.gvSignal.shift_state_changed.connect( self.set_shift_statuslabel) sig_frame.ui.lineEditSignalName.setToolTip( self.tr("Sourcefile: ") + proto_analyzer.signal.filename) sig_frame.apply_to_all_clicked.connect(self.on_apply_to_all_clicked) prev_signal_frame = sframes[-1] if len(sframes) > 0 else None if prev_signal_frame is not None and hasattr(prev_signal_frame, "ui"): sig_frame.ui.cbProtoView.setCurrentIndex( prev_signal_frame.ui.cbProtoView.currentIndex()) sig_frame.blockSignals(True) if proto_analyzer.signal.qad_demod_file_loaded: sig_frame.ui.cbSignalView.setCurrentIndex(1) sig_frame.ui.cbSignalView.setDisabled(True) self.splitter.insertWidget(self.num_frames, sig_frame) sig_frame.blockSignals(False) default_view = constants.SETTINGS.value('default_view', 0, int) sig_frame.ui.cbProtoView.setCurrentIndex(default_view) return sig_frame def __create_connects_for_signal_frame( self, signal_frame: SignalFrameController): signal_frame.hold_shift = constants.SETTINGS.value( 'hold_shift_to_drag', False, type=bool) signal_frame.drag_started.connect(self.frame_dragged) signal_frame.frame_dropped.connect(self.frame_dropped) signal_frame.files_dropped.connect(self.on_files_dropped) signal_frame.closed.connect(self.close_frame) def add_empty_frame(self, filename: str, proto): sig_frame = SignalFrameController( proto_analyzer=proto, undo_stack=self.undo_stack, project_manager=self.project_manager, proto_bits=proto.decoded_proto_bits_str, parent=self) sig_frame.ui.lineEditSignalName.setText(filename) sig_frame.setMinimumHeight(sig_frame.height()) sig_frame.set_empty_frame_visibilities() self.__create_connects_for_signal_frame(signal_frame=sig_frame) self.splitter.insertWidget(self.num_frames, sig_frame) return sig_frame def set_frame_numbers(self): for i, f in enumerate(self.signal_frames): f.ui.lSignalNr.setText("{0:d}:".format(i + 1)) @pyqtSlot() def save_all(self): if self.num_frames == 0: return settings = constants.SETTINGS try: not_show = settings.value('not_show_save_dialog', type=bool, defaultValue=False) except TypeError: not_show = False if not not_show: cb = QCheckBox("Don't ask me again.") msg_box = QMessageBox( QMessageBox.Question, self.tr("Confirm saving all signals"), self.tr("All changed signal files will be overwritten. OK?")) msg_box.addButton(QMessageBox.Yes) msg_box.addButton(QMessageBox.No) msg_box.setCheckBox(cb) reply = msg_box.exec() not_show_again = cb.isChecked() settings.setValue("not_show_save_dialog", not_show_again) self.not_show_again_changed.emit() if reply != QMessageBox.Yes: return for f in self.signal_frames: if f.signal is None or f.signal.filename == "": continue f.signal.save() @pyqtSlot() def close_all(self): for f in self.signal_frames: f.my_close() @pyqtSlot(Signal) def on_apply_to_all_clicked(self, signal: Signal): for frame in self.signal_frames: if frame.signal is not None: frame.signal.noise_min_plot = signal.noise_min_plot frame.signal.noise_max_plot = signal.noise_max_plot frame.signal.block_protocol_update = True proto_needs_update = False if frame.signal.modulation_type != signal.modulation_type: frame.signal.modulation_type = signal.modulation_type proto_needs_update = True if frame.signal.qad_center != signal.qad_center: frame.signal.qad_center = signal.qad_center proto_needs_update = True if frame.signal.tolerance != signal.tolerance: frame.signal.tolerance = signal.tolerance proto_needs_update = True if frame.signal.noise_threshold != signal.noise_threshold: frame.signal.noise_threshold = signal.noise_threshold proto_needs_update = True if frame.signal.bit_len != signal.bit_len: frame.signal.bit_len = signal.bit_len proto_needs_update = True frame.signal.block_protocol_update = False if proto_needs_update: frame.signal.protocol_needs_update.emit() @pyqtSlot(QPoint) def frame_dragged(self, pos: QPoint): self.drag_pos = pos @pyqtSlot(QPoint) def frame_dropped(self, pos: QPoint): start = self.drag_pos if start is None: return end = pos start_index = -1 end_index = -1 if self.num_frames > 1: for i, w in enumerate(self.signal_frames): if w.geometry().contains(start): start_index = i if w.geometry().contains(end): end_index = i self.swap_frames(start_index, end_index) self.frame_was_dropped.emit(start_index, end_index) @pyqtSlot(int, int) def swap_frames(self, from_index: int, to_index: int): if from_index != to_index: start_sig_widget = self.splitter.widget(from_index) self.splitter.insertWidget(to_index, start_sig_widget) @pyqtSlot(bool) def set_shift_statuslabel(self, shift_pressed): if shift_pressed and constants.SETTINGS.value( 'hold_shift_to_drag', False, type=bool): self.ui.lShiftStatus.setText("[SHIFT] Use Mouse to scroll signal.") elif shift_pressed and not constants.SETTINGS.value( 'hold_shift_to_drag', False, type=bool): self.ui.lShiftStatus.setText( "[SHIFT] Use mouse to create a selection.") else: self.ui.lShiftStatus.clear() @pyqtSlot() def on_participant_changed(self): for sframe in self.signal_frames: sframe.on_participant_changed()
class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.folder = settings.ROOT self.widget_close = None self.context = None self.base_path = os.path.dirname(__file__) #self.folder = folder QDir.setCurrent(self.base_path) #self.setWindowTitle('Data Library') #self.resize(840, 480) self.color_background = '#404040' self.color_text_field = '#A7A7A7' self.color_button = '#979797' self.color_panel_bright = '#727272' self.color_panel_dark = '#525252' self.color_border = '#2E2E2E' self.setUI() #self.style_button = "border-color: %s;background-color:%s;"%(self.color_border,self.color_button) def setUI(self): #QApplication.setStyle(QStyleFactory.create('Cleanlooks')) self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.setSpacing(0) self.setStyleSheet(get_css("MainWindow")) #top Bar self.topBarArea = QFrame() self.topBarArea.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)) self.topBarArea.setMinimumHeight(32) self.topBarArea.setMaximumHeight(32) self.topBarLayout = QHBoxLayout() self.topBarLayout.setSpacing(2) self.topBarLayout.setContentsMargins(4, 1, 4, 1) self.topBarArea.setLayout(self.topBarLayout) self.topBarArea.setStyleSheet(get_css('Bar')) #Left Panel self.leftPanel = QFrame() #self.leftPanel.setMaximumWidth(132) self.leftPanel.setStyleSheet(get_css('PanelLeft')) self.leftPanelLayout = QVBoxLayout() self.leftPanelLayout.setContentsMargins(0, 0, 0, 0) self.leftPanel.setLayout(self.leftPanelLayout) self.outlinerLayout = QVBoxLayout() self.outlinerLayout.setContentsMargins(1, 5, 1, 1) self.assetChoiceLayout = QVBoxLayout() self.assetChoiceLayout.setContentsMargins(0, 0, 0, 0) self.treeWidget = TreeWidget() self.treeWidget.itemClicked.connect(self.onClickItem) # comboBox asset cbox_asset_choice self.cbox_asset_choice = ComboBox() self.cbox_asset_choice.setMinimumHeight(28) self.cbox_asset_choice.setStyleSheet(get_css("ComboBoxAsset")) #self.cbox_asset_choice.setStyleSheet("border-left : none; border-right : none; border-top : none") self.cbox_asset_choice.addItem(QIcon(icon_path("ICON_ACTION")), "Action") self.cbox_asset_choice.addItem(QIcon(icon_path("ICON_GROUP")), "Group") self.cbox_asset_choice.addItem(QIcon(icon_path("ICON_MATERIAL")), "Material") self.assetChoiceLayout.addWidget(self.cbox_asset_choice) self.outlinerLayout.addWidget(self.treeWidget) self.leftPanelLayout.addLayout(self.assetChoiceLayout) self.leftPanelLayout.addLayout(self.outlinerLayout) #Tool Box self.toolBoxPanel = QFrame() self.toolBoxPanel.setStyleSheet( "border : none; background-color : rgb(100,100,100)") self.toolBoxLayout = QVBoxLayout() self.toolBoxPanel.setLayout(self.toolBoxLayout) self.leftPanelLayout.addWidget(self.toolBoxPanel) #Middle self.middle = QFrame() self.middle.setStyleSheet(get_css('2DSpace')) self.middleLayout = QVBoxLayout() self.middleLayout.setContentsMargins(0, 0, 0, 0) self.thumbnailList = ThumbnailList(self.folder) self.thumbnailList.itemClicked.connect(self.onClickThumb) self.thumbnailList.itemDoubleClicked.connect(self.apply_pose) self.middleLayout.addWidget(self.topBarArea) self.middleLayout.addWidget(self.thumbnailList) self.middle.setLayout(self.middleLayout) #Right Panel self.rightPanel = QFrame() #self.rightPanel.setMaximumWidth(256) #self.rightPanel.setMinimumWidth(256) self.rightPanel.setStyleSheet(get_css('PanelRight')) self.rightLayout = QVBoxLayout() self.rightLayout.setContentsMargins(4, 4, 4, 4) self.rightPanel.setLayout(self.rightLayout) #Splitter self.splitter = QSplitter(Qt.Horizontal) self.splitter.setStyleSheet(get_css('Splitter')) #self.splitter.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) ## Dir button btn_parent_dir = PushButton(icon=icon_path('ICON_FILE_PARENT'), size=[22, 22]) ### add_asset button btn_add_asset = PushButton(icon=icon_path('ICON_ZOOMIN'), size=[22, 22]) btn_add_asset.clicked.connect(self.exportAnimPanel) btn_refresh = PushButton(icon=icon_path('ICON_FILE_FOLDER'), size=[22, 22]) btn_refresh.clicked.connect(self.refresh) #open folder button btn_open_folder = PushButton(icon=icon_path('OPEN_FOLDER'), size=[22, 22]) btn_open_folder.clicked.connect(self.open_folder) #search bar self.search_bar = LineEdit() self.search_bar.textChanged.connect(self.filterThumbnail) self.topBarLayout.addWidget(btn_parent_dir) self.topBarLayout.addWidget(self.search_bar) self.topBarLayout.addWidget(btn_refresh) self.topBarLayout.addWidget(btn_open_folder) # Adding Panel to splitter self.splitter.addWidget(self.leftPanel) self.splitter.addWidget(self.middle) self.splitter.addWidget(self.rightPanel) self.splitter.setSizes([132, 512, 256]) self.splitter.setStretchFactor(0, 0) self.splitter.setStretchFactor(1, 1) self.splitter.setStretchFactor(2, 0) #self.mainLayout.addWidget(self.topBarArea) self.mainLayout.addWidget(self.splitter) #shortcut self.shortcut_zoom_in = QShortcut(QKeySequence("+"), self) self.shortcut_zoom_out = QShortcut(QKeySequence("-"), self) self.shortcut_zoom_in.activated.connect(self.zoom_in) self.shortcut_zoom_out.activated.connect(self.zoom_out) self.setLayout(self.mainLayout) #self.show() def refresh(self): self.treeWidget.clear() TreeWidget().recursive_dir(self.folder, self.treeWidget, self.folder.count(os.sep)) def open_folder(self): try: os.startfile(self.folder) except: subprocess.Popen(['xdg-open', self.folder]) def exportAnimPanel(self): clear_layout(self.rightLayout) self.exportAnimPanel = ExportAnimPanel(self) self.rightLayout.addLayout(self.exportAnimPanel) def zoom_in(self): new_size = self.thumbnailList.iconSize().width() if not new_size > 512: new_size *= 1.25 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) def zoom_out(self): new_size = self.thumbnailList.iconSize().width() if not new_size < 64: new_size *= 0.75 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) # When selected of folder in the outliner def onClickItem(self, item): self.thumbnailList.clear() #a= TreeWidget(item.text(1)) #self.middle.addWidget(ThumbnailPanel.createWidget(item.text(1))) folder = item.text(1) for root, dirs, files in os.walk(folder): for filename in files: if os.path.splitext(filename)[1] in ['.png', '.jpg']: full_path = os.path.abspath(os.path.join(root, filename)) name = os.path.splitext(filename)[0].split('_')[0].replace( '-', ' ').capitalize() item = QListWidgetItem(name) item.setIcon(QIcon(full_path)) item.full_path = full_path self.thumbnailList.addItem(item) # display information when clicking on a thumbnail def onClickThumb(self, item): clear_layout(self.rightLayout) base_name = os.path.basename((item.full_path)) dir_name = os.path.dirname((item.full_path)) description_name = base_name.replace( base_name.split('_')[-1], 'description.txt') description_path = os.path.join(dir_name, description_name) infile = open(description_path).read() self.textPanel = QFrame() self.textPanel.setStyleSheet( "border : none; background-color : rgb(100,100,100)") #self.text self.textLayout = QVBoxLayout() self.textPanel.setLayout(self.textLayout) #Fill layout #Text description self.textWidget = QPlainTextEdit() self.textWidget.setPlainText(infile) self.textLayout.addWidget(self.textWidget) #Preview Image self.previewImage = QLabel() self.previewImage.setStyleSheet("border : none;") #sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) #sizePolicy.setHeightForWidth(True) self.previewImage.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) self.previewImage.setMinimumSize(256, 256) self.previewImage.setMaximumSize(256, 256) self.previewImage.setScaledContents(True) #self.previewImage.setWidgetResizable(True) thumb = QPixmap(item.full_path) self.previewImage.setPixmap(thumb) self.rightLayout.addWidget(self.previewImage) self.rightLayout.addWidget(self.textPanel) def apply_pose(self, item): ob = self.context.scene.objects.active clear_layout(self.toolBoxLayout) self.frame_current = bpy.context.scene.frame_current self.blend = QSlider() self.blend.setOrientation(Qt.Horizontal) self.blend.setValue(100) self.blend.setMaximum(100) self.action_left = CheckBox('Left') self.action_left.setChecked(True) self.action_right = CheckBox('Right') self.action_right.setChecked(True) self.selected_only = CheckBox('Selected only') self.selected_only.setChecked(True) self.mirror_pose = CheckBox('Mirror') self.mirror_pose.setChecked(False) self.toolBoxLayout.addWidget(self.blend) row_L_R = QHBoxLayout() row_L_R.addWidget(self.action_right) row_L_R.addWidget(self.action_left) self.toolBoxLayout.addLayout(row_L_R) self.toolBoxLayout.addWidget(self.selected_only) self.toolBoxLayout.addWidget(self.mirror_pose) self.action = {} item_basename = os.path.splitext(item.full_path)[0] action_txt = item_basename.replace('_thumbnail', '_action') + '.txt' self.blend.setValue(100) with open(action_txt) as poseLib: for line in poseLib: fcurve = line.split("=")[0] value = eval(line.split("=")[1].replace("\n", "")) self.action[fcurve] = value if ob: for fcurve, value in self.action.items(): for path, channel in value.items(): #print(channel.items()) for array_index, attributes in channel.items(): correct_path = find_fcurve_path( ob, fcurve, path, array_index) dstChannel = correct_path[0] for index, keypose in enumerate( self.action[fcurve][path][array_index]): #print(keypose) self.action[fcurve][path][array_index][index][ 1].append(dstChannel) #if find_mirror(fcurve) : self.blend.valueChanged.connect(lambda: self.refresh_pose(action_txt)) self.action_left.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.action_right.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.selected_only.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.mirror_pose.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.refresh_pose(action_txt) # Apply the pose or anim to the rig def refresh_pose(self, action): ob = self.context.scene.objects.active if ob.type == 'ARMATURE' and ob.mode == 'POSE': read_anim(self.action, self.blend.value() * 0.01, self.action_left.isChecked(), self.action_right.isChecked(), self.selected_only.isChecked(), self.mirror_pose.isChecked(), self.frame_current) # When taping in the search bar def filterThumbnail(self): items = (self.thumbnailList.item(i) for i in range(self.thumbnailList.count())) for w in items: if self.search_bar.text().lower() not in w.text().lower(): w.setHidden(True) else: w.setHidden(False) def closeEvent(self, event): self.widget_close = True self.deleteLater()
class App(QMainWindow): # +++++++++++++++++++++++++++++++++++++++++++++++++++++ __init__ +++++++++++++++++++++++++++++++++++++++++++++++++++ def __init__(self,title,top,left,iconPath): QMainWindow.__init__(self,None) # -------------------------------------------------- Initialization ------------------------------------------------ self.title = title # create main window title self.top = top # window ofset distance from top self.left = left # window ofset distance from left side self.iconPath = iconPath # main window icon self.importData('data.json') # import data from file self.initUI() # Run initialization User Interface # ++++++++++++++++++++++++++++++++++++++++++++++++++++++ initUI ++++++++++++++++++++++++++++++++++++++++++++++++++++ def initUI(self): QMainWindow.__init__(self) self.setWindowTitle(self.title) # sets window title self.setWindowIcon(QtGui.QIcon(self.iconPath)) # Set main window icon self.setStyleSheet(""" QWidget { background-color: rgba(0,41,59,255);}""") #self.setStyleSheet("background-color: qlineargradient(x1: 0, y1: 0 x2: 0, y2: 1, stop: 0 #00CD00 , stop: 0.2 #0AC92B stop: 1 #00FF33 );") self.setGeometry(self.left, self.top, int(temp_data['config']['length']), int(temp_data['config']['width'])) # set window size #----------------------------------------------- set date on status ber -------------------------------------------- now = datetime.datetime.now() # read date self.statusBar().showMessage(now.strftime("%d-%m-%Y")) # set date to statusBar self.statusBar().setStyleSheet("""QStatusBar{ padding-left:8px; color:white; font-weight:bold;}""") # --------------------------------------------------- Create Menu -------------------------------------------------- mainMenu = self.menuBar() # Create menu mainMenu.setStyleSheet("""QWidget { background-color: rgba(0,41,59,255); color:white; font-weight:bold;}""") # ------------------------------------------------ create menu options --------------------------------------------- viewMenu = mainMenu.addMenu('ინტერფეისი') # create menu section viewMenu.setStyleSheet("""QWidget { background-color: rgba(0,41,150,255); color:white; font-weight:bold;}""") toggleTool = QAction("ინსტრუმენტთა ველი",self,checkable=True) # create menu option toggleTool.triggered.connect(self.handleToggleTool) # choose menu oprion toggleStatus = QAction("Toggle Statusbar",self,checkable=True) # create menu option toggleStatus.triggered.connect(self.handleToggleStatus) # choose menu oprion viewMenu.addAction(toggleTool) # set menu oprion # ----------------------------------------------------- ToolBar ---------------------------------------------------- # -------------------------------------------------- Exit toolbar -------------------------------------------------- exitAct = QAction(QIcon('img/close.png'),'გასვლა', self) # create exit button in toolBar exitAct.setShortcut('Ctrl+Q') # key manipulation of exit button exitAct.triggered.connect(app.quit) # run quit function #-------------------------------------------------------- Save ----------------------------------------------------- # --------------------------------------------------- Save toolbar ------------------------------------------------- saveAct = QAction(QIcon('img/save.png'),'შენახვა', self) # create Save button in toolBar saveAct.setShortcut("Ctrl+S") # key manipulation of save button saveAct.triggered.connect(lambda : self.save('data.json')) # run function saveAct.triggered.connect(lambda : self.statusBarMessage("შენახვა")) # run function # ------------------------------------------------------- copy ----------------------------------------------------- copyAct = QAction(QIcon('img/copy.png'),'ასლი', self) # create Copy button in toolBar copyAct.setShortcut("Ctrl+C") # key manipulation of Copy button copyAct.triggered.connect(lambda : self.table1.copy() if self.tabs.currentIndex() == 0 else self.table2.copy()) # run function copyAct.triggered.connect(lambda : self.statusBarMessage("ასლი")) # ------------------------------------------------------ paste ----------------------------------------------------- pasteAct = QAction(QIcon('img/paste.png'),'ასლის ჩაკვრა', self) # create paste button in toolBar pasteAct.setShortcut("Ctrl+V") # key manipulation of paste button pasteAct.triggered.connect(lambda : self.table1.paste() if self.tabs.currentIndex() == 0 else self.table2.paste()) pasteAct.triggered.connect(lambda : self.statusBarMessage("ასლის ჩაკვრა")) # ------------------------------------------------------- play ----------------------------------------------------- playAct = QAction(QIcon('img/play.png'),'გაშვება', self) # create play button in toolBar playAct.setShortcut("Ctrl+P") # key manipulation of play button playAct.triggered.connect(self.play) # run function playAct.triggered.connect(lambda : self.statusBarMessage('ლინკის გაშვება')) # run function #--------------------------------------------- Row - Column manipulation ------------------------------------------- # ------------------------------------------------ insert Row toolbar ---------------------------------------------- insRowAct = QAction(QIcon('img/addRow.png'), 'სტრიქონის დამატება', self) # create addRow button in toolBar insRowAct.triggered.connect(lambda : self.table1.insRow() if self.tabs.currentIndex() == 0 else self.table2.insRow()) # run function insRowAct.triggered.connect(lambda : self.statusBarMessage('სტრიქონის დამატება')) # run function # ------------------------------------------------ Delete Row toolbar ---------------------------------------------- DelRowAct = QAction(QIcon('img/DelRow.png'), 'სტრიქონის წაშლა', self) # create delRow button in toolBar DelRowAct.triggered.connect(lambda : self.table1.delRow() if self.tabs.currentIndex() == 0 else self.table2.delRow()) # run function DelRowAct.triggered.connect(lambda : self.statusBarMessage('სტრიქონის წაშლა')) # run function # ------------------------------------------------------ Menge ----------------------------------------------------- mergeAct = QAction(QIcon('img/merge.png'), 'შერწყმა', self) # create Merge button in toolBar mergeAct.triggered.connect(lambda : self.table1.merge() if self.tabs.currentIndex() == 0 else self.table2.merge()) # run function mergeAct.triggered.connect(lambda : self.statusBarMessage('უჯრების შერწყმა')) # run function #-------------------------------------------------------- Font ----------------------------------------------------- # --------------------------------------------------- Font toolbar ------------------------------------------------- FontAct = QAction(QIcon('img/Font.png'), 'ფონტები', self) # create Font button in toolBar FontAct.triggered.connect(lambda : self.table1.font() if self.tabs.currentIndex() == 0 else self.table2.font()) # run function FontAct.triggered.connect(lambda : self.statusBarMessage('ფონტი')) # run function # --------------------------------------------------- color palete ------------------------------------------------- colorAct = QAction(QIcon('img/color.png'), 'ტექსტის ფერი', self) # create Font button in toolBar colorAct.triggered.connect(lambda : self.table1.color() if self.tabs.currentIndex() == 0 else self.table2.color()) # run function colorAct.triggered.connect(lambda : self.statusBarMessage('ტექსტის ფერი')) # run function # ------------------------------------------------- background color ----------------------------------------------- backColorAct = QAction(QIcon("img/background-color.png"),"ფონის ფერი",self) # create Font button in toolBar backColorAct.triggered.connect(lambda : self.table1.FontBackColor() if self.tabs.currentIndex() == 0 else self.table2.FontBackColor()) # run function backColorAct.triggered.connect(lambda : self.statusBarMessage('ფონის ფერი')) # run function # ---------------------------------------------------- alignLeft -------------------------------------------------- alignLeftAct = QAction(QIcon('img/alignLeft.png'), 'ტექსტი მარცხნივ', self) # create Font button in toolBar alignLeftAct.triggered.connect(lambda : self.table1.alignLeft() if self.tabs.currentIndex() == 0 else self.table2.alignLeft()) # run function alignLeftAct.triggered.connect(lambda : self.statusBarMessage('ტექსტი მარცხნივ')) # run function # ---------------------------------------------------- alignRight ------------------------------------------------- alignRightAct = QAction(QIcon('img/alignRight.png'), 'ტექსტი მარჯვნივ', self) # create Font button in toolBar alignRightAct.triggered.connect(lambda : self.table1.alignRight() if self.tabs.currentIndex() == 0 else self.table2.alignRight()) # run function alignRightAct.triggered.connect(lambda : self.statusBarMessage('ტექსტი მარჯვნივ')) # run function # --------------------------------------------------- alignCenter ------------------------------------------------- alignCenterAct = QAction(QIcon('img/alignCenter.png'), 'ტექსტი ცენტრში', self) alignCenterAct.triggered.connect(lambda : self.table1.alignCenter() if self.tabs.currentIndex() == 0 else self.table2.alignCenter()) alignCenterAct.triggered.connect(lambda : self.statusBarMessage('ტექსტი ცენტრში')) # ---------------------------------------------------- settings --------------------------------------------------- settingsAct = QAction(QIcon('img/settings.png'), 'პარამეტრები', self) # create Font button in toolBar settingsAct.triggered.connect(self.settings) # run function self.statusBarMessage("პარამეტრები") # ---------------------------------------------- Print data structure ---------------------------------------------- printAct = QAction(QIcon('img/print.png'), 'მონაცემთა დაბეჭვდა', self) # create Font button in toolBar printAct.triggered.connect(self.printData) # run function printAct.triggered.connect(lambda : self.statusBarMessage('მონაცემთა დაბეჭვდა')) # run function # ----------------------------------------------- save data template ----------------------------------------------- #saveTemplateAct = QAction(QIcon('img/template.png'), 'მონაცემთა შაბლონი', self) # create Font button in toolBar #saveTemplateAct.triggered.connect(self.dataTemplate) # run function #saveTemplateAct.triggered.connect(lambda : self.table1.openData(temp_data['data_tab1'])) # run function #saveTemplateAct.triggered.connect(lambda : self.table2.openData(temp_data['data_tab2'])) # run function #saveTemplateAct.triggered.connect(lambda : self.statusBarMessage('მონაცემთა შაბლონი')) # run function # ------------------------------------------------------ Test ------------------------------------------------------ testAct = QAction(QIcon('img/test.png'), 'ტესტი', self) # create Test button in toolBar #testAct.triggered.connect(lambda : self.table1.calculations(temp_data)) # run function testAct.triggered.connect(self.test) # run function testAct.triggered.connect(lambda : self.statusBarMessage('ტესტი')) # run function # ------------------------------------------- add buttons on first toolbar ----------------------------------------- self.toolbar = self.addToolBar('Tools') self.toolbar.setStyleSheet("""QWidget { background-color: rgba(0,41,59,255); color:white; font-weight:bold; border-style: solid; border-radius: 10px; border-width: 1px; border-color: rgba(127,127,255,255);}""") self.toolbar.addAction(exitAct) self.toolbar.addAction(saveAct) self.toolbar.addSeparator() self.toolbar.addAction(copyAct) self.toolbar.addAction(pasteAct) self.toolbar.addSeparator() self.toolbar.addAction(playAct) self.toolbar.addSeparator() self.toolbar.addAction(insRowAct) self.toolbar.addAction(DelRowAct) self.toolbar.addAction(mergeAct) self.toolbar.addSeparator() self.toolbar.addAction(FontAct) self.toolbar.addAction(colorAct) self.toolbar.addAction(backColorAct) self.toolbar.addSeparator() self.toolbar.addAction(alignLeftAct) self.toolbar.addAction(alignRightAct) self.toolbar.addAction(alignCenterAct) self.toolbar.addSeparator() self.toolbar.addAction(settingsAct) self.toolbar.addSeparator() self.toolbar.addAction(printAct) #self.toolbar.addAction(saveTemplateAct) self.toolbar.addAction(testAct) self.addToolBarBreak() self.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.addToolBar(Qt.TopToolBarArea , self.toolbar) # ------------------------------------------------ Create tabs widget ---------------------------------------------- self.tabs = QTabWidget() self.tabs.setStyleSheet(""" QWidget { background-color: rgba(0,41,59,255); color:white; font-weight:bold; border-style: solid; border-radius: 3px; border-width: 1px; border-color: rgba(0,41,59,255);}""") self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() self.tab4 = QWidget() # -------------------------------------------------- add tab pages ------------------------------------------------- # ---------------------------------------------------- Add tabs ---------------------------------------------------- self.tabs.addTab(self.tab1, "მიმდინარე") self.tabs.addTab(self.tab2, "ლინკები") self.tabs.addTab(self.tab3, "გრაფიკები") self.tabs.addTab(self.tab4, "ტერმინალი") self.setCentralWidget(self.tabs) # ------------------------------------------------ set tab1 layouts ------------------------------------------------ self.VlayoutTab1 = QVBoxLayout() self.HlayoutTab1 = QHBoxLayout() # ------------------------------------------------ set tab2 layouts ------------------------------------------------ self.VlayoutTab2 = QVBoxLayout() # ------------------------------------------------ set tab3 layouts ------------------------------------------------ self.VlayoutTab3 = QVBoxLayout() # ------------------------------------------------ set tab4 layouts ------------------------------------------------ self.VlayoutTab4 = QVBoxLayout() # --------------------------------------------------- Search_tab1 -------------------------------------------------- self.HlayoutSearch_tab1 = QHBoxLayout() self.search_line_tab1 = LineEdit() self.search_line_tab1.setPlaceholderText("Search to...") self.search_but_tab1 = PushBut("ძებნა") self.search_but_tab1.setIcon(QIcon('img/find.png')) self.search_next_tab1 = PushBut("შემდეგი") self.search_next_tab1.setIcon(QIcon('img/next.png')) self.searchInfoLabel_tab1 = QLabel(" ") self.searchInfoLabel_tab1.setStyleSheet(""" margin: 1px; padding: 7px; background-color: rgba(0,255,255,100); color: rgba(255,255,255,255); border-style: solid; border-radius: 3px; border-width: 0.5px; border-color: rgba(0,140,255,255);""") self.searchInfoLabel_tab1.setText("0") self.search_but_tab1.clicked.connect(lambda : self.searchInfoLabel_tab1.setText(str(self.table1.find_items(self.search_line_tab1.text())))) self.search_next_tab1.clicked.connect(lambda : self.table1.find_items(self.search_line_tab1.text())) self.HlayoutSearch_tab1.addWidget(self.search_line_tab1) self.HlayoutSearch_tab1.addWidget(self.search_but_tab1) self.HlayoutSearch_tab1.addWidget(self.search_next_tab1) self.HlayoutSearch_tab1.addWidget(self.searchInfoLabel_tab1) self.VlayoutTab1.addLayout(self.HlayoutSearch_tab1) # --------------------------------------------------- Search_tab2 -------------------------------------------------- self.HlayoutSearch_tab2 = QHBoxLayout() self.search_line_tab2 = LineEdit() self.search_line_tab2.setPlaceholderText("Search to...") self.search_but_tab2 = PushBut("ძებნა") self.search_but_tab2.setIcon(QIcon('img/find.png')) self.search_next_tab2 = PushBut("შემდეგი") self.search_next_tab2.setIcon(QIcon('img/next.png')) self.searchInfoLabel_tab2 = QLabel(" ") self.searchInfoLabel_tab2.setStyleSheet(""" margin: 1px; padding: 7px; background-color: rgba(0,255,255,100); color: rgba(255,255,255,255); border-style: solid; border-radius: 3px; border-width: 0.5px; border-color: rgba(0,140,255,255);""") self.searchInfoLabel_tab2.setText("0") self.search_but_tab2.clicked.connect(lambda : self.searchInfoLabel_tab2.setText(str(self.table2.find_items(self.search_line_tab2.text())))) self.search_next_tab2.clicked.connect(lambda : self.table2.find_items(self.search_line_tab2.text())) self.HlayoutSearch_tab2.addWidget(self.search_line_tab2) self.HlayoutSearch_tab2.addWidget(self.search_but_tab2) self.HlayoutSearch_tab2.addWidget(self.search_next_tab2) self.HlayoutSearch_tab2.addWidget(self.searchInfoLabel_tab2) self.VlayoutTab2.addLayout(self.HlayoutSearch_tab2) # --------------------------------------------------- Content List ------------------------------------------------- self.contentList = QListWidget() self.contentList.setWindowTitle('კონტენტი') self.contentList.itemClicked.connect(self.test) self.contentList.setMaximumWidth(200) self.contentList.itemClicked.connect(self.t) self.HlayoutTab1.addWidget(self.contentList) # ----------------------------------- create table1 widget and add on vertical layut ------------------------------- col_width_array_tab1 = {0 : 500, 1 : 120, 2 : 130, 3 : 170, 4 : 400, 5 : 250} self.table1 = TableView(temp_data['data_tab1'], col_width_array_tab1, 50, len(temp_data['data_tab1']['header'])) self.table1.openData(temp_data['data_tab1']) self.HlayoutTab1.addWidget(self.table1) self.BGColorCalculation() self.table1.cellChanged.connect(self.calculationEvent) self.VlayoutTab1.addLayout(self.HlayoutTab1) # ----------------------------------- create table2 widget and add on vertical layut ------------------------------- col_width_array_tab2 = {0 : 590, 1 : 590, 2 : 590} self.table2 = TableView(temp_data['data_tab2'], col_width_array_tab2, 50, len(temp_data['data_tab2']['header'])) self.table2.openData(temp_data['data_tab2']) self.VlayoutTab2.addWidget(self.table2) # add table in vertival layout of tab1 # ---------------------------------------------------- plot data --------------------------------------------------- from Plots import PlotCanvas self.plot1 = PlotCanvas(self, width=5, height=4) self.plot2 = PlotCanvas(self, width=5, height=4) self.plot3 = PlotCanvas(self, width=5, height=4) self.plot4 = PlotCanvas(self, width=5, height=4) #------------------------------------------------------ Spliter ---------------------------------------------------- self.splitter1 = QSplitter(Qt.Horizontal) self.splitter1.setStyleSheet("""QSplitter::handle:horizontal { border: 2px dashed blue; margin: 1px 1px;}""") self.splitter1.addWidget(self.plot1) self.splitter1.addWidget(self.plot2) self.splitter2 = QSplitter(Qt.Vertical) self.splitter2.setStyleSheet("""QSplitter::handle:vertical { border: 2px dashed blue; margin: 1px 1px;}""") self.splitter2.addWidget(self.splitter1) self.splitter2.addWidget(self.plot3) self.splitter2.addWidget(self.plot4) self.Hlayout_spliter = QHBoxLayout() self.Hlayout_spliter.addWidget(self.splitter2) self.VlayoutTab3.addLayout(self.Hlayout_spliter) #------------------------------------------------------ Terminal --------------------------------------------------- self.terminal = QPlainTextEdit(self) self.terminal.setStyleSheet("""QWidget {background-color: rgba(0,41,59,255); color:white; font-weight:bold; border-style: solid; border-radius: 10px; border-width: 0.5px; border-color: rgba(0,140,255,255);} QScrollBar:horizontal { width: 12px; height: 12px; background-color: rgba(0,41,59,255);} QScrollBar:vertical { width: 12px; height: 12px; background-color: rgba(0,41,59,255);}""") self.VlayoutTab4.addWidget(self.terminal) # ------------------------------------------------- set tab 1 layout ---------------------------------------------- self.tab1.setLayout(self.VlayoutTab1) # ------------------------------------------------- set tab 2 layout ---------------------------------------------- self.tab2.setLayout(self.VlayoutTab2) # ------------------------------------------------- set tab 3 layout ---------------------------------------------- self.tab3.setLayout(self.VlayoutTab3) # ------------------------------------------------- set tab 4 layout ---------------------------------------------- self.tab4.setLayout(self.VlayoutTab4) self.statusBarMessage("") # +++++++++++++++++++++++++++++++++++++++++++++++ StatusBar Message ++++++++++++++++++++++++++++++++++++++++++++++++ def statusBarMessage(self,message): self.statusBar().showMessage(message) # ++++++++++++++++++++++++++++++++++++++++++++++++ Toolbar Hide-Show +++++++++++++++++++++++++++++++++++++++++++++++ def handleToggleTool(self): global tt if tt == True: self.toolbar.hide() tt = False else: self.toolbar.show() tt = True # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ def handleToggleStatus(self): global ts if ts == True: self.status.hide() ts = False else: self.status.show() ts = True # ++++++++++++++++++++++++++++++++++++++++++++++++++ Terminal Print ++++++++++++++++++++++++++++++++++++++++++++++++ def term(self, Text): self.terminal.insertPlainText("-----------------------------\n") self.terminal.insertPlainText("----> " + Text + "\n") self.terminal.insertPlainText("-----------------------------\n") self.statusBarMessage("ტერმინალში ბეჭვდა") # +++++++++++++++++++++++++++++++++++++++++++++++++++++++ play +++++++++++++++++++++++++++++++++++++++++++++++++++++ def play(self): import os try: if self.tabs.currentIndex() == 0: l = self.table1.item(self.table1.currentRow(), 4) if self.tabs.currentIndex() == 1: l = self.table2.item(self.table2.currentRow(), 1) os.startfile(l.text()) self.statusBarMessage('გაშვება') except: pass # +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Save +++++++++++++++++++++++++++++++++++++++++++++++++++++ def save(self,Path): with open(Path, 'w') as outfile: json.dump(temp_data, outfile, indent=4) self.statusBarMessage('შენახვა') # ++++++++++++++++++++++++++++++++++++++++++++++++++++ importData ++++++++++++++++++++++++++++++++++++++++++++++++++ def importData(self,OpenPath): self.OpenPath = OpenPath global temp_data try: with open(OpenPath, 'r') as f: temp_data = json.load(f) return temp_data except FileNotFoundError: pass self.save('data.json') self.importData('data.json') self.statusBarMessage('მონაცემთა შემოტანა') # ++++++++++++++++++++++++++++++++++++++++++ Print data structure button +++++++++++++++++++++++++++++++++++++++++++ def printData(self): self.term(" კონფიგურაცია ---> " + str(pformat(temp_data['config'], indent=4))) self.term(" ჰედერი 1 ---> " + str(pformat(temp_data['data_tab1']['header'], indent=4))) self.term(" შერწყმა 1 ---> " + str(pformat(temp_data['data_tab1']['Merge'], indent=4))) self.term(" ცხრილის 1 ---> " + str(pformat(temp_data['data_tab1']['table'], indent=4))) self.term(" ცხრილის 1 ზომა ---> " + str(len(temp_data['data_tab1']['table']))) self.term(" ჰედერი 2 ---> " + str(pformat(temp_data['data_tab2']['header'], indent=4))) self.term(" შერწყმა 2 ---> " + str(pformat(temp_data['data_tab2']['Merge'], indent=4))) self.term(" ცხრილის 2 ---> " + str(pformat(temp_data['data_tab2']['table'], indent=4))) self.term(" ცხრილის 2 ზომა ---> " + str(len(temp_data['data_tab2']['table']))) currentIndex=self.tabs.currentIndex() currentWidget=self.tabs.currentWidget() self.term(" ფანჯრის ინდექსი ---> " + str(currentIndex)) self.term(" მიმდინარე ვიდჯეტი ---> " + str(currentWidget)) self.statusBarMessage("მონაცემთა დაბეჭვდა") # +++++++++++++++++++++++++++++++++++++++++++++++ save Data template +++++++++++++++++++++++++++++++++++++++++++++++ def dataTemplate(self): global temp_data with open('data.json', 'w') as f: json.dump(data, f, indent=4) self.statusBarMessage("მონაცემთა შაბლონის შენახვა") temp_data = self.importData('data.json') self.statusBarMessage('მონაცემთა შაბლონის შენახვა') # +++++++++++++++++++++++++++++++++++++++++++++++++++++ settings +++++++++++++++++++++++++++++++++++++++++++++++++++ bug with cancel def settings(self): from SettingsDialog import Settings self.diag = Settings(temp_data['config']) self.diag.exec_() self.setGeometry(self.left, self.top, int(temp_data['config']["length"]), int(temp_data['config']["width"])) self.statusBarMessage("პარამეტრები") # ++++++++++++++++++++++++++++++++++++++++++++++ Time stamp to seconds +++++++++++++++++++++++++++++++++++++++++++++ def timeStampToSec(self, timeStamp): from datetime import datetime try: pt = datetime.strptime(timeStamp,'%H:%M:%S') except ValueError: pt = datetime.strptime(timeStamp,'%M:%S') total_seconds = pt.second + pt.minute*60 + pt.hour*3600 return int(total_seconds) # ++++++++++++++++++++++++++++++++ Update Background color and progress calculation ++++++++++++++++++++++++++++++++ def BGColorCalculation(self): for row in range(self.table1.rowCount()): try: if self.table1.item(row, 2).text() != "" and type(int(self.table1.item(row, 2).text()) == type(int(0))): newitem = QProgressBar() newitem.setAlignment(Qt.AlignCenter) newitem.setValue(round(float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text())*100, 1)) self.table1.setCellWidget(row, 3, newitem) if float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) == 1: for column in range(self.table1.columnCount()): try: self.table1.item(row, column).setBackground(QtGui.QColor(0, 170, 0, 255)) except AttributeError: newitem = QTableWidgetItem(None) self.table1.setItem(row, column, newitem) newitem.setBackground(QtGui.QColor(0, 170, 0, 255)) if float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) > 0.8 and float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) <= 0.9: for column in range(self.columnCount()): try: self.item(row, column).setBackground(QtGui.QColor(0, 170, 127, 255)) except AttributeError: newitem = QTableWidgetItem(None) self.table1.setItem(row, column, newitem) newitem.setBackground(QtGui.QColor(0, 170, 127, 255)) if float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) >= 0.3 and float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) <= 0.8: for column in range(self.table1.columnCount()): try: self.table1.item(row, column).setBackground(QtGui.QColor(255, 255, 127, 255)) except AttributeError: newitem = QTableWidgetItem(None) self.table1.setItem(row, column, newitem) newitem.setBackground(QtGui.QColor(255, 255, 127, 255)) if float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) < 0.3 and float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) != 0: for column in range(self.table1.columnCount()): try: self.table1.item(row, column).setBackground(QtGui.QColor(255, 170, 0, 255)) except AttributeError: newitem = QTableWidgetItem(None) self.table1.setItem(row, column, newitem) newitem.setBackground(QtGui.QColor(255, 170, 0, 255)) if float(self.table1.item(row, 1).text())/float(self.table1.item(row, 2).text()) == 0: for column in range(self.columnCount()): try: self.table1.item(row, column).setBackground(QtGui.QColor(170, 170, 127, 255)) except AttributeError: newitem = QTableWidgetItem(None) self.table1.setItem(row, column, newitem) newitem.setBackground(QtGui.QColor(170, 170, 127, 255)) except AttributeError: pass except ZeroDivisionError: newitem = QTableWidgetItem('Inf') self.table1.setItem(row, 3, newitem) pass except ValueError: newitem = QProgressBar() newitem.setAlignment(Qt.AlignCenter) try: newitem.setValue(round(self.timeStampToSec(self.table1.item(row, 1).text())/self.timeStampToSec(self.table1.item(row, 2).text())*100, 1)) self.table1.setCellWidget(row, 3, newitem) except ValueError: self.table1.removeCellWidget(row, 3) pass pass # +++++++++++++++++++++++++++++++++++++++++++++++++++ TABLE EVENT ++++++++++++++++++++++++++++++++++++++++++++++++++ # ++++++++++++++++++++++++++++++++++++++++++++++++ Calculation Event +++++++++++++++++++++++++++++++++++++++++++++++ def calculationEvent(self): try: item = self.table1.item(self.table1.currentRow(), self.table1.currentColumn()) self.table1.value = item.text() if self.table1.value is not '': self.BGColorCalculation() except AttributeError: pass # +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Test +++++++++++++++++++++++++++++++++++++++++++++++++++++ def test(self): #from pprint import pprint self.contentNamesList = [] self.contentList.clear() for row in range(self.table1.rowCount()): try: if isinstance(None, type(self.table1.item(row, 4))): self.contentNamesList.append(self.table1.item(row, 0).text()) else: if self.table1.item(row, 4).text() == "" and self.table1.item(row, 2).text() == "": self.contentNamesList.append(self.table1.item(row, 0).text()) except AttributeError: pass self.term(str(pformat(self.contentNamesList, indent=4))) self.contentList.addItems(self.contentNamesList) self.statusBarMessage('ტესტი') def t(self): self.term(str(self.contentList.text()))
class SignalTabController(QWidget): frame_closed = pyqtSignal(SignalFrameController) not_show_again_changed = pyqtSignal() signal_created = pyqtSignal(Signal) files_dropped = pyqtSignal(list) frame_was_dropped = pyqtSignal(int, int) @property def num_frames(self): return self.splitter.count() - 1 @property def signal_frames(self): """ :rtype: list of SignalFrameController """ return [self.splitter.widget(i) for i in range(self.num_frames)] @property def signal_undo_stack(self): return self.undo_stack def __init__(self, project_manager, parent=None): super().__init__(parent) self.ui = Ui_Interpretation() self.ui.setupUi(self) self.splitter = QSplitter() self.splitter.setStyleSheet("QSplitter::handle:vertical {\nmargin: 4px 0px; background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, \nstop:0 rgba(255, 255, 255, 0), \nstop:0.5 rgba(100, 100, 100, 100), \nstop:1 rgba(255, 255, 255, 0));\n image: url(:/icons/data/icons/splitter_handle_horizontal.svg);\n}") self.splitter.setOrientation(Qt.Vertical) self.splitter.setChildrenCollapsible(True) self.splitter.setHandleWidth(6) placeholder_widget = QWidget() placeholder_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) self.undo_stack = QUndoStack() self.project_manager = project_manager self.splitter.addWidget(placeholder_widget) self.signal_vlay = QVBoxLayout() self.signal_vlay.setContentsMargins(0,0,0,0) self.signal_vlay.addWidget(self.splitter) self.ui.scrlAreaSignals.setLayout(self.signal_vlay) self.drag_pos = None def on_files_dropped(self, files): self.files_dropped.emit(files) def close_frame(self, frame:SignalFrameController): self.frame_closed.emit(frame) def add_signal_frame(self, proto_analyzer): sig_frame = SignalFrameController(proto_analyzer, self.undo_stack, self.project_manager, parent=self) sframes = self.signal_frames if len(proto_analyzer.signal.filename) == 0: # new signal from "create signal from selection" sig_frame.ui.btnSaveSignal.show() self.__create_connects_for_signal_frame(signal_frame=sig_frame) sig_frame.signal_created.connect(self.signal_created.emit) sig_frame.not_show_again_changed.connect(self.not_show_again_changed.emit) sig_frame.ui.lineEditSignalName.setToolTip(self.tr("Sourcefile: ") + proto_analyzer.signal.filename) sig_frame.apply_to_all_clicked.connect(self.on_apply_to_all_clicked) prev_signal_frame = sframes[-1] if len(sframes) > 0 else None if prev_signal_frame is not None and hasattr(prev_signal_frame, "ui"): sig_frame.ui.cbProtoView.setCurrentIndex(prev_signal_frame.ui.cbProtoView.currentIndex()) sig_frame.blockSignals(True) if proto_analyzer.signal.qad_demod_file_loaded: sig_frame.ui.cbSignalView.setCurrentIndex(1) sig_frame.ui.cbSignalView.setDisabled(True) self.splitter.insertWidget(self.num_frames, sig_frame) sig_frame.blockSignals(False) default_view = constants.SETTINGS.value('default_view', 0, int) sig_frame.ui.cbProtoView.setCurrentIndex(default_view) return sig_frame def __create_connects_for_signal_frame(self, signal_frame: SignalFrameController): signal_frame.hold_shift = constants.SETTINGS.value('hold_shift_to_drag', False, type=bool) signal_frame.drag_started.connect(self.frame_dragged) signal_frame.frame_dropped.connect(self.frame_dropped) signal_frame.files_dropped.connect(self.on_files_dropped) signal_frame.closed.connect(self.close_frame) def add_empty_frame(self, filename: str, proto): sig_frame = SignalFrameController(proto_analyzer=proto, undo_stack=self.undo_stack, project_manager=self.project_manager, proto_bits=proto.decoded_proto_bits_str, parent=self) sig_frame.ui.lineEditSignalName.setText(filename) sig_frame.setMinimumHeight(sig_frame.height()) sig_frame.set_empty_frame_visibilities() self.__create_connects_for_signal_frame(signal_frame=sig_frame) self.splitter.insertWidget(self.num_frames, sig_frame) return sig_frame def set_frame_numbers(self): for i, f in enumerate(self.signal_frames): f.ui.lSignalNr.setText("{0:d}:".format(i + 1)) @pyqtSlot() def save_all(self): if self.num_frames == 0: return settings = constants.SETTINGS try: not_show = settings.value('not_show_save_dialog', type=bool, defaultValue=False) except TypeError: not_show = False if not not_show: cb = QCheckBox("Don't ask me again.") msg_box = QMessageBox(QMessageBox.Question, self.tr("Confirm saving all signals"), self.tr("All changed signal files will be overwritten. OK?")) msg_box.addButton(QMessageBox.Yes) msg_box.addButton(QMessageBox.No) msg_box.setCheckBox(cb) reply = msg_box.exec() not_show_again = cb.isChecked() settings.setValue("not_show_save_dialog", not_show_again) self.not_show_again_changed.emit() if reply != QMessageBox.Yes: return for f in self.signal_frames: if f.signal is None or f.signal.filename == "": continue f.signal.save() @pyqtSlot() def close_all(self): for f in self.signal_frames: f.my_close() @pyqtSlot(Signal) def on_apply_to_all_clicked(self, signal: Signal): for frame in self.signal_frames: if frame.signal is not None: frame.signal.noise_min_plot = signal.noise_min_plot frame.signal.noise_max_plot = signal.noise_max_plot frame.signal.block_protocol_update = True proto_needs_update = False if frame.signal.modulation_type != signal.modulation_type: frame.signal.modulation_type = signal.modulation_type proto_needs_update = True if frame.signal.qad_center != signal.qad_center: frame.signal.qad_center = signal.qad_center proto_needs_update = True if frame.signal.tolerance != signal.tolerance: frame.signal.tolerance = signal.tolerance proto_needs_update = True if frame.signal.noise_threshold != signal.noise_threshold: frame.signal.noise_threshold = signal.noise_threshold proto_needs_update = True if frame.signal.bit_len != signal.bit_len: frame.signal.bit_len = signal.bit_len proto_needs_update = True frame.signal.block_protocol_update = False if proto_needs_update: frame.signal.protocol_needs_update.emit() @pyqtSlot(QPoint) def frame_dragged(self, pos: QPoint): self.drag_pos = pos @pyqtSlot(QPoint) def frame_dropped(self, pos: QPoint): start = self.drag_pos if start is None: return end = pos start_index = -1 end_index = -1 if self.num_frames > 1: for i, w in enumerate(self.signal_frames): if w.geometry().contains(start): start_index = i if w.geometry().contains(end): end_index = i self.swap_frames(start_index, end_index) self.frame_was_dropped.emit(start_index, end_index) @pyqtSlot(int, int) def swap_frames(self, from_index: int, to_index: int): if from_index != to_index: start_sig_widget = self.splitter.widget(from_index) self.splitter.insertWidget(to_index, start_sig_widget) @pyqtSlot() def on_participant_changed(self): for sframe in self.signal_frames: sframe.on_participant_changed()
class Sidebar(QWidget): def __init__(self): super().__init__() self.setWindowTitle = "Longway Sidebar" self.setGeometry(1920 - 180, 0, 180, 1080 - 32) self.color_gradient_left = QColor(100, 100, 100, 50) self.color_gradient_right = QColor(0, 0, 0, 255) self.layout = QVBoxLayout() self.layout.setSpacing(0) self.layout.setContentsMargins(0, 0, 0, 0) # self.layout.addWidget(QWidget()) self.setLayout(self.layout) # Splitter for storing tiles self.tiles = [] self.splitter = QSplitter(Qt.Vertical) self.splitter.setChildrenCollapsible(False) self.splitter.setMinimumHeight(20) self.splitter.setStyleSheet(''' QSplitter::handle:vertical { height: 1px; background: black }''') self.layout.addWidget(self.splitter) self.setWindowFlags(Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) # Starting the show! self.addTile(TileSlideshow()) self.addTile(TileTest()) self.addTile(Tile()) self.addTile(Tile()) self.addTile(QWidget()) self.show() def paintEvent(self, event): # Initializing QPainter qp = QPainter() qp.begin(self) qp.setRenderHint(QPainter.Antialiasing) sidebar_rect = self.geometry() # Gradient gradient = QLinearGradient(0, 0, sidebar_rect.width(), 0) gradient.setColorAt(0.0, self.color_gradient_left) gradient.setColorAt(1.0, self.color_gradient_right) qp.setBrush(QBrush(gradient)) # qp.setPen(Qt.white) qp.drawRect(0, 0, sidebar_rect.width(), sidebar_rect.height()) # Glass highlight qp.setBrush(QBrush(Qt.white)) qp.setPen(QPen(QBrush(Qt.white), 0.01)) qp.setOpacity(0.1) qppath = QPainterPath() qppath.moveTo(sidebar_rect.width() * 0.2, 0) qppath.quadTo(sidebar_rect.width() * 0.3, sidebar_rect.height() * 0.5, sidebar_rect.width() * 0.2, sidebar_rect.height() - 1) qppath.lineTo(0, sidebar_rect.height()) qppath.lineTo(0, 0) qp.setClipPath(qppath) qp.drawRect(1, 1, sidebar_rect.width() - 1, sidebar.height() - 1) # Left border highlight qp.setOpacity(1.0) gradient = QLinearGradient(0, 0, 2, 0) gradient.setColorAt(0.0, QColor(255, 255, 255, 80)) gradient.setColorAt(1.0, QColor(0, 0, 0, 0)) qp.setBrush(QBrush(gradient)) # qp.setPen(Qt.transparent) qp.drawRect(0, 0, 8, sidebar_rect.height()) qp.end() def addTile(self, tile): self.tiles.append(tile) self.splitter.addWidget(self.tiles[-1])
class Document(QWidget, ProjectDocument): mark_item_created = pyqtSignal(MarkItem) added_mark_item = pyqtSignal(Project, MarkItem) browser_result_signal = pyqtSignal(bool) selected_mark_item_changed = pyqtSignal(MarkItem) def __init__(self, gadget, toolbar_gadget, file_name=None, project_name=None, image_path=None, person_name=None, parent=None, eraser_size=3, eraser_option=SelectionOptionToolBar.Subtract): super(Document, self).__init__(parent) ProjectDocument.__init__(self, parent=parent) self._writer_format = ProjectFormat() self._reader_format = ProjectFormat() self._export_format = ProjectFormat() self._mark_item_to_outline_item = {} self._modifier = False self._project = Project(image_path, file_name, project_name, person_name) self._image_path = image_path if image_path else self._project.image_path self._current_tool = gadget self._selection_option = toolbar_gadget self._eraser_size = eraser_size self._eraser_option = eraser_option self.__current_index = -1 self.__mouse_press_index = -1 self.__mouse_press_offset = QPoint() self.__resize_handel_pressed = False self.__undo_stack = QUndoStack(self) self._selection_item = None self._history_widget = None self._history_project_manager = None self._mark_item_manager = MarkItemManager() self._mark_item_manager.selected_item_changed.connect( self.selected_mark_item_changed) # # 创建场景 self._workbench_scene.setObjectName("workbench_scene") self._is_big_img = False # if self._is_big_img: # self.workbench_view = LoadIMGraphicsView(self._mark_item_manager, gadget, toolbar_gadget, eraser_size, # image_path, self._workbench_scene, parent=self) # else: self.workbench_view = GraphicsViewTest(self._mark_item_manager, gadget, toolbar_gadget, eraser_size, parent=self) # 把场景添加到视图中 self.workbench_view.setScene(self._workbench_scene) self.workbench_view.setObjectName("workbench_view") self.workbench_view.setContentsMargins(0, 0, 0, 0) self.workbench_view.setBackgroundBrush(QColor(147, 147, 147)) # 布局 self.tab_vertical_layout = QVBoxLayout(self) self._splitter1 = QSplitter(self) self._splitter1.setStyleSheet("margin: 0px") self._splitter1.addWidget(self.workbench_view) self._splitter2 = QSplitter(self) self._splitter2.setOrientation(Qt.Vertical) self._splitter2.setStyleSheet("margin: 0px") self._splitter2.addWidget(self._splitter1) self.tab_vertical_layout.addWidget(self._splitter2) self.tab_vertical_layout.setContentsMargins(0, 0, 0, 0) # 当前选择小工具 self.change_gadget(gadget) # 信号接收 self.workbench_view.border_moved_signal.connect(self.border_moved) self.workbench_view.border_created.connect(self.created_border) self.workbench_view.about_to_create_border.connect( self.about_to_create_border) self.workbench_view.eraser_action_signal.connect(self.eraser_action) if all([image_path, project_name, file_name]) and not self._is_big_img: self.create_document() @property def is_big_img(self): return self._is_big_img def about_to_cmp(self, project_documents: ProjectDocument = None): if not self._history_widget: self._history_project_manager = HistoryProjectManager( project_documents) self._history_widget = Thumbnail(self._history_project_manager, self) self._history_project_manager.set_scene( self._history_widget.current_project()) self._splitter1.addWidget(self._history_project_manager.get_view()) self._splitter2.addWidget(self._history_widget) self.workbench_view.set_is_comparing(True) self._history_project_manager.get_view().set_is_comparing(True) self._history_widget.selected_project_changed.connect( self._selected_history_project_changed) self._history_widget.close_event_signal.connect( self._toggle_cmp_history) self._history_widget.synchronize_changed_signal.connect( self._toggle_synchronize_view) items = project_documents[0].project().get_mark_items() for item in items: self._project.add_mark_item(item) else: self._toggle_cmp_history(True) self._history_widget.setHidden(False) if True: self.connect_to_synchronize_view() def had_cmp(self): return bool(self._history_widget) def _toggle_synchronize_view(self, is_synchronize: bool): if is_synchronize: self.connect_to_synchronize_view() else: self.disconnect_to_asynchronous_view() def connect_to_synchronize_view(self): self._history_project_manager.synchronize_with_origin_view( self.workbench_view) self._history_project_manager.get_view().connect_to_synchronize_with( self.workbench_view) self.workbench_view.connect_to_synchronize_with( self._history_project_manager.get_view()) def disconnect_to_asynchronous_view(self): self._history_project_manager.get_view( ).disconnect_to_asynchronous_with(self.workbench_view) self.workbench_view.disconnect_to_asynchronous_with( self._history_project_manager.get_view()) def _toggle_cmp_history(self, is_on: bool): self._history_project_manager.hidden_view(not is_on) self.workbench_view.set_is_comparing(is_on) self._history_project_manager.get_view().set_is_comparing(is_on) def _selected_history_project_changed(self, project_doc: ProjectDocument): self._history_project_manager.set_scene(project_doc) self._history_project_manager.synchronize_with_origin_view( self.workbench_view) def modifier(self): return not self.__undo_stack.isClean() def set_project(self, project: Project): self._project = project if not self._image_path: self._image_path = project.image_path if not self._is_big_img: self.load_document(self._image_path) for mark_item in self._project.get_mark_items(): self.add_mark_item(mark_item) def set_current_mark_item(self, mark_item: MarkItem): """""" if not mark_item: return item = [ item for item in self._workbench_scene.items() if isinstance(item, OutlineItem) and item.mark_item() == mark_item ] if item: self._mark_item_manager.set_selected_item(item[0]) self.workbench_view.centerOn(item[0]) def delete_mark_item(self, mark_item: [MarkItem, OutlineItem]): if not mark_item: return if isinstance(mark_item, MarkItem): if self._mark_item_manager.selected_mark_item().mark_item( ) == mark_item: self._mark_item_manager.set_selected_item(None) self._project.remove_mark_item(mark_item) item = [ item for item in self._workbench_scene.items() if isinstance(item, OutlineItem) and item.mark_item() == mark_item ] if item: self._mark_item_manager.unregister_mark_item( mark_item.item_name) self._workbench_scene.removeItem(item[0]) del item[0] elif isinstance(mark_item, OutlineItem): if self._mark_item_manager.selected_mark_item() == mark_item: self._mark_item_manager.set_selected_item(None) self._project.remove_mark_item(mark_item.mark_item()) self._mark_item_manager.unregister_mark_item(mark_item.item_name) self._workbench_scene.removeItem(mark_item) del mark_item def project(self) -> Project: return self._project def project_name(self): return self._project.project_name def undo_stack(self): return self.__undo_stack def create_document(self): self.load_document(self._image_path) self.save_project() def save_project(self): self.writer_format.save_project(self._project) self.__undo_stack.clear() def export_result(self, path, progress): self.writer_format.export_result(path, self._project, self._image.size(), self) def get_file_name(self): return self._project.project_full_path() def get_project_name(self): return self._project.parent() def about_to_create_border(self): if self._selection_option == SelectionOptionToolBar.Replace: self._workbench_scene.removeItem(self._selection_item) self._selection_item = None def cancel_selection(self): self._workbench_scene.removeItem(self._selection_item) self._selection_item.disconnect() self._selection_item = None def selection_as_mark_item(self): """TODO""" def created_border(self, border: SelectionItem): if self._selection_option == SelectionOptionToolBar.Replace: self._workbench_scene.removeItem(self._selection_item) self._selection_item = border self.__undo_stack.push( AddSelectionItem(self._workbench_scene, self._selection_item)) elif self._selection_option == SelectionOptionToolBar.Subtract: if self._selection_item: self._selection_item -= border elif self._selection_option == SelectionOptionToolBar.Add: if not self._selection_item: self._selection_item = border else: self._selection_item += border elif self._selection_option == SelectionOptionToolBar.Intersect: if self._selection_item: self._selection_item &= border if self._selection_item: if self._selection_item.is_empty(): self._workbench_scene.removeItem(self._selection_item) self._selection_item = None return self.workbench_view.view_zoom_signal.connect( self._selection_item.set_pen_width_by_scale) self._selection_item.cancel_selection_signal.connect( self.cancel_selection) self._selection_item.as_mark_item_signal.connect( self.selection_as_mark_item) self._selection_item.reverse_select_signal.connect( self._select_reverser_path) def add_border_item(self, item: SelectionItem): self.__undo_stack.push(AddItemCommand(self._workbench_scene, item)) def border_moved(self, item: SelectionItem): self.__undo_stack.push(MoveItemCommand(item)) def change_toolbar_gadget(self, toolbar_gadget: QAction): self._selection_option = toolbar_gadget.data() def change_eraser_option(self, option_action: QAction): self._eraser_option = option_action.data() def change_gadget(self, tool: QAction): if isinstance(tool, QAction): tool = tool.data() self.workbench_view.set_gadget(tool) if tool == ToolsToolBar.BrowserImageTool: self.browser_result() self.browser_result_signal.emit(True) else: if self._current_tool == ToolsToolBar.BrowserImageTool: self.end_browser() self.browser_result_signal.emit(False) self._current_tool = tool def eraser_size_changed(self, eraser_size: int): self._eraser_size = eraser_size self.workbench_view.set_eraser_size(eraser_size) def browser_result(self): self.workbench_view.setBackgroundBrush(QColor(Qt.black)) self._pixmap_item.setVisible(False) if self.workbench_view.is_comparing(): self._history_project_manager.browser_result() if self._selection_item: self._selection_item.setVisible(False) def end_browser(self): self.workbench_view.setBackgroundBrush(QColor(147, 147, 147)) self._pixmap_item.setVisible(True) if self.workbench_view.is_comparing(): self._history_project_manager.end_browser() if self._selection_item: self._selection_item.setVisible(True) def get_sub_image_in(self, item: SelectionItem) -> [QImage, None]: rect = item.rectangle() if self.is_big_img: """""" # slide_helper = SlideHelper(self.project().image_path) # image_from_rect = ImgFromRect(rect, slide_helper) # image_from_rect = image_from_rect.area_img # return image_from_rect else: rect_sub_image = self._image.copy(rect) polygon_path = item.get_path() polygon_sub_image = rect_sub_image for row in range(0, rect.width()): for clo in range(0, rect.height()): point = QPoint(row, clo) if not polygon_path.contains(point): polygon_sub_image.setPixel(point, 0) return polygon_sub_image def ai_delete_outline(self, detect_policy): result_numpy_array = None width_num_array = None if not self._selection_item: image = self._image else: image = self._image.copy(self._selection_item.rectangle()) if detect_policy == 5: for h in range(0, image.height(), 256): for w in range(0, image.width(), 256): image_ = self._image.copy(QRect(w, h, 255, 255)) image_ = qimage2numpy(image_) result = detect_one(image_) numpy_array = mat_to_img(result) if width_num_array is not None: width_num_array = np.hstack( (width_num_array, numpy_array)) else: width_num_array = numpy_array if result_numpy_array is not None: result_numpy_array = np.vstack( (result_numpy_array, width_num_array)) else: result_numpy_array = width_num_array width_num_array = None print(result_numpy_array.shape) return result_numpy_array def _get_outlines(self, numpy_array, detect_policy): outline_path1 = QPainterPath() outline_path2 = QPainterPath() outline1, outline2 = detect_outline(detect_policy, numpy_array, drop_area=80) for array in outline1: sub_path = [] for point in array[0]: point = self._selection_item.mapToScene( point[0][0], point[0][1]) sub_path.append(point) polygon = QPolygonF(sub_path) path = QPainterPath() path.addPolygon(polygon) outline_path1 += path for array in outline2: sub_path = [] for point in array[0]: point = self._selection_item.mapToScene( point[0][0], point[0][1]) sub_path.append(point) polygon = QPolygonF(sub_path) path = QPainterPath() path.addPolygon(polygon) outline_path2 += path return outline_path1, outline_path2 def _get_outline_by_no_selection(self, numpy_array, detect_policy): outline_path1 = QPainterPath() outline_path2 = QPainterPath() outline1, outline2 = detect_outline(detect_policy, numpy_array, drop_area=80) for array in outline1: sub_path = [] for point in array[0]: point = QPoint(point[0][0], point[0][1]) sub_path.append(point) polygon = QPolygonF(sub_path) path = QPainterPath() path.addPolygon(polygon) outline_path1 += path for array in outline2: sub_path = [] for point in array[0]: point = QPoint(point[0][0], point[0][1]) sub_path.append(point) polygon = QPolygonF(sub_path) path = QPainterPath() path.addPolygon(polygon) outline_path2 += path return outline_path1, outline_path2 def _to_create_mark_item(self, outline_path1, outline_path2): use_outline1_flag = True if not outline_path1.isEmpty(): self.create_mark_item(outline_path1) elif not outline_path2.isEmpty(): self.create_mark_item(outline_path2) use_outline1_flag = False if self._selection_item: self._selection_item.setFlag(QGraphicsItem.ItemIsMovable, False) if use_outline1_flag and not outline_path2.isEmpty(): self._selection_item.set_reverser_path(outline_path2) def detect_outline(self, detect_policy): """ 将选中的选区对应的部分图片copy出来,然后转为ndarray类型 用来转为OpenCV识别轮廓的输入数据 :param detect_policy: 用哪种识别算法识别轮廓 :return: None """ if detect_policy >= 5: numpy_array = self.ai_delete_outline(detect_policy) outline_path1, outline_path2 = self._get_outline_by_no_selection( numpy_array, detect_policy) if not self._selection_item: self._selection_item = SelectionItem( QPoint(0, 0), self._workbench_scene, self.workbench_view.transform().m11()) path = QPainterPath() path.addRect( QRectF(0, 0, self._image.width(), self._image.height())) self._selection_item.set_item_path_by_path(path) self._selection_item.reverse_select_signal.connect( self._select_reverser_path) self._to_create_mark_item(outline_path1, outline_path2) return if not self._selection_item: QMessageBox.warning(self, "警告", "没有选择区域!") return if isinstance(self._selection_item, SelectionItem): outline_path1 = QPainterPath() outline_path2 = QPainterPath() if detect_policy == 4: self._workbench_scene.removeItem(self._selection_item) outline_path1 = self._selection_item.mapToScene( self._selection_item.get_path()) self._selection_item = None else: sub_img = self.get_sub_image_in(self._selection_item) if sub_img is None: return if isinstance(sub_img, QImage): sub_img = qimage2numpy(sub_img) outline_path1, outline_path2 = self._get_outlines( sub_img, detect_policy) self._to_create_mark_item(outline_path1, outline_path2) def correction_outline(self, option): """""" if not self._selection_item: return mark_items = [ item for item in self._workbench_scene.items( self._selection_item.get_scene_path()) if isinstance(item, OutlineItem) ] for mark_item in mark_items: if mark_item.locked(): continue elif option == 1: mark_item += self._selection_item self._mark_item_manager.set_selected_item(mark_item) break elif option == 2: mark_item -= self._selection_item self._mark_item_manager.set_selected_item(mark_item) break self._workbench_scene.removeItem(self._selection_item) self._selection_item = None def eraser_action(self, eraser_area: SelectionItem): if self._selection_item: eraser_area &= self._selection_item if eraser_area.is_empty(): return mark_items = [ item for item in self._workbench_scene.items( eraser_area.get_scene_path()) if isinstance(item, OutlineItem) ] # if self._eraser_option == SelectionOptionToolBar.Add: # selected_item = self._mark_item_manager.selected_mark_item() # if selected_item in mark_items: # selected_item += eraser_area # return for item in mark_items: if item.locked(): continue item -= eraser_area self._workbench_scene.removeItem(eraser_area) del eraser_area def create_mark_item(self, outline: QPainterPath): item_name = self._mark_item_manager.get_unique_mark_item_name() new_mark_item = MarkItem(list(self._project.persons), item_name=item_name, outline_path=outline) self._project.add_mark_item(new_mark_item) self.add_mark_item(new_mark_item, True) def add_mark_item(self, mark_item: MarkItem, new_item=False): item = OutlineItem(mark_item, self._workbench_scene, self.workbench_view.transform().m11()) flag = True if new_item: flag = self.detect_intersect_with_others(item) if flag: self._mark_item_to_outline_item[mark_item] = item self.browser_result_signal.connect(item.is_browser_result) self.workbench_view.view_zoom_signal.connect( item.set_pen_width_by_scale) self._mark_item_manager.register_mark_item(item, mark_item.item_name) self.added_mark_item.emit(self._project, mark_item) self._mark_item_manager.set_selected_item(item) def _select_reverser_path(self): if self._selection_item: item = self._project.get_mark_items()[-1] reverse_path = self._selection_item.get_reverse_path() self._selection_item.set_reverser_path(item.get_outline()) item.set_outline(reverse_path) def detect_intersect_with_others(self, new_item: OutlineItem): selection_path = new_item.get_scene_path() mark_items = [ item for item in self._workbench_scene.items(selection_path) if isinstance(item, OutlineItem) ] for mark_item in mark_items: if mark_item != new_item: new_item -= mark_item if new_item.get_path().isEmpty(): self._workbench_scene.removeItem(new_item) del new_item return False else: new_item.get_path().closeSubpath() return True def paint_make_item(self, mark_item: MarkItem): pen = QPen() pen.setWidth(1) pen.setColor(Qt.yellow) self._workbench_scene.addPath(mark_item.draw_path(), pen) @property def writer_format(self): return self._reader_format @writer_format.setter def writer_format(self, new_writer_format): self._writer_format = new_writer_format @property def reader_format(self): return self._reader_format @reader_format.setter def reader_format(self, new_reader_format): self._reader_format = new_reader_format @property def export_format(self): return self._export_format @export_format.setter def export_format(self, new_export_format): self._export_format = new_export_format
def setupUI(self): hbox = QHBoxLayout(self) hbox.setContentsMargins(22, 12, 22, 12) splitter = QSplitter(Qt.Vertical) splitter.setStyleSheet( "QSplitter::handle{border-image: url(icons/split_line.png)}") splitter.setHandleWidth(17) hbox.addWidget(splitter) left = QWidget(splitter) vbox = QVBoxLayout(left) vbox.setSpacing(0) vbox.setContentsMargins(0, 0, 0, 4) buttonsContainer1 = QWidget() vbox.addWidget(buttonsContainer1) hbox2 = QHBoxLayout(buttonsContainer1) hbox2.setContentsMargins(2, 3, 2, 10) comboWhere = QComboBox() comboWhere.setStyleSheet( "QComboBox {width:160px;min-width:20px;height:28px;border:1px solid #c7c7c7;font-size:14px;selection-background-color:#f4f4f4;}" "QComboBox QAbstractItemView {background:#ffffff;color:#333333;}" "QComboBox::drop-down{width: 21px;border-left: 0px solid #333333;}" "QComboBox::down-arrow:hover {image: url(icons/ComboBox_hover.png);}" "QComboBox::down-arrow {image: url(icons/ComboBox_default.png);}") comboWhere.currentIndexChanged.connect( self.handleComboWhereIndexChanged) hbox2.addWidget(comboWhere) self.comboWhere = comboWhere comboLang = QComboBox() comboLang.setStyleSheet( "QComboBox {width:160px;min-width:20px;height:28px;border:1px solid #c7c7c7;font-size:14px;selection-background-color:#f4f4f4;}" "QComboBox QAbstractItemView {background:#ffffff;color:#333333;}" "QComboBox::drop-down{width: 21px;border-left: 0px solid #333333;}" "QComboBox::down-arrow:hover {image: url(icons/ComboBox_hover.png);}" "QComboBox::down-arrow {image: url(icons/ComboBox_default.png);}") comboLang.currentIndexChanged.connect( self.handleComboLanguageIndexChanged) hbox2.addWidget(comboLang) self.comboLang = comboLang #addStretch hbox2.addStretch() btnInstallFont = QPushButton() btnInstallFont.setEnabled(True) btnInstallFont.clicked.connect(self.installFonts) btnInstallFont.setStyleSheet( "QPushButton{border-image: url(icons/install_default.png) 0 0 0 0;border:none;color:rgb(255, 255, 255);font-size:14px;}" "QPushButton:hover{border-image: url(icons/install_hover.png) 0 0 0 0;border:none;color:rgb(255, 255, 255);}" "QPushButton:checked{border-image: url(icons/install_click.png) 0 0 0 0;border:none;color:rgb(255, 255, 255);}" ) btnInstallFont.setFixedSize(100, 30) hbox2.addWidget(btnInstallFont) self.btnInstallFont = btnInstallFont btnUninstallFont = QPushButton() btnUninstallFont.setEnabled(False) btnUninstallFont.clicked.connect(self.uninstallFonts) btnUninstallFont.setStyleSheet( "QPushButton{border-image: url(icons/uninstall_default.png);font-size:14px;}" "QPushButton:disabled{border-image: url(icons/uninstall_forbid.png) 0 0 0 0;border:none;color:#c1c1c1;font-size:14px;}" "QPushButton:hover{border-image: url(icons/uninstall_hover.png) 0 0 0 0;border:none;color:rgb(51, 51, 51);}" "QPushButton:checked{border-image: url(icons/uninstall_click.png) 0 0 0 0;border:none;color:rgb(51, 51, 51);}" ) btnUninstallFont.setFixedSize(100, 30) hbox2.addWidget(btnUninstallFont) self.btnUninstallFont = btnUninstallFont buttonsContainer4 = QWidget() vbox.addWidget(buttonsContainer4) hbox4 = QHBoxLayout(buttonsContainer4) hbox4.setContentsMargins(0, 0, 0, 6) hbox4.setSpacing(3) #add checkBox checkCheckALL = QCheckBox() checkCheckALL.setChecked(False) checkCheckALL.setStyleSheet( "QCheckBox::indicator {width: 20px; height: 20px;}" "QCheckBox::indicator:unchecked {image:url(icons/CheckBox_uncheck_default.png);}" "QCheckBox::indicator:unchecked:hover {image:url(icons/CheckBox_uncheck_hover.png);}" "QCheckBox::indicator:checked:hover {image:url(icons/CheckBox_checked_hover.png);}" "QCheckBox::indicator:checked {image:url(icons/CheckBox_checked_default.png);}" ) checkCheckALL.stateChanged.connect(self.CheckboxChange) checkCheckALL.stateChanged.connect(self.apply) hbox4.addWidget(checkCheckALL) self.checkCheckALL = checkCheckALL #add Label textLabel = QLabel() hbox4.addWidget(textLabel) self.textLabel = textLabel textLabel3 = QLabel() hbox4.addWidget(textLabel3) self.textLabel3 = textLabel3 textLabel4 = QLabel() hbox4.addWidget(textLabel4) self.textLabel4 = textLabel4 btnExpandAll = QPushButton() btnExpandAll.setStyleSheet( "QPushButton{border-image: url(icons/ExpandAll_default.png) 0 0 0 0;border:none;color:rgb(51, 51, 51);}" "QPushButton:hover{border-image: url(icons/ExpandAll_hover.png) 0 0 0 0;border:none;color:rgb(51, 51, 51);}" "QPushButton:checked{border-image: url(icons/ExpandAll_click.png) 0 0 0 0;border:none;color:rgb(51, 51, 51);}" ) btnExpandAll.setFixedSize(87, 26) btnExpandAll.clicked.connect(self.expandORcollapse) self.btnExpandAll = btnExpandAll hbox4.addWidget(btnExpandAll) #addStretch hbox4.addStretch() tree = QTreeWidget() tree.setColumnCount(3) tree.setColumnWidth(0, 250) tree.setColumnWidth(1, 250) tree.setColumnWidth(2, 300) tree.setStyleSheet( "QTreeWidget {border:1px solid #c7c7c7;}" "QTreeWidget QHeaderView::section{padding-left:6px;height:24px;background-color:#f8f8f8;border:1px solid #dddddd;border-bottom: 0px;border-top: 0px;}" "QTreeView::branch:has-children:!has-siblings:closed,\ QTreeView::branch:closed:has-children:has-siblings{border-image: none; image: url(icons/treeArrow_right.png);}\ QTreeView::branch:open:has-children:!has-siblings,\ QTreeView::branch:open:has-children:has-siblings{border-image: none; image: url(icons/treeArrow_bottom.png);}\ QTreeWidget::indicator:checked {image: url(icons/CheckBox_checked_default.png);}\ QTreeWidget::indicator:checked:hover {image: url(icons/CheckBox_checked_hover.png);}\ QTreeWidget::indicator:unchecked {image: url(icons/CheckBox_uncheck_default.png);}\ QTreeWidget::indicator:unchecked:hover {image: url(icons/CheckBox_uncheck_hover.png);}" "QTreeView QScrollBar:vertical {border:1px solid #c7c7c7;border-left: 0px;background-color:#f1f1f1;padding-top:15px;padding-bottom:15px;}" "QTreeView QScrollBar::handle:vertical {background-color:#c7c7c7;min-height:30px;}" "QTreeView QScrollBar::handle:vertical:hover {background-color:#a6a6a6;}" "QTreeView QScrollBar::add-line:vertical {border-image: url(icons/scorllAdd_default.png);}" "QTreeView QScrollBar::add-line:vertical:hover {border-image: url(icons/scorllAdd_hover.png);}" "QTreeView QScrollBar::sub-line:vertical:hover {border-image: url(icons/scorllSub_hover.png);}" "QTreeView QScrollBar::sub-line:vertical {border-image: url(icons/scorllSub_default.png);}" ) tree.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) tree.itemChanged.connect(self.handleTreeItemChanged) vbox.addWidget(tree) self.tree = tree editSearch = QLineEdit("") editSearch.setFixedSize(210, 30) editAction = QAction(editSearch) editSearch.addAction(editAction, QLineEdit.TrailingPosition) editAction.setIcon(QIcon("icons/search.png")) editSearch.textChanged.connect(self.handleEditSearchTextChanged) editAction.triggered.connect(self.loopSearch) editSearch.setStyleSheet("QLineEdit {border:1px solid #c7c7c7;}") self.editSearch = editSearch hbox4.addWidget(editSearch) right = QWidget() splitter.addWidget(right) # splitter.setSizes([200, 200]) splitter.setStretchFactor(0, 45) splitter.setStretchFactor(1, 55) vbox2 = QVBoxLayout(right) vbox2.setSpacing(0) vbox2.setContentsMargins(0, 4, 0, 10) buttonsContainer2 = QWidget() vbox2.addWidget(buttonsContainer2) hbox3 = QHBoxLayout(buttonsContainer2) hbox3.setContentsMargins(0, 0, 0, 5) hbox3.setSpacing(7) #add Label textLabel2 = QLabel() hbox3.addWidget(textLabel2) self.textLabel2 = textLabel2 spinBox = QSpinBox() spinBox.setRange(5, 60) spinBox.setValue(14) spinBox.setSingleStep(1) spinBox.setFixedSize(150, 26) spinBox.setStyleSheet( "QSpinBox {padding-right:23px;border: 1px solid #c7c7c7;}" "QSpinBox::down-button{subcontrol-origin: padding;subcontrol-origin:border;subcontrol-position:right;image: url(icons/reduce_default.png);position:relative;right:23px;}" "QSpinBox::down-button:hover{image: url(icons/reduce_click.png);}" "QSpinBox::up-button{subcontrol-origin:border;subcontrol-position:right;image: url(icons/add_default.png);position:relative;right:2px;}" "QSpinBox::up-button:hover{image: url(icons/add_click.png);}") spinBox.valueChanged.connect(self.handleFontSizeChanged) hbox3.addWidget(spinBox) self.spinBox = spinBox lineEdit = QLineEdit() lineEdit.setStyleSheet( "QLineEdit {border:1px solid #c7c7c7;height:24px;}") hbox3.addWidget(lineEdit) self.lineEdit = lineEdit scroll = QScrollArea() #scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) #scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) scroll.setWidgetResizable(True) scroll.setStyleSheet( "QScrollArea {border:1px solid #c7c7c7;}" "QScrollArea QScrollBar {border:1px solid #c7c7c7;border-left: 0px;}" "QScrollArea QScrollBar:vertical {background-color:#f1f1f1;padding-top:15px;padding-bottom:15px;}" "QScrollArea QScrollBar::handle:vertical {background-color:#c7c7c7;min-height:30px;}" "QScrollArea QScrollBar::handle:vertical:hover {background-color:#a6a6a6;}" "QScrollArea QScrollBar::add-line:vertical {border-image: url(icons/scorllAdd_default.png);}" "QScrollArea QScrollBar::add-line:vertical:hover {border-image: url(icons/scorllAdd_hover.png);}" "QScrollArea QScrollBar::sub-line:vertical:hover {border-image: url(icons/scorllSub_hover.png);}" "QScrollArea QScrollBar::sub-line:vertical {border-image: url(icons/scorllSub_default.png);}" ) vbox2.addWidget(scroll) displayer = FontDisplayer() scroll.setWidget(displayer) self.displayer = displayer
def __init__(self, parent=None): super().__init__(parent) self.record = -1 self.inspected = None self.oob_update = False prefs = QSettings() prefs.beginGroup("/General") timeout = prefs.value("/Timeout") dark_mode = prefs.value("/DarkMode") prefs.endGroup() # Instantiate core objects self.timeout_timer = QTimer() self.timeout_timer.setTimerType(Qt.VeryCoarseTimer) self.timeout_timer.setInterval(timeout * 1000) self.timeout_timer.setSingleShot(True) self.timeout_timer.timeout.connect(self.update_temp_log) self.systems = ActionsWidget(LogSource.SYSTEM) self.systems.acted.connect(self.log_item) self.events = ActionsWidget(LogSource.EVENT) self.events.acted.connect(self.log_item) self.compass = Compass() self.compass_widget = QWidget() compass_layout = QHBoxLayout() self.compass_widget.setLayout(compass_layout) compass_layout.addWidget(self.compass) self.compass.angle_event.connect(self.log_item) self.exact_angle = ExactAngle() self.exact_angle_widget = QWidget() exact_angle_layout = QHBoxLayout() self.exact_angle_widget.setLayout(exact_angle_layout) exact_angle_layout.addWidget(self.exact_angle) self.exact_angle.btn_event.connect(self.reset_timer) self.exact_angle.angle_event.connect(self.log_item) tab_widget = QTabWidget() tab_bar = tab_widget.tabBar() tab_bar.setFont(QFont('Consolas', 12, 3)) tab_widget.addTab(self.compass_widget, "Compass") tab_widget.addTab(self.exact_angle_widget, "Precise Angle") tab_widget.setStyleSheet(""" QTabWidget::pane { border-top: 2px solid #C2C7CB; } /* Style the tab using the tab sub-control. Note that it reads QTabBar _not_ QTabWidget */ QTabBar::tab { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); border: 2px solid #C4C4C3; border-bottom-color: #C2C7CB; /* same as the pane color */ border-top-left-radius: 4px; border-top-right-radius: 4px; min-width: 8ex; padding: 2px; color: black; } QTabBar::tab:selected, QTabBar::tab:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fafafa, stop: 0.4 #f4f4f4, stop: 0.5 #e7e7e7, stop: 1.0 #fafafa); } QTabBar::tab:selected { border-color: #ff0000; border-bottom-color: #C2C7CB; /* same as pane color */ } QTabBar::tab:!selected { margin-top: 2px; /* make non-selected tabs look smaller */ } """) header_layout = QHBoxLayout() self.zulu_time_label = QLabel() self.assessor_label = QLabel() self.date_label = QLabel() self.dl_label = QLabel() self.mnemonic_label = QLabel() header_layout.addWidget(self.zulu_time_label) header_layout.addWidget(self.assessor_label) header_layout.addWidget(self.date_label) header_layout.addWidget(self.dl_label) header_layout.addWidget(self.mnemonic_label) res = QApplication.primaryScreen().size() w, h = res.width(), res.height() if w > 1920 or h > 1080: hdr_font = QFont("Consolas", 16, 2) end_font = QFont("Consolas", 32, 5) else: hdr_font = QFont("Consolas", 14, 2) end_font = QFont("Consolas", 28, 5) for index in range(header_layout.count()): widget = header_layout.itemAt(index).widget() widget.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Maximum ) widget.setFont(hdr_font) widget.setAlignment(Qt.AlignCenter) # Setup logging state machine self.init_log_sm() # Setup splitters actions_splitter = QSplitter( Qt.Horizontal, frameShape=QFrame.StyledPanel, frameShadow=QFrame.Plain ) actions_splitter.addWidget(self.systems) actions_splitter.addWidget(self.events) actions_splitter.addWidget(tab_widget) actions_splitter.setChildrenCollapsible(False) main_splitter = QSplitter( Qt.Vertical, frameShape=QFrame.StyledPanel, frameShadow=QFrame.Plain ) self.log_area = QTableWidget(0, 3) self.log_area.cellDoubleClicked.connect(self.entry_inspected) self.log_area.cellChanged.connect(self.entry_changed) self.log_area.setHorizontalHeaderLabels( ["Time", "System", "Events"] ) self.log_area.horizontalHeader().setStretchLastSection(True) self.set_dark_mode(dark_mode) end_msn_btn = QPushButton("END\r\nMISSION") end_msn_btn.clicked.connect(self.end_mission) end_msn_btn.setFont(end_font) end_msn_btn.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) end_msn_btn.setStyleSheet("background-color: red; color: white") bottom_layout = QGridLayout() bottom_widget = QWidget() bottom_widget.setLayout(bottom_layout) bottom_layout.addWidget(self.log_area, 0, 0, 1, 7) bottom_layout.addWidget(end_msn_btn, 0, 8, 1, 1) main_splitter.addWidget(actions_splitter) main_splitter.addWidget(bottom_widget) main_splitter.setChildrenCollapsible(False) handle_css = """ QSplitter::handle { background-image: url(:/imgs/dot_pattern.png); background-repeat: repeat-xy; background-color: none; border: 1px solid gray; } QSplitter::handle:pressed { background-image: url(:/imgs/pressed.png); } """ actions_splitter.setStyleSheet(handle_css) main_splitter.setStyleSheet(handle_css) # Finalize layout main_layout = QVBoxLayout() main_layout.addLayout(header_layout) main_layout.addWidget(main_splitter) self.setLayout(main_layout)
class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.asset_type = get_asset_type() self.settings = settings self.working_dir = working_dir self.title = None self.treeWidget = None self.cbox_filter = None self.widget_close = None #self.view_mode = None self.context = None self.thumbnailList = None #self.folders = folder QDir.setCurrent(working_dir) self.setWindowTitle('Lib Manager') self.resize(840, 480) self.color_background = '#404040' self.color_text_field = '#A7A7A7' self.color_button = '#979797' self.color_panel_bright = '#727272' self.color_panel_dark = '#525252' self.color_border = '#2E2E2E' self.setUI() #self.style_button = "border-color: %s;background-color:%s;"%(self.color_border,self.color_button) def setUI(self): self.setWindowFlags(Qt.WindowStaysOnTopHint) self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.setSpacing(0) self.setStyleSheet(get_css("MainWindow")) #Title Bar self.area = ComboBox() self.area.setStyleSheet(get_css("ComboBoxArea")) self.area.currentIndexChanged.connect(self.change_area) #self.area.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.area.setFixedWidth(32) #self.area.setMinimumWidth(32) #self.area.setMinimumHeight(28) #Populate the step_filter by the steps in settings self.area.addItem(QIcon(icon_path("ICON_GROUP")), "Library") self.area.addItem(QIcon(icon_path("ICON_MATERIAL")), "Assets") self.area.addItem(QIcon(icon_path("ICON_ARMATURE_DATA")), "Picker") self.area.addItem(QIcon(icon_path("ICON_SETTINGS")), "Prefs") self.titleBarArea = QFrame() self.titleBarLayout = QHBoxLayout() self.titleBarArea.setLayout(self.titleBarLayout) self.titleBarLayout.setContentsMargins(4, 0, 0, 0) self.titleBarArea.setStyleSheet(""" border : none; background-color : rgb(100,100,100); border-style: solid; border-color: rgb(50, 50, 50); border-bottom-width: 1px;""") self.titleBarArea.setMinimumHeight(28) self.titleBarArea.setMaximumHeight(28) self.title = Label(text='Library') #self.toolBox = QFrame() self.toolBoxLayout = QHBoxLayout() self.toolBoxLayout.setContentsMargins(12, 0, 12, 0) # Batch self.btn_batch = PushButton(icon=icon_path("ICON_CONSOLE"), size=[22, 22]) self.btn_batch.clicked.connect(self.batch) self.btn_batch.setToolTip('Batch') # Add asset self.btn_add_asset = PushButton(icon=icon_path("ICON_ZOOMIN"), size=[22, 22]) self.btn_add_asset.clicked.connect(self.add_asset) self.btn_add_asset.setToolTip('Add an asset') # Settings Button self.btn_settings = PushButton(icon=icon_path("ICON_SETTINGS"), size=[22, 22]) self.btn_settings.setToolTip('Settings') # Add button to layout self.toolBoxLayout.addWidget(self.btn_batch) self.toolBoxLayout.addWidget(self.btn_add_asset) self.toolBoxLayout.addWidget(self.btn_settings) self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.hSpacer = QSpacerItem(30, 20, QSizePolicy.Maximum, QSizePolicy.Minimum) self.titleBarLayout.addWidget(self.area) self.titleBarLayout.addWidget(self.title) self.titleBarLayout.addItem(self.horizontalSpacer) self.titleBarLayout.addLayout(self.toolBoxLayout) #self.titleBarLayout.addItem(self.hSpacer) #top Bar self.topBarArea = QFrame() self.topBarArea.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)) self.topBarArea.setMinimumHeight(32) self.topBarArea.setMaximumHeight(32) self.topBarLayout = QHBoxLayout() self.topBarLayout.setSpacing(2) self.topBarLayout.setContentsMargins(4, 1, 4, 1) self.topBarArea.setLayout(self.topBarLayout) self.topBarArea.setStyleSheet(get_css('Bar')) #Left Panel self.leftPanel = QFrame() #self.leftPanel.setMaximumWidth(132) self.leftPanel.setStyleSheet(get_css('PanelLeft')) self.leftPanelLayout = QVBoxLayout() self.leftPanelLayout.setContentsMargins(0, 0, 0, 0) self.leftPanel.setLayout(self.leftPanelLayout) self.outlinerLayout = QVBoxLayout() self.outlinerLayout.setContentsMargins(1, 5, 1, 1) self.outlinerTopBarLayout = QVBoxLayout() self.outlinerTopBarLayout.setContentsMargins(0, 0, 0, 0) self.treeWidget = TreeWidget() self.treeWidget.create_widget(settings['path']) self.treeWidget.itemClicked.connect(self.click_item) # comboBox asset cbox_asset_choice self.cbox_filter = ComboBox() self.cbox_filter.currentIndexChanged.connect(self.change_filter) self.cbox_filter.setFixedHeight(28) self.cbox_filter.setStyleSheet(get_css("ComboBoxAsset")) #self.cbox_asset_choice.setStyleSheet("border-left : none; border-right : none; border-top : none") self.cbox_filter.addItem(QIcon(icon_path("ICON_ACTION")), "All") for item, info in sorted(self.asset_type.items()): self.cbox_filter.addItem(QIcon(info['icon']), item.title(), info['image']) #filter_item.image_path = self.outlinerTopBarLayout.addWidget(self.cbox_filter) self.outlinerLayout.addWidget(self.treeWidget) self.leftPanelLayout.addLayout(self.outlinerTopBarLayout) self.leftPanelLayout.addLayout(self.outlinerLayout) #Tool Box self.toolBoxPanel = QFrame() self.toolBoxPanel.setStyleSheet( "border : none; background-color : rgb(100,100,100)") self.toolBoxLayout = QVBoxLayout() self.toolBoxPanel.setLayout(self.toolBoxLayout) self.leftPanelLayout.addWidget(self.toolBoxPanel) #Middle self.middle = QFrame() self.middle.setStyleSheet(get_css('2DSpace')) self.middleLayout = QVBoxLayout() self.middleLayout.setContentsMargins(0, 0, 0, 0) self.middleLayout.setSpacing(0) self.thumbnailList = ListWidget(self) self.assetLayout = QVBoxLayout() self.assetLayout.setContentsMargins(0, 0, 0, 0) self.assetLayout.addWidget(self.thumbnailList) #vSpacer = QSpacerItem(20, 10, QSizePolicy.Expanding, QSizePolicy.Expanding) #self.assetLayout.addItem(vSpacer) #self.change_view_mode() #self.thumbnailList.itemClicked.connect(self.click_thumb) #self.thumbnailList = TableWidget(self) self.middleLayout.addWidget(self.topBarArea) self.middleLayout.addLayout(self.assetLayout) self.middle.setLayout(self.middleLayout) #Right Panel self.rightPanel = QFrame() #self.rightPanel.setMaximumWidth(256) #self.rightPanel.setMinimumWidth(256) self.rightPanel.setStyleSheet(get_css('PanelRight')) self.rightLayout = QVBoxLayout() self.rightLayout.setContentsMargins(0, 0, 0, 0) self.rightLayout.setSpacing(0) self.rightPanel.setLayout(self.rightLayout) #Splitter self.splitter = QSplitter(Qt.Horizontal) self.splitter.setStyleSheet(get_css('Splitter')) #self.splitter.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) ## Dir button btn_parent_dir = PushButton(icon=icon_path('ICON_FILE_PARENT'), size=[22, 22]) #### add_asset button #btn_add_asset = PushButton(icon= icon_path('ICON_ZOOMIN'),size = [22,22]) #btn_add_asset.clicked.connect(self.add_asset) btn_refresh = PushButton(icon=icon_path('ICON_FILE_FOLDER'), size=[22, 22]) btn_refresh.clicked.connect(self.refresh) btn_refresh.setToolTip('Refresh tree') #open folder button btn_open_folder = PushButton(icon=icon_path('OPEN_FOLDER'), size=[22, 22]) btn_open_folder.clicked.connect(self.open_folder) btn_open_folder.setToolTip('Open Lib Folder') #list view spacer = QSpacerItem(5, 5, QSizePolicy.Maximum, QSizePolicy.Minimum) self.view_mode = CheckBox('List') self.view_mode.stateChanged.connect( lambda: self.click_item(self.treeWidget.currentItem())) #search bar self.search_bar = LineEdit() self.search_bar.textChanged.connect(self.filterThumbnail) #add widget to search bar self.topBarLayout.addWidget(btn_parent_dir) self.topBarLayout.addWidget(self.search_bar) self.topBarLayout.addWidget(btn_refresh) self.topBarLayout.addWidget(btn_open_folder) self.topBarLayout.addItem(spacer) self.topBarLayout.addWidget(self.view_mode) # Adding Panel to splitter self.splitter.addWidget(self.leftPanel) self.splitter.addWidget(self.middle) self.splitter.addWidget(self.rightPanel) self.splitter.setSizes([132, 512, 256]) self.splitter.setStretchFactor(0, 0) self.splitter.setStretchFactor(1, 1) self.splitter.setStretchFactor(2, 0) self.mainLayout.addWidget(self.titleBarArea) self.mainLayout.addWidget(self.splitter) #shortcut self.shortcut_zoom_in = QShortcut(QKeySequence("+"), self) self.shortcut_zoom_out = QShortcut(QKeySequence("-"), self) self.shortcut_zoom_in.activated.connect(self.zoom_in) self.shortcut_zoom_out.activated.connect(self.zoom_out) self.setLayout(self.mainLayout) self.show() def change_view_mode(self): self.click_item(self.treeWidget.currentItem) def batch(self): clear_layout(self.rightLayout) #self.addAssetPanel = Batch(self) self.rightLayout.addLayout(Batch(self)) #def batch_fill_lib(template,files,folder = None,category = None) : #self.click_item(self.treeWidget.currentItem) def change_filter(self, index): print(str(self.cbox_filter.currentText())) def change_area(self, index): #self.treeWidget.clear() print(str(self.area.currentText())) if self.title: self.title.setText(self.area.currentText()) #self.refresh() def refresh(self): area = str(self.area.currentText()) if self.treeWidget and self.area and self.cbox_filter: if self.treeWidget.search_json.isRunning: self.treeWidget.search_json.terminate() self.treeWidget.clear() #filter_items = str(self.cbox_filter.currentText()) self.treeWidget.create_widget(settings['path']) #self.treeWidget.create_tree(settings['path'],'Library','All') def open_folder(self): try: os.startfile(settings['path']) except: subprocess.Popen(['xdg-open', settings['path']]) def add_asset(self): clear_layout(self.rightLayout) self.addAssetPanel = AddAsset(self) self.rightLayout.addLayout(self.addAssetPanel) def zoom_in(self): new_size = self.thumbnailList.iconSize().width() if not new_size > 512: new_size *= 1.25 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) def zoom_out(self): new_size = self.thumbnailList.iconSize().width() if not new_size < 16: new_size *= 0.75 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) # When selected of folder in the outliner def click_item(self, item): #for row in range(self.thumbnailList.rowCount()) : #clear_layout(self.assetLayout) #self.thumbnailList.clear() #a= TreeWidget(item.text(1)) #self.thumbnailList.clear() #self.middle.addWidget(ThumbnailPanel.createWidget(item.text(1))) if hasattr(self, 'view_mode') and self.view_mode.isChecked(): self.thumbnailList = TableWidget(self) #self.thumbnailList.horizontalHeader().setSortIndicator(1,Qt.AscendingOrder) #self.thumbnailList.cellClicked.connect(self.click_thumb) #self.thumbnailList.setRowCount(0) else: if hasattr(self.thumbnailList, "search_asset" ) and self.thumbnailList.search_asset.isRunning: self.thumbnailList.search_asset.terminate() self.thumbnailList.clear() self.thumbnailList.search_images(item.full_path) #self.thumbnailList.itemClicked.connect(self.click_thumb) #self.thumbnailList.clear() #print(item.full_path) #self.asset_list.sort(key = lambda x : x['']) #self.assetLayout.addWidget(self.thumbnailList) if self.area.currentText() == 'Library': subFolder = [] # When taping in the search bar def filterThumbnail(self): if self.thumbnailList: items = (self.thumbnailList.item(i) for i in range(self.thumbnailList.count())) search = self.search_bar.text() for index, item in enumerate(items): info = item.info tags = [ t for t in info['tags'].split(',') if len(info['tags']) ] name = info['asset'] item_visibility = filtering_keyword(name, search, tags) if self.view_mode.isChecked(): self.thumbnailList.setRowHidden(index, item_visibility) else: self.thumbnailList.item(index).setHidden(item_visibility) def closeEvent(self, event): if self.treeWidget.search_json.isRunning: self.treeWidget.search_json.terminate() if hasattr( self.thumbnailList, "search_asset") and self.thumbnailList.search_asset.isRunning: self.thumbnailList.search_asset.terminate() self.widget_close = True self.deleteLater()