Пример #1
0
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)
Пример #2
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
Пример #3
0
    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()
Пример #4
0
    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()
Пример #5
0
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()
Пример #6
0
 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()
Пример #7
0
    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()
Пример #8
0
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
Пример #9
0
Файл: util.py Проект: jopohl/urh
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))
Пример #10
0
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))
Пример #11
0
 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)
Пример #12
0
    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()
Пример #13
0
    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()
Пример #14
0
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;")
Пример #15
0
    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()
Пример #16
0
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']])
Пример #17
0
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)
Пример #18
0
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" &lt;[email protected]&gt;</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.""")
Пример #19
0
    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)
Пример #20
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()
Пример #21
0
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()))
Пример #23
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_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()
Пример #24
0
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])
Пример #25
0
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
Пример #26
0
    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
Пример #27
0
    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)
Пример #28
0
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()