#include "outputdialog.h" #include "check/check.h" #include "output/output_options.h" #include "ui_outputdialog.h" #include #include #include #include "settings/settings.h" #include "utils/utils.h" OutputDialog::OutputDialog(QWidget *parent, Check &check) : QDialog(parent), ui(new Ui::OutputDialog), check(check), options(OutputOptions()) { Settings settings(get_path_relative_to_home(".local/share/checks_parser/settings.json")); ui->setupUi(this); ui->tableWidget->item(0, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_name"]["name"])); ui->tableWidget->item(0, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_name"]["position"])); ui->tableWidget->item(1, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_price_per_unit"]["name"])); ui->tableWidget->item(1, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_price_per_unit"]["position"])); ui->tableWidget->item(2, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_quantity"]["name"])); ui->tableWidget->item(2, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_quantity"]["position"])); ui->tableWidget->item(3, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_net_weight"]["name"])); ui->tableWidget->item(3, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_net_weight"]["position"])); ui->tableWidget->item(4, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_total"]["name"])); ui->tableWidget->item(4, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_total"]["position"])); ui->printHeaderCheckBox->setChecked(settings.get_all_settings()["print_header"]); ui->printTotalCheckBox->setChecked(settings.get_all_settings()["print_total"]); } OutputDialog::~OutputDialog() { delete ui; } bool compare_position(Column &c1, Column &c2) { return c1.position < c2.position; } void OutputDialog::on_buttonBox_accepted() { std::ofstream output_file(this->options.get_path()); for (int i = 0; i < ui->tableWidget->rowCount(); i++) { int position = ui->tableWidget->item(i, 0)->text().toInt(); std::string name = ui->tableWidget->item(i, 1)->text().toStdString(); Column c; c.type = static_cast(i); c.position = position; c.name = name; this->options.add_or_update_column(c); } std::sort(this->options.get_columns().begin(), this->options.get_columns().end(), compare_position); if (options.get_print_header()) { for (auto &column : this->options.get_columns()) { output_file << column.name << (column.position == this->options.get_columns().size() ? "" : ","); } output_file << std::endl; } for (auto goods : this->check.get_goods()) { for (auto &column : this->options.get_columns()) { switch (column.type) { case ColumnType::goods_name: output_file << goods.get_name(); break; case ColumnType::goods_price_per_unit: output_file << std::fixed << std::setprecision(2) << goods.get_price_per_unit(); break; case ColumnType::goods_quantity: output_file << std::fixed << std::setprecision(2) << goods.get_quantity(); break; case ColumnType::goods_net_weight: output_file << "TODO"; // TODO break; case ColumnType::goods_total: output_file << std::fixed << std::setprecision(2) << goods.calculate_total_price(); break; } if (column.position != this->options.get_columns().size()) { output_file << ","; } else { output_file << "\n"; } } } if (this->options.get_print_total()) { output_file << "Total: " << std::fixed << std::setprecision(2) << check.calculae_total_price() << std::endl; } output_file.close(); } void update_settings(OutputOptions &options, ColumnType t, std::string name, int value) { Column column; column.type = t; column.name = name; column.position = value; if (value) { options.add_or_update_column(column); } else { options.remove_column(t); } } void OutputDialog::on_chooseFileButton_clicked() { QString filename = QFileDialog::getSaveFileName(); this->options.set_path(filename.toStdString()); ui->pathLabel->setText("Path to export: " + filename); } void OutputDialog::on_printHeaderCheckBox_stateChanged(int value) { this->options.set_print_header(value); } void OutputDialog::on_printTotalCheckBox_stateChanged(int value) { this->options.set_print_total(value); }