diff --git a/QtPyLoT.py b/QtPyLoT.py index c02599e0..9cee1a45 100755 --- a/QtPyLoT.py +++ b/QtPyLoT.py @@ -109,6 +109,7 @@ class MainWindow(QMainWindow): print('Using default input file {}'.format(infile)) if os.path.isfile(infile) == False: infile = QFileDialog().getOpenFileName(caption='Choose PyLoT-input file') + if not os.path.exists(infile[0]): QMessageBox.warning(self, "PyLoT Warning", "No PyLoT-input file declared!") @@ -209,6 +210,8 @@ class MainWindow(QMainWindow): except: self.startTime = UTCDateTime() + self.init_styles() + pylot_icon = QIcon() pylot_icon.addPixmap(QPixmap(':/icons/pylot.png')) @@ -566,21 +569,22 @@ class MainWindow(QMainWindow): self.eventBox.activated.connect(self.refreshEvents) # add main tab widget - self.tabs = QTabWidget() + self.tabs = QTabWidget(self) self._main_layout.addWidget(self.tabs) self.tabs.currentChanged.connect(self.refreshTabs) # add scroll area used in case number of traces gets too high - self.wf_scroll_area = QtGui.QScrollArea() + self.wf_scroll_area = QtGui.QScrollArea(self) # create central matplotlib figure canvas widget self.pg = pg + #self.set_style('custom') self.init_wfWidget() # init main widgets for main tabs - wf_tab = QtGui.QWidget() - array_tab = QtGui.QWidget() - events_tab = QtGui.QWidget() + wf_tab = QtGui.QWidget(self) + array_tab = QtGui.QWidget(self) + events_tab = QtGui.QWidget(self) # init main widgets layouts self.wf_layout = QtGui.QVBoxLayout() @@ -623,8 +627,8 @@ class MainWindow(QMainWindow): self.dataPlot = PylotCanvas(parent=self, connect_events=False, multicursor=True) self.dataPlot.updateWidget(xlab, None, plottitle) else: - self.pg = True - self.dataPlot = WaveformWidgetPG(parent=self, xlabel=xlab, ylabel=None, + self.pg = pg + self.dataPlot = WaveformWidgetPG(parent=self, title=plottitle) self.dataPlot.setCursor(Qt.CrossCursor) self.wf_scroll_area.setWidget(self.dataPlot) @@ -662,6 +666,53 @@ class MainWindow(QMainWindow): if event.key() == QtCore.Qt.Key.Key_Shift: self._shift = False + def init_styles(self): + self._styles = {} + styles = ['default', 'dark', 'custom'] + for style in styles: + self._styles[style] = {} + + self._styles['default']['stylesheet'] = ("QMainWindow {background-color: rgba(200, 200, 200, 255)}") + # ;" + # "alternate-background-color: rgba(255, 0, 255, 255);" + # "color: rgba(0, 0, 0, 255);" + # "gridline-color: rgba(0, 0, 0, 255);" + # "selection-background-color: rgba(50, 50, 150, 255)};" + # "QMainWindow {background-color: red}") + self._styles['default']['background'] = 'w' + self._styles['default']['foreground'] = 'k' + + self._styles['dark']['stylesheet'] = ("QWidget {background-color: rgba(50, 50, 60, 255);" + "alternate-background-color: rgba(100, 100, 150, 255);" + "border-color: rgba(200, 200, 200, 255);" + "color: rgba(255, 255, 255, 255);" + "gridline-color: rgba(255, 255, 255, 255);" + "selection-background-color: rgba(50, 50, 150, 255)}") + self._styles['dark']['background'] = QtGui.QColor(50, 50, 65, 255) + self._styles['dark']['foreground'] = 'w' + + infile = open('./pylot/core/util/stylesheet.qss', 'r') + stylesheet = infile.read() + infile.close() + self._styles['custom']['stylesheet'] = stylesheet + self._styles['custom']['background'] = QtGui.QColor(50, 50, 65, 255) + self._styles['custom']['foreground'] = 'w' + + + def set_style(self, stylename): + if not stylename in self._styles: + qmb = QMessageBox.warning(self, 'Could not find style', + 'Could not find style with name {}.'.format(stylename)) + return + self._style = stylename + style = self._styles[stylename] + self.setStyleSheet(style['stylesheet']) + + if self.pg: + pg.setConfigOption('background', style['background']) + pg.setConfigOption('foreground', style['foreground']) + pg.setConfigOptions(antialias=True) + @property def metadata(self): return self._metadata @@ -1521,7 +1572,7 @@ class MainWindow(QMainWindow): self.getPlotWidget().updateWidget() plots = self.wfp_thread.data for times, data in plots: - self.dataPlot.plotWidget.getPlotItem().plot(times, data, pen='k') + self.dataPlot.plotWidget.getPlotItem().plot(times, data)#, pen='k') self.dataPlot.reinitMoveProxy() self.dataPlot.plotWidget.showAxis('left') self.dataPlot.plotWidget.showAxis('bottom') @@ -2498,7 +2549,7 @@ class MainWindow(QMainWindow): self.events_layout.removeWidget(self.event_table) # init new qtable - self.event_table = QtGui.QTableWidget() + self.event_table = QtGui.QTableWidget(self) self.event_table.setColumnCount(12) self.event_table.setRowCount(len(eventlist)) self.event_table.setHorizontalHeaderLabels(['', @@ -2775,7 +2826,7 @@ class MainWindow(QMainWindow): if not self.okToContinue(): return if not fnm: - dlg = QFileDialog() + dlg = QFileDialog(parent=self) fnm = dlg.getOpenFileName(self, 'Open project file...', filter='Pylot project (*.plp)') if not fnm: return @@ -2802,7 +2853,7 @@ class MainWindow(QMainWindow): ''' Save back project to new pickle file. ''' - dlg = QFileDialog() + dlg = QFileDialog(self) fnm = dlg.getSaveFileName(self, 'Create a new project file...', filter='Pylot project (*.plp)') filename = fnm[0] if not len(fnm[0]): @@ -3084,7 +3135,6 @@ def create_window(): # window.show() return app, app_created - def main(args=None): project_filename = None pylot_infile = None diff --git a/pylot/core/util/widgets.py b/pylot/core/util/widgets.py index e038bb3c..a733a98c 100644 --- a/pylot/core/util/widgets.py +++ b/pylot/core/util/widgets.py @@ -16,11 +16,6 @@ import time import numpy as np -try: - import pyqtgraph as pg -except: - pg = None - from matplotlib.figure import Figure from pylot.core.util.utils import find_horizontals, identifyPhase, loopIdentifyPhase, trim_station_components, \ identifyPhaseID, check4rotated @@ -64,12 +59,6 @@ elif sys.version_info.major == 2: else: raise ImportError('Could not determine python version.') -if pg: - pg.setConfigOption('background', 'w') - pg.setConfigOption('foreground', 'k') - pg.setConfigOptions(antialias=True) - # pg.setConfigOption('leftButtonPan', False) - def getDataType(parent): type = QInputDialog().getItem(parent, "Select phases type", "Type:", @@ -435,29 +424,30 @@ class PlotWidget(FigureCanvas): class WaveformWidgetPG(QtGui.QWidget): - def __init__(self, parent=None, xlabel='x', ylabel='y', title='Title'): - QtGui.QWidget.__init__(self, parent) # , 1) - self.setParent(parent) - self._parent = parent + def __init__(self, parent, title='Title'): + QtGui.QWidget.__init__(self, parent=parent) + self.pg = self.parent().pg + # added because adding widget to scrollArea will set scrollArea to parent + self.orig_parent = parent # attribute plotdict is a dictionary connecting position and a name self.plotdict = dict() # create plot self.main_layout = QtGui.QVBoxLayout() self.label = QtGui.QLabel() self.setLayout(self.main_layout) - self.plotWidget = pg.PlotWidget(title=title, autoDownsample=True) + self.plotWidget = self.pg.PlotWidget(self.parent(), title=title, autoDownsample=True) self.main_layout.addWidget(self.plotWidget) self.main_layout.addWidget(self.label) - self.plotWidget.showGrid(x=False, y=True, alpha=0.2) + self.plotWidget.showGrid(x=False, y=True, alpha=0.3) self.plotWidget.hideAxis('bottom') self.plotWidget.hideAxis('left') self.wfstart, self.wfend = 0, 0 self.reinitMoveProxy() - self._proxy = pg.SignalProxy(self.plotWidget.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved) + self._proxy = self.pg.SignalProxy(self.plotWidget.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved) def reinitMoveProxy(self): - self.vLine = pg.InfiniteLine(angle=90, movable=False) - self.hLine = pg.InfiniteLine(angle=0, movable=False) + self.vLine = self.pg.InfiniteLine(angle=90, movable=False) + self.hLine = self.pg.InfiniteLine(angle=0, movable=False) self.plotWidget.addItem(self.vLine, ignoreBounds=True) self.plotWidget.addItem(self.hLine, ignoreBounds=True) @@ -467,10 +457,10 @@ class WaveformWidgetPG(QtGui.QWidget): mousePoint = self.plotWidget.getPlotItem().vb.mapSceneToView(pos) x, y, = (mousePoint.x(), mousePoint.y()) # if x > 0:# and index < len(data1): - wfID = self._parent.getWFID(y) - station = self._parent.getStationName(wfID) + wfID = self.orig_parent.getWFID(y) + station = self.orig_parent.getStationName(wfID) abstime = self.wfstart + x - if self._parent.get_current_event(): + if self.orig_parent.get_current_event(): self.label.setText("station = {}, T = {}, t = {} [s]".format(station, abstime, x)) self.vLine.setPos(mousePoint.x()) self.hLine.setPos(mousePoint.y()) @@ -484,12 +474,6 @@ class WaveformWidgetPG(QtGui.QWidget): def clearPlotDict(self): self.plotdict = dict() - def getParent(self): - return self._parent - - def setParent(self, parent): - self._parent = parent - def plotWFData(self, wfdata, title=None, zoomx=None, zoomy=None, noiselevel=None, scaleddata=False, mapping=True, component='*', nth_sample=1, iniPick=None, verbosity=0): @@ -3747,6 +3731,12 @@ class GraphicsTab(PropTab): self.main_layout.addWidget(self.spinbox_nth_sample, 1, 1) def add_pg_cb(self): + try: + import pyqtgraph as pg + pg = True + except: + pg = False + text = {True: 'Use pyqtgraphic library for plotting', False: 'Cannot use library: pyqtgraphic not found on system'} label = QLabel('PyQt graphic')