def test_text(pixmap_differ: PixmapDiffer): actual: QPainter expected: QPainter with pixmap_differ.create_painters( 300, 240, 'scaled_radio_button_text') as (actual, expected): ex_widget = QWidget() ex_layout = QVBoxLayout(ex_widget) ex_radio1 = QRadioButton('Lorem ipsum') ex_radio2 = QRadioButton('Lorem ipsum') ex_font = ex_radio1.font() if ex_font.family() == 'Sans Serif': # Fonts are different on Travis CI. big_font_size = 26 small_font_size = 25 ex_radio1.setStyleSheet('QRadioButton::indicator {width: 26} ' 'QRadioButton {spacing: 13}') ex_radio2.setStyleSheet('QRadioButton::indicator {width: 25} ' 'QRadioButton {spacing: 12}') else: big_font_size = 29 small_font_size = 28 ex_radio1.setStyleSheet('QRadioButton::indicator {width: 29} ' 'QRadioButton {spacing: 14}') ex_radio2.setStyleSheet('QRadioButton::indicator {width: 28} ' 'QRadioButton {spacing: 14}') ex_font.setPointSize(big_font_size) ex_radio1.setFont(ex_font) ex_font.setPointSize(small_font_size) ex_radio2.setFont(ex_font) ex_size_policy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) ex_radio1.setSizePolicy(ex_size_policy) ex_radio2.setSizePolicy(ex_size_policy) ex_layout.addWidget(ex_radio1) ex_layout.addWidget(ex_radio2) ex_layout.setStretch(0, 4) ex_layout.setStretch(1, 1) ex_widget.resize(300, 240) expected.drawPixmap(0, 0, ex_widget.grab()) widget = QWidget() layout = QVBoxLayout(widget) radio1 = ScaledRadioButton('Lorem ipsum') radio2 = ScaledRadioButton('Lorem ipsum') size_policy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) radio1.setSizePolicy(size_policy) radio2.setSizePolicy(size_policy) layout.addWidget(radio1) layout.addWidget(radio2) layout.setStretch(0, 4) layout.setStretch(1, 1) widget.resize(300, 240) actual.drawPixmap(0, 0, widget.grab())
def test_icon(pixmap_differ: PixmapDiffer): actual: QPainter expected: QPainter with pixmap_differ.create_painters( 300, 240, 'scaled_radio_button_icon') as (actual, expected): display = TicTacToeDisplay() icon = display.player1_icon display.close() ex_widget = QWidget() ex_layout = QVBoxLayout(ex_widget) ex_radio1 = QRadioButton() ex_radio2 = QRadioButton('Lorem ipsum') ex_radio1.setIcon(icon) ex_radio2.setIcon(icon) ex_font = ex_radio1.font() if ex_font.family() == 'Sans Serif': # Fonts are different on Travis CI. big_font_size = 93 small_font_size = 22 ex_radio1.setStyleSheet('QRadioButton::indicator {width: 93} ' 'QRadioButton {spacing: 46}') ex_radio2.setStyleSheet('QRadioButton::indicator {width: 22} ' 'QRadioButton {spacing: 11}') else: big_font_size = 93 small_font_size = 25 ex_radio1.setStyleSheet('QRadioButton::indicator {width: 93} ' 'QRadioButton {spacing: 46}') ex_radio2.setStyleSheet('QRadioButton::indicator {width: 25} ' 'QRadioButton {spacing: 12}') ex_radio1.setIconSize( QSize(big_font_size * 3 // 2, big_font_size * 3 // 2)) ex_radio2.setIconSize( QSize(small_font_size * 3 // 2, small_font_size * 3 // 2)) ex_font.setPointSize(big_font_size) ex_radio1.setFont(ex_font) ex_font.setPointSize(small_font_size) ex_radio2.setFont(ex_font) ex_size_policy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) ex_radio1.setSizePolicy(ex_size_policy) ex_radio2.setSizePolicy(ex_size_policy) ex_layout.addWidget(ex_radio1) ex_layout.addWidget(ex_radio2) ex_layout.setStretch(0, 4) ex_layout.setStretch(1, 1) ex_widget.resize(300, 240) expected.drawPixmap(0, 0, ex_widget.grab()) widget = QWidget() layout = QVBoxLayout(widget) radio1 = ScaledRadioButton() radio2 = ScaledRadioButton('Lorem ipsum') radio1.setIcon(icon) radio2.setIcon(icon) size_policy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) radio1.setSizePolicy(size_policy) radio2.setSizePolicy(size_policy) layout.addWidget(radio1) layout.addWidget(radio2) layout.setStretch(0, 4) layout.setStretch(1, 1) widget.resize(300, 240) actual.drawPixmap(0, 0, widget.grab())
class CoreRopeSim(QFrame): def __init__(self, parent, usbif): super().__init__(parent) self._usbif = usbif self._bank_switches = [] self._updating_switches = False self._setup_ui() self._rope_loader = MemoryLoad(usbif, um.WriteSimFixed, 0o100, 1024, self._bank_switches, self._aux_switch) self._rope_loader.finished.connect(self._load_complete) self._rope_dumper = MemoryDump(usbif, um.ReadFixed, um.Fixed, 0o100, 1024, self._bank_switches, self._aux_switch) self._rope_loader.finished.connect(self._dump_complete) def _setup_ui(self): self.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) # Set up our basic layout layout = QGridLayout(self) self.setLayout(layout) layout.setSpacing(1) layout.setMargin(1) for bank in range(0o44): col = bank % 18 row = int(bank / 18) * 2 sw = self._create_bank_switch('%o' % bank, layout, row, col, 1) sw.stateChanged.connect( lambda state, bank=bank: self._update_crs_bank(bank)) self._bank_switches.append(sw) self._aux_switch = self._create_bank_switch('44-77', layout, 5, 0, 2) label = QLabel('CRS', self) font = label.font() font.setPointSize(12) font.setBold(True) label.setFont(font) label.setAlignment(Qt.AlignCenter) layout.addWidget(label, 5, 16, 2, 2, Qt.AlignCenter) b = self._create_button('ALL', layout, 5, 1, 3) b.pressed.connect(lambda: self._set_all(True)) b = self._create_button('NONE', layout, 5, 3, 2) b.pressed.connect(lambda: self._set_all(False)) self._crs_sel = QRadioButton('CRS', self) self._crs_sel.setLayoutDirection(Qt.RightToLeft) layout.addWidget(self._crs_sel, 5, 6, 2, 3) layout.setAlignment(self._crs_sel, Qt.AlignRight) self._agc_sel = QRadioButton('AGC', self) self._agc_sel.setChecked(True) layout.addWidget(self._agc_sel, 5, 8, 2, 3) layout.setAlignment(self._agc_sel, Qt.AlignCenter) font.setPointSize(7) self._crs_sel.setFont(font) self._agc_sel.setFont(font) b = self._create_button('LOAD', layout, 5, 12, 3) b.pressed.connect(self._load_rope) b = self._create_button('DUMP', layout, 5, 14, 2) b.pressed.connect(self._dump_rope) def _update_crs_bank(self, bank): if self._updating_switches: return group = int(bank / 16) first_bank = group * 16 enables = [False] * 16 for i in range(16): bank = first_bank + i if bank < 0o44: sw = self._bank_switches[bank] else: sw = self._aux_switch enables[i] = sw.isChecked() write_crs_enables = getattr(um, 'WriteControlCRSBankEnable%u' % group) self._usbif.send(write_crs_enables(*enables)) def _update_all_banks(self): for bank in [0, 0o20, 0o40, 0o60]: self._update_crs_bank(bank) def _set_all(self, state): self._updating_switches = True for sw in self._bank_switches: sw.setChecked(state) self._updating_switches = False self._update_all_banks() def _create_button(self, name, layout, row, col, width): label = QLabel(name, self) label.setAlignment(Qt.AlignCenter) font = label.font() font.setPointSize(7) font.setBold(True) label.setFont(font) label.setMinimumWidth(30) layout.addWidget(label, row, col, 1, width) layout.setAlignment(label, Qt.AlignCenter) b = QPushButton(self) b.setFixedSize(20, 20) layout.addWidget(b, row + 1, col, 1, width) layout.setAlignment(b, Qt.AlignCenter) return b def _create_bank_switch(self, name, layout, row, col, width): label = QLabel(name, self) label.setAlignment(Qt.AlignBottom | (Qt.AlignLeft if width == 2 else Qt.AlignCenter)) font = label.font() font.setPointSize(7) font.setBold(True) label.setFont(font) layout.addWidget(label, row, col, 1, width) check = QCheckBox(self) check.setFixedSize(20, 20) check.setStyleSheet( 'QCheckBox::indicator{subcontrol-position:center;}') layout.addWidget(check, row + 1, col, 1, 1) layout.setAlignment(check, Qt.AlignCenter) return check def _load_rope(self): filename, group = QFileDialog.getOpenFileName(self, 'Load AGC Rope', 'roms', 'AGC ROMs (*.bin)') if group == '': return self._updating_switches = True self._rope_loader.load_memory(filename) def _load_complete(self): self._updating_switches = False def _dump_complete(self): self._updating_switches = False self._update_all_banks() def _dump_rope(self): filename, group = QFileDialog.getSaveFileName(self, 'Save AGC Rope', 'roms', 'AGC ROMs (*.bin)') if group == '': return self._updating_switches = True if self._agc_sel.isChecked(): z = [False] * 16 for m in [ um.WriteControlCRSBankEnable0, um.WriteControlCRSBankEnable1, um.WriteControlCRSBankEnable2, um.WriteControlCRSBankEnable3 ]: self._usbif.send(m(*z)) self._rope_dumper.dump_memory(filename)
class Window(QWidget): def __init__(self): super().__init__() # ----------style------------- self.font_type = "Arial" self.font_size = 10 self.font_color = "#676767" self.font_size2 = 12 self.font_color_black = "#f0f0f0" #--------------------------------- self.text8 = QTextEdit() self.text8.setReadOnly(True) self.check_text = False self.gbox6 = QGroupBox() try: f = open("plotter.txt", "x+") except: f = open("plotter.txt", "r") self.s = f.readline() f.close if self.s == "": f = open("plotter.txt", "w") f.write("dark") f.close() self.s = "dark" self.information_dialog() else: self.gbox6.setStyleSheet( "border:None;background-color:rgba(255,255,255,0)") self.text8.setStyleSheet( "border:None;background-color:rgba(255,255,255,0)") self.gbox6.setTitle("") self.text8.setText("") np.seterr(invalid='raise') self.setWindowTitle("XGrapher") self.setGeometry(500, 400, 900, 600) self.setMinimumSize(900, 600) pg.setConfigOption('background', (255, 255, 255, 0)) self.pw = pg.PlotWidget() self.pw.setXRange(0, 1) self.pw.setYRange(0, 1) self.pw.hideButtons() #--------------------------- self.list_errors = [] # -------------------------- self.a = False self.b = False self.c = False # ------------------------- self.d = False self.e = False self.f = False self.g = False self.after = False # ------------------------- self.check1 = False self.check2 = False self.check3 = False self.check_dot = False self.check_neg = False self.check_xrange = False self.check_yrange = False # ------------Labels----------------------------------------- self.label1 = QLabel() self.label1.setText("F(x):") self.label2 = QLabel() self.label2.setText("Min(x):") self.label3 = QLabel() self.label3.setText("Max(x):") self.label4 = QLabel() self.label5 = QLabel() self.label5.setText("< x <") self.label6 = QLabel() self.label6.setText("< y <") # --------------------------texteditors------------------ self.text1 = QLineEdit(self) self.text1.textChanged.connect(self.text1_response) self.text1.returnPressed.connect(self.focus_text1) self.text2 = QLineEdit(self) self.text2.textChanged.connect(self.text2_response) self.text2.returnPressed.connect(self.focus_text2) self.text3 = QLineEdit(self) self.text3.textChanged.connect(self.text3_response) self.text3.returnPressed.connect(self.focus_text3) self.text4 = QLineEdit() self.text4.textChanged.connect(self.text4_response) self.text4.returnPressed.connect(self.focus_text4) self.text5 = QLineEdit() self.text5.textChanged.connect(self.text5_response) self.text5.returnPressed.connect(self.focus_text5) self.text6 = QLineEdit() self.text6.textChanged.connect(self.text6_response) self.text6.returnPressed.connect(self.focus_text6) self.text7 = QLineEdit() self.text7.textChanged.connect(self.text7_response) self.text7.returnPressed.connect(self.focus_text7) # -------------------------------------------------------- self.button_2 = QPushButton() self.button_2.clicked.connect(self.auto_mode) self.button_save = QPushButton("Export Graph") self.button_help = QPushButton() self.button_help.clicked.connect(self.information_dialog) # ----------------------RadioButtons---------------------- self.rbutton1 = QRadioButton("Light") self.rbutton1.toggled.connect(self.light_mode) self.rbutton2 = QRadioButton("Dark") self.rbutton2.toggled.connect(self.dark_mode) # -------------------------------------------------------- self.setIcon() self.center() self.input_box() self.plot_box() self.vbox = QHBoxLayout() self.vbox.addWidget(self.gbox5) self.vbox.addSpacing(5) self.vbox.addWidget(self.plot) # self.setStyleSheet("background-color:rgb(32,32,32);") # self.setStyleSheet("background-color:rgb(240,240,240);") self.setLayout(self.vbox) if self.s == "dark": self.rbutton2.setChecked(True) else: self.rbutton1.setChecked(True) if self.s == "dark": self.dark_mode() else: self.light_mode() self.show() # --------------------------------------evalute------------------------------------------------------------------- self.replacements = { 'sin': 'np.sin', 'cos': 'np.cos', 'tan': 'np.tan', 'arccos': 'np.arccos', 'arcsin': 'np.arcsin', 'arctan': 'np.arctan', 'exp': 'np.exp', 'sqrt': 'np.sqrt', 'cbrt': 'np.cbrt', 'ln': 'np.log', "cosh": "np.cosh", "sinh": "np.cosh", "tanh": "np.cosh" } self.allowed_words = [ "x", "sin", "cos", "tan", "arccos", "arcsin", "arctan", "cosh", "sinh", "tanh", "exp", "sqrt", "cbrt", "log10", "ln" ] # ---------------------------------------------------------------------------------------------------------------- self.after = True def setIcon(self): appIcon = QIcon("close.ico") self.setWindowIcon(appIcon) def center(self): qRect = self.frameGeometry() centerPoint = QDesktopWidget().availableGeometry().center() qRect.moveCenter(centerPoint) self.move(qRect.topLeft()) def input_box(self): self.input = QGroupBox("Function") self.gbox = QGroupBox("Range") vbox_parent = QVBoxLayout() self.hbox_parent = QVBoxLayout() hbox1 = QHBoxLayout() hbox2 = QHBoxLayout() hbox3 = QHBoxLayout() hbox1.addWidget(self.label1) hbox1.addSpacing(17) hbox1.addWidget(self.text1) hbox2.addWidget(self.label2) hbox2.addSpacing(4) hbox2.addWidget(self.text2) hbox3.addWidget(self.label3) hbox3.addSpacing(0) hbox3.addWidget(self.text3) hbox_button = QHBoxLayout() hbox_button.addStretch(1) self.button = QPushButton("Reset") self.button.setFixedSize(70, 25) self.button.clicked.connect(self.reset) hbox_button.addWidget(self.button) vbox_parent.addLayout(hbox1) vbox_parent.addLayout(hbox2) vbox_parent.addLayout(hbox3) vbox_parent.addLayout(hbox_button) self.input.setLayout(vbox_parent) hbox4 = QHBoxLayout() hbox4.addWidget(self.text4) hbox4.addWidget(self.label5) hbox4.addWidget(self.text5) hbox5 = QHBoxLayout() hbox5.addWidget(self.text6) hbox5.addWidget(self.label6) hbox5.addWidget(self.text7) vbox3 = QVBoxLayout() vbox3.addWidget(self.button_2) vbox2 = QVBoxLayout() vbox2.addLayout(hbox4) vbox2.addLayout(hbox5) hbox6 = QHBoxLayout() hbox6.addLayout(vbox2) hbox6.addLayout(vbox3) self.gbox.setLayout(hbox6) #self.button_save.setFixedSize(200, 25) self.button_save.setFixedHeight(25) self.button_save.setFixedWidth(220) self.button_save.clicked.connect(self.export) hbox7 = QHBoxLayout() hbox7.addWidget(self.button_save) hbox7.addWidget(self.button_help) self.gbox3 = QGroupBox() self.gbox3.setFlat(True) self.gbox3.setStyleSheet("border: None") #self.gbox3.setLayout(hbox7) vbox3 = QVBoxLayout() vbox3.addWidget(self.gbox) self.gbox4 = QGroupBox("Status") hbox8 = QHBoxLayout() hbox8.addWidget(self.label4) self.gbox4.setLayout(hbox8) self.gbox_mode = QGroupBox("Style") vbox4 = QHBoxLayout() vbox4.addWidget(self.rbutton1) vbox4.addWidget(self.rbutton2) self.gbox_mode.setLayout(vbox4) hbox9 = QHBoxLayout() hbox9.addWidget(self.text8) self.gbox6.setLayout(hbox9) self.hbox_parent.addWidget(self.input) self.hbox_parent.addLayout(vbox3) self.hbox_parent.addLayout(hbox7) self.hbox_parent.addWidget(self.gbox6) self.hbox_parent.addWidget(self.gbox_mode) self.hbox_parent.addWidget(self.gbox4) self.gbox5 = QGroupBox() self.gbox5.setLayout(self.hbox_parent) def plot_box(self): self.plot = QGroupBox() layout = QVBoxLayout() self.pw.showGrid(True, True, 0.5) layout.addWidget(self.pw) self.plot.setLayout(layout) def text_restricted(self, str): if str != "": word = str[len(str) - 1] if re.match('[0-9-.]', word) is None: k = str.translate({ord(word): None}) str = k if word == "-" and len(str) > 1: k = str[1:].translate({ord(word): None}) str = str.replace(str[1:], k) if word == ".": i = 0 for v in str: if v == ".": i += 1 if i > 1: str = str[0:len(str) - 1] + "" if word == ".": self.check_dot = True else: str = "" return str def text1_response(self): if self.check1 == False: self.a = True self.plotx() else: self.check1 = False def text2_response(self): self.text2.setText(self.text_restricted(self.text2.text())) if self.check2 == False: self.b = True self.plotx() else: self.check2 = False def text3_response(self): self.text3.setText(self.text_restricted(self.text3.text())) if self.check3 == False: self.c = True self.plotx() else: self.check3 = False def text4_response(self): self.text4.setText(self.text_restricted(self.text4.text())) self.xrange() def text5_response(self): self.text5.setText(self.text_restricted(self.text5.text())) self.xrange() def text6_response(self): self.text6.setText(self.text_restricted(self.text6.text())) self.yrange() def text7_response(self): self.text7.setText(self.text_restricted(self.text7.text())) self.yrange() def xrange(self): if self.text4.text() == "" and self.text5.text() == "": self.error("No X Min Range") self.error("No X Max Range") self.error("Invalid X Range") self.f = False self.check_xrange = False if self.text1.text() == "" or self.text2.text( ) == "" or self.text3.text() == "": self.pw.setXRange(0, 1) else: self.pw.enableAutoRange(axis='x') elif self.text4.text() != "" and self.text5.text() != "": self.check_xrange = True if float(self.text4.text()) >= float(self.text5.text()): self.error_add("Invalid X Range") self.f = True else: self.pw.setXRange(float(self.text4.text()), float(self.text5.text())) self.error("No X Min Range") self.error("No X Max Range") self.error("Invalid X Range") self.f = False self.plotx() if self.text6.text() == "" or self.text7.text() == "": self.pw.enableAutoRange(axis='y') self.pw.setAutoVisible(y=True) else: if self.text4.text() == "" and self.check_xrange == True: self.error_add("No X Min Range") self.f = True self.pw.setXRange(0, 1) if self.text5.text() == "" and self.check_xrange == True: self.error_add("No X Max Range") self.f = True self.pw.setXRange(0, 1) if self.text6.text() != "" and self.text7.text() != "": self.pw.enableAutoRange(axis='x') self.pw.setAutoVisible(x=True) else: if self.d == True or self.e == True: self.pw.setYRange(0, 1) self.pw.setXRange(0, 1) else: self.pw.enableAutoRange() def yrange(self): if self.text6.text() == "" and self.text7.text() == "": self.error("No Y Min Range") self.error("No Y Max Range") self.error("Invalid Y Range") self.g = False self.check_yrange = False if self.text1.text() == "" or self.text2.text( ) == "" or self.text3.text() == "": self.pw.setYRange(0, 1) else: self.pw.enableAutoRange(axis='y') elif self.text6.text() != "" and self.text7.text() != "": self.check_yrange = True if float(self.text6.text()) >= float(self.text7.text()): self.error_add("Invalid Y Range") self.g = True else: self.pw.setYRange(float(self.text6.text()), float(self.text7.text())) self.error("No Y Min Range") self.error("No Y Max Range") self.error("Invalid Y Range") self.g = False self.plotx() if self.text4.text() == "" or self.text5.text() == "": self.pw.enableAutoRange(axis='x') self.pw.setAutoVisible(x=True) else: if self.text6.text() == "" and self.check_yrange == True: self.error_add("No Y Min Range") self.g = True self.pw.setYRange(0, 1) if self.text7.text() == "" and self.check_yrange == True: self.error_add("No Y Max Range") self.g = True self.pw.setYRange(0, 1) if self.text4.text() != "" and self.text5.text() != "": self.pw.enableAutoRange(axis='y') self.pw.setAutoVisible(y=True) else: if self.d == True or self.e == True: self.pw.setYRange(0, 1) self.pw.setXRange(0, 1) else: self.pw.enableAutoRange() def string2func(self, str): if str != "" and self.a == True and self.b == True and self.c == True: self.error("No Function to draw") self.d = False for word in re.findall('[a-zA-Z_]+', str): if word not in self.allowed_words: self.error_add("F(x) is not a Function of x") self.d = True else: self.d = False self.error('F(x) is not a Function of x') if word in self.replacements: str = str.replace(word, self.replacements[word]) if "^" in str: str = str.replace("^", "**") elif str == "" and self.b == True and self.c == True: self.error_add("No Function to draw") self.d = True self.pw.clear() def func(x): if str != "" and self.text2.text() != "" and self.text3.text( ) != "" and self.d == False: if self.d == False: try: if np.inf in eval(str): raise ZeroDivisionError if -np.inf in eval(str): raise ValueError except ZeroDivisionError: self.error_add("Cannot divide by Zero") self.d = True except FloatingPointError: self.error_addd("Undefined") self.d = True except ValueError: self.error_add("Math Error") self.d = True except: self.error_add("Syntax Error") self.d = True else: self.error("Cannot divide by Zero") self.error("Undefined") self.error("Math Error") self.error("Syntax Error") self.d = False return eval(str) return func def plotx(self): if self.text2.text() == "" and self.text3.text( ) == "" and self.text1.text( ) == "" and self.a == True and self.b == True and self.c == True: self.reset() func = self.string2func(self.text1.text()) if self.a == True and self.b == True and self.c == True and self.text2.text( ) != "" and self.text3.text() != "" and self.text1.text( ) != "" and self.d == False: if (self.text4.text() == "" and self.text5.text() == "") and ( self.text6.text() == "" and self.text7.text() == ""): self.pw.enableAutoRange() self.pw.clear() if (self.text2.text() == "-" or self.text3.text() == "-" or self.text3.text() == "." or self.text2.text() == "."): self.list_errors.append("Invalid Range") self.e = True else: min_num = float(self.text2.text()) max_num = float(self.text3.text()) if min_num >= max_num: self.error_add("Invalid Range") self.e = True else: range = np.linspace(min_num, max_num, 2000) if "x" not in self.text1.text( ) and self.text1.text() != "": try: if self.s == "light": self.pw.plot(range, np.ones(len(range)) * eval(self.text1.text()), pen=pg.mkPen(color=(140, 140, 140), width=2)) else: self.pw.plot(range, np.ones(len(range)) * eval(self.text1.text()), pen=pg.mkPen(color="w", width=2)) except ZeroDivisionError: self.error_add("Cannot divide by Zero") self.d = True except FloatingPointError: self.error_add("Undefined") self.d = True except ValueError: self.error_add("Math Error") self.d = True except: self.error_add("Syntax Error") self.d = True else: self.error("Cannot divide by Zero") self.error("Undefined") self.error("Math Error") self.error("Syntax Error") self.d = False else: y = func(range) if self.s == "light": self.pw.plot(range, y, pen=pg.mkPen(color=(140, 140, 140), width=2)) self.error("Invalid Range") self.error("No Min Value") self.error("No Max Value") else: self.pw.plot(range, y, pen=pg.mkPen(color="w", width=2)) self.error("Invalid Range") self.error("No Min Value") self.error("No Max Value") self.e = False else: if (self.text3.text() == "" and self.c == True): self.pw.clear() self.e = True self.error_add("No Max Value") elif (self.text3.text() != "" and self.c == True): self.error("No Max Value") if (self.text2.text() == "" and self.b == True): self.pw.clear() self.e = True self.error_add("No Min Value") elif (self.text2.text() != "" and self.b == True): self.error("No Min Value") def error(self, type): if type in self.list_errors: self.list_errors.remove(type) if len(self.list_errors) == 0: self.label4.setText("") else: self.label4.setText(self.list_errors[len(self.list_errors) - 1]) def error_add(self, error): if error in self.list_errors: pass else: self.list_errors.append(error) self.label4.setText(self.list_errors[len(self.list_errors) - 1]) def reset(self): self.pw.clear() if self.text4.text() == "" and self.text5.text( ) == "" and self.text6.text() == "" and self.text7.text() == "": self.pw.setXRange(0, 1) self.pw.setYRange(0, 1) self.check1 = True self.check2 = True self.check3 = True self.text1.setText("") self.text2.setText("") self.text3.setText("") self.a = False self.b = False self.c = False self.text1.setFocus() self.d = False self.e = False self.error("Invalid Range") self.error("No Min Value") self.error("No Max Value") self.error("Cannot divide by Zero") self.error("Undefined") self.error("Math Error") self.error("Syntax Error") self.error('F(x) is not a Function of x') self.error("No Function to draw") def focus_text1(self): self.text2.setFocus() def focus_text2(self): self.text3.setFocus() def focus_text3(self): self.text1.setFocus() def focus_text4(self): self.text5.setFocus() def focus_text5(self): self.text6.setFocus() def focus_text6(self): self.text7.setFocus() def focus_text7(self): self.text4.setFocus() def save(self): pass def information_dialog(self): if self.check_text == False: if self.s == "dark": self.gbox6.setTitle("Help") self.gbox6.setStyleSheet( "QGroupBox {border: 2px solid #3d3d3d;background-color:#383838;color: " + self.font_color_black + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.text8.setStyleSheet( "border:None;background-color:#383838;border:None;color: " + self.font_color_black) self.text8.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) self.text8.setText("--> The following operators must be used when writting the function:\n( - + / ^ ( ) ).\n\n--> The program supports the following functions and must be written as:" "\nsin(x),cos(x),tan(x),arccos(x),\narcsin(x),arctan(x),cosh(x),sinh(x),\ntanh(x),exp(x),sqrt(X),cbrt(x),\n" "log10(x),ln(x) and polynomial and rational functions." "\n\n--> The 'A' button in the Range box sets the x-axis and y-axis ranges to the appropriate values according to the values of the function.\n\n" \ "--> To close the Help box just click the help button beside the Export Graph.") else: self.gbox6.setTitle("Help") self.gbox6.setStyleSheet( "QGroupBox {border: 2px solid #e6e6e6;background-color:#f5f6f7;color: " + self.font_color + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.text8.setStyleSheet( "border:None;background-color:#f5f6f7;color: " + self.font_color) self.text8.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) self.text8.setText("--> The following operators must be used when writting the function:\n( - + / ^ ( ) ).\n\n--> The program supports the following functions and must be written as:" "\nsin(x),cos(x),tan(x),arccos(x),\narcsin(x),arctan(x),cosh(x),sinh(x),\ntanh(x),exp(x),sqrt(X),cbrt(x),\n" "log10(x),ln(x) and polynomial and rational functions." "\n\n--> The 'A' button in the Range box sets the x-axis and y-axis ranges to the appropriate values according to the values of the function.\n\n" \ "--> To close the Help box just click the help button beside the Export Graph.") self.check_text = True else: self.gbox6.setStyleSheet( "border:None;background-color:rgba(255,255,255,0)") self.text8.setStyleSheet( "border:None;background-color:rgba(255,255,255,0)") self.text8.setText("") self.gbox6.setTitle("") self.check_text = False def auto_mode(self): self.text4.setText("") self.text5.setText("") self.text6.setText("") self.text7.setText("") self.f = False self.g = False self.check_yrange == False self.check_xrange == False self.xrange() self.yrange() def dark_mode(self): self.input.setMaximumWidth(250) self.input.setFixedSize(250, 150) self.gbox.setMaximumWidth(250) self.gbox.setFixedSize(250, 90) self.gbox3.setMaximumWidth(250) self.gbox3.setFixedSize(250, 90) self.gbox4.setMaximumWidth(250) self.gbox4.setFixedSize(250, 45) self.gbox_mode.setMaximumWidth(250) self.gbox_mode.setFixedSize(250, 50) self.gbox5.setMaximumWidth(270) self.input.setObjectName("input") self.input.setStyleSheet( "QGroupBox#input{border: 2px solid #3d3d3d;background-color:#383838;color: " + self.font_color_black + ";margin-top: 6px;}" + "QGroupBox#input::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.gbox.setStyleSheet( "QGroupBox {border: 2px solid #3d3d3d;background-color:#383838;color: " + self.font_color_black + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.gbox4.setStyleSheet( "QGroupBox {border: 2px solid #3d3d3d;background-color:#383838;color: " + self.font_color_black + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.gbox_mode.setStyleSheet( "QGroupBox {border: 2px solid #3d3d3d;background-color:#383838;color: " + self.font_color_black + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.plot.setStyleSheet("color: " + self.font_color) self.setStyleSheet("background-color:#202020") self.label1.setStyleSheet( "background-color:#383838;border:None;color: " + self.font_color_black) self.label2.setStyleSheet( "background-color:#383838;border:None;color:" + self.font_color_black) self.label3.setStyleSheet( "background-color:#383838;border:None;color:" + self.font_color_black) self.label4.setStyleSheet( "background-color:#383838;border:None;color:" + self.font_color_black) self.label5.setStyleSheet( "background-color:#383838;border:None;color:" + self.font_color_black) self.label6.setStyleSheet( "background-color:#383838;border:None;color:" + self.font_color_black) self.rbutton1.setStyleSheet("background-color:#383838;color:" + self.font_color_black) self.rbutton2.setStyleSheet("background-color:#383838;color:" + self.font_color_black) self.rbutton1.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) self.rbutton2.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) self.label1.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label2.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label3.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label4.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label5.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label6.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text1.setStyleSheet( "border:1px solid #5b5b5b;background-color:#383838;color:" + self.font_color_black) self.text2.setStyleSheet( "border:1px solid #5b5b5b;background-color:#383838;color:" + self.font_color_black) self.text3.setStyleSheet( "border:1px solid #5b5b5b;background-color:#383838;color:" + self.font_color_black) self.text4.setStyleSheet( "border:1px solid #5b5b5b;background-color:#383838;color:" + self.font_color_black) self.text5.setStyleSheet( "border:1px solid #5b5b5b;background-color:#383838;color:" + self.font_color_black) self.text6.setStyleSheet( "border:1px solid #5b5b5b;background-color:#383838;color:" + self.font_color_black) self.text7.setStyleSheet( "border:1px solid #5b5b5b;background-color:#383838;color:" + self.font_color_black) self.button_save.setStyleSheet( " QPushButton{border: 1px solid #f0f0f0;Text-align:center;background:#333333; color:#f0f0f0}" "QPushButton::hover{border: 1px solid #f0f0f0;Text-align:center;background:#2c2c2c}" "QPushButton::Pressed{border: 1px solid #f0f0f0;Text-align:center;background:#3d3c3c}" ) self.button.setStyleSheet( " QPushButton{border: 1px solid #f0f0f0;Text-align:center;background:#333333; color:#f0f0f0}" "QPushButton::hover{border: 1px solid #f0f0f0;Text-align:center;background:#2c2c2c}" "QPushButton::Pressed{border: 1px solid #f0f0f0;Text-align:center;background:#3d3c3c}" ) self.text1.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text2.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text3.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text4.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text5.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text6.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text7.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.gbox5.setObjectName("GroupBox") self.gbox5.setStyleSheet( "QGroupBox#GroupBox{border: None;background-color:#383838}") f = open("plotter.txt", "w") f.write("dark") f.close() self.s = "dark" self.pw.setBackground(background=None) if self.after == True: self.plotx() pixmap1 = QPixmap("auto-button_dark.png") button_icon1 = QIcon(pixmap1) self.button_2.setStyleSheet("border:none;background-color:#383838") self.button_2.setIcon(button_icon1) pixmap2 = QPixmap("help_dark.png") button_icon2 = QIcon(pixmap2) self.button_help.setIcon(button_icon2) self.button_help.setStyleSheet("border:none;background-color:#383838") if self.check_text == True: self.gbox6.setStyleSheet( "QGroupBox {border: 2px solid #3d3d3d;background-color:#383838;color: " + self.font_color_black + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.text8.setStyleSheet( "border:None;background-color:#383838;border:None;color: " + self.font_color_black) self.text8.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) def light_mode(self): self.input.setMaximumWidth(250) self.input.setFixedSize(250, 150) self.gbox.setMaximumWidth(250) self.gbox.setFixedSize(250, 90) self.gbox3.setMaximumWidth(250) self.gbox3.setFixedSize(250, 90) self.gbox4.setMaximumWidth(250) self.gbox4.setFixedSize(250, 45) self.gbox_mode.setMaximumWidth(250) self.gbox_mode.setFixedSize(250, 50) self.gbox5.setMaximumWidth(270) self.input.setObjectName("input") self.input.setStyleSheet( "QGroupBox#input{border: 2px solid #e6e6e6;background-color:#f5f6f7;color: " + self.font_color + ";margin-top: 6px;}" + "QGroupBox#input::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.gbox.setStyleSheet( "QGroupBox {border: 2px solid #e6e6e6;background-color:#f5f6f7;color: " + self.font_color + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.gbox4.setStyleSheet( "QGroupBox {border: 2px solid #e6e6e6;background-color:#f5f6f7;color: " + self.font_color + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.gbox_mode.setStyleSheet( "QGroupBox {border: 2px solid #e6e6e6;background-color:#f5f6f7;color: " + self.font_color + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.plot.setStyleSheet("color: " + self.font_color) self.setStyleSheet("background-color:white;") self.label1.setStyleSheet("background-color:#f5f6f7;color: " + self.font_color) self.label2.setStyleSheet("background-color:#f5f6f7;color:" + self.font_color) self.label3.setStyleSheet("background-color:#f5f6f7;color:" + self.font_color) self.label4.setStyleSheet("background-color:#f5f6f7;color:" + self.font_color) self.label5.setStyleSheet("background-color:#f5f6f7;color:" + self.font_color) self.label6.setStyleSheet("background-color:#f5f6f7;color:" + self.font_color) self.rbutton1.setStyleSheet("background-color:#f5f6f7;color:" + self.font_color) self.rbutton2.setStyleSheet("background-color:#f5f6f7;color:" + self.font_color) self.rbutton1.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) self.rbutton2.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) self.label1.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label2.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label3.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label4.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label5.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.label6.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text1.setStyleSheet("background-color:white") self.text2.setStyleSheet("background-color:white") self.text3.setStyleSheet("background-color:white") self.text4.setStyleSheet("background-color:white") self.text5.setStyleSheet("background-color:white") self.text6.setStyleSheet("background-color:white") self.text7.setStyleSheet("background-color:white") self.button_save.setStyleSheet( " QPushButton{border: 1px solid #adadad;Text-align:center;background:#e1e1e1; color:black}" "QPushButton::hover{border: 1px solid #adadad;Text-align:center;background:#d8d7d7}" "QPushButton::Pressed{border: 1px solid #adadad;Text-align:center;background:#f5f6f7}" ) self.button.setStyleSheet( " QPushButton{border: 1px solid #adadad;Text-align:center;background:#e1e1e1; color:black}" "QPushButton::hover{border: 1px solid #adadad;Text-align:center;background:#d8d7d7}" "QPushButton::Pressed{border: 1px solid #adadad;Text-align:center;background:#f5f6f7}" ) self.text1.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text2.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text3.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text4.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text5.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text6.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.text7.setFont(QFont(self.font_type, self.font_size, QFont.Normal)) self.gbox5.setObjectName("GroupBox") self.gbox5.setStyleSheet( "QGroupBox#GroupBox{border: None;background-color:#f5f6f7}") f = open("plotter.txt", "w") f.write("light") f.close() self.s = "light" self.pw.setBackground(background=None) if self.after == True: self.plotx() pixmap2 = QPixmap("auto-button.png") button_icon2 = QIcon(pixmap2) self.button_2.setStyleSheet("border:none;background-color:#f5f6f7") self.button_2.setIcon(button_icon2) pixmap2 = QPixmap("help_light.png") button_icon2 = QIcon(pixmap2) self.button_help.setIcon(button_icon2) self.button_help.setStyleSheet("border:none;background-color:#f5f6f7") if self.check_text == True: self.gbox6.setStyleSheet( "QGroupBox {border: 2px solid #e6e6e6;background-color:#f5f6f7;color: " + self.font_color + ";margin-top: 6px;}" + "QGroupBox::title {subcontrol-origin:margin;left:8px;padding: 0px 0px 0px 0px;}" ) self.text8.setStyleSheet( "border:None;background-color:#f5f6f7;color: " + self.font_color) self.text8.setFont( QFont(self.font_type, self.font_size, QFont.Normal)) def export(self): self.exportdialog = exportDialog.ExportDialog(self.pw.plotItem.scene()) name = QFileDialog.getSaveFileName( self, 'Save File', "", "PNG (*.PNG;*.PNG);;CSV (*.CSV);;SVG(*.SVG)", "", QFileDialog.Options()) if name[0] != "": if "PNG" in name[1]: if self.s == "dark": self.pw.setBackground(background=(0, 0, 0)) else: self.pw.setBackground(background=(255, 255, 255)) exporter = pg.exporters.ImageExporter(self.pw.plotItem) exporter.export(name[0]) self.pw.setBackground(background=None) elif "CSV" in name[1]: exporter = pg.exporters.CSVExporter(self.pw.plotItem) exporter.export(name[0]) elif "SVG" in name[1]: if self.s == "dark": self.pw.setBackground(background=(0, 0, 0)) else: self.pw.setBackground(background=(255, 255, 255)) exporter = pg.exporters.SVGExporter(self.pw.plotItem) exporter.export(name[0]) self.pw.setBackground(background=None)
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Queues\' Type') self.setGeometry(150, 150, 800, 500) self.setFixedSize(800, 500) self.center() self.setIcon() self.initRadioButtons() def initRadioButtons(self): width = self.width() height = self.height() self.deterministicRadio = QRadioButton('Deterministic Queue', self) self.deterministicRadio.setFont(QFont('Sanserif', 18)) self.deterministicRadio.setStyleSheet('QRadioButton{color:maroon}') self.deterministicRadio.adjustSize() self.deterministicRadio.move(100, 100) self.deterministicRadio.clicked.connect(self.deterministicRadioClicked) self.stochasticRadio = QRadioButton('Stochastic Queue', self) self.stochasticRadio.setFont(QFont('Sanserif', 18)) self.stochasticRadio.setStyleSheet('QRadioButton{color:darkslategray}') self.stochasticRadio.adjustSize() self.stochasticRadio.move((width / 2) + 50, 100) self.stochasticRadio.clicked.connect(self.stochasticRadioClicked) self.deterministicRadio = QRadioButton('WhatEver Queue', self) self.deterministicRadio.setFont(QFont('Sanserif', 18)) self.deterministicRadio.setStyleSheet('QRadioButton{color:steelblue}') self.deterministicRadio.adjustSize() self.deterministicRadio.move(300, 200) icon1 = QIcon('line.png') label1 = QLabel('Sample', self) pixmap1 = icon1.pixmap(100, 100, QIcon.Active, QIcon.On) label1.setPixmap(pixmap1) label1.move((width / 2) - 50, 300) label1.adjustSize() def deterministicRadioClicked(self): print('clickeddddd') self.dete = determenistic.DeterministicScreen() self.dete.show() self.destroy() def stochasticRadioClicked(self): self.soch = sochastic.SochasticScreen() self.soch.show() self.destroy() def center(self): qRect = self.frameGeometry() centerpoint = QDesktopWidget().availableGeometry().center() qRect.moveCenter(centerpoint) self.move(qRect.topLeft()) def setIcon(self): appIcon = QIcon('line.png') self.setWindowIcon(appIcon) def closeEvent(self, event): userInfo = QMessageBox.question(self, 'Closing ?', 'Do u want to quit ?', QMessageBox.Yes | QMessageBox.No) if userInfo == QMessageBox.Yes: event.accept() self.close() #sys.exit(QApplication(sys.argv).exec_()) elif userInfo == QMessageBox.No: event.ignore()
class ErasableMemSim(QFrame): def __init__(self, parent, usbif): super().__init__(parent) self._usbif = usbif self._bank_switches = [] self._updating_switches = False self._setup_ui() self._core_loader = MemoryLoad(usbif, um.WriteSimErasable, 0o10, 256, self._bank_switches, None) self._core_loader.finished.connect(self._load_complete) self._core_dumper = MemoryDump(usbif, um.ReadErasable, um.Erasable, 0o10, 256, self._bank_switches, None) self._core_loader.finished.connect(self._dump_complete) def _setup_ui(self): self.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) # Set up our basic layout layout = QGridLayout(self) self.setLayout(layout) layout.setSpacing(1) layout.setMargin(1) for bank in range(0o10): sw = self._create_bank_switch('E%o' % bank, layout, 0, bank, 1) sw.stateChanged.connect(self._update_ems_banks) self._bank_switches.append(sw) for col in range(0o10, 0o22): s = QSpacerItem(20, 20) layout.addItem(s, 1, col) label = QLabel('EMS', self) font = label.font() font.setPointSize(12) font.setBold(True) label.setFont(font) label.setAlignment(Qt.AlignCenter) layout.addWidget(label, 5, 16, 2, 2, Qt.AlignCenter) b = self._create_button('ALL', layout, 5, 1, 3) b.pressed.connect(lambda: self._set_all(True)) b = self._create_button('NONE', layout, 5, 3, 2) b.pressed.connect(lambda: self._set_all(False)) self._ems_sel = QRadioButton('EMS', self) self._ems_sel.setLayoutDirection(Qt.RightToLeft) layout.addWidget(self._ems_sel, 5, 6, 2, 3) layout.setAlignment(self._ems_sel, Qt.AlignRight) self._agc_sel = QRadioButton('AGC', self) self._agc_sel.setChecked(True) layout.addWidget(self._agc_sel, 5, 8, 2, 3) layout.setAlignment(self._agc_sel, Qt.AlignCenter) font.setPointSize(7) self._ems_sel.setFont(font) self._agc_sel.setFont(font) b = self._create_button('PAD', layout, 5, 11, 2) b.pressed.connect(self._load_pad) b = self._create_button('LOAD', layout, 5, 12, 3) b.pressed.connect(self._load_core) b = self._create_button('DUMP', layout, 5, 14, 2) b.pressed.connect(self._dump_core) def _update_ems_banks(self): if self._updating_switches: return enables = [False] * 8 for i, sw in enumerate(self._bank_switches): enables[i] = sw.isChecked() self._usbif.send(um.WriteControlEMSBankEnable(*enables)) def _set_all(self, state): self._updating_switches = True for sw in self._bank_switches: sw.setChecked(state) self._updating_switches = False self._update_ems_banks() def _create_button(self, name, layout, row, col, width): label = QLabel(name, self) label.setAlignment(Qt.AlignCenter) font = label.font() font.setPointSize(7) font.setBold(True) label.setFont(font) label.setMinimumWidth(30) layout.addWidget(label, row, col, 1, width) layout.setAlignment(label, Qt.AlignCenter) b = QPushButton(self) b.setFixedSize(20, 20) layout.addWidget(b, row + 1, col, 1, width) layout.setAlignment(b, Qt.AlignCenter) return b def _create_bank_switch(self, name, layout, row, col, width): label = QLabel(name, self) label.setAlignment(Qt.AlignBottom | (Qt.AlignLeft if width == 2 else Qt.AlignCenter)) font = label.font() font.setPointSize(7) font.setBold(True) label.setFont(font) layout.addWidget(label, row, col, 1, width) check = QCheckBox(self) check.setFixedSize(20, 20) check.setStyleSheet( 'QCheckBox::indicator{subcontrol-position:center;}') layout.addWidget(check, row + 1, col, 1, 1) layout.setAlignment(check, Qt.AlignCenter) return check def _load_pad(self): filename, group = QFileDialog.getOpenFileName( self, 'Load AGC Pad Load', 'pads', 'AGC Pad Load Files (*.pad)') if group == '': return load_data = [] with open(filename, 'r') as f: for l in f.readlines(): parts = l.split() addr_idx = 0 if len(parts) == 3: if parts[0] in ('CMPAD', 'LMPAD'): addr_idx = 1 else: raise RuntimeError('Invalid pad load line "%s"' % l) elif len(parts) != 2: raise RuntimeError('Invalid pad load line "%s"' % l) addr = int(parts[addr_idx], 8) val = int(parts[addr_idx + 1], 8) load_data.append((addr, val)) msg_type = um.WriteErasable if self._agc_sel.isChecked( ) else um.WriteSimErasable for addr, val in load_data: print('%04o %o' % (addr, val)) self._usbif.send(msg_type(addr=addr, data=val, parity=0)) def _load_core(self): filename, group = QFileDialog.getOpenFileName( self, 'Load AGC Core File', 'cores', 'AGC Core Files (*.bin)') if group == '': return self._updating_switches = True self._core_loader.load_memory( filename, um.WriteErasable if self._agc_sel.isChecked() else um.WriteSimErasable) def _load_complete(self): self._updating_switches = False def _dump_complete(self): self._updating_switches = False self._update_ems_banks() def _dump_core(self): filename, group = QFileDialog.getSaveFileName( self, 'Save AGC Core Dump', 'cores', 'AGC Core Files (*.bin)') if group == '': return self._updating_switches = True if self._agc_sel.isChecked(): z = [False] * 8 self._usbif.send(um.WriteControlEMSBankEnable(*z)) self._core_dumper.dump_memory(filename)
def _setup_ui(self): layout = QVBoxLayout(self) self.setLayout(layout) layout.setMargin(1) layout.setSpacing(1) s1_s2 = QWidget(self) s1_s2_layout = QHBoxLayout(s1_s2) s1_s2.setLayout(s1_s2_layout) s1_s2_layout.setMargin(1) s1_s2_layout.setSpacing(0) self._s1 = QRadioButton('S1', s1_s2) font = self._s1.font() font.setPointSize(7) font.setBold(True) self._s1.setFont(font) self._s1.setLayoutDirection(Qt.RightToLeft) self._s1.setChecked(True) self._s2 = QRadioButton('S2', s1_s2) self._s2.setFont(font) self._s2.toggled.connect(lambda s: self._send_mode(s)) s1_s2_layout.addWidget(self._s1) s1_s2_layout.setAlignment(self._s1, Qt.AlignLeft) s1_s2_layout.addWidget(self._s2) s1_s2_layout.setAlignment(self._s2, Qt.AlignLeft) layout.addWidget(s1_s2) layout.setAlignment(s1_s2, Qt.AlignRight) write_w_box = QGroupBox('WRITE W', self) write_w_layout = QGridLayout(write_w_box) write_w_box.setLayout(write_w_layout) write_w_layout.setMargin(1) write_w_layout.setSpacing(1) row = 0 col = 0 for label, mode in WRITE_W_POSITIONS.items(): pos = QRadioButton(label, write_w_box) pos.setFont(font) if label == 'ALL': pos.setChecked(True) pos.pressed.connect(lambda m=mode: self._update_mode(m)) write_w_layout.addWidget(pos, row, col) col += 1 if row == 0 or col >= 3: col = 0 row += 1 layout.addWidget(write_w_box) switch_frame = QFrame(self) switch_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) switch_layout = QGridLayout(switch_frame) switch_layout.setMargin(1) switch_layout.setSpacing(1) switch_frame.setLayout(switch_layout) layout.addWidget(switch_frame) row = self._add_switches(switch_frame, switch_layout, TIME_SWITCHES, self._time_switches, self._send_times, row) sep = QFrame(switch_frame) sep.setFrameStyle(QFrame.HLine | QFrame.Raised) switch_layout.addWidget(sep, row, 0, 1, 6) row += 1 self._add_switches(switch_frame, switch_layout, PULSE_SWITCHES, self._pulse_switches, self._send_pulses, row)
class WriteW(QWidget): def __init__(self, parent, usbif): super().__init__(parent) self._usbif = usbif self._time_switches = {} self._pulse_switches = {} self._mode = WRITE_W_POSITIONS['ALL'] self._setup_ui() usbif.send(um.WriteControlWriteW(mode=um.WriteWMode.ALL, s1_s2=0)) z = (0, ) * len(TIME_SWITCHES) usbif.send(um.WriteControlTimeSwitches(*z)) z = (0, ) * len(PULSE_SWITCHES) usbif.send(um.WriteControlPulseSwitches(*z)) def _update_mode(self, mode): self._mode = mode self._send_mode(self._s2.isChecked()) def _send_mode(self, s1_s2): self._usbif.send(um.WriteControlWriteW(mode=self._mode, s1_s2=s1_s2)) def _send_times(self, state): time_states = { s: self._time_switches[s].isChecked() for s in self._time_switches.keys() } self._usbif.send(um.WriteControlTimeSwitches(**time_states)) def _send_pulses(self, state): pulse_states = { s: self._pulse_switches[s].isChecked() for s in self._pulse_switches.keys() } self._usbif.send(um.WriteControlPulseSwitches(**pulse_states)) def _setup_ui(self): layout = QVBoxLayout(self) self.setLayout(layout) layout.setMargin(1) layout.setSpacing(1) s1_s2 = QWidget(self) s1_s2_layout = QHBoxLayout(s1_s2) s1_s2.setLayout(s1_s2_layout) s1_s2_layout.setMargin(1) s1_s2_layout.setSpacing(0) self._s1 = QRadioButton('S1', s1_s2) font = self._s1.font() font.setPointSize(7) font.setBold(True) self._s1.setFont(font) self._s1.setLayoutDirection(Qt.RightToLeft) self._s1.setChecked(True) self._s2 = QRadioButton('S2', s1_s2) self._s2.setFont(font) self._s2.toggled.connect(lambda s: self._send_mode(s)) s1_s2_layout.addWidget(self._s1) s1_s2_layout.setAlignment(self._s1, Qt.AlignLeft) s1_s2_layout.addWidget(self._s2) s1_s2_layout.setAlignment(self._s2, Qt.AlignLeft) layout.addWidget(s1_s2) layout.setAlignment(s1_s2, Qt.AlignRight) write_w_box = QGroupBox('WRITE W', self) write_w_layout = QGridLayout(write_w_box) write_w_box.setLayout(write_w_layout) write_w_layout.setMargin(1) write_w_layout.setSpacing(1) row = 0 col = 0 for label, mode in WRITE_W_POSITIONS.items(): pos = QRadioButton(label, write_w_box) pos.setFont(font) if label == 'ALL': pos.setChecked(True) pos.pressed.connect(lambda m=mode: self._update_mode(m)) write_w_layout.addWidget(pos, row, col) col += 1 if row == 0 or col >= 3: col = 0 row += 1 layout.addWidget(write_w_box) switch_frame = QFrame(self) switch_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) switch_layout = QGridLayout(switch_frame) switch_layout.setMargin(1) switch_layout.setSpacing(1) switch_frame.setLayout(switch_layout) layout.addWidget(switch_frame) row = self._add_switches(switch_frame, switch_layout, TIME_SWITCHES, self._time_switches, self._send_times, row) sep = QFrame(switch_frame) sep.setFrameStyle(QFrame.HLine | QFrame.Raised) switch_layout.addWidget(sep, row, 0, 1, 6) row += 1 self._add_switches(switch_frame, switch_layout, PULSE_SWITCHES, self._pulse_switches, self._send_pulses, row) def _add_switches(self, switch_frame, switch_layout, switches, switch_dict, switch_fn, row): col = 0 for v, l in switches.items(): check = QCheckBox(switch_frame) check.setFixedSize(20, 20) check.setStyleSheet( 'QCheckBox::indicator{subcontrol-position:center;}') check.stateChanged.connect(switch_fn) switch_dict[v] = check switch_layout.addWidget(check, row, col) switch_layout.setAlignment(check, Qt.AlignCenter) label = QLabel(l, switch_frame) font = label.font() font.setPointSize(7) font.setBold(True) label.setFont(font) switch_layout.addWidget(label, row + 1, col) switch_layout.setAlignment(label, Qt.AlignCenter) col += 1 if col >= 6: col = 0 row += 2 return row
class CompStop(QFrame): def __init__(self, parent, usbif): super().__init__(parent) self._usbif = usbif self._stop_switches = {} self._stop_inds = {} self._setup_ui() usbif.poll(um.ReadControlStopCause()) usbif.listen(self) z = (0, ) * (len(STOP_CONDS) + 1) usbif.send(um.WriteControlStop(*z)) def handle_msg(self, msg): if isinstance(msg, um.ControlStopCause): for v in STOP_CONDS.values(): self._stop_inds[v].set_on(getattr(msg, v)) def _set_stop_conds(self, on): settings = { s: self._stop_switches[s].isChecked() for s in STOP_CONDS.values() } settings['s1_s2'] = self._s2.isChecked() self._usbif.send(um.WriteControlStop(**settings)) def _setup_ui(self): self.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) layout = QGridLayout(self) self.setLayout(layout) layout.setMargin(1) layout.setSpacing(1) # Construct the stop indicators and switches col = 0 for l, n in STOP_CONDS.items(): self._create_stop_cond(l, n, layout, col) col += 1 label = QLabel('COMP STOP', self) font = label.font() font.setPointSize(12) font.setBold(True) label.setFont(font) label.setAlignment(Qt.AlignCenter) layout.addWidget(label, 3, 0, 1, 4, Qt.AlignRight) self._s1 = QRadioButton('S1', self) self._s1.setLayoutDirection(Qt.RightToLeft) layout.addWidget(self._s1, 3, 5, 1, 2) layout.setAlignment(self._s1, Qt.AlignRight) self._s1.setChecked(True) self._s1.toggled.connect(self._set_stop_conds) self._s2 = QRadioButton('S2', self) layout.addWidget(self._s2, 3, 6, 1, 2) layout.setAlignment(self._s2, Qt.AlignRight) font.setPointSize(7) self._s1.setFont(font) self._s2.setFont(font) def _create_stop_cond(self, label_text, name, layout, col): # Create an indicator to show stop status ind = Indicator(self, QColor(255, 0, 0)) ind.setFixedSize(25, 20) layout.addWidget(ind, 0, col) layout.setAlignment(ind, Qt.AlignCenter) self._stop_inds[name] = ind # Add a switch to control the stop control state check = QCheckBox(self) check.setFixedSize(20, 20) check.setStyleSheet( 'QCheckBox::indicator{subcontrol-position:center;}') layout.addWidget(check, 1, col) layout.setAlignment(check, Qt.AlignCenter) check.stateChanged.connect(self._set_stop_conds) self._stop_switches[name] = check # Create a label for the inhibit switch label = QLabel(label_text, self) label.setAlignment(Qt.AlignCenter) font = label.font() font.setPointSize(7) font.setBold(True) label.setFont(font) label_height = 2 if '\n' in label_text else 1 layout.addWidget(label, 2, col, label_height, 1) layout.setAlignment(label, Qt.AlignCenter | Qt.AlignTop)