class BinFilePanel(QtGui.QGroupBox): def __init__(self, parent, app_status_file, event_handler=DummyEventHandler(), max_width=600): super(BinFilePanel, self).__init__(parent) frame_grid = QtGui.QGridLayout() frame_grid.setSpacing(1) self.combo_box = ComboBox(self, tip_msg="???") self.combo_box.setFixedWidth(max_width) # self.combo_box.size self.apply_copot_patch_button = SmallPushButton( "COPOT patch", tip_msg=APPLY_COPOT_PATCH_TIP) copot_btn_font = self.apply_copot_patch_button.font() self.apply_copot_patch_button.setFont( QFont(copot_btn_font.defaultFamily(), 5, QFont.Bold)) self.browse_btn = PushButton("...", tip_msg="browse for file") self.browse_btn.setIcon(QtGui.QIcon(BROWSE_ICON)) self.open_btn = PushButton("open", tip_msg="open file in editor") self.app_status_file = app_status_file self.last_browse_location = '' frame_grid.addWidget(self.combo_box, 0, 0, 1, 6) frame_grid.addWidget(self.open_btn, 0, 7, 1, 1) frame_grid.addWidget(self.browse_btn, 0, 8, 1, 1) frame_grid.addWidget(self.apply_copot_patch_button, 1, 7, 1, 1) self.setTitle("BIN FILE") self.setLayout(frame_grid) self.browse_btn.clicked.connect(self.browse_for_file) self.apply_copot_patch_button.clicked.connect( event_handler.apply_copot_fix_patch) self.open_btn.clicked.connect(event_handler.open_bin_file) self.combo_box.setDuplicatesEnabled(False) self.combo_box.setMaxCount(30) self.combo_box.setEditable(True) self.event_handler = event_handler self.setAcceptDrops(True) self.combo_box.dragEnterEvent = self.dragEnterEvent self.combo_box.dropEvent = self.dropEvent def dragEnterEvent(self, event): file_path = event.mimeData().urls()[0].path() file_path = prepare_file_path_for_platform(file_path) if os.path.isfile(file_path): event.accept() def dropEvent(self, event): bin_path = event.mimeData().urls()[0].path() bin_path = prepare_file_path_for_platform(bin_path) self.insert_new_file(bin_path) def get_current_file(self): bin_path = str(self.combo_box.currentText()) if bin_path: if os.path.exists(bin_path): self.combo_box.moveOnTop(bin_path) return bin_path else: message_box("no such file: {}\n".format(bin_path)) self.combo_box.setEditText(self.combo_box.itemText(0)) self.combo_box.removeByStr(bin_path) def browse_for_file(self): start_dir = self.last_browse_location file_path = QtGui.QFileDialog.getOpenFileName( self, 'Select bin file', start_dir, "hex files (*.bin *.BIN)") if platform != 'Linux': file_path = file_path.replace('/', '\\') return self.insert_new_file(file_path) def insert_new_file(self, file_path): if os.path.isfile( file_path) and file_path not in self.combo_box.getItems( ) and self.check_bin_size(file_path): self.combo_box.insertItem(0, file_path) self.combo_box.setCurrentIndex(0) self.last_browse_location = os.path.dirname(str(file_path)) elif file_path in self.combo_box.getItems(): self.combo_box.moveOnTop(file_path) elif not os.path.isfile(file_path): return False def check_bin_size(self, bin_path): with open(bin_path, 'rb') as f: size = len(f.read()) if size != 0x8000: message_box( "This is not valid 27c256 chip image.\nSize not match 0x{:X}!=0x{:X}" .format(size, 0x8000)) return False return True
class BanksPanel(QtGui.QGroupBox): def __init__(self, parent, event_handler=DummyEventHandler()): super(BanksPanel, self).__init__(parent) frame_grid = QtGui.QGridLayout() frame_grid.setSpacing(1) self.event_handler = event_handler self.bank_name_max_len = 25 self.setTitle("Banks") # self.bank1_wear_lcd = LcdDisplay(tip_msg=LCD_WEAR_DISPLAY_TIP) # self.bank2_wear_lcd = LcdDisplay(tip_msg=LCD_WEAR_DISPLAY_TIP) # self.bank3_wear_lcd = LcdDisplay(tip_msg=LCD_WEAR_DISPLAY_TIP) settings_icon = QtGui.QIcon(SETTINGS_ICON) self.bank1_settings_btn = PushButton(tip_msg=BANK_SETTINGS_TIP) self.bank1_settings_btn.setIcon(settings_icon) self.bank2_settings_btn = PushButton(tip_msg=BANK_SETTINGS_TIP) self.bank2_settings_btn.setIcon(settings_icon) self.bank3_settings_btn = PushButton(tip_msg=BANK_SETTINGS_TIP) self.bank3_settings_btn.setIcon(settings_icon) self.auto_download_checkbox = CheckBox( "auto download", tip_msg=AUTO_DOWNLOAD_CHECKBOX_TIP) self.bank1pushButton = PushButton("bank 1", tip_msg=BANK_TIP) self.bank2pushButton = PushButton("bank 2", tip_msg=BANK_TIP) self.bank3pushButton = PushButton("bank 3", tip_msg=BANK_TIP) self.bank_name_line_edit = LineEdit( tip_msg="Provide new bank name. ENTER accepts", focus_event=event_handler.bank_name_line_edit_event, focus_out_event=event_handler.bank_name_line_focus_out_event) frame_grid.addWidget(self.bank1pushButton, 0, 0) frame_grid.addWidget(self.bank2pushButton, 1, 0) frame_grid.addWidget(self.bank3pushButton, 2, 0) frame_grid.addWidget(self.bank1_settings_btn, 0, 2) frame_grid.addWidget(self.bank2_settings_btn, 1, 2) frame_grid.addWidget(self.bank3_settings_btn, 2, 2) frame_grid.addWidget(self.bank_name_line_edit, 3, 0, 1, 3) frame_grid.addWidget(self.auto_download_checkbox, 4, 0) self.setLayout(frame_grid) self.bank1pushButton.clicked.connect(event_handler.bank1set_slot) self.bank2pushButton.clicked.connect(event_handler.bank2set_slot) self.bank3pushButton.clicked.connect(event_handler.bank3set_slot) self.bank_name_line_edit.returnPressed.connect( self.bank_name_line_edit_slot) def update_tip_msg_for_bank(self, bank_button_no, bank_name, msg): """ Update tip message for button {1, 2, 3} :param bank_button_no: :param msg: :return: """ bank_button = [ self.bank1pushButton, self.bank2pushButton, self.bank3pushButton ][bank_button_no] bank_button.update_tip_msg(msg, wrap=False) if len(bank_name) > 14: bank_name = bank_name[0:11] + '...' bank_button.setText(bank_name) def put_bank_name(self, name): self.bank_name_line_edit.setText(name[0:self.bank_name_max_len]) def get_bank_name_text(self): bank_name = str(self.bank_name_line_edit.text()) return bank_name[0:self.bank_name_max_len] def set_default_style_sheet_for_buttons(self): self.bank1pushButton.set_default_style_sheet() self.bank2pushButton.set_default_style_sheet() self.bank3pushButton.set_default_style_sheet() def bank_name_line_edit_slot(self): bank_name = self.bank_name_line_edit.text()[0:self.bank_name_max_len] self.bank_name_line_edit.setText(bank_name) self.event_handler.set_bank_name() self.bank_name_line_edit.clearFocus() def disable_active_button(self): to_signal(self.bank1pushButton.set_default_style_sheet)() to_signal(self.bank2pushButton.set_default_style_sheet)() to_signal(self.bank3pushButton.set_default_style_sheet)() def set_active_button(self, bank_no): to_signal(self.bank1pushButton.set_default_style_sheet)() to_signal(self.bank2pushButton.set_default_style_sheet)() to_signal(self.bank3pushButton.set_default_style_sheet)() set_green_style = \ [ self.bank1pushButton.set_green_style_sheet, self.bank2pushButton.set_green_style_sheet, self.bank3pushButton.set_green_style_sheet, ][bank_no] to_signal(set_green_style).emit()