#include "customlogo.h" #include "ui_customlogo.h" #include "QFileDialog" #include #include #include #include #include #include #include static QPointF BG_POS_START = QPointF(159, 61); static QPointF BG_POS_ROT_START = QPointF(900, 2094); static qreal BG_WIDTH_OFFSET = 320; static int NAME_COUNT_IN_PAGE = 12; static QPointF NAME_OFFSET_START = QPointF(79, 377); static qreal EACH_WORD_OFFSET = 142; static QColor FONT_COLOR = QColor(0, 0, 0); class QGraphicsCloneTextItem : public QGraphicsTextItem { public: QGraphicsCloneTextItem(const QString& text, QGraphicsItem* parent = nullptr) : QGraphicsTextItem(text, parent) { } QGraphicsCloneTextItem* clone(QGraphicsItem* parent = nullptr) const { QGraphicsCloneTextItem* newItem = new QGraphicsCloneTextItem(toPlainText(), parent); newItem->setFont(font()); newItem->setPos(pos()); newItem->setDefaultTextColor(defaultTextColor()); return newItem; } }; CustomLogo::CustomLogo(QFont* font, QDialog* parent) : QDialog(parent), ui(new Ui::CustomLogo), customFont(font), fontColor(QColor(0, 0, 0)) { ui->setupUi(this); connect(ui->load_bg_btn, &QPushButton::released, this, &CustomLogo::onClickedBtn); connect(ui->load_list_btn, &QPushButton::released, this, &CustomLogo::onClickedBtn); connect(ui->color_btn, &QPushButton::released, this, &CustomLogo::onClickedBtn); QPalette palette = ui->color_label->palette(); palette.setColor(QPalette::WindowText, fontColor); ui->color_label->setPalette(palette); } CustomLogo::~CustomLogo() { delete ui; } void CustomLogo::loadBGFromFile() { auto fileContentReady = [this](const QString& fileName, const QByteArray& fileContent) { if (fileName.isEmpty()) { // No file was selected } else { QPixmap pix; if (pix.loadFromData(fileContent, "JPG")) { ui->display_label->setPixmap(pix); } else { qDebug() << "Data content not image format"; } } }; QFileDialog::getOpenFileContent("Image (*.jpg)", fileContentReady); } void CustomLogo::loadListFromFile() { auto fileContentReady = [this](const QString& fileName, const QByteArray& fileContent) { if (fileName.isEmpty()) { // No file was selected } else { QList nameList = getNameByFileContent(Name_zh, fileContent); if (!nameList.isEmpty()) { qDebug() << "List size: " << QString::number(nameList.count()); gerneraImageFromList(nameList, Name_zh); } else { qDebug() << "List is empty!!"; } } }; QFileDialog::getOpenFileContent("CSV file (*.csv)", fileContentReady); } void CustomLogo::gerneraImageFromList(const QList& nameList, Name_Type_e type) { int export_times = 0; QGraphicsScene scene; scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); QGraphicsView view(&scene); switch (type) { case Name_zh: { for (int n = 0; n < nameList.length(); n++) { int idx = n % NAME_COUNT_IN_PAGE; NameInfo_t name_info = nameList.at(n); if (idx == 0) { QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); bg_item->setBrush(QBrush(QColor(255, 255, 255))); scene.addItem(bg_item); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QPixmap _bg = ui->display_label->pixmap()->copy(); #else QPixmap _bg = ui->display_label->pixmap().copy(); #endif // QGraphicsPixmapItem* name_bgItem = new QGraphicsPixmapItem(_bg); bool rot = (idx == 10 || idx == 11); name_bgItem->setRotation(rot ? -90 : 0); qreal item_pos_x = rot ? BG_POS_ROT_START.x() : BG_POS_START.x() + idx * BG_WIDTH_OFFSET; qreal item_pos_y = rot ? BG_POS_ROT_START.y() + (idx - 10) * BG_WIDTH_OFFSET : BG_POS_START.y(); name_bgItem->setPos(item_pos_x, item_pos_y); scene.addItem(name_bgItem); if (name_info.name1.isEmpty()) { QMessageBox msgBox; msgBox.setText(QString().asprintf("Name is Empty at %d", export_times + 1)); msgBox.exec(); } QGraphicsRectItem* name_rectItem = new QGraphicsRectItem(QRectF(0, 0, name_bgItem->boundingRect().width(), name_bgItem->boundingRect().height()/2), name_bgItem); name_rectItem->setPen(QPen(QColor(0, 0, 0, 0))); QString name = name_info.name1; int name_len = name.length(); QPointF pos = NAME_OFFSET_START; qreal y_offset = 0; if (name_len == 2) { pos.setY(pos.y() + 82.0 ); y_offset = 25; } for (int k = 0; k < name_len; k++) { QGraphicsCloneTextItem* textItem = new QGraphicsCloneTextItem(name.mid(k, 1), name_rectItem); textItem->setFont(*customFont); textItem->setDefaultTextColor(fontColor); textItem->setPos(pos.x(), pos.y() + k * EACH_WORD_OFFSET + y_offset); } if (ui->double_checkbox->isChecked()) { QGraphicsRectItem* name_reverse_rectItem = new QGraphicsRectItem(name_rectItem->rect(), name_bgItem); name_reverse_rectItem->setPen(QPen(QColor(0, 0, 0, 0))); name_reverse_rectItem->setPos(name_bgItem->boundingRect().width(), name_bgItem->boundingRect().height()); foreach(auto item, name_rectItem->childItems()) { QGraphicsCloneTextItem* _ti = ((QGraphicsCloneTextItem*)item)->clone(name_reverse_rectItem); } name_reverse_rectItem->setRotation(180); qDebug() << "name_rect item child count:" << name_rectItem->childItems().size(); } bool is_export_page = ((idx + 1) % NAME_COUNT_IN_PAGE == 0); if (is_export_page || n == nameList.count() - 1) { QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); QString file_name = QString("Signal_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); //saveToImage(file_name, &scene); INameCreater().saveToImage(file_name, &scene); export_times++; scene.clear(); } } } break; default: break; } QMessageBox msgBox; msgBox.setText(QString().asprintf("Export Finshed. Count:%d", export_times)); msgBox.exec(); } QList CustomLogo::getNameByFileContent(Name_Type_e type, const QByteArray& conetent) { QList nameList; QTextCodec* tc = QTextCodec::codecForName("Big5"); QString codec = tc->toUnicode(conetent.data()); QTextStream stream(&codec); int row = 0; while (!stream.atEnd()) { NameInfo_t info; QString line = stream.readLine(); QString name_tc = line; QStringList csvList = name_tc.split(','); QString name, eng_name, bg_type; switch (type) { case Name_zh: name = csvList.at(0); break; default: break; } qDebug() << "row :" << row << " " << name; if (name.compare("name_1") == 0 || name.compare("name") == 0 || eng_name.compare("eng_name") == 0) { //pass first line continue; } info.name1 = name; nameList.append(info); row++; } return nameList; } void CustomLogo::onClickedBtn() { auto sender = (QPushButton*)QObject::sender(); if (sender == ui->load_bg_btn) { loadBGFromFile(); } else if (sender == ui->load_list_btn) { loadListFromFile(); } else if (sender == ui->color_btn) { QColor color = QColorDialog::getColor(Qt::red, this); if (color.isValid()) { fontColor = color; QPalette palette = ui->color_label->palette(); palette.setColor(QPalette::WindowText, color); ui->color_label->setPalette(palette); } } }