def setup_central_widget(self, parent: QtWidgets.QMainWindow): """Sets up the client's UI elements.""" if should_create_widget(self.central_tabs): self.central_tabs = QtWidgets.QTabWidget() self.central_tabs.setTabPosition(QtWidgets.QTabWidget.West) self.central_tabs.setDocumentMode(True) self.central_tabs.setMovable(True) # Insert them if parent.centralWidget() != self.central_tabs: parent.setCentralWidget(self.central_tabs)
class WAtMain(CjAt, TjUtil, TgWai): LInputFileName = jf_gi('class LInputFileName { String lu_it }') LDo = jf_gi('class LDo { String lu_o_fn }') def __init__(self): super().__init__() def create(self): self.wn_init() def wn_init(self): JC_LOG.info(self.tm_wai('Initializing ...')) self.wv_i_nop = 0 self.wu_atr_rp = jy_bf('gf_mk_atr', jy_be('CAtReversePages'), [], ':c') self.wu_mw = QMainWindow() self.wu_mw.setWindowTitle(GC_APP_NM) self.wu_mw.setCentralWidget(QWidget()) self.wu_mw.resize(460, 145) self.wu_mw.showEvent = self.showEvent self.wu_mw.closeEvent = self.closeEvent self.wu_cw = self.wu_mw.centralWidget() self.wu_cw.setLayout(QGridLayout()) self.wu_lo = self.wu_cw.layout() def nf2_new_le(): fu2_le = QLineEdit() fu2_le.setMinimumWidth(700) fu2_le.setAlignment(Qt.AlignLeft) fu2_le.setReadOnly(True) return fu2_le def nf2_ui_add_input(x_row): fv2_row = x_row self.wu_lb_i_pn = QLabel('Input path') self.wu_le_i_pn = nf2_new_le() self.wu_le_i_pn.setText(GC_DESKTOP_PN) self.wu_pb_i_fn = QPushButton('…') self.wu_pb_i_fn.setMaximumWidth(25) self.wu_lb_i_bn = QLabel('Input base name') self.wu_le_i_bn = nf2_new_le() self.wu_lb_i_nfo = QLabel('Input file info') self.wu_le_i_nfo = nf2_new_le() self.wu_lo.addWidget(self.wu_lb_i_pn, fv2_row, 0, 1, 1, Qt.AlignRight) self.wu_lo.addWidget(self.wu_le_i_pn, fv2_row, 1, 1, 3) self.wu_lo.addWidget(self.wu_pb_i_fn, fv2_row, 4, 2, 1) fv2_row += 1 self.wu_lo.addWidget(self.wu_lb_i_bn, fv2_row, 0, 1, 1, Qt.AlignRight) self.wu_lo.addWidget(self.wu_le_i_bn, fv2_row, 1, 1, 3) fv2_row += 1 self.wu_lo.addWidget(self.wu_lb_i_nfo, fv2_row, 0, 1, 1, Qt.AlignRight) self.wu_lo.addWidget(self.wu_le_i_nfo, fv2_row, 1, 1, -1) return fv2_row def nf2_ui_add_hor_ln(x_row): fv2_row = x_row fu2_fm = QFrame() fu2_fm.setGeometry(QRect(1, 1, 1, 1)) fu2_fm.setFrameShape(QFrame.HLine) fu2_fm.setFrameShadow(QFrame.Sunken) self.wu_lo.addWidget(fu2_fm, fv2_row, 0, 1, -1) return fv2_row def nf2_ui_add_output(x_row): fv2_row = x_row self.wu_lb_o_pn = QLabel('Output path') self.wu_le_o_pn = nf2_new_le() self.wu_le_o_pn.setText(gf_pj(GC_DOWNLOAD_PN, 'TMPS')) self.wu_lo.addWidget(self.wu_lb_o_pn, fv2_row, 0, 1, 1, Qt.AlignRight) self.wu_lo.addWidget(self.wu_le_o_pn, fv2_row, 1, 1, -1) self.wu_lb_o_bn = QLabel('Output base name') self.wu_le_o_bn = nf2_new_le() self.wu_lb_o_nfo = QLabel('Output file info') self.wu_le_o_nfo = nf2_new_le() fv2_row += 1 self.wu_lo.addWidget(self.wu_lb_o_bn, fv2_row, 0, 1, 1, Qt.AlignRight) self.wu_lo.addWidget(self.wu_le_o_bn, fv2_row, 1, 1, -1) fv2_row += 1 self.wu_lo.addWidget(self.wu_lb_o_nfo, fv2_row, 0, 1, 1, Qt.AlignRight) self.wu_lo.addWidget(self.wu_le_o_nfo, fv2_row, 1, 1, -1) return fv2_row def nf2_ui_add_process(x_row): fv2_row = x_row self.wu_lb_process = QLabel('Process') self.wu_pgb = QProgressBar() self.wu_pgb.setMinimum(0) self.wu_pgb.setAlignment(Qt.AlignCenter) self.wu_pb_do = QPushButton('Do') self.wu_pb_do.setMaximumWidth(80) self.wu_pb_do.setEnabled(False) self.wu_te_log = QTextEdit() self.wu_te_log.setFont( QFontDatabase.systemFont(QFontDatabase.FixedFont)) self.wu_te_log.setReadOnly(True) self.wu_te_log.setWordWrapMode(QTextOption.NoWrap) self.wu_te_log.setMinimumHeight(250) self.wu_lo.addWidget(self.wu_lb_process, fv2_row, 0, 1, 1, Qt.AlignRight) self.wu_lo.addWidget(self.wu_pgb, fv2_row, 1, 1, 2) self.wu_lo.addWidget(self.wu_pb_do, fv2_row, 3, 1, -1, Qt.AlignCenter) fv2_row += 1 self.wu_lo.addWidget(self.wu_te_log, fv2_row, 1, 1, -1) return fv2_row nv_row = 0 nv_row = nf2_ui_add_input(nv_row) + 1 nv_row = nf2_ui_add_hor_ln(nv_row) + 1 nv_row = nf2_ui_add_output(nv_row) + 1 nv_row = nf2_ui_add_hor_ln(nv_row) + 1 nv_row = nf2_ui_add_process(nv_row) + 1 self.wu_lo.setColumnStretch(1, 1) self.wu_pb_i_fn.clicked.connect(self.won_pb_i_fn_clicked) self.wu_pb_do.clicked.connect(self.won_pb_do_clicked) def pp2_move_center(x2_w): pu2_cp = QDesktopWidget().availableGeometry().center() pu2_fg = x2_w.frameGeometry() pu2_fg.moveCenter(pu2_cp) x2_w.move(pu2_fg.topLeft()) self.wu_mw.show() self.wu_mw.raise_() pp2_move_center(self.wu_mw) def receive(self, x_letter, x_atr_sender): nu_java_nm = x_letter.java_name JC_LOG.debug(self.tm_wai(f'Received {nu_java_nm}')) if (nu_java_nm == 'LInputFileNumberOfPages'): self.wv_i_nop = x_letter.getProperty('lu_it') self.wn_log_info( f"Total pages of the requested file => {self.wv_i_nop:,d}") self.wu_le_i_nfo.setText(f'{self.wv_i_nop:,d} page(s)') self.wn_set_output_fn() elif (nu_java_nm == 'LSoFar'): bu2_so_far = x_letter.getProperty('lu_it') self.wu_pgb.setValue(bu2_so_far) elif (nu_java_nm == 'LDone'): self.wn_log_info( 'Done processing => elapsed {} ...'.format(datetime.now() - self.wv_st)) self.wn_set_enabled(True) def won_pb_i_fn_clicked(self): def np2_do(): pu2_i_fn = QFileDialog.getOpenFileName(self.wu_mw, 'Select PDF file', self.wu_le_i_pn.text(), 'PDF file (*.pdf)')[0] if not gf_if(pu2_i_fn): return self.wn_log_clear() self.wn_log_info(f'Requested file => {pu2_i_fn}') self.wu_pgb.setValue(0) self.wu_le_i_pn.setText(gf_pn(pu2_i_fn)) self.wu_le_i_bn.setText(gf_bn(pu2_i_fn)) self.wn_log_info('Sending input file name ...') self.tell(self.wu_atr_rp, self.LInputFileName(pu2_i_fn)) try: np2_do() except: gp_log_exception(self.wn_log_error, 'Following error occurs !!!', gf_exception_to_list(), 30) self.wn_log_error('Check your PDF file or this program logic !!!') def wn_set_output_fn(self): nu_o_nop = self.wv_i_nop self.wu_le_o_bn.setText( f'{ gf_jn ( self.wu_le_i_bn .text () ) }-(ReversePages)-{nu_o_nop:d}-page(s).pdf' ) self.wu_le_o_nfo.setText(f'{nu_o_nop:,d} pages') self.wu_pb_do.setEnabled(True) def wn_set_enabled(self, x_bool): for bu4_w in [self.wu_pb_i_fn, self.wu_pb_do]: bu4_w.setEnabled(x_bool) def won_pb_do_clicked(self): self.wv_st = datetime.now() nv_cancelled = False gp_log_header(self.wn_log_info, 'Start processing ...', 23) def np2_do(): self.wn_set_enabled(False) pu2_o_fn = gf_pj(self.wu_le_o_pn.text(), self.wu_le_o_bn.text()) self.wn_log_info(f'Output path => { gf_pn (pu2_o_fn) }') self.wn_log_info(f'Base name to generate => { gf_bn (pu2_o_fn) }') if gf_if(pu2_o_fn): self.wn_log_warning( f'Oputput file already exist in { gf_pn (pu2_o_fn) }') bu3_overwrite = QMessageBox.question(self.wu_mw, GC_APP_NM, 'Overwrite ?') if bu3_overwrite == QMessageBox.No: nonlocal nv_cancelled nv_cancelled = True return JC_LOG.info('Make output path if not exist ...') gp_mp(gf_pn(pu2_o_fn)) pu2_i_nop = self.wv_i_nop JC_LOG.info(f'Initializing progress bar ...') self.wu_pgb.setValue(0) self.wu_pgb.setMaximum(pu2_i_nop) self.wn_log_info('Opening output file ...') self.wn_log_info( 'Writing output file ( may take a long time ) ...') self.tell(self.wu_atr_rp, self.LDo(pu2_o_fn)) try: np2_do() except: gp_log_exception(self.wn_log_error, 'Following error occurs !!!', gf_exception_to_list(), 30) self.wn_log_error('Check your PDF file or this program logic !!!') else: if nv_cancelled: self.wn_log_warning('Cancelled by user !!!') self.wn_set_enabled(True) def wn_log_clear(self): self.wu_te_log.clear() def wn_log_info(self, x_msg): JC_LOG.info(x_msg) self.wu_te_log.append( f"<font color=black>[I] { self. wm_2_html (x_msg) }</font>") def wn_log_warning(self, x_msg): JC_LOG.warning(x_msg) self.wu_te_log.append( f"<font color=magenta>[W] { self. wm_2_html (x_msg) }</font>") def wn_log_error(self, x_msg): JC_LOG.error(x_msg) self.wu_te_log.append( f"<font color=red>[E] { self. wm_2_html (x_msg) }</font>") def wm_2_html(self, x_msg): nv_msg = re.sub(r'(?:\r\n|\r|\n)', '<br>', x_msg) return nv_msg.replace(' ', ' ') def showEvent(self, x_ev): JC_LOG.info(self.tm_wai('Qt Widget shown ...')) def closeEvent(self, x_ev): JC_LOG.info(self.tm_wai('About to quit ...')) jp_request_exit(GC_EC_SUCCESS)