def _addButton(self, v, cnt): control = QPushButton(v.name) control.setFocusPolicy(Qt.StrongFocus) f = control.font() f.setPointSizeF(11) if self.styleName == "mac": f.setPointSizeF(10) control.setFont(f) control.tag = cnt if self.styleName == "mac": control.setAttribute(Qt.WA_MacMiniSize, True) self.layout.addWidget(control, cnt, 1) self.connect(control, SIGNAL("clicked()"), self.buttonClicked_)
def _addButton(self, v, cnt): control = QPushButton(v.name) control.setFocusPolicy(Qt.StrongFocus) f = control.font() f.setPointSizeF(11) if self.styleName == "mac": f.setPointSizeF(10) control.setFont(f) control.tag = cnt if self.styleName == "mac": control.setAttribute(Qt.WA_MacMiniSize, True) self.layout.addWidget(control, cnt, 1) self.connect(control, SIGNAL("clicked()"), self.buttonClicked_)
def __init__(self, parent=None): super(LayerSelectionPage, self).__init__(parent) self.parent = parent #convenience link self.confconn_link = self.parent.parent.confconn #flag top prevent read read action on keyword delete. New logic makes this redundant #self.keywordbypass = False QToolTip.setFont(QFont('SansSerif', 10)) #label filterlabel = QLabel('Filter') availablelabel = QLabel('Available Layers') selectionlabel = QLabel('Layer Selections') keywordlabel = QLabel('Keyword') explainlabel = QLabel("Edit Group assignments using this dialog or to simply initialise the Layer-Config just click 'Finish'") #selection buttons chooseallbutton = QPushButton('>>') chooseallbutton.setFixedWidth(self.XFER_BW) chooseallbutton.clicked.connect(self.doChooseAllClickAction) choosebutton = QPushButton('>') choosebutton.setFixedWidth(self.XFER_BW) choosebutton.clicked.connect(self.doChooseClickAction) rejectbutton = QPushButton('<') rejectbutton.setFixedWidth(self.XFER_BW) rejectbutton.clicked.connect(self.doRejectClickAction) rejectallbutton = QPushButton('<<') rejectallbutton.setFixedWidth(self.XFER_BW) rejectallbutton.clicked.connect(self.doRejectAllClickAction) #operation buttons finishbutton = QPushButton('Finish') finishbutton.setToolTip('Finish and Close layer selection dialog') finishbutton.clicked.connect(self.parent.close) resetbutton = QPushButton('Reset') resetbutton.font() resetbutton.setToolTip('Read Layer from LDS GetCapabilities request. Overwrites current Layer Config') resetbutton.clicked.connect(self.doResetClickAction) self.available_sfpm = LDSSFPAvailableModel(self) self.selection_sfpm = LDSSFPSelectionModel(self) self.available_sfpm.setSourceModel(self.parent.available_model) self.selection_sfpm.setSourceModel(self.parent.selection_model) #textedits filteredit = QLineEdit('') filteredit.setToolTip('Filter Available-Layers pane (filter operates across Name and Title fields and accepts Regex expressions)') filteredit.textChanged.connect(self.available_sfpm.setActiveFilter) self.keywordcombo = QComboBox() self.keywordcombo.setToolTip('Select or Add a unique identifier to be saved in layer config (keyword)') self.keywordcombo.addItems(list(self.confconn_link.assigned)) self.keywordcombo.setEditable(True) self.keywordcombo.activated.connect(self.doKeyComboChangeAction) lgindex = self.confconn_link.getLayerGroupIndex(self.confconn_link.lgval,col=1) lgentry = self.confconn_link.lglist[lgindex] if LU.assessNone(lgindex) else None #keywordedit = self.keywordcombo.lineEdit().text().toUtf8().data().decode('utf8')# for writing #if no entry or layer indicated then blank self.keywordcombo.lineEdit().setText('' if lgentry is None or lgentry[0]==LORG.LAYER else lgentry[1])#self.confconn_link.lgval)#TODO. group only #header headmodel = QStandardItemModel() headmodel.setHorizontalHeaderLabels([i[2] for i in self.colparams][:self.parent.available_model.columnCount()]) headview1 = QHeaderView(Qt.Horizontal) headview1.setModel(headmodel) headview1.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) headview2 = QHeaderView(Qt.Horizontal) headview2.setModel(headmodel) headview2.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) #table self.available = QTableView() self.available.setSelectionBehavior(QAbstractItemView.SelectRows) self.available.setSelectionMode(QAbstractItemView.MultiSelection) self.selection = QTableView() self.selection.setSelectionBehavior(QAbstractItemView.SelectRows) self.selection.setSelectionMode(QAbstractItemView.MultiSelection) #interesting, must set model after selection attributes but before headers else row selections/headers don't work properly self.available.setModel(self.available_sfpm) self.selection.setModel(self.selection_sfpm) self.available.setSortingEnabled(True) self.available.setHorizontalHeader(headview1) self.selection.setSortingEnabled(True) self.selection.setHorizontalHeader(headview2) for cp in self.colparams: self.available.setColumnWidth(cp[0],cp[1]) self.selection.setColumnWidth(cp[0],cp[1]) self.available.verticalHeader().setVisible(False) self.available.horizontalHeader().setVisible(True) self.selection.verticalHeader().setVisible(False) self.selection.horizontalHeader().setVisible(True) #layout vbox00 = QVBoxLayout() vbox00.addWidget(availablelabel) vbox00.addWidget(self.available) vbox01 = QVBoxLayout() vbox01.addWidget(chooseallbutton) vbox01.addWidget(choosebutton) vbox01.addWidget(rejectbutton) vbox01.addWidget(rejectallbutton) vbox02 = QVBoxLayout() vbox02.addWidget(selectionlabel) vbox02.addWidget(self.selection) vbox10 = QVBoxLayout() vbox10.addWidget(filterlabel) vbox10.addWidget(filteredit) hbox12 = QHBoxLayout() hbox12.addWidget(keywordlabel) hbox12.addStretch(1) #hbox12.addWidget(inspbutton) #hbox12.addWidget(addbutton) #hbox12.addWidget(delbutton) vbox12 = QVBoxLayout() vbox12.addLayout(hbox12) vbox12.addWidget(self.keywordcombo) #00|01|02 #10|11|12 grid0 = QGridLayout() grid0.addLayout(vbox00,1,0) grid0.addLayout(vbox01,1,1) grid0.addLayout(vbox02,1,2) grid0.addLayout(vbox10,0,0) grid0.addLayout(vbox12,0,2) hbox2 = QHBoxLayout() hbox2.addWidget(resetbutton) hbox2.addStretch(1) hbox2.addWidget(explainlabel) hbox2.addWidget(finishbutton) #gbox1.setLayout(hbox2) vbox3 = QVBoxLayout() vbox3.addLayout(grid0) #vbox3.addLayout(hbox3) #vbox3.addWidget(line0) vbox3.addLayout(hbox2) self.setLayout(vbox3)
class DataViewerBase(QMainWindow): """ Base GUI class for viewing data / images. This class was made in the purpose of viewing VMI images. """ # _name = DataViewerBase().__class__.__name__ def __init__(self, filepath=""): """ Initialization. """ super().__init__() self.initInnerParameters(filepath) self.initGui() self.initGetDataProcess() self.initUpdateImageProcess() self.initCheckWindowProcess() @footprint def initInnerParameters(self, filepath): """ Initialize the inner parameters. """ self._mutex = QMutex() self._windows = [] self.initData() self._isUpdatingImage = False self._font_size_button = 16 # [pixel] self._font_size_groupbox_title = 12 # [pixel] self._font_size_label = 11 # [pixel] self._font_bold_label = True self._init_window_width = 1600 # [pixel] self._init_window_height = 700 # [pixel] self._init_button_color = "#EBF5FB" self.main_bgcolor = "#FDF2E9" self._get_data_interval = 1 # [sec] self._get_data_worker_sleep_interval = self._get_data_interval - 0.1 # [sec] self._update_image_interval = 2 # [sec] self._get_update_delay = 1 # [sec] self._check_window_interval = 1 # [sec] self._currentDir = os.path.dirname(__file__) self._online = False self._closing_dialog = True if os.path.exists( os.path.join(os.path.dirname(__file__), "config.json")): self.loadConfig() if not os.path.exists( os.path.join(os.path.dirname(__file__), "config_getdata.json")): raise FileNotFoundError("config_getdata.json") self.loadConfigGetData() @footprint @pyqtSlot() def initData(self): """ Initialize inner data. """ self.dataset = { "sig_wl": None, "sig_wol": None, "bg_wl": None, "bg_wol": None } self.nbr_of_sig = 0 self.nbr_of_bg = 0 self.sig = None self.bg = None self.currentRun = -1 self.startTag = -1 self.endTag = -1 @footprint def loadConfig(self): """ Load a config file. """ with open(os.path.join(os.path.dirname(__file__), "config.json"), 'r') as ff: config = json.load(ff) if config.get("currentDir") is not None: if isinstance(config.get("currentDir"), str): if os.path.exists(config.get("currentDir")): self._currentDir = config["currentDir"] if config.get("online") is not None: if isinstance(config.get("online"), bool): self._online = config["online"] if config.get("closing_dialog") is not None: if isinstance(config.get("closing_dialog"), bool): self._closing_dialog = config["closing_dialog"] if config.get("emulate") is not None: if isinstance(config.get("emulate"), bool): self._emulate = config["emulate"] if config.get("font_size_button") is not None: if isinstance(config.get("font_size_button"), int): self._font_size_button = config["font_size_button"] if config.get("font_size_groupbox_title") is not None: if isinstance(config.get("font_size_groupbox_title"), int): self._font_size_groupbox_title = config[ "font_size_groupbox_title"] if config.get("font_size_label") is not None: if isinstance(config.get("font_size_label"), int): self._font_size_label = config["font_size_label"] if config.get("font_bold_label") is not None: if isinstance(config.get("font_bold_label"), bool): self._font_bold_label = config["font_bold_label"] self._config = config def loadConfigGetData(self): """ Load a config file of getDatawithOLPY. """ with open( os.path.join(os.path.dirname(__file__), "config_getdata.json"), 'r') as ff: config_get_data = json.load(ff) self._get_data_interval = config_get_data["interval"] # [sec] self._get_data_worker_sleep_interval = self._get_data_interval - 0.1 # [sec] self._get_data_ports = config_get_data["port"] self._get_info_port = config_get_data["port_info"] self._config_get_data = config_get_data @footprint def initGui(self): """ Initialize the GUI. """ self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.initMainWidget() self.setMenuBar() self.setWindowTitle("VMI Viewer") self.resize(self._init_window_width, self._init_window_height) ### RunInfo. group_runinfo = QGroupBox(self) group_runinfo.setTitle("RunInfo") font = group_runinfo.font() font.setPointSize(self._font_size_groupbox_title) group_runinfo.setFont(font) group_runinfo.resize(400, 100) grid_runinfo = QGridLayout(group_runinfo) # Run No. label_run = QLabel(self) label_run.setText("Run No. : ") label_run.setAlignment(Qt.AlignRight) font = label_run.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_run.setFont(font) self.label_run_number = QLabel(self) self.label_run_number.setText("Unknown") pal = QPalette() pal.setColor(QPalette.Foreground, QColor("#0B5345")) self.label_run_number.setPalette(pal) font = self.label_run_number.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_run_number.setFont(font) # Tag No. label_tag = QLabel(self) label_tag.setText("Tag No. : ") label_tag.setAlignment(Qt.AlignRight) font = label_tag.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_tag.setFont(font) self.label_tag_start = QLabel(self) self.label_tag_start.setText("None") font = self.label_tag_start.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_tag_start.setFont(font) label_tag_hyphen = QLabel(self) label_tag_hyphen.setText(" - ") label_tag_hyphen.setFixedWidth(30) font = label_tag_hyphen.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_tag_hyphen.setFont(font) self.label_tag_end = QLabel(self) self.label_tag_end.setText("None") font = self.label_tag_end.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_tag_end.setFont(font) # Sig / BG. label_sig = QLabel(self) label_sig.setText("# of Sig : ") label_sig.setAlignment(Qt.AlignRight) font = label_sig.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_sig.setFont(font) self.label_nbr_of_sig = QLabel(self) self.label_nbr_of_sig.setText("None") font = self.label_nbr_of_sig.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_nbr_of_sig.setFont(font) label_bg = QLabel(self) label_bg.setText("# of BG : ") label_bg.setAlignment(Qt.AlignRight) font = label_bg.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_bg.setFont(font) self.label_nbr_of_bg = QLabel(self) self.label_nbr_of_bg.setText("None") font = self.label_nbr_of_bg.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_nbr_of_bg.setFont(font) # Construct the layout. grid_runinfo.addWidget(label_run, 0, 0) grid_runinfo.addWidget(self.label_run_number, 0, 1, 1, 3) grid_runinfo.addWidget(label_tag, 1, 0) grid_runinfo.addWidget(self.label_tag_start, 1, 1) grid_runinfo.addWidget(label_tag_hyphen, 1, 2) grid_runinfo.addWidget(self.label_tag_end, 1, 3) grid_runinfo.addWidget(label_sig, 2, 0) grid_runinfo.addWidget(self.label_nbr_of_sig, 2, 1) grid_runinfo.addWidget(label_bg, 2, 2) grid_runinfo.addWidget(self.label_nbr_of_bg, 2, 3) ### Settings. # group_settings = QGroupBox(self) # group_settings.setTitle("Settings") # font = group_settings.font() # font.setPointSize(self._font_size_groupbox_title) # group_settings.setFont(font) # group_settings.resize(400, 100) # grid_settings = QGridLayout(group_settings) # # Update interval. # label_upd_rate = QLabel(self) # label_upd_rate.setText("Upd. image interval: ") # font = label_upd_rate.font() # font.setPointSize(self._font_size_label) # font.setBold(self._font_bold_label) # label_upd_rate.setFont(font) # self.spinbox_upd_img_interval = QDoubleSpinBox(self) # self.spinbox_upd_img_interval.setValue(self._get_data_interval) # self.spinbox_upd_img_interval.setFixedWidth(100) # self.spinbox_upd_img_interval.setAlignment(Qt.AlignRight) # font = self.spinbox_upd_img_interval.font() # font.setBold(True) # font.setPointSize(self._font_size_label) # self.spinbox_upd_img_interval.setFont(font) # label_upd_rate_unit = QLabel(self) # label_upd_rate_unit.setText("sec") # font = label_upd_rate_unit.font() # font.setPointSize(self._font_size_label) # font.setBold(self._font_bold_label) # label_upd_rate_unit.setFont(font) # Construct the layout. # grid_settings.addWidget(label_upd_rate, 0, 0, 1, 3) # grid_settings.addWidget(self.spinbox_upd_img_interval, 0, 3) # grid_settings.addWidget(label_upd_rate_unit, 0, 4) ### Function buttons. group_func = QGroupBox(self) group_func.setTitle("Function") font = group_func.font() font.setPointSize(self._font_size_groupbox_title) group_func.setFont(font) group_func.resize(400, 100) grid_func = QGridLayout(group_func) grid_func.setSpacing(10) # Start/Stop main process button. self.brun = QPushButton(group_func) self.brun.setText("Start") font = self.brun.font() font.setPointSize(self._font_size_button) self.brun.setFont(font) self.brun.resize(400, 50) self.brun.setStyleSheet("background-color:{};".format( self._init_button_color)) self.brun.clicked.connect(self.runMainProcess) # Clear data button. bclear = QPushButton(group_func) bclear.setText("Clear") font = bclear.font() font.setPointSize(self._font_size_button) bclear.setFont(font) bclear.resize(400, 50) bclear.setStyleSheet("background-color:{};".format( self._init_button_color)) bclear.clicked.connect(self.clearData) # Save images button. bsave = QPushButton(group_func) bsave.setText("Save") font = bsave.font() font.setPointSize(self._font_size_button) bsave.setFont(font) bsave.resize(400, 50) bsave.setStyleSheet("background-color:{};".format( self._init_button_color)) bsave.clicked.connect(self.saveData) # New window button. bwindow = QPushButton(group_func) bwindow.setText("Window") font = bwindow.font() font.setPointSize(self._font_size_button) bwindow.setFont(font) bwindow.resize(400, 50) bwindow.setStyleSheet("background-color:{};".format( self._init_button_color)) bwindow.clicked.connect(self.showWindow) # Construct the layout of RunInfo groupbox. grid_func.addWidget(self.brun, 0, 0) grid_func.addWidget(bclear, 0, 1) grid_func.addWidget(bsave, 1, 0) grid_func.addWidget(bwindow, 1, 1) ### Plotting area. grp1 = QGroupBox(self) # grp1.setTitle("SIG WL") grp1.setTitle("SIG") font = grp1.font() font.setPointSize(self._font_size_groupbox_title) grp1.setFont(font) gp1 = QGridLayout(grp1) gp1.setSpacing(10) grp2 = QGroupBox(self) # grp2.setTitle("SIG WOL") grp2.setTitle("BG") font = grp2.font() font.setPointSize(self._font_size_groupbox_title) grp2.setFont(font) gp2 = QGridLayout(grp2) gp2.setSpacing(10) grp3 = QGroupBox(self) # grp3.setTitle("BG WL") grp3.setTitle("SIg - BG") font = grp3.font() font.setPointSize(self._font_size_groupbox_title) grp3.setFont(font) gp3 = QGridLayout(grp3) gp3.setSpacing(10) # grp4 = QGroupBox(self) # grp4.setTitle("BG WOL") # font = grp4.font() # font.setPointSize(self._font_size_groupbox_title) # grp4.setFont(font) # gp4 = QGridLayout(grp4) # gp4.setSpacing(10) kwargs = dict(px=False, py=False, ph=False, bp=False) self.pw1 = PlotWindow(self, **kwargs) self.pw2 = PlotWindow(self, **kwargs) self.pw3 = PlotWindow(self, **kwargs) # self.pw4 = PlotWindow(self, **kwargs) gp1.addWidget(self.pw1, 0, 0) gp2.addWidget(self.pw2, 0, 0) gp3.addWidget(self.pw3, 0, 0) # gp4.addWidget(self.pw4, 0, 0) ### Construct the layout. self.grid.addWidget(group_runinfo, 0, 0) # self.grid.addWidget(group_settings, 0, 1) self.grid.addWidget(group_func, 0, 1) self.grid.addWidget(grp1, 1, 0, 2, 1) self.grid.addWidget(grp2, 1, 1, 2, 1) self.grid.addWidget(grp3, 1, 2, 2, 1) # self.grid.addWidget(grp4, 1, 3, 2, 1) self.main_widget.setFocus() self.setCentralWidget(self.main_widget) @footprint def initMainWidget(self): """ Initialize the main widget and the grid. """ self.main_widget = QWidget(self) self.setStyleSheet("background-color:{};".format(self.main_bgcolor)) self.grid = QGridLayout(self.main_widget) self.grid.setSpacing(10) self.setWindowIcon( QIcon(os.path.join(os.path.dirname(__file__), "python.png"))) @footprint def setMenuBar(self): """ Set the contents of the menu bar """ ## File file_menu = QMenu('&File', self) # Open # file_menu.addAction('&Open', self.openFile, # QtCore.Qt.CTRL + QtCore.Qt.Key_O) # Config file_menu.addAction('&Config', self.setConfig, QtCore.Qt.CTRL + QtCore.Qt.Key_C) # Quit file_menu.addAction('&Quit', self.quitApp, QtCore.Qt.CTRL + QtCore.Qt.Key_Q) self.menuBar().addMenu(file_menu) ## Help # help_menu = QMenu('&Help', self) # help_menu.addAction('Help', self.showHelp) # help_menu.addAction('About...', self.showAbout) self.menuBar().addSeparator() # self.menuBar().addMenu(help_menu) ######################## Menu bar ######################## @footprint def openFile(self): """ Show a file dialog and select a file """ pass @footprint def setConfig(self): """ Set configuration of this application. """ pass @footprint def quitApp(self): """ Quit this application. """ self.close() @footprint def showHelp(self): """ Show a pop-up dialog showing how to use this application. """ pass @footprint def showAbout(self): """ Show a pop-up dialog describing this application. """ pass ######################## Widgets' functions ######################## @footprint @pyqtSlot() def showWindow(self): window = PlotWindow(self, "win{0:02d}".format(len(self._windows) + 1)) window.show() window.raise_() window.activateWindow() self._windows.append(window) @footprint @pyqtSlot() def runMainProcess(self): if not self._timer_getData.isActive(): self.initData() for listener in self._worker_getData.listeners.values(): listener.Connect() self._worker_getData.listener_info.Connect() # self._update_image_interval = self.spinbox_upd_img_interval.value() # self.spinbox_upd_img_interval.setEnabled(False) self._timer_getData.start() self.brun.setText("Stop") if not self._timer_updImage.isActive(): time.sleep(self._get_update_delay) self._timer_updImage.start() else: self.brun.setEnabled(False) self.stopTimer = True @footprint @pyqtSlot() def saveData(self): now_save = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") saveDataDir = os.path.join(os.path.dirname(__file__), "data", "Run{}".format(str(self.currentRun))) # Data. if not os.path.exists(saveDataDir): os.makedirs(saveDataDir) for _types in self._get_data_ports.keys(): np.save(os.path.join(saveDataDir, "data_{0}_{1}.npy".format(now, _types)), \ self.dataset[_types]) # Image. # saveScn = os.path.join(saveDataDir, "{}_screenshot.png".format(now)) # QPixmap.grabWindow(self.winId()).save(saveScn, 'png') # Status. status = { "save_datetime": now_save, "Run": self.label_run_number.text(), "StartTag": self.label_tag_start.text(), "CurrentTag": self.label_tag_end.text() } with open(os.path.join(saveDataDir, "{}_status.json".format(now)), "w") as ff: json.dump(status, ff) @footprint @pyqtSlot() def clearData(self): self.saveData() self.initData() ######################## GetDataProcess ######################## @footprint def initGetDataProcess(self): self._timer_getData = QTimer() self._timer_getData.setInterval(int(self._get_data_interval * 1000)) self.stopTimer = False self._thread_getData = QThread() self._worker_getData = GetDataWorker3(port=self._get_data_ports, port_info=self._get_info_port) self._worker_getData.sleepInterval = self._get_data_worker_sleep_interval # Start. self._timer_getData.timeout.connect(self.startGettingDataThread) self._thread_getData.started.connect(self._worker_getData.process) self._worker_getData.do_something.connect(self.updateData) # Finish. self._worker_getData.finished.connect(self._thread_getData.quit) self._thread_getData.finished.connect(self.checkIsTimerStopped) # Move. self._worker_getData.moveToThread(self._thread_getData) @footprint @pyqtSlot() def startGettingDataThread(self): if not self._thread_getData.isRunning(): print("start thread by timer.") self._thread_getData.start() else: print("Thread is running.") @footprint @pyqtSlot(object) def updateData(self, obj): if self._isUpdatingImage is False: # In case. if obj is not None: for key in self.dataset.keys(): if self.dataset.get(key) is None and obj.get( key) is not None: self.dataset[key] = obj.get(key).copy() elif obj.get(key) is not None: self.dataset[key] += obj.get(key).copy() currentRun = obj.get("currentRun") self.label_run_number.setText(str(currentRun)) if self.nbr_of_sig == 0: self.label_tag_start.setText(str(obj.get("startTag"))) self.label_tag_end.setText(str(obj.get("endTag"))) self.nbr_of_sig += obj.get("nbr_sig_wl") + obj.get( "nbr_sig_wol") self.nbr_of_bg += obj.get("nbr_bg_wl") + obj.get("nbr_bg_wol") self.label_nbr_of_sig.setText(str(self.nbr_of_sig)) self.label_nbr_of_bg.setText(str(self.nbr_of_bg)) if self.currentRun != -1 and currentRun != self.currentRun: self.saveData() self.initData() self.currentRun = currentRun @footprint @pyqtSlot() def checkIsTimerStopped(self): if self.stopTimer: self._timer_getData.stop() self._timer_updImage.stop() print("timer stopped.") for listener in self._worker_getData.listeners.values(): listener.Close() self._worker_getData.listener_info.Close() self.stopTimer = False self.brun.setEnabled(True) self.brun.setText("Start") # self.spinbox_upd_img_interval.setEnabled(True) ######################## updateImageProcess ######################## @footprint def initUpdateImageProcess(self): self._timer_updImage = QTimer() self._timer_updImage.setInterval( int(self._update_image_interval * 1000)) self._timer_updImage.timeout.connect(self.updateImage) @footprint def updateImage(self): self._isUpdatingImage = True try: with QMutexLocker(self._mutex): sig_wl = self.dataset.get("sig_wl", None) sig_wol = self.dataset.get("sig_wol", None) bg_wl = self.dataset.get("bg_wl", None) bg_wol = self.dataset.get("bg_wol", None) if self.sig is None or self.bg is None: self.sig = sig_wl + sig_wol self.bg = bg_wl + bg_wol else: self.sig += sig_wl + sig_wol self.bg += bg_wl + bg_wol # print(self.sig.dtype) # buff1 = self.sig / float(self.nbr_of_sig) self.pw1.data = self.sig / float(self.nbr_of_sig) # buff1 = self.bg / float(self.nbr_of_bg) self.pw2.data = self.bg / float(self.nbr_of_bg) self.pw3.data = self.pw1.data - self.pw2.data # self.pw4.data = bg_wol # if sig_wl is not None and sig_wol is not None: # self.pw3.data = sig_wl - sig_wol for window in self._windows: if not window.is_closed: window.data = sig_wl except Exception as ex: print(ex) self._isUpdatingImage = False if self.sig is not None and self.bg is not None: self.pw1.updateImage() self.pw2.updateImage() self.pw3.updateImage() # self.pw4.updateImage() ######################## CheckWindowProcess ######################## @footprint def initCheckWindowProcess(self): """ Initialize checkWindow process. """ self._timer_checkWindow = QTimer() self._timer_checkWindow.setInterval( int(self._check_window_interval * 1000)) self._timer_checkWindow.timeout.connect(self.checkWindow) self._timer_checkWindow.start() # @footprint @pyqtSlot() def checkWindow(self): """ Check whether windows are active. """ # print(len(self._windows)) N = len(self._windows) * 1 for ii in range(N): if self._windows[N - ii - 1].is_closed: del self._windows[N - ii - 1] # @footprint # @pyqtSlot() # def finishWorker(self): # pass ######################## Closing processes ######################## @footprint def closeEvent(self, event): if self._thread_getData.isRunning(): string = "Some threads are still running.\n" string += "Please wait for their finishing." confirmObject = QMessageBox.warning(self, "Closing is ignored.", string, QMessageBox.Ok) event.ignore() return if self._closing_dialog: confirmObject = QMessageBox.question( self, "Closing...", "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if confirmObject == QMessageBox.Yes: self.makeConfig() with open( os.path.join(os.path.dirname(__file__), "config.json"), "w") as ff: json.dump(self.config, ff) self.stopAllTimers() self.saveData() event.accept() else: event.ignore() else: self.makeConfig() with open(os.path.join(os.path.dirname(__file__), "config.json"), "w") as ff: json.dump(self.config, ff, indent=4) self.saveData() self.stopAllTimers() @footprint def stopAllTimers(self): if self._timer_getData.isActive(): self._timer_getData.stop() if self._timer_updImage.isActive(): self._timer_updImage.stop() if self._timer_checkWindow.isActive(): self._timer_checkWindow.stop() @footprint def makeConfig(self): """ Make a config dict object to save the latest configration in. """ self.config = OrderedDict([ ("online", self._online), ("closing_dialog", self._closing_dialog), ("currentDir", self._currentDir), ("emulate", self._emulate), ("font_size_button", self._font_size_button), ("font_size_label", self._font_size_label), ("font_size_groupbox_title", self._font_size_groupbox_title) ])
def initGui(self): """ Initialize the GUI. """ self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.initMainWidget() self.setMenuBar() self.setWindowTitle("VMI Viewer") self.resize(self._init_window_width, self._init_window_height) ### RunInfo. group_runinfo = QGroupBox(self) group_runinfo.setTitle("RunInfo") font = group_runinfo.font() font.setPointSize(self._font_size_groupbox_title) group_runinfo.setFont(font) group_runinfo.resize(400, 100) grid_runinfo = QGridLayout(group_runinfo) # Run No. label_run = QLabel(self) label_run.setText("Run No. : ") label_run.setAlignment(Qt.AlignRight) font = label_run.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_run.setFont(font) self.label_run_number = QLabel(self) self.label_run_number.setText("Unknown") pal = QPalette() pal.setColor(QPalette.Foreground, QColor("#0B5345")) self.label_run_number.setPalette(pal) font = self.label_run_number.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_run_number.setFont(font) # Tag No. label_tag = QLabel(self) label_tag.setText("Tag No. : ") label_tag.setAlignment(Qt.AlignRight) font = label_tag.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_tag.setFont(font) self.label_tag_start = QLabel(self) self.label_tag_start.setText("None") font = self.label_tag_start.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_tag_start.setFont(font) label_tag_hyphen = QLabel(self) label_tag_hyphen.setText(" - ") label_tag_hyphen.setFixedWidth(30) font = label_tag_hyphen.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_tag_hyphen.setFont(font) self.label_tag_end = QLabel(self) self.label_tag_end.setText("None") font = self.label_tag_end.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_tag_end.setFont(font) # Sig / BG. label_sig = QLabel(self) label_sig.setText("# of Sig : ") label_sig.setAlignment(Qt.AlignRight) font = label_sig.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_sig.setFont(font) self.label_nbr_of_sig = QLabel(self) self.label_nbr_of_sig.setText("None") font = self.label_nbr_of_sig.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_nbr_of_sig.setFont(font) label_bg = QLabel(self) label_bg.setText("# of BG : ") label_bg.setAlignment(Qt.AlignRight) font = label_bg.font() font.setPointSize(self._font_size_label) font.setBold(self._font_bold_label) label_bg.setFont(font) self.label_nbr_of_bg = QLabel(self) self.label_nbr_of_bg.setText("None") font = self.label_nbr_of_bg.font() font.setBold(True) font.setPointSize(self._font_size_label) self.label_nbr_of_bg.setFont(font) # Construct the layout. grid_runinfo.addWidget(label_run, 0, 0) grid_runinfo.addWidget(self.label_run_number, 0, 1, 1, 3) grid_runinfo.addWidget(label_tag, 1, 0) grid_runinfo.addWidget(self.label_tag_start, 1, 1) grid_runinfo.addWidget(label_tag_hyphen, 1, 2) grid_runinfo.addWidget(self.label_tag_end, 1, 3) grid_runinfo.addWidget(label_sig, 2, 0) grid_runinfo.addWidget(self.label_nbr_of_sig, 2, 1) grid_runinfo.addWidget(label_bg, 2, 2) grid_runinfo.addWidget(self.label_nbr_of_bg, 2, 3) ### Settings. # group_settings = QGroupBox(self) # group_settings.setTitle("Settings") # font = group_settings.font() # font.setPointSize(self._font_size_groupbox_title) # group_settings.setFont(font) # group_settings.resize(400, 100) # grid_settings = QGridLayout(group_settings) # # Update interval. # label_upd_rate = QLabel(self) # label_upd_rate.setText("Upd. image interval: ") # font = label_upd_rate.font() # font.setPointSize(self._font_size_label) # font.setBold(self._font_bold_label) # label_upd_rate.setFont(font) # self.spinbox_upd_img_interval = QDoubleSpinBox(self) # self.spinbox_upd_img_interval.setValue(self._get_data_interval) # self.spinbox_upd_img_interval.setFixedWidth(100) # self.spinbox_upd_img_interval.setAlignment(Qt.AlignRight) # font = self.spinbox_upd_img_interval.font() # font.setBold(True) # font.setPointSize(self._font_size_label) # self.spinbox_upd_img_interval.setFont(font) # label_upd_rate_unit = QLabel(self) # label_upd_rate_unit.setText("sec") # font = label_upd_rate_unit.font() # font.setPointSize(self._font_size_label) # font.setBold(self._font_bold_label) # label_upd_rate_unit.setFont(font) # Construct the layout. # grid_settings.addWidget(label_upd_rate, 0, 0, 1, 3) # grid_settings.addWidget(self.spinbox_upd_img_interval, 0, 3) # grid_settings.addWidget(label_upd_rate_unit, 0, 4) ### Function buttons. group_func = QGroupBox(self) group_func.setTitle("Function") font = group_func.font() font.setPointSize(self._font_size_groupbox_title) group_func.setFont(font) group_func.resize(400, 100) grid_func = QGridLayout(group_func) grid_func.setSpacing(10) # Start/Stop main process button. self.brun = QPushButton(group_func) self.brun.setText("Start") font = self.brun.font() font.setPointSize(self._font_size_button) self.brun.setFont(font) self.brun.resize(400, 50) self.brun.setStyleSheet("background-color:{};".format( self._init_button_color)) self.brun.clicked.connect(self.runMainProcess) # Clear data button. bclear = QPushButton(group_func) bclear.setText("Clear") font = bclear.font() font.setPointSize(self._font_size_button) bclear.setFont(font) bclear.resize(400, 50) bclear.setStyleSheet("background-color:{};".format( self._init_button_color)) bclear.clicked.connect(self.clearData) # Save images button. bsave = QPushButton(group_func) bsave.setText("Save") font = bsave.font() font.setPointSize(self._font_size_button) bsave.setFont(font) bsave.resize(400, 50) bsave.setStyleSheet("background-color:{};".format( self._init_button_color)) bsave.clicked.connect(self.saveData) # New window button. bwindow = QPushButton(group_func) bwindow.setText("Window") font = bwindow.font() font.setPointSize(self._font_size_button) bwindow.setFont(font) bwindow.resize(400, 50) bwindow.setStyleSheet("background-color:{};".format( self._init_button_color)) bwindow.clicked.connect(self.showWindow) # Construct the layout of RunInfo groupbox. grid_func.addWidget(self.brun, 0, 0) grid_func.addWidget(bclear, 0, 1) grid_func.addWidget(bsave, 1, 0) grid_func.addWidget(bwindow, 1, 1) ### Plotting area. grp1 = QGroupBox(self) # grp1.setTitle("SIG WL") grp1.setTitle("SIG") font = grp1.font() font.setPointSize(self._font_size_groupbox_title) grp1.setFont(font) gp1 = QGridLayout(grp1) gp1.setSpacing(10) grp2 = QGroupBox(self) # grp2.setTitle("SIG WOL") grp2.setTitle("BG") font = grp2.font() font.setPointSize(self._font_size_groupbox_title) grp2.setFont(font) gp2 = QGridLayout(grp2) gp2.setSpacing(10) grp3 = QGroupBox(self) # grp3.setTitle("BG WL") grp3.setTitle("SIg - BG") font = grp3.font() font.setPointSize(self._font_size_groupbox_title) grp3.setFont(font) gp3 = QGridLayout(grp3) gp3.setSpacing(10) # grp4 = QGroupBox(self) # grp4.setTitle("BG WOL") # font = grp4.font() # font.setPointSize(self._font_size_groupbox_title) # grp4.setFont(font) # gp4 = QGridLayout(grp4) # gp4.setSpacing(10) kwargs = dict(px=False, py=False, ph=False, bp=False) self.pw1 = PlotWindow(self, **kwargs) self.pw2 = PlotWindow(self, **kwargs) self.pw3 = PlotWindow(self, **kwargs) # self.pw4 = PlotWindow(self, **kwargs) gp1.addWidget(self.pw1, 0, 0) gp2.addWidget(self.pw2, 0, 0) gp3.addWidget(self.pw3, 0, 0) # gp4.addWidget(self.pw4, 0, 0) ### Construct the layout. self.grid.addWidget(group_runinfo, 0, 0) # self.grid.addWidget(group_settings, 0, 1) self.grid.addWidget(group_func, 0, 1) self.grid.addWidget(grp1, 1, 0, 2, 1) self.grid.addWidget(grp2, 1, 1, 2, 1) self.grid.addWidget(grp3, 1, 2, 2, 1) # self.grid.addWidget(grp4, 1, 3, 2, 1) self.main_widget.setFocus() self.setCentralWidget(self.main_widget)
class CompileWidget(QWidget): progress = pyqtSignal(int) def __init__(self, parent=None): QWidget.__init__(self, parent) self._options = None self._conf = None self._go = QPushButton('Go') self._go.setMaximumWidth(100) font = self._go.font() font.setPointSizeF(font.pointSizeF() * 2.0) font.setWeight(QFont.Bold) self._go.setFont(font) self._go.clicked.connect(self.go) self._saveLog = QPushButton('Save') saveLogLabel = QLabel('Log File:') saveLogBrowse = QPushButton('&Browse') saveLogBrowse.clicked.connect(self.browseSaveLog) self._saveLogEdit = QLineEdit('') gLayout = QGridLayout() gLayout.addWidget(saveLogLabel, 0, 0, 1, 1, Qt.AlignRight) gLayout.addWidget(self._saveLogEdit, 0, 1, 1, 6) gLayout.addWidget(saveLogBrowse, 0, 7, 1, 1) self._console = QTextEdit() self._console.setLineWrapMode(QTextEdit.NoWrap) self._console.setMinimumSize(800, 400) palette = self._console.palette() palette.setColor(QPalette.Base, QColor.fromRgb(255, 255, 221)) # ffffdd. self._console.setPalette(palette) font = QFont('Bitstream Vera Sans Mono', self._console.font().pointSize()) self._console.setFont(font) self._highlighter = Highlighter(self._console.document()) self._progressBar = QProgressBar() self._progressBar.setRange(0, 100) self._progressBar.setTextVisible(True) hLayout = QHBoxLayout() hLayout.addStretch() hLayout.addWidget(self._go) hLayout.addStretch() hLayout.addWidget(self._saveLog) hLayout.addStretch() vLayout = QVBoxLayout() vLayout.addLayout(hLayout) vLayout.addLayout(gLayout) vLayout.addWidget(self._progressBar) vLayout.addWidget(self._console) self.setLayout(vLayout) self.progress.connect(self._progressBar.setValue) self._saveLog.clicked.connect(self.saveLog) self.readSettings() return def _setOptions(self, options): self._options = options def _setConf(self, conf): self._conf = conf def _getOptions(self): return self._options def _getConf(self): return self._conf options = property(_getOptions, _setOptions) conf = property(_getConf, _setConf) def browseSaveLog(self): self._saveLogEdit.setText( QFileDialog.getSaveFileName(self, 'Select Log File Report', self._saveLogEdit.text(), 'Report Files (*.log *.txt)')) return def saveLog(self): if self._saveLogEdit.text(): fd = open(self._saveLogEdit.text(), 'w+') fd.write(self._console.toPlainText()) fd.close() return def shellCommand(self): command = [self.conf.bootstrapDir + '/ccb.py'] for project in self.options.projects: for tool in project.actives: command += ['--tool=' + tool] toolsCount = len(command) - 1 if self.conf.rootDir: command += ['--root=%s' % self.conf.rootDir] #if self.options.svnUpdate: command += [ '--svn-update' ] #if self.options.svnStatus: command += [ '--svn-update' ] if self.options.enableDoc: command += ['--doc'] if self.options.devtoolset2: command += ['--devtoolset-2'] if self.options.qt5: command += ['--qt5'] if self.options.noCache: command += ['--no-cache'] if self.options.rmBuild: command += ['--rm-build'] if self.options.verbose: command += ['--verbose'] if self.options.make: makeArguments = 'install ' + self.options.threads command += ['--make=%s' % makeArguments] if self.options.buildMode == 'Debug': command += ['--debug'] return toolsCount, command def go(self): rePercentage = re.compile(r'^\[\s*(?P<percent>\d+)%\].*') reProcessTool = re.compile(r'^Processing tool:\s*"(?P<tool>.+)"') if not self.options or not self.conf: return toolsCount, command = self.shellCommand() if not toolsCount: return self._progressBar.reset() self._progressBar.setRange(0, toolsCount * 100) strCommand = command[0] for arg in command[1:]: strCommand += ' ' + arg strCommand += '\n\n' self._console.setFontItalic(True) self._console.insertPlainText(strCommand) self._console.setFontItalic(False) toolsDone = -1 builderProcess = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while True: line = builderProcess.stdout.readline() if line == '': break m = rePercentage.match(line) if m: self.progress.emit(toolsDone * 100 + int(m.group('percent'))) else: m = reProcessTool.match(line) if m: toolsDone += 1 self._console.insertPlainText(line) scrollBar = self._console.verticalScrollBar() scrollBar.setValue(scrollBar.maximum()) QApplication.processEvents() builderProcess.wait() if builderProcess.returncode == None: pass return def readSettings(self): settings = QSettings() self._saveLogEdit.setText(settings.value('compile/saveLog').toString()) return def saveSettings(self): settings = QSettings() settings.setValue('compile/saveLog', self._saveLogEdit.text()) return
def __init__(self, parent=None): super(LayerSelectionPage, self).__init__(parent) self.parent = parent #convenience link self.confconn_link = self.parent.parent.confconn #flag top prevent read read action on keyword delete. New logic makes this redundant #self.keywordbypass = False QToolTip.setFont(QFont('SansSerif', 10)) #label filterlabel = QLabel('Filter') availablelabel = QLabel('Available Layers') selectionlabel = QLabel('Layer Selections') keywordlabel = QLabel('Keyword') explainlabel = QLabel( "Edit Group assignments using this dialog or to simply initialise the Layer-Config just click 'Finish'" ) #selection buttons chooseallbutton = QPushButton('>>') chooseallbutton.setFixedWidth(self.XFER_BW) chooseallbutton.clicked.connect(self.doChooseAllClickAction) choosebutton = QPushButton('>') choosebutton.setFixedWidth(self.XFER_BW) choosebutton.clicked.connect(self.doChooseClickAction) rejectbutton = QPushButton('<') rejectbutton.setFixedWidth(self.XFER_BW) rejectbutton.clicked.connect(self.doRejectClickAction) rejectallbutton = QPushButton('<<') rejectallbutton.setFixedWidth(self.XFER_BW) rejectallbutton.clicked.connect(self.doRejectAllClickAction) #operation buttons finishbutton = QPushButton('Finish') finishbutton.setToolTip('Finish and Close layer selection dialog') finishbutton.clicked.connect(self.parent.close) resetbutton = QPushButton('Reset') resetbutton.font() resetbutton.setToolTip( 'Read Layer from LDS GetCapabilities request. Overwrites current Layer Config' ) resetbutton.clicked.connect(self.doResetClickAction) self.available_sfpm = LDSSFPAvailableModel(self) self.selection_sfpm = LDSSFPSelectionModel(self) self.available_sfpm.setSourceModel(self.parent.available_model) self.selection_sfpm.setSourceModel(self.parent.selection_model) #textedits filteredit = QLineEdit('') filteredit.setToolTip( 'Filter Available-Layers pane (filter operates across Name and Title fields and accepts Regex expressions)' ) filteredit.textChanged.connect(self.available_sfpm.setActiveFilter) self.keywordcombo = QComboBox() self.keywordcombo.setToolTip( 'Select or Add a unique identifier to be saved in layer config (keyword)' ) self.keywordcombo.addItems(list(self.confconn_link.assigned)) self.keywordcombo.setEditable(True) self.keywordcombo.activated.connect(self.doKeyComboChangeAction) lgindex = self.confconn_link.getLayerGroupIndex( self.confconn_link.lgval, col=1) lgentry = self.confconn_link.lglist[lgindex] if LU.assessNone( lgindex) else None #keywordedit = self.keywordcombo.lineEdit().text().toUtf8().data().decode('utf8')# for writing #if no entry or layer indicated then blank self.keywordcombo.lineEdit().setText( '' if lgentry is None or lgentry[0] == LORG.LAYER else lgentry[1]) #self.confconn_link.lgval)#TODO. group only #header headmodel = QStandardItemModel() headmodel.setHorizontalHeaderLabels([ i[2] for i in self.colparams ][:self.parent.available_model.columnCount()]) headview1 = QHeaderView(Qt.Horizontal) headview1.setModel(headmodel) headview1.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) headview2 = QHeaderView(Qt.Horizontal) headview2.setModel(headmodel) headview2.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) #table self.available = QTableView() self.available.setSelectionBehavior(QAbstractItemView.SelectRows) self.available.setSelectionMode(QAbstractItemView.MultiSelection) self.selection = QTableView() self.selection.setSelectionBehavior(QAbstractItemView.SelectRows) self.selection.setSelectionMode(QAbstractItemView.MultiSelection) #interesting, must set model after selection attributes but before headers else row selections/headers don't work properly self.available.setModel(self.available_sfpm) self.selection.setModel(self.selection_sfpm) self.available.setSortingEnabled(True) self.available.setHorizontalHeader(headview1) self.selection.setSortingEnabled(True) self.selection.setHorizontalHeader(headview2) for cp in self.colparams: self.available.setColumnWidth(cp[0], cp[1]) self.selection.setColumnWidth(cp[0], cp[1]) self.available.verticalHeader().setVisible(False) self.available.horizontalHeader().setVisible(True) self.selection.verticalHeader().setVisible(False) self.selection.horizontalHeader().setVisible(True) #layout vbox00 = QVBoxLayout() vbox00.addWidget(availablelabel) vbox00.addWidget(self.available) vbox01 = QVBoxLayout() vbox01.addWidget(chooseallbutton) vbox01.addWidget(choosebutton) vbox01.addWidget(rejectbutton) vbox01.addWidget(rejectallbutton) vbox02 = QVBoxLayout() vbox02.addWidget(selectionlabel) vbox02.addWidget(self.selection) vbox10 = QVBoxLayout() vbox10.addWidget(filterlabel) vbox10.addWidget(filteredit) hbox12 = QHBoxLayout() hbox12.addWidget(keywordlabel) hbox12.addStretch(1) #hbox12.addWidget(inspbutton) #hbox12.addWidget(addbutton) #hbox12.addWidget(delbutton) vbox12 = QVBoxLayout() vbox12.addLayout(hbox12) vbox12.addWidget(self.keywordcombo) #00|01|02 #10|11|12 grid0 = QGridLayout() grid0.addLayout(vbox00, 1, 0) grid0.addLayout(vbox01, 1, 1) grid0.addLayout(vbox02, 1, 2) grid0.addLayout(vbox10, 0, 0) grid0.addLayout(vbox12, 0, 2) hbox2 = QHBoxLayout() hbox2.addWidget(resetbutton) hbox2.addStretch(1) hbox2.addWidget(explainlabel) hbox2.addWidget(finishbutton) #gbox1.setLayout(hbox2) vbox3 = QVBoxLayout() vbox3.addLayout(grid0) #vbox3.addLayout(hbox3) #vbox3.addWidget(line0) vbox3.addLayout(hbox2) self.setLayout(vbox3)
class OutsideChangeWidget(QFrame): " Frameless dialogue to deal with outside changes " reloadRequest = pyqtSignal() reloadAllNonModifiedRequest = pyqtSignal() def __init__(self, parent): QFrame.__init__(self, parent) # Make the frame nice looking panelColor = QColor(170, 17, 17) palette = self.palette() palette.setColor(self.backgroundRole(), panelColor) self.setPalette(palette) self.setFrameShape(QFrame.StyledPanel) self.setLineWidth(2) self.setAutoFillBackground(True) # Keep pylint happy self.__messageLabel = None self.__leaveAsIsButton = None self.__reloadButton = None self.__reloadAllNonChangedButton = None self.__markers = [] self.__createLayout() for item in self.__markers: item.hide() return def __createLayout(self): " Creates the widget layout " self.__messageLabel = QLabel("This file has been modified " "outside of codimension. What " "would you like to do?") self.__messageLabel.setWordWrap(True) self.__messageLabel.setAlignment(Qt.AlignHCenter) palette = self.__messageLabel.palette() palette.setColor(self.foregroundRole(), QColor(255, 255, 255, 255)) self.__messageLabel.setPalette(palette) self.__leaveAsIsButton = QPushButton("Continue editing", self) self.__leaveAsIsButton.setToolTip("ESC") self.__leaveAsIsButton.clicked.connect(self.hide) self.__reloadButton = QPushButton(self) self.__reloadButton.clicked.connect(self.__reload) txt = "Reload all non-modified buffers" self.__reloadAllNonChangedButton = QPushButton(txt, self) self.__reloadAllNonChangedButton.clicked.connect( self.__reloadAllNonModified) # This will prevent the buttons growing wider than necessary fontMetrics = QFontMetrics(self.__reloadAllNonChangedButton.font()) buttonWidth = fontMetrics.width(txt) + 20 self.__reloadAllNonChangedButton.setFixedWidth(buttonWidth) gridLayout = QGridLayout(self) gridLayout.setMargin(3) gridLayout.addWidget(self.__messageLabel, 0, 0, 1, 1) gridLayout.addWidget(self.__leaveAsIsButton, 0, 1, 1, 1) gridLayout.addWidget(self.__reloadButton, 1, 1, 1, 1) gridLayout.addWidget(self.__reloadAllNonChangedButton, 2, 1, 1, 1) self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.move(5, 5) self.__markers.append(QFrame(self.parent())) self.__markers.append(QFrame(self.parent())) self.__markers.append(QFrame(self.parent())) self.__markers.append(QFrame(self.parent())) markerColor = QColor(224, 0, 0, 255) for item in self.__markers: pal = item.palette() pal.setColor(item.backgroundRole(), markerColor) item.setPalette(pal) item.setFrameShape(QFrame.StyledPanel) item.setLineWidth(1) item.setAutoFillBackground(True) item.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) return def resize(self): " Resizes the dialogue to match the editor size " vscroll = self.parent().verticalScrollBar() if vscroll.isVisible(): scrollWidth = vscroll.width() else: scrollWidth = 0 hscroll = self.parent().horizontalScrollBar() if hscroll.isVisible(): scrollHeight = hscroll.height() else: scrollHeight = 0 # Dialogue width = self.parent().width() height = self.parent().height() widgetWidth = width - scrollWidth - 10 - 1 self.setFixedWidth(widgetWidth) # Marker self.__markers[0].move(1, 1) self.__markers[0].setFixedWidth(width - scrollWidth - 4) self.__markers[0].setFixedHeight(3) self.__markers[1].move(width - scrollWidth - 5, 1) self.__markers[1].setFixedWidth(3) self.__markers[1].setFixedHeight(height - scrollHeight - 4) self.__markers[2].move(1, height - scrollHeight - 5) self.__markers[2].setFixedWidth(width - scrollWidth - 4) self.__markers[2].setFixedHeight(3) self.__markers[3].move(1, 1) self.__markers[3].setFixedWidth(3) self.__markers[3].setFixedHeight(height - scrollHeight - 4) return def showChoice(self, modified, allEnabled): " Brings up the panel with the correct text and buttons " if modified: self.__reloadButton.setText("Reload losing changes") else: self.__reloadButton.setText("Reload") self.__reloadAllNonChangedButton.setEnabled(allEnabled) QApplication.processEvents(QEventLoop.ExcludeUserInputEvents) self.resize() self.show() for item in self.__markers: item.show() self.__leaveAsIsButton.setFocus() self.parent().setReadOnly(True) return def setFocus(self): " Passes the focus to the default button " self.__leaveAsIsButton.setFocus() return def keyPressEvent(self, event): " Handles the key press events " if event.key() == Qt.Key_Escape: editorsManager = GlobalData().mainWindow.editorsManager() activeWindow = editorsManager.currentWidget() if activeWindow: activeWindow.setFocus() event.accept() self.hide() return def hide(self): " Handles the hiding of the panel and markers " for item in self.__markers: item.hide() QFrame.hide(self) self.parent().setReadOnly(False) self.parent().setFocus() return def __reload(self): " Reloads the file from the disk " self.reloadRequest.emit() return def __reloadAllNonModified(self): " Reloads all the non-modified buffers " self.reloadAllNonModifiedRequest.emit() return
class OutsideChangeWidget( QFrame ): " Frameless dialogue to deal with outside changes " reloadRequest = pyqtSignal() reloadAllNonModifiedRequest = pyqtSignal() def __init__( self, parent ): QFrame.__init__( self, parent ) # Make the frame nice looking panelColor = QColor( 170, 17, 17 ) palette = self.palette() palette.setColor( self.backgroundRole(), panelColor ) self.setPalette( palette ) self.setFrameShape( QFrame.StyledPanel ) self.setLineWidth( 2 ) self.setAutoFillBackground( True ) # Keep pylint happy self.__messageLabel = None self.__leaveAsIsButton = None self.__reloadButton = None self.__reloadAllNonChangedButton = None self.__markers = [] self.__createLayout() for item in self.__markers: item.hide() return def __createLayout( self ): " Creates the widget layout " self.__messageLabel = QLabel( "This file has been modified " "outside of codimension. What " "would you like to do?" ) self.__messageLabel.setWordWrap( True ) self.__messageLabel.setAlignment( Qt.AlignHCenter ) palette = self.__messageLabel.palette() palette.setColor( self.foregroundRole(), QColor( 255, 255, 255, 255 ) ) self.__messageLabel.setPalette( palette ) self.__leaveAsIsButton = QPushButton( "Continue editing", self ) self.__leaveAsIsButton.setToolTip( "ESC" ) self.__leaveAsIsButton.clicked.connect( self.hide ) self.__reloadButton = QPushButton( self ) self.__reloadButton.clicked.connect( self.__reload ) txt = "Reload all non-modified buffers" self.__reloadAllNonChangedButton = QPushButton( txt, self ) self.__reloadAllNonChangedButton.clicked.connect( self.__reloadAllNonModified ) # This will prevent the buttons growing wider than necessary fontMetrics = QFontMetrics( self.__reloadAllNonChangedButton.font() ) buttonWidth = fontMetrics.width( txt ) + 20 self.__reloadAllNonChangedButton.setFixedWidth( buttonWidth ) gridLayout = QGridLayout( self ) gridLayout.setMargin( 3 ) gridLayout.addWidget( self.__messageLabel, 0, 0, 1, 1 ) gridLayout.addWidget( self.__leaveAsIsButton, 0, 1, 1, 1 ) gridLayout.addWidget( self.__reloadButton, 1, 1, 1, 1 ) gridLayout.addWidget( self.__reloadAllNonChangedButton, 2, 1, 1, 1 ) self.setSizePolicy( QSizePolicy.Fixed, QSizePolicy.Fixed ) self.move( 5, 5 ) self.__markers.append( QFrame( self.parent() ) ) self.__markers.append( QFrame( self.parent() ) ) self.__markers.append( QFrame( self.parent() ) ) self.__markers.append( QFrame( self.parent() ) ) markerColor = QColor( 224, 0, 0, 255 ) for item in self.__markers: pal = item.palette() pal.setColor( item.backgroundRole(), markerColor ) item.setPalette( pal ) item.setFrameShape( QFrame.StyledPanel ) item.setLineWidth( 1 ) item.setAutoFillBackground( True ) item.setSizePolicy( QSizePolicy.Fixed, QSizePolicy.Fixed ) return def resize( self ): " Resizes the dialogue to match the editor size " vscroll = self.parent().verticalScrollBar() if vscroll.isVisible(): scrollWidth = vscroll.width() else: scrollWidth = 0 hscroll = self.parent().horizontalScrollBar() if hscroll.isVisible(): scrollHeight = hscroll.height() else: scrollHeight = 0 # Dialogue width = self.parent().width() height = self.parent().height() widgetWidth = width - scrollWidth - 10 - 1 self.setFixedWidth( widgetWidth ) # Marker self.__markers[ 0 ].move( 1, 1 ) self.__markers[ 0 ].setFixedWidth( width - scrollWidth - 4 ) self.__markers[ 0 ].setFixedHeight( 3 ) self.__markers[ 1 ].move( width - scrollWidth - 5, 1 ) self.__markers[ 1 ].setFixedWidth( 3 ) self.__markers[ 1 ].setFixedHeight( height - scrollHeight - 4 ) self.__markers[ 2 ].move( 1, height - scrollHeight - 5 ) self.__markers[ 2 ].setFixedWidth( width - scrollWidth - 4 ) self.__markers[ 2 ].setFixedHeight( 3 ) self.__markers[ 3 ].move( 1, 1 ) self.__markers[ 3 ].setFixedWidth( 3 ) self.__markers[ 3 ].setFixedHeight( height - scrollHeight - 4 ) return def showChoice( self, modified, allEnabled ): " Brings up the panel with the correct text and buttons " if modified: self.__reloadButton.setText( "Reload losing changes" ) else: self.__reloadButton.setText( "Reload" ) self.__reloadAllNonChangedButton.setEnabled( allEnabled ) QApplication.processEvents( QEventLoop.ExcludeUserInputEvents ) self.resize() self.show() for item in self.__markers: item.show() self.__leaveAsIsButton.setFocus() self.parent().setReadOnly( True ) return def setFocus( self ): " Passes the focus to the default button " self.__leaveAsIsButton.setFocus() return def keyPressEvent( self, event ): " Handles the key press events " if event.key() == Qt.Key_Escape: editorsManager = GlobalData().mainWindow.editorsManager() activeWindow = editorsManager.currentWidget() if activeWindow: activeWindow.setFocus() event.accept() self.hide() return def hide( self ): " Handles the hiding of the panel and markers " for item in self.__markers: item.hide() QFrame.hide( self ) self.parent().setReadOnly( False ) self.parent().setFocus() return def __reload( self ): " Reloads the file from the disk " self.reloadRequest.emit() return def __reloadAllNonModified( self ): " Reloads all the non-modified buffers " self.reloadAllNonModifiedRequest.emit() return