#include "customlogo.h" #include "ui_customlogo.h" #include "QFileDialog" #include #include #include #include #include #include #include #define DEMO_BG_PATH ":/NameCreater/resource/custom_logo/bg_1.jpg" #define KEY_DEMO_BG_ITEM 10 #define KEY_WORD_ITEM 100 #define KEY_WORD_ITEM_X_POS 101 #define KEY_WORD_ITEM_Y_POS 102 #define DEMO_WORD_UNICODE "\u92ea\u96dc\u5152" 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, 365); static qreal EACH_WORD_OFFSET = 142; static QColor FONT_COLOR = QColor(0, 0, 0); static QColorDialog* s_colorDialog = nullptr; 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); x_adjust_offset = y_adjust_offset = 0; onSliderValueChanged(0); 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); connect(ui->reset_adjust_btn, &QPushButton::released, this, &CustomLogo::onClickedBtn); connect(ui->double_checkbox, &QCheckBox::clicked, this, &CustomLogo::onCheckboxClicked); connect(ui->x_adjust_slider, &QSlider::valueChanged, this, &CustomLogo::onSliderValueChanged); connect(ui->y_adjust_slider, &QSlider::valueChanged, this, &CustomLogo::onSliderValueChanged); QFont _f(*font); _f.setPixelSize(20); QPalette palette = ui->color_label->palette(); palette.setColor(QPalette::WindowText, fontColor); ui->color_label->setPalette(palette); ui->color_label->setFont(_f); ui->color_btn->setFont(_f); ui->double_checkbox->setFont(_f); demo_scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); ui->demo_graphicsView->setScene(&demo_scene); QPixmap def_demo_bg(DEMO_BG_PATH); createDemoGraphicItemBG(def_demo_bg); } 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); createDemoGraphicItemBG(pix); } else { qDebug() << "Data content not image format"; } } }; QFileDialog::getOpenFileContent("Image (*.jpg)", fileContentReady); } void CustomLogo::createDemoGraphicItemBG(const QPixmap& img) { demo_scene.clear(); bool isReverse = ui->double_checkbox->isChecked(); QGraphicsPixmapItem* name_bgItem = new QGraphicsPixmapItem(img); name_bgItem->setData(KEY_DEMO_BG_ITEM, KEY_DEMO_BG_ITEM); name_bgItem->setPos(10, 10); demo_scene.addItem(name_bgItem); QGraphicsRectItem* name_rectItem = NULL, * name_reverse_rectItem = NULL; 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, 255))); if (isReverse) { 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()); name_reverse_rectItem->setRotation(180); } QString name = QString(DEMO_WORD_UNICODE); int name_len = name.length(); QPointF pos = NAME_OFFSET_START; qreal y_offset = 0; if (name_len == 2) { pos.setY(pos.y() + 65.0); y_offset = 55; } for (int k = 0; k < name_len; k++) { QGraphicsCloneTextItem* textItem = new QGraphicsCloneTextItem(name.mid(k, 1), name_rectItem); textItem->setFont(*customFont); textItem->setDefaultTextColor(fontColor); qreal _posX = (name_rectItem->boundingRect().width() / 2 - textItem->boundingRect().width() / 2); qreal _posY = (pos.y()) + k * (EACH_WORD_OFFSET + y_offset); qDebug() << "Name num:" << QString::number(k) << "PosY:" << QString::number(_posY); textItem->setData(KEY_WORD_ITEM, QVariant(KEY_WORD_ITEM)); textItem->setData(KEY_WORD_ITEM_X_POS, QVariant(_posX)); textItem->setData(KEY_WORD_ITEM_Y_POS, QVariant(_posY)); textItem->setPos(_posX+x_adjust_offset, _posY+y_adjust_offset); if (name_reverse_rectItem) { QGraphicsCloneTextItem* _ti = ((QGraphicsCloneTextItem*)textItem)->clone(name_reverse_rectItem); _ti->setData(KEY_WORD_ITEM, QVariant(KEY_WORD_ITEM)); _ti->setData(KEY_WORD_ITEM_X_POS, QVariant(_posX)); _ti->setData(KEY_WORD_ITEM_Y_POS, QVariant(_posY)); } } } void CustomLogo::updateDemoGraphicItemBG() { foreach(QGraphicsItem * item, demo_scene.items()) { QVariant v = item->data(KEY_WORD_ITEM); if (v.toInt() == KEY_WORD_ITEM) { ((QGraphicsTextItem*)item)->setDefaultTextColor(fontColor); qreal _ori_x = item->data(KEY_WORD_ITEM_X_POS).toReal(); qreal _ori_y = item->data(KEY_WORD_ITEM_Y_POS).toReal(); item->setPos(_ori_x + x_adjust_offset, _ori_y + y_adjust_offset); } } } 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); } QPixmap _bg; foreach(QGraphicsItem * item, demo_scene.items()) { QVariant v = item->data(KEY_DEMO_BG_ITEM); if (v.toInt() == KEY_DEMO_BG_ITEM) { _bg = ((QGraphicsPixmapItem*)item)->pixmap().copy(); break; } } 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() + 65.0); y_offset = 55; } for (int k = 0; k < name_len; k++) { QGraphicsCloneTextItem* textItem = new QGraphicsCloneTextItem(name.mid(k, 1), name_rectItem); textItem->setFont(*customFont); textItem->setDefaultTextColor(fontColor); qreal _posX = name_rectItem->boundingRect().width() / 2 - textItem->boundingRect().width() / 2; qreal _posY = pos.y() + k * (EACH_WORD_OFFSET + y_offset); qDebug() << "Name num:" << QString::number(k) << "PosY:" << QString::number(_posY); textItem->setPos(_posX+x_adjust_offset, _posY+y_adjust_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::onColorSelected(const QColor& color) { qDebug() << "color accept: r:" << color.red() << ", g:" << color.green() <<", b:" << color.blue(); fontColor = QColor(color); QPalette palette = ui->color_label->palette(); palette.setColor(QPalette::WindowText, fontColor); ui->color_label->setPalette(palette); updateDemoGraphicItemBG(); } void CustomLogo::onSliderValueChanged(int value) { auto slider = QObject::sender(); if (slider == ui->x_adjust_slider) { x_adjust_offset = value; } else if (slider == ui->y_adjust_slider) { y_adjust_offset = value; } ui->x_adjust_label->setText(QString("X: %1").arg(QString::number(x_adjust_offset))); ui->y_adjust_label->setText(QString("Y: %1").arg(QString::number(y_adjust_offset))); updateDemoGraphicItemBG(); } void CustomLogo::onCheckboxClicked(bool click) { foreach(QGraphicsItem * item, demo_scene.items()) { QVariant v = item->data(KEY_DEMO_BG_ITEM); if (v.toInt() == KEY_DEMO_BG_ITEM) { QPixmap _bg = ((QGraphicsPixmapItem*)item)->pixmap().copy(); createDemoGraphicItemBG(_bg); break; } } } 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) { if (s_colorDialog == nullptr) { s_colorDialog = new QColorDialog(ui->color_label->palette().color(QPalette::WindowText), this); connect(s_colorDialog, &QColorDialog::colorSelected, this, &CustomLogo::onColorSelected); } s_colorDialog->open(); } else if (sender == ui->reset_adjust_btn) { ui->x_adjust_slider->setValue(0); ui->y_adjust_slider->setValue(0); } }