Exemple #1
0
    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)
Exemple #2
0
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(' ', '&nbsp;')

    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)