Example #1
0
    def __init__(self, widget):
        super().__init__()
        font_family = 'Yu Gothic UI'
        font_style = 'Semibold'
        db = QFontDatabase()
        self.btn_font = db.font(font_family, font_style, 10)
        self.normal_font = db.font(font_family, font_style, 14)
        self.underlined_font = db.font(font_family, font_style, 14)
        self.underlined_font.setUnderline(True)

        self.widget = widget
Example #2
0
class MainWindow(QMainWindow):
    def __init__(self, user: User):
        super().__init__()
        logging.debug("MainWindow creation")
        self.ui = Ui_MainWindow(self)
        self.retranslate_ui()
        self.set_offer_ui_enabled(False)

        self.font_database = QFontDatabase()
        self.font_database.addApplicationFont(':/font-regular')
        self.font_database.addApplicationFont(':/font-medium')
        self.font_database.addApplicationFont(':/font-bold')
        self.offer_font = self.font_database.font('Montserrat', 'Regular', 7)
        logging.info(f"Loaded font for offer print: {self.offer_font.family()} {self.offer_font.styleName()}")

        self.offer = None
        self.user = user
        self.calendar = QCalendarWidget()

        self.ui.action_new.triggered.connect(self.new_offer)
        self.ui.action_open.triggered.connect(self.load_offer)
        self.ui.action_save.triggered.connect(self.save_offer)
        self.ui.action_new_number.triggered.connect(self.new_offer_symbol)
        self.ui.action_exit.triggered.connect(self.exit)

        self.ui.action_print.triggered.connect(self.print_preview)
        self.ui.action_PDF.triggered.connect(self.print_pdf)

        self.ui.action_create_merchandise.triggered.connect(self.create_merchandise)
        self.ui.action_create_customer.triggered.connect(self.create_customer)

        self.ui.action_about.triggered.connect(self.about)
        self.ui.action_about_Qt.triggered.connect(self.about_qt)

        self.ui.push_button_add_merchandise.clicked.connect(self.select_merchandise)
        self.ui.push_button_remove_row.clicked.connect(self.remove_row)
        self.ui.push_button_discount.clicked.connect(self.set_discount)
        self.ui.push_button_discount_group.clicked.connect(self.set_discount_group)

        self.ui.command_link_button_customer.clicked.connect(self.select_customer)
        self.ui.check_box_query_date.stateChanged.connect(self.inquiry_date_toggled)
        self.ui.line_edit_query_date.textChanged.connect(self.inquiry_date_text_changed)
        self.ui.push_button_query_date.clicked.connect(self.inquiry_date_button_clicked)
        self.ui.check_box_query_number.stateChanged.connect(self.inquiry_number_toggled)
        self.ui.line_edit_query_number.textChanged.connect(self.inquiry_number_changed)

        self.ui.command_link_button_delivery.clicked.connect(self.select_delivery_terms)
        self.ui.command_link_button_offer.clicked.connect(self.select_offer_terms)
        self.ui.command_link_button_billing.clicked.connect(self.select_billing_terms)
        self.ui.command_link_button_delivery_date.clicked.connect(self.select_delivery_date_terms)
        self.ui.plain_text_edit_remarks.textChanged.connect(self.update_remarks)

        # must be connected at the end or will break tests
        self.calendar.clicked.connect(self.inquiry_date_changed)

    def retranslate_ui(self) -> None:
        self.ui.menu_offer.setTitle(self.tr("Offer"))
        self.ui.menu_export.setTitle(self.tr("Export"))
        self.ui.menu_database.setTitle(self.tr("Database"))
        self.ui.menu_help.setTitle(self.tr("Help"))
        self.ui.action_new.setText(self.tr("New"))
        self.ui.action_open.setText(self.tr("Open"))
        self.ui.action_save.setText(self.tr("Save"))
        self.ui.action_exit.setText(self.tr("Exit"))
        self.ui.action_PDF.setText(self.tr("PDF"))
        self.ui.action_print.setText(self.tr("Print preview"))
        self.ui.action_create_merchandise.setText(self.tr("Create merchandise"))
        self.ui.action_create_customer.setText(self.tr("Create customer"))
        self.ui.action_about.setText(self.tr("About"))
        self.ui.action_about_Qt.setText(self.tr("About Qt"))
        self.ui.action_new_number.setText(self.tr("Set new offer symbol"))
        self.ui.push_button_add_merchandise.setText(self.tr("Add merchandise"))
        self.ui.push_button_discount.setText(self.tr("Set Discount"))
        self.ui.push_button_discount_group.setText(self.tr("Set Discount for group"))
        self.ui.push_button_remove_row.setText(self.tr("Remove row"))
        self.ui.tabWidget.setTabText(self.ui.tabWidget.indexOf(self.ui.tab), self.tr("Offer table"))
        self.ui.tabWidget.setTabText(self.ui.tabWidget.indexOf(self.ui.tab_2), self.tr("Other information"))
        self.ui.command_link_button_customer.setText(self.tr("Choose customer"))
        self.ui.grup_box_query.setTitle(self.tr("Inquiry"))
        self.ui.check_box_query_date.setText(self.tr("Inquiry date:"))
        self.ui.push_button_query_date.setText("")
        self.ui.check_box_query_number.setText(self.tr("Inquiry number:"))
        self.ui.groupBox.setTitle(self.tr("Other information"))
        self.ui.command_link_button_delivery.setText(self.tr("Shipment terms"))
        self.ui.command_link_button_delivery_date.setText(self.tr("Delivery date"))
        self.ui.command_link_button_billing.setText(self.tr("Billing terms"))
        self.ui.command_link_button_offer.setText(self.tr("Offer terms"))
        self.ui.command_link_button_remarks.setText(self.tr("Remarks"))
        self.ui.group_box_columns.setTitle(self.tr("Columns to be printed"))
        self.ui.check_box_no_column.setText(self.tr("No."))
        self.ui.check_box_code_column.setText(self.tr("Code"))
        self.ui.check_box_details_column.setText(self.tr("Specification"))
        self.ui.check_box_list_price_column.setText(self.tr("List Price"))
        self.ui.check_box_discount_column.setText(self.tr("Discount"))
        self.ui.check_box_price_column.setText(self.tr("Price"))
        self.ui.check_box_quantity_column.setText(self.tr("Quantity"))
        self.ui.check_box_total_column.setText(self.tr("Total"))

    def set_offer_ui_enabled(self, enable: bool) -> None:
        # menus
        self.ui.menu_export.setEnabled(enable)
        self.ui.action_save.setEnabled(enable)
        self.ui.action_new_number.setEnabled(enable)
        # tabs
        self.ui.tab.setEnabled(enable)
        self.ui.tab_2.setEnabled(enable)

    def update_inquiry_text(self) -> None:
        self.ui.plain_text_edit_query.setPlainText(self.offer.inquiry_text)

    @Slot()
    def new_offer(self) -> None:
        self.offer = Offer.create_empty(self.user, self)
        self.set_offer_ui_enabled(True)
        self.setWindowTitle(f"pyOffer - {self.offer.symbol}")
        self.ui.tableView.setModel(self.offer.merchandise_list)
        self.update_inquiry_text()

    @Slot()
    def new_offer_symbol(self) -> None:
        self.offer.new_symbol()
        self.setWindowTitle(f"pyOffer - {self.offer.symbol}")

    @Slot()
    def select_customer(self) -> None:
        dialog = CustomerSelectionDialog.make(self)
        if dialog.exec_() == QDialog.Accepted and dialog.chosen_customer:
            self.ui.plain_text_edit_customer.setPlainText(dialog.chosen_customer.description)
            self.offer.customer = dialog.chosen_customer

    @Slot()
    def update_remarks(self) -> None:
        self.offer.remarks = self.ui.plain_text_edit_remarks.toPlainText()

    @Slot()
    def select_delivery_terms(self) -> None:
        term_type = TermType.delivery
        dialog = TermsChooserDialog.make(term_type, self)
        if dialog.exec_() == QDialog.Accepted and dialog.chosen_item:
            self.ui.plain_text_edit_delivery.setPlainText(dialog.chosen_item.long_desc)
            self.offer.terms[term_type] = dialog.chosen_item

    @Slot()
    def select_offer_terms(self) -> None:
        term_type = TermType.offer
        dialog = TermsChooserDialog.make(term_type, self)
        if dialog.exec_() == QDialog.Accepted and dialog.chosen_item:
            self.ui.plain_text_edit_offer.setPlainText(dialog.chosen_item.long_desc)
            self.offer.terms[term_type] = dialog.chosen_item

    @Slot()
    def select_billing_terms(self) -> None:
        term_type = TermType.billing
        dialog = TermsChooserDialog.make(term_type, self)
        if dialog.exec_() == QDialog.Accepted and dialog.chosen_item:
            self.ui.plain_text_edit_billing.setPlainText(dialog.chosen_item.long_desc)
            self.offer.terms[term_type] = dialog.chosen_item

    @Slot()
    def select_delivery_date_terms(self) -> None:
        term_type = TermType.delivery_date
        dialog = TermsChooserDialog.make(term_type, self)
        if dialog.exec_() == QDialog.Accepted and dialog.chosen_item:
            self.ui.plain_text_edit_delivery_date.setPlainText(dialog.chosen_item.long_desc)
            self.offer.terms[term_type] = dialog.chosen_item

    @Slot()
    def select_merchandise(self) -> None:
        dialog = MerchandiseSelectionDialog.make(self)
        dialog.exec_()
        for item in dialog.selected.values():
            self.offer.merchandise_list.change_item_count(item)

    @Slot()
    def remove_row(self) -> None:
        index = self.ui.tableView.currentIndex()
        if index.row() < self.offer.merchandise_list.rowCount():
            self.offer.merchandise_list.removeRow(index.row())

    @Slot()
    def set_discount(self) -> None:
        dialog = DiscountDialog(self)
        dialog.line_edit_expression.textChanged.connect(self.offer.merchandise_list.select_items)
        self.offer.merchandise_list.select_items("")
        if dialog.exec_() == QDialog.Accepted:
            self.offer.merchandise_list.apply_discount(dialog.discount_value)
        else:
            self.offer.merchandise_list.select_items(None)

    @Slot()
    def set_discount_group(self) -> None:
        dialog = DiscountGroupDialog(self.offer.merchandise_list.get_discount_groups(), self)
        dialog.selectionChanged.connect(self.offer.merchandise_list.select_items)
        if dialog.exec_() == QDialog.Accepted:
            self.offer.merchandise_list.apply_discount(dialog.discount_value)
        else:
            self.offer.merchandise_list.select_items(None)

    @Slot()
    def inquiry_date_button_clicked(self) -> None:
        self.ui.check_box_query_date.setChecked(Qt.Checked)
        self.calendar.show()

    @Slot(QDate)
    def inquiry_date_changed(self, d: QDate) -> None:
        self.ui.line_edit_query_date.setText(f"{d.toPython():%d.%m.%Y}")
        self.calendar.close()

    @Slot(int)
    def inquiry_date_toggled(self, state: int) -> None:
        enabled = state == Qt.Checked
        self.ui.line_edit_query_date.setEnabled(enabled)
        if enabled:
            self.ui.line_edit_query_date.setText(f"{date.today():%d.%m.%Y}")
        else:
            self.ui.line_edit_query_date.clear()

    @Slot(str)
    def inquiry_date_text_changed(self, text: str) -> None:
        self.offer.inquiry_date = text
        self.update_inquiry_text()

    @Slot(int)
    def inquiry_number_toggled(self, state: int) -> None:
        enabled = state == Qt.Checked
        self.ui.line_edit_query_number.setEnabled(enabled)
        if not enabled:
            self.ui.line_edit_query_number.clear()

    @Slot(str)
    def inquiry_number_changed(self, text: str) -> None:
        self.offer.inquiry_number = text
        self.update_inquiry_text()

    @Slot()
    def load_offer(self) -> None:
        pass

    @Slot()
    def save_offer(self) -> None:
        pass

    @Slot()
    def exit(self) -> None:
        """Forward to QMainWindow.close, but keep here for sake of tests"""
        super().close()

    @Slot(QPrinter)
    def print(self, printer: QPrinter) -> None:
        print_options = PrintOptions(
            print_no=self.ui.check_box_no_column.isChecked(),
            print_code=self.ui.check_box_code_column.isChecked(),
            print_description=self.ui.check_box_details_column.isChecked(),
            print_list_price=self.ui.check_box_list_price_column.isChecked(),
            print_discount=self.ui.check_box_discount_column.isChecked(),
            print_price=self.ui.check_box_price_column.isChecked(),
            print_quantity=self.ui.check_box_quantity_column.isChecked(),
            print_total=self.ui.check_box_total_column.isChecked()
        )
        margin = 5
        printer.setPageSize(QPrinter.A4)
        printer.setPageMargins(margin, margin, margin, margin, QPrinter.Millimeter)
        printer.setResolution(96)

        doc = QTextDocument()
        doc.setUseDesignMetrics(True)
        doc.setDefaultFont(self.offer_font)
        doc.setHtml(self.offer.printout(print_options))
        doc.setPageSize(printer.pageRect().size())
        doc.print_(printer)

    @Slot()
    def print_preview(self) -> None:
        printer = QPrinter()
        printer.setOutputFormat(QPrinter.NativeFormat)

        dialog = QPrintPreviewDialog(printer, self)
        dialog.setWindowFlags(Qt.Window)
        dialog.paintRequested.connect(self.print)
        dialog.showMaximized()
        dialog.exec_()

    @Slot()
    def print_pdf(self) -> None:
        file_name = QFileDialog.getSaveFileName(self, self.tr("Save to .pdf"), filter=self.tr("Portable Document Format (*.pdf)"))[0]
        if not file_name:
            return

        printer = QPrinter()
        printer.setOutputFormat(QPrinter.PdfFormat)
        printer.setOutputFileName(file_name)
        self.print(printer)

    @Slot()
    def create_merchandise(self) -> None:
        dialog = CreateMerchandiseDialog.make(self)
        dialog.show()

    @Slot()
    def create_customer(self) -> None:
        dialog = CreateCustomerDialog.make(self)
        dialog.show()

    @Slot()
    def about(self) -> None:
        QMessageBox.information(self, self.tr("About pyOffer"), self.tr("pyOffer version {}\nAll rights reserved (c) Kamil Strzempowicz".format(version)))

    @Slot()
    def about_qt(self) -> None:
        """Forward to QApplication.aboutQt, but keep here for sake of tests"""
        QApplication.aboutQt()