diff --git a/.gitignore b/.gitignore index f4a14ba..d36d765 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ /*.opendb /*.db /_bin +/web_build +/buildwed +/NameCreater/*.aps +/buildweb/ diff --git a/NameCreater.sln b/NameCreater.sln index 1a30f46..8642b7a 100644 --- a/NameCreater.sln +++ b/NameCreater.sln @@ -7,12 +7,18 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NameCreater", "NameCreater\ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B66B108B-6DA8-408D-936D-988FF8B6B722}.Debug|x64.ActiveCfg = Debug|x64 + {B66B108B-6DA8-408D-936D-988FF8B6B722}.Debug|x64.Build.0 = Debug|x64 {B66B108B-6DA8-408D-936D-988FF8B6B722}.Debug|x86.ActiveCfg = Debug|Win32 {B66B108B-6DA8-408D-936D-988FF8B6B722}.Debug|x86.Build.0 = Debug|Win32 + {B66B108B-6DA8-408D-936D-988FF8B6B722}.Release|x64.ActiveCfg = Release|x64 + {B66B108B-6DA8-408D-936D-988FF8B6B722}.Release|x64.Build.0 = Release|x64 {B66B108B-6DA8-408D-936D-988FF8B6B722}.Release|x86.ActiveCfg = Release|Win32 {B66B108B-6DA8-408D-936D-988FF8B6B722}.Release|x86.Build.0 = Release|Win32 EndGlobalSection diff --git a/NameCreater/BirthdayCreater.cpp b/NameCreater/BirthdayCreater.cpp new file mode 100644 index 0000000..3a8b775 --- /dev/null +++ b/NameCreater/BirthdayCreater.cpp @@ -0,0 +1,308 @@ +#include "BirthdayCreater.h" +#include +#include +#include +#include +#include + + +#define LABEL_HIGHT_LIMIT 350.0 +#define LABEL_POS_X_OFFSET 323.0 +#define NAME_TWO_WORD_OFFSET 170.0 +#define NAME_THREE_WORD_OFFSET 145.0 +#define MAX_LABEL_IN_PAPER 10 +#define FONT_PIXEL_SIZE 120 + +static QPoint LABEL_POS_START = QPoint(163, 115); +static QPoint NAME_OFFSET_START = QPoint(82, 712); +static QPoint NAME_OFFSET_REVERSE_START = QPoint(214, 1745); + +BirthdayCreater::BirthdayCreater() :INameCreater() +{ + label_bg_map["b"] = ":/NameCreater/resource/b.jpg"; + label_bg_map["g"] = ":/NameCreater/resource/g.jpg"; + label_bg_map["m"] = ":/NameCreater/resource/m.jpg"; + label_bg_map["p"] = ":/NameCreater/resource/p.jpg"; + label_bg_map["r"] = ":/NameCreater/resource/r.jpg"; + label_bg_map["w"] = ":/NameCreater/resource/w.jpg"; + label_bg_map["y"] = ":/NameCreater/resource/y.jpg"; + label_bg_map["co"] = ":/NameCreater/resource/co.jpg"; + label_bg_map["ol"] = ":/NameCreater/resource/ol.jpg"; + label_bg_map["sn"] = ":/NameCreater/resource/sn.jpg"; + label_bg_map["st"] = ":/NameCreater/resource/st.jpg"; + label_bg_map["a"] = ":/NameCreater/resource/a.jpg"; + label_bg_map["pg"] = ":/NameCreater/resource/pg.jpg"; + + +} + +BirthdayCreater::~BirthdayCreater() +{ +} + +QList BirthdayCreater::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); + bg_type = csvList.at(1); + + break; + case Name_zh_eng: + name = csvList.at(0); + eng_name = csvList.at(1); + bg_type = csvList.at(2); + + break; + case Name_eng: + eng_name = csvList.at(0); + bg_type = csvList.at(1); + default: + break; + + } + + qDebug() << "row :" << row << " " << name <<", eng: "<< eng_name << ", bg_type: " << bg_type; + + if (name.compare("name") == 0 || eng_name.compare("eng_name")==0) { + //pass first line + continue; + } + + info.name1 = name; + info.name_eng = eng_name; + info.name2 = bg_type; + + nameList.append(info); + + row++; + } + return nameList; +} + +void BirthdayCreater::generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color) +{ + int export_times = 0; + + QList nameList = getNameByFileContent(type, filecontent); + if (nameList.isEmpty()) { + QMessageBox msgBox; + msgBox.setText(QString("Name is empty ! ").append(filename)); + msgBox.exec(); + } + + QGraphicsScene scene; + scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); + QGraphicsView view(&scene); + + switch (type) + + { + case Name_zh: + for (int idx = 0; idx < nameList.length(); idx++) { + + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = QGraphicsPixmapItem(QPixmap(BG_SMAPLE_PATH)); + scene.addItem(bg_item); + + } + NameInfo_t name_info = nameList.at(idx); + int col_index = idx % MAX_LABEL_IN_PAPER; + QString label_rel_path = label_bg_map[name_info.name2]; + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(int(LABEL_POS_START.x() + LABEL_POS_X_OFFSET * col_index), int(LABEL_POS_START.y())); + label_item->setOpacity(1); + scene.addItem(label_item); + + int chrismas_y_offset = 0; + if (name_info.name2.compare("co") == 0 || name_info.name2.compare("ol") == 0 || + name_info.name2.compare("st") == 0 || name_info.name2.compare("sn") == 0) { + chrismas_y_offset = 30; + } + + for (int i = 0; i < 2; i++) { + int name_word_len = name_info.name1.length(); + qreal two_word_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET / 2 : 0; + qreal offset_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET : NAME_THREE_WORD_OFFSET; + + for (int w = 0; w < name_word_len; w++) { + QGraphicsTextItem* word_item = new QGraphicsTextItem(name_info.name1.at(w)); + word_item->setFont(font); + word_item->setDefaultTextColor(font_color); + if (i == 0) { + word_item->setPos(label_item->x() + NAME_OFFSET_START.x(), label_item->y() + NAME_OFFSET_START.y() + two_word_y + chrismas_y_offset + offset_y * w); + } + else { + word_item->setTransform(QTransform().fromScale(-1, -1)); + word_item->setPos(label_item->x() + NAME_OFFSET_REVERSE_START.x(), label_item->y() + NAME_OFFSET_REVERSE_START.y() - two_word_y - chrismas_y_offset - offset_y * w); + } + scene.addItem(word_item); + } + + } + + if ((idx % MAX_LABEL_IN_PAPER) == (MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("Birthday_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + saveToImage(file_name, &scene); + export_times++; + + scene.clear(); + } + } + break; + case Name_eng: + for (int idx = 0; idx < nameList.length(); idx++) { + + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = QGraphicsPixmapItem(QPixmap(BG_SMAPLE_PATH)); + scene.addItem(bg_item); + + } + NameInfo_t name_info = nameList.at(idx); + int col_index = idx % MAX_LABEL_IN_PAPER; + QString label_rel_path = label_bg_map[name_info.name2]; + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(int(LABEL_POS_START.x() + LABEL_POS_X_OFFSET * col_index), int(LABEL_POS_START.y())); + label_item->setOpacity(1); + scene.addItem(label_item); + + int chrismas_y_offset = 0; + if (name_info.name2.compare("co") == 0 || name_info.name2.compare("ol") == 0 || + name_info.name2.compare("st") == 0 || name_info.name2.compare("sn") == 0) { + chrismas_y_offset = 30; + } + + + QFont _new_font = QFont(EnglisthFont()); + _new_font.setWeight(QFont::ExtraLight); + int _new_size = getFontSizebyStr(_new_font, 120, 480, name_info.name_eng); + _new_font.setPixelSize(_new_size); + + for(int i = 0; i < 2; i++){ + qreal dir = (i == 0) ? -1.0:1.0; + qreal x_offset = (i == 0) ? 290.0 : 170.0; + qreal y_offset = (i == 0) ? 890.0 : 1550.0; + int sp_y_offset = (i == 0)? 1.0*chrismas_y_offset:-1.0*chrismas_y_offset; + //add English world + QGraphicsTextItem* eng_word_item = new QGraphicsTextItem(name_info.name_eng); + eng_word_item->setFont(_new_font); + QRectF rect = eng_word_item->boundingRect(); + eng_word_item->setDefaultTextColor(font_color); + + eng_word_item->setRotation(i == 0 ? 90 : -90); + eng_word_item->setPos(label_item->x() + x_offset - rect.height()/2.0, label_item->y() + y_offset + sp_y_offset + (rect.width()/2*dir)); + + + scene.addItem(eng_word_item); + } + + + + if ((idx % MAX_LABEL_IN_PAPER) == (MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("Birthday_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + saveToImage(file_name, &scene); + export_times++; + scene.clear(); + } + } + + + break; + case Name_zh_eng: + for (int idx = 0; idx < nameList.length(); idx++) { + + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = QGraphicsPixmapItem(QPixmap(BG_SMAPLE_PATH)); + scene.addItem(bg_item); + + } + NameInfo_t name_info = nameList.at(idx); + int col_index = idx % MAX_LABEL_IN_PAPER; + QString label_rel_path = label_bg_map[name_info.name2]; + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(int(LABEL_POS_START.x() + LABEL_POS_X_OFFSET * col_index), int(LABEL_POS_START.y())); + label_item->setOpacity(1); + scene.addItem(label_item); + + int chrismas_y_offset = 0; + if (name_info.name2.compare("co") == 0 || name_info.name2.compare("ol") == 0 || + name_info.name2.compare("st") == 0 || name_info.name2.compare("sn") == 0) { + chrismas_y_offset = 30; + } + + // add ZH word + int name_word_len = name_info.name1.length(); + qreal two_word_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET / 2 : 0; + qreal offset_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET : NAME_THREE_WORD_OFFSET; + + for (int w = 0; w < name_word_len; w++) { + QGraphicsTextItem* word_item = new QGraphicsTextItem(name_info.name1.at(w)); + word_item->setFont(font); + word_item->setDefaultTextColor(font_color); + word_item->setPos(label_item->x() + NAME_OFFSET_START.x(), label_item->y() + NAME_OFFSET_START.y() + two_word_y + chrismas_y_offset + offset_y * w); + scene.addItem(word_item); + } + + //TODO: add English world + QGraphicsTextItem* eng_word_item = new QGraphicsTextItem(name_info.name_eng); + QFont _new_font = QFont(EnglisthFont()); + _new_font.setWeight(QFont::ExtraLight); + int _new_size = getFontSizebyStr(_new_font, 120, 480, name_info.name_eng); + _new_font.setPixelSize(_new_size); + + eng_word_item->setFont(_new_font); + QRectF rect = eng_word_item->boundingRect(); + eng_word_item->setDefaultTextColor(font_color); + + eng_word_item->setRotation(-90); + eng_word_item->setPos(label_item->x() + 170.0 - rect.height()/2.0, label_item->y() + 1580 - chrismas_y_offset + rect.width()/2); + scene.addItem(eng_word_item); + + + if ((idx % MAX_LABEL_IN_PAPER) == (MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("Birthday_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + 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(); + +} diff --git a/NameCreater/BirthdayCreater.h b/NameCreater/BirthdayCreater.h new file mode 100644 index 0000000..bac5c44 --- /dev/null +++ b/NameCreater/BirthdayCreater.h @@ -0,0 +1,19 @@ +#pragma once +#include "INameCreater.h" +#include +class BirthdayCreater : public INameCreater +{ +public: + BirthdayCreater(); + ~BirthdayCreater(); + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); +public: + virtual void generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color); + + +private: + QMap label_bg_map; +}; + diff --git a/NameCreater/FiveToSingle.cpp b/NameCreater/FiveToSingle.cpp new file mode 100644 index 0000000..e7d4dc5 --- /dev/null +++ b/NameCreater/FiveToSingle.cpp @@ -0,0 +1,369 @@ +#include "FiveToSingle.h" +#include +#include +#include +#include +#include + +#define BG_PATH_FORMAT ":/NameCreater/resource/background_%1.jpg" + +static QPointF BG_POS[] = { + QPointF(159, 61), QPointF(482, 61), QPointF(802, 61), + QPointF(1122, 61), QPointF(1449, 61), QPointF(1772, 61), + QPointF(2095, 61), QPointF(2414, 61), QPointF(2738, 61), + QPointF(3060, 61), QPointF(900, 2094), QPointF(900, 2420), +}; + +static int BG_POS_COUNT = sizeof(BG_POS) / sizeof(BG_POS[0]); + + +static QPointF NAME_POS[] = { + QPointF(240, 430), QPointF(372, 1402), + QPointF(564, 430), QPointF(694, 1402), + QPointF(883, 430), QPointF(1014, 1402), + QPointF(1205, 430), QPointF(1337, 1402), + QPointF(1532, 430), QPointF(1663, 1402), + QPointF(1854, 430), QPointF(1987, 1402), + QPointF(2176, 430), QPointF(2309, 1402), + QPointF(2498, 430), QPointF(2629, 1402), + QPointF(2821, 430), QPointF(2952, 1402), + QPointF(3145, 430), QPointF(3276, 1402), + QPointF(1268, 2012), QPointF(2240, 1880), + QPointF(1268, 2334), QPointF(2240, 2202), +}; + +static QPointF NAME_POS_NUMBER[] = { + QPointF(240, 370), QPointF(372, 1442), + QPointF(564, 370), QPointF(694, 1442), + QPointF(883, 370), QPointF(1014, 1442), + QPointF(1205, 370), QPointF(1337, 1442), + QPointF(1532, 370), QPointF(1663, 1442), + QPointF(1854, 370), QPointF(1987, 1442), + QPointF(2176, 370), QPointF(2309, 1442), + QPointF(2498, 370), QPointF(2629, 1442), + QPointF(2821, 370), QPointF(2952, 1442), + QPointF(3145, 370), QPointF(3276, 1442), + QPointF(1228, 2012), QPointF(2280, 1880), + QPointF(1228, 2334), QPointF(2280, 2202), +}; + +static QPointF NEW_POS = QPoint(81, 320); + +//static int NAME_POS_COUNT = sizeof(NAME_POS) / sizeof(NAME_POS[0]); + +FiveToSingle::FiveToSingle() :INameCreater() +{ + + +} + +FiveToSingle::~FiveToSingle() +{ +} + +QList FiveToSingle::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); + bg_type = csvList.at(1); + + break; + case Name_zh_eng: + name = csvList.at(0); + eng_name = csvList.at(1); + bg_type = csvList.at(2); + + break; + case Name_eng: + eng_name = csvList.at(0); + bg_type = csvList.at(1); + default: + break; + + } + + qDebug() << "row :" << row << " " << name << ", eng: " << eng_name << ", bg_type: " << bg_type; + + if (name.compare("name_1") == 0 || eng_name.compare("eng_name") == 0) { + //pass first line + continue; + } + + info.name1 = name; + info.name_eng = eng_name; + info.name2 = QString(BG_PATH_FORMAT).arg(bg_type); + + nameList.append(info); + + row++; + } + return nameList; +} + +void FiveToSingle::generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color) +{ + int export_times = 0; + + QList nameList = getNameByFileContent(type, filecontent); + if (nameList.isEmpty()) { + QMessageBox msgBox; + msgBox.setText(QString("Name is empty ! ").append(filename)); + msgBox.exec(); + } + + QGraphicsScene scene; + scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); + QGraphicsView view(&scene); + + + + /*QImage image(BG_SAMPLE_PATH); + QGraphicsPixmapItem* bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(image)); + scene.addItem(bgItem);*/ + + + switch (type) { + case Name_zh: + { + for (int n = 0; n < nameList.length(); n++) { + int idx = n % BG_POS_COUNT; + NameInfo_t name_info = nameList.at(n); + QImage name_image(name_info.name2); + 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); + } + + + QGraphicsPixmapItem* name_bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(name_image)); + bool rot = (idx == 10 || idx == 11); + name_bgItem->setRotation(rot ? -90 : 0); + name_bgItem->setPos(BG_POS[idx]); + 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(); + } + QString name = name_info.name1; + int name_len = name.length(); + for (int j = 0; j < 2; j++) { + int pos_idx = idx * 2 + j; + qreal xscale, yscale; + + xscale = yscale = (j == 1) ? -1 : 1; + QPointF pos = name_info.is_number_bg ? NAME_POS_NUMBER[pos_idx] : NAME_POS_NUMBER[pos_idx]; + qreal y_offset[2] = { 0 }; + if (name_len == 2) { + if (!rot) { + pos.setY(pos.y() + 82.0 * xscale); + } + else { + pos.setX(pos.x() + 82.0 * xscale); + + } + + y_offset[0] = 25; + } + + QGraphicsTextItem* textItem1 = new QGraphicsTextItem(name.mid(0, 1)); + textItem1->setFont(font); + textItem1->setDefaultTextColor(font_color); + if (!rot) { + textItem1->setPos(pos); + textItem1->setTransform(QTransform::fromScale(xscale, yscale)); + } + else { + textItem1->setPos(pos); + textItem1->setRotation(-90); + textItem1->setTransform(QTransform::fromScale(xscale, yscale)); + } + + + scene.addItem(textItem1); + + QGraphicsTextItem* textItem2 = new QGraphicsTextItem(name.mid(1, 1)); + textItem2->setFont(font); + textItem2->setDefaultTextColor(font_color); + if (!rot) { + + textItem2->setPos(pos.x(), pos.y() + (145 + y_offset[0]) * xscale); + textItem2->setTransform(QTransform::fromScale(xscale, yscale)); + } + else { + textItem2->setPos(pos.x() + (145 + y_offset[0]) * xscale, pos.y()); + textItem2->setRotation(-90); + textItem2->setTransform(QTransform::fromScale(xscale, yscale)); + } + + scene.addItem(textItem2); + + if (name_len > 2) { + QGraphicsTextItem* textItem3 = new QGraphicsTextItem(name.mid(2, 1)); + textItem3->setFont(font); + textItem3->setDefaultTextColor(font_color); + if (!rot) { + textItem3->setPos(pos.x(), pos.y() + 290 * xscale); + textItem3->setTransform(QTransform::fromScale(xscale, yscale)); + } + else { + textItem3->setPos(pos.x() + 290 * xscale, pos.y()); + textItem3->setRotation(-90); + textItem3->setTransform(QTransform::fromScale(xscale, yscale)); + } + + scene.addItem(textItem3); + } + + + } + bool is_export_page = ((idx + 1) % BG_POS_COUNT == 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); + export_times++; + + scene.clear(); + } + } + } + break; + case Name_zh_eng: + { + QFont _new_font = QFont(this->EnglisthFont()); + _new_font.setWeight(QFont::ExtraLight); + + for (int n = 0; n < nameList.length(); n++) { + int idx = n % BG_POS_COUNT; + NameInfo_t name_info = nameList.at(n); + QImage name_image(name_info.name2); + 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); + } + + + QGraphicsPixmapItem* name_bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(name_image)); + bool rot = (idx == 10 || idx == 11); + name_bgItem->setRotation(rot ? -90 : 0); + name_bgItem->setPos(BG_POS[idx]); + 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(); + } + QString name = name_info.name1; + int name_len = name.length(); + for (int j = 0; j < 2; j++) { + int pos_idx = idx * 2 + j; + QPointF pos = NEW_POS; + if (j == 0) { + qreal xscale, yscale; + xscale = yscale = 1; + + qreal y_offset[2] = { 0 }; + if (name_len == 2) { + pos.setY(pos.y() + 82.0 * xscale); + y_offset[0] = 25; + } + + QGraphicsTextItem* textItem1 = new QGraphicsTextItem(name.mid(0, 1), name_bgItem); + textItem1->setFont(font); + textItem1->setDefaultTextColor(font_color); + textItem1->setPos(pos); + textItem1->setTransform(QTransform::fromScale(xscale, yscale)); + + //scene.addItem(textItem1); + QGraphicsTextItem* textItem2 = new QGraphicsTextItem(name.mid(1, 1), name_bgItem); + textItem2->setFont(font); + textItem2->setDefaultTextColor(font_color); + textItem2->setPos(pos.x(), pos.y() + (145 + y_offset[0]) * xscale); + textItem2->setTransform(QTransform::fromScale(xscale, yscale)); + + + if (name_len > 2) { + QGraphicsTextItem* textItem3 = new QGraphicsTextItem(name.mid(2, 1), name_bgItem); + textItem3->setFont(font); + textItem3->setDefaultTextColor(font_color); + textItem3->setPos(pos.x(), pos.y() + 290 * xscale); + textItem3->setTransform(QTransform::fromScale(xscale, yscale)); + + } + } + else if (j == 1) { + //TODO: add English world + QGraphicsTextItem* eng_word_item = new QGraphicsTextItem(name_info.name_eng, name_bgItem); + + + int _new_size = getFontSizebyStr(_new_font, 120, 480, name_info.name_eng); + _new_font.setPixelSize(_new_size); + + eng_word_item->setFont(_new_font); + eng_word_item->adjustSize(); + + QRectF rect = eng_word_item->boundingRect(); + eng_word_item->setDefaultTextColor(font_color); + + + eng_word_item->setRotation(-90); + // the position export from web is different. + eng_word_item->setPos((name_bgItem->boundingRect().width()/2 - rect.height()/2)+20, 1230 + rect.width() / 2); + + + } + + } + bool is_export_page = ((idx + 1) % BG_POS_COUNT == 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); + export_times++; + + scene.clear(); + } + } + + } + break; + + default: + break; + } + + + + + + QMessageBox msgBox; + msgBox.setText(QString().asprintf("Export Finshed. Count:%d", export_times)); + msgBox.exec(); + +} diff --git a/NameCreater/FiveToSingle.h b/NameCreater/FiveToSingle.h new file mode 100644 index 0000000..35e2a88 --- /dev/null +++ b/NameCreater/FiveToSingle.h @@ -0,0 +1,15 @@ +#pragma once +#include "INameCreater.h" +class FiveToSingle : public INameCreater +{ +public: + FiveToSingle(); + ~FiveToSingle(); + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); +public: + virtual void generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color); + +}; + diff --git a/NameCreater/HKHolderCreater.cpp b/NameCreater/HKHolderCreater.cpp new file mode 100644 index 0000000..a7e4788 --- /dev/null +++ b/NameCreater/HKHolderCreater.cpp @@ -0,0 +1,313 @@ +#include "HKHolderCreater.h" +#include +#include +#include +#include +#include +#include + +#define HK_BG_WIDTH 2482 +#define HK_BG_HEIGH 3509 + +#define MAX_COL_IN_ROW 7 +#define MAX_LABEL_IN_PAPER 14 + +#define NAME_TWO_WORD_OFFSET 90.0 +#define NAME_THREE_WORD_OFFSET 82.0 + +#define NAME_TWO_EXT_Y 20.0 +#define NAME_TWO_EXT_REV_Y 23.0 + +static qreal row_x_offset = 132; +static qreal row_x_gap = 320; +static qreal row_y_offset[] = { 105 , 1615 }; + +static QPoint NAME_OFFSET_START = QPoint(92, 413); +static QPoint NAME_OFFSET_REVERSE_START = QPoint(179, 1030); + +HKHolderCreater::HKHolderCreater() : INameCreater() +{ + label_bg_map["a"] = ":/NameCreater/resource/hk_holder/a.jpg"; + label_bg_map["b"] = ":/NameCreater/resource/hk_holder/b.jpg"; + label_bg_map["m"] = ":/NameCreater/resource/hk_holder/m.jpg"; + label_bg_map["g"] = ":/NameCreater/resource/hk_holder/g.jpg"; + label_bg_map["st"] = ":/NameCreater/resource/hk_holder/st.jpg"; + label_bg_map["w"] = ":/NameCreater/resource/hk_holder/w.jpg"; + label_bg_map["p"] = ":/NameCreater/resource/hk_holder/p.jpg"; + label_bg_map["pg"] = ":/NameCreater/resource/hk_holder/pg.jpg"; + label_bg_map["r"] = ":/NameCreater/resource/hk_holder/r.jpg"; + label_bg_map["y"] = ":/NameCreater/resource/hk_holder/y.jpg"; + +} + +HKHolderCreater::~HKHolderCreater() +{ +} + +QList HKHolderCreater::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); + bg_type = csvList.at(1); + + break; + case Name_zh_eng: + /*name = csvList.at(0); + eng_name = csvList.at(1); + bg_type = csvList.at(2);*/ + + break; + case Name_eng: + //eng_name = csvList.at(0); + //bg_type = csvList.at(1); + default: + break; + + } + + qDebug() << "row :" << row << " " << name << ", eng: " << eng_name << ", bg_type: " << bg_type; + + if (name.compare("name") == 0 || eng_name.compare("eng_name") == 0) { + //pass first line + continue; + } + + info.name1 = name; + info.name_eng = eng_name; + info.name2 = bg_type; + + nameList.append(info); + + row++; + } + return nameList; +} + +void HKHolderCreater::generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color) +{ + int export_times = 0; + + + QList nameList = getNameByFileContent(type, filecontent); + if (nameList.isEmpty()) { + QMessageBox msgBox; + msgBox.setText(QString("Name is empty ! ").append(filename)); + msgBox.exec(); + } + + QGraphicsScene scene; + scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); + QGraphicsView view(&scene); + + switch (type) + + { + case Name_zh: + for (int idx = 0; idx < nameList.length(); idx++) { + + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, HK_BG_WIDTH, HK_BG_HEIGH); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = new QGraphicsPixmapItem(QPixmap(":/NameCreater/resource/hk_holder/sample.jpg")); + scene.addItem(bg_item); + + } + + int re_idx, row_idx, col_idx; + re_idx = idx % MAX_LABEL_IN_PAPER; + row_idx = re_idx / MAX_COL_IN_ROW; + col_idx = re_idx % MAX_COL_IN_ROW; + + NameInfo_t name_info = nameList.at(idx); + QString label_rel_path = label_bg_map[name_info.name2]; + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(qreal(row_x_offset + col_idx* row_x_gap), row_y_offset[row_idx]); + //label_item->setOpacity(0.5); + scene.addItem(label_item); + + + + for (int i = 0; i < 2; i++) { + int name_word_len = name_info.name1.length(); + qreal two_word_y = (name_word_len == 2) ? NAME_TWO_EXT_Y : 0; + qreal two_word_rev_y = (name_word_len == 2) ? NAME_TWO_EXT_REV_Y : 0; + qreal offset_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET : NAME_THREE_WORD_OFFSET; + + for (int w = 0; w < name_word_len; w++) { + QGraphicsTextItem* word_item = new QGraphicsTextItem(name_info.name1.at(w)); + word_item->setFont(font); + word_item->setDefaultTextColor(font_color); + if (i == 0) { + word_item->setPos(label_item->x() + NAME_OFFSET_START.x(), label_item->y() + NAME_OFFSET_START.y() + two_word_y + offset_y * w); + } + else { + word_item->setTransform(QTransform().fromScale(-1, -1)); + word_item->setPos(label_item->x() + NAME_OFFSET_REVERSE_START.x(), label_item->y() + NAME_OFFSET_REVERSE_START.y() - two_word_rev_y - offset_y * w); + } + scene.addItem(word_item); + } + + } + + if ((idx % MAX_LABEL_IN_PAPER) == (MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("HK_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + saveToImage(file_name, &scene); + export_times++; + + scene.clear(); + } + } + break; + /* + case Name_eng: + for (int idx = 0; idx < nameList.length(); idx++) { + + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = QGraphicsPixmapItem(QPixmap(BG_SMAPLE_PATH)); + scene.addItem(bg_item); + + } + NameInfo_t name_info = nameList.at(idx); + int col_index = idx % MAX_LABEL_IN_PAPER; + QString label_rel_path = label_bg_map[name_info.name2]; + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(int(LABEL_POS_START.x() + LABEL_POS_X_OFFSET * col_index), int(LABEL_POS_START.y())); + label_item->setOpacity(1); + scene.addItem(label_item); + + int chrismas_y_offset = 0; + if (name_info.name2.compare("co") == 0 || name_info.name2.compare("ol") == 0 || + name_info.name2.compare("st") == 0 || name_info.name2.compare("sn") == 0) { + chrismas_y_offset = 30; + } + + + QFont _new_font = QFont(EnglisthFont()); + _new_font.setWeight(QFont::ExtraLight); + int _new_size = getFontSizebyStr(_new_font, 120, 480, name_info.name_eng); + _new_font.setPixelSize(_new_size); + + for (int i = 0; i < 2; i++) { + qreal dir = (i == 0) ? -1.0 : 1.0; + qreal x_offset = (i == 0) ? 290.0 : 170.0; + qreal y_offset = (i == 0) ? 780.0 : 1580.0; + chrismas_y_offset = (i == 0) ? 1.0 * chrismas_y_offset : -1.0 * chrismas_y_offset; + //add English world + QGraphicsTextItem* eng_word_item = new QGraphicsTextItem(name_info.name_eng); + eng_word_item->setFont(_new_font); + QRectF rect = eng_word_item->boundingRect(); + eng_word_item->setDefaultTextColor(font_color); + + eng_word_item->setRotation(i == 0 ? 90 : -90); + eng_word_item->setPos(label_item->x() + x_offset - rect.height() / 2.0, label_item->y() + y_offset + chrismas_y_offset + (rect.width() / 2 * dir)); + scene.addItem(eng_word_item); + } + + + + if ((idx % MAX_LABEL_IN_PAPER) == (MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("Birthday_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + saveToImage(file_name, &scene); + export_times++; + scene.clear(); + } + } + + + break; + case Name_zh_eng: + for (int idx = 0; idx < nameList.length(); idx++) { + + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = QGraphicsPixmapItem(QPixmap(BG_SMAPLE_PATH)); + scene.addItem(bg_item); + + } + NameInfo_t name_info = nameList.at(idx); + int col_index = idx % MAX_LABEL_IN_PAPER; + QString label_rel_path = label_bg_map[name_info.name2]; + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(int(LABEL_POS_START.x() + LABEL_POS_X_OFFSET * col_index), int(LABEL_POS_START.y())); + label_item->setOpacity(1); + scene.addItem(label_item); + + int chrismas_y_offset = 0; + if (name_info.name2.compare("co") == 0 || name_info.name2.compare("ol") == 0 || + name_info.name2.compare("st") == 0 || name_info.name2.compare("sn") == 0) { + chrismas_y_offset = 30; + } + + // add ZH word + int name_word_len = name_info.name1.length(); + qreal two_word_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET / 2 : 0; + qreal offset_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET : NAME_THREE_WORD_OFFSET; + + for (int w = 0; w < name_word_len; w++) { + QGraphicsTextItem* word_item = new QGraphicsTextItem(name_info.name1.at(w)); + word_item->setFont(font); + word_item->setDefaultTextColor(font_color); + word_item->setPos(label_item->x() + NAME_OFFSET_START.x(), label_item->y() + NAME_OFFSET_START.y() + two_word_y + chrismas_y_offset + offset_y * w); + scene.addItem(word_item); + } + + //TODO: add English world + QGraphicsTextItem* eng_word_item = new QGraphicsTextItem(name_info.name_eng); + QFont _new_font = QFont(EnglisthFont()); + _new_font.setWeight(QFont::ExtraLight); + int _new_size = getFontSizebyStr(_new_font, 120, 480, name_info.name_eng); + _new_font.setPixelSize(_new_size); + + eng_word_item->setFont(_new_font); + QRectF rect = eng_word_item->boundingRect(); + eng_word_item->setDefaultTextColor(font_color); + + eng_word_item->setRotation(-90); + eng_word_item->setPos(label_item->x() + 170.0 - rect.height() / 2.0, label_item->y() + 1580 - chrismas_y_offset + rect.width() / 2); + scene.addItem(eng_word_item); + + + if ((idx % MAX_LABEL_IN_PAPER) == (MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("Birthday_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + 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(); +} diff --git a/NameCreater/HKHolderCreater.h b/NameCreater/HKHolderCreater.h new file mode 100644 index 0000000..fae2d1e --- /dev/null +++ b/NameCreater/HKHolderCreater.h @@ -0,0 +1,20 @@ +#pragma once +#include "INameCreater.h" +#include +class HKHolderCreater : + public INameCreater +{ +public: + HKHolderCreater(); + ~HKHolderCreater(); + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); +public: + virtual void generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color); + +private: + QMap label_bg_map; + +}; + diff --git a/NameCreater/INameCreater.cpp b/NameCreater/INameCreater.cpp new file mode 100644 index 0000000..fd35cf1 --- /dev/null +++ b/NameCreater/INameCreater.cpp @@ -0,0 +1,179 @@ +#include "INameCreater.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BG_PATH_FORMAT ":/NameCreater/resource/background_%1.jpg" + +INameCreater::INameCreater() +{ +} + +INameCreater::~INameCreater() +{ +} + +void INameCreater::saveToImage(const QString& filename, QGraphicsScene* scene) +{ + scene->clearSelection(); // Selections would also render to the file + scene->setSceneRect(scene->itemsBoundingRect()); // Re-shrink the scene to it's bounding contents + QImage image(scene->sceneRect().size().toSize(), QImage::Format_ARGB32); // Create the image with the exact size of the shrunk scene + image.fill(Qt::transparent); // Start all pixels transparent + int dpm = 300 / 0.0254; // ~300 DPI + image.setDotsPerMeterX(dpm); + image.setDotsPerMeterY(dpm); + + + QPainter painter(&image); + scene->render(&painter); + + + +#ifdef Q_OS_MAC + QString folder_name = QCoreApplication::applicationDirPath() + "/../../../export_" + QDateTime::currentDateTime().toString("yyyyMMdd"); + qDebug() << "app director path" < INameCreater::getNameByFile(Name_Type_e type, const QString& filename) +{ + QList nameList; + +#ifdef Q_OS_MAC + QString root_path = QCoreApplication::applicationDirPath() + "/../../../"; +#else + QString root_path = "";//QCoreApplication::applicationDirPath() + "/"; +#endif + + + QFile file(filename); + + if (!file.open(QIODevice::ReadOnly)) { + QMessageBox msgBox; + msgBox.setText(QString("Load file failed!").append(filename)); + msgBox.exec(); + file.close(); + return nameList; + } + + int row = 0; + QTextCodec* tc = QTextCodec::codecForName("Big5"); + while (!file.atEnd()) + { + NameInfo_t info; + QByteArray line = file.readLine(); + + QString name_tc = tc->toUnicode(line); + QStringList csvList = name_tc.split(','); + + + QString name1 = csvList.at(0); + QString type_str = csvList.last();//QString::fromLocal8Bit(csvList.last()); + qDebug() << "row :" << row << " " << name1; + + type_str = type_str.remove(QRegularExpression("\r")); + type_str = type_str.remove(QRegularExpression("\n")); + + + + if (name1.compare("name_1") == 0) { + continue; + } + + info.name1 = name1; + info.bg_path = QString(BG_PATH_FORMAT).arg(type_str); + info.is_number_bg = type_str[0].isDigit(); + + nameList.append(info); + + row++; + } + file.close(); + return nameList; +} + +QList INameCreater::getNameByFileContent(Name_Type_e type, const QByteArray& conetent) +{ + (void)type; + 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 name1 = csvList.at(0); + QString type_str = csvList.last();//QString::fromLocal8Bit(csvList.last()); + qDebug() << "row :" << row << " " << name1; + + type_str = type_str.remove(QRegularExpression("\r")); + type_str = type_str.remove(QRegularExpression("\n")); + + + + if (name1.compare("name_1") == 0) { + continue; + } + + info.name1 = name1; + info.bg_path = QString(BG_PATH_FORMAT).arg(type_str); + info.is_number_bg = type_str[0].isDigit(); + + nameList.append(info); + + row++; + } + return nameList; +} + +void INameCreater::generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color) +{ +} + +int INameCreater::getFontSizebyStr(const QFont& font, int max_font_size,int max_label_width, const QString& str) +{ + QFont _font(font); + int font_size = max_font_size; + while (font_size > 10) { + _font.setPixelSize(font_size); + QFontMetrics fm(_font); + if (fm.horizontalAdvance(str) <= max_label_width) return font_size; + font_size--; + } + + return font_size; +} diff --git a/NameCreater/INameCreater.h b/NameCreater/INameCreater.h new file mode 100644 index 0000000..9336499 --- /dev/null +++ b/NameCreater/INameCreater.h @@ -0,0 +1,52 @@ +#pragma once +#include +#include +#include +#include +#include + +#define BG_WIDTH 3508 +#define BG_HEIGHT 2481 + + + +struct NameInfo_t { + QString name1; + QString name2; + QString name_eng; + QString bg_path; + bool is_number_bg; + int bg_type; +}; + +enum Name_Type_e { + Name_zh = 0, + Name_eng, + Name_zh_eng +}; + +class INameCreater : public QObject { +public: + INameCreater(); + ~INameCreater(); + + void setEnglishFont(const QFont& font) { + eng_Font = QFont(font); + } + + QFont EnglisthFont() const { + return eng_Font; + } + void saveToImage(const QString& filename, QGraphicsScene* scene); +protected: + + QList getNameByFile(Name_Type_e type, const QString& filename); + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); + + virtual void generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color); + int getFontSizebyStr(const QFont& font, int max_font_size, int max_label_width, const QString& str); +private: + + QFont eng_Font; + +}; diff --git a/NameCreater/NameCreater.cpp b/NameCreater/NameCreater.cpp index 37eb9ab..b35340f 100644 --- a/NameCreater/NameCreater.cpp +++ b/NameCreater/NameCreater.cpp @@ -1,12 +1,318 @@ +#include "def.h" #include "NameCreater.h" #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -NameCreater::NameCreater(QWidget *parent) - : QMainWindow(parent) + +#include "FiveToSingle.h" +#include "BirthdayCreater.h" +#include "TowelCreater.h" +#include "NewFiveCreater.h" +#include "HKHolderCreater.h" +#include "customlogo.h" +#include "customlogo2.h" + + +#define TOWEL_FONT_PATH ":/NameCreater/_exp/W1.ttc" +#define ENGLISH_FONT_PATH ":/NameCreater/_exp/FontsFree-Net-Acumin-Pro-Semibold.ttf" + +#define FONT_SIZE 120 + +//#define FONT_CHT_URL "https://bazaar1688.ddns.net/font/TaiwanPearl-SemiBold.ttf" + +#define FONT_JSON_URL "https://bazaar1688.ddns.net/font/fonts.json" + +//#define FONT_CHT_URL "http://45.32.51.135/font/TaiwanPearl-SemiBold.ttf" + +NameCreater::NameCreater(QWidget* parent) + : QMainWindow(parent) { - ui.setupUi(this); - - - qDebug() << ui.label->font().family(); + ui.setupUi(this); + + + ui.scrollAreaWidgetContents->setMinimumSize(ui.frame->size()); + + connect(ui.fivesingle_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + //connect(ui.fiveold_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.birthday_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.towel_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.fivenew_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.birthday_zh_eng_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.birthday_eng_eng_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.handkerchief_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.fivesingle_zh_eng_btn, &QPushButton::released, this, &NameCreater::OnClickedReadBtn); + connect(ui.customlogo_btn, &QPushButton::released, this, &NameCreater::OnClickedCustomLogoBtn); + connect(ui.customlogo2_btn, &QPushButton::released, this, &NameCreater::OnClickedCustomLogo2Btn); + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + connect(ui.font_comboBox, &QComboBox::currentTextChanged, this, &NameCreater::OnFontComboBoxTextChanged); +#else + connect(ui.font_comboBox, &QComboBox::currentIndexChanged, this, &NameCreater::OnFontComboBoxIndexChanged); +#endif + //qDebug()<<"QSslSocket="<clear(); + QJsonArray jsonArray = jsonDoc.array(); + + foreach(auto val, jsonArray) { + auto obj = val.toObject(); + QString n = obj["font_name"].toString(); + QString u = obj["font_url"].toString(); + ui.font_comboBox->addItem(n, u); + } + + // Process the JSON array + qDebug() << "JSON Array:" << jsonArray; + + + + + } + + +} + +void NameCreater::query(const QUrl& url, int type) +{ + QNetworkRequest req(url); + req.setAttribute(QNetworkRequest::User, QVariant(type)); + network_mgr.get(req); + + +} + +void NameCreater::loadFont(const QByteArray& fontdata) { + + int id = QFontDatabase::addApplicationFontFromData(fontdata); + QStringList family_list = QFontDatabase::applicationFontFamilies(id); + qDebug() << "font family list:" << family_list; + QString cht_fontname = family_list.at(0); + + font = QFont(cht_fontname); + font.setPixelSize(FONT_SIZE); + + QString font_path = QString(TOWEL_FONT_PATH); + QFile font_res_towel(font_path); + if (!font_res_towel.open(QIODevice::ReadOnly)) { + QMessageBox msgBox; + msgBox.setText("Can not load font file!" + font_path); + msgBox.exec(); + font_res_towel.close(); + } + + id = QFontDatabase::addApplicationFontFromData(font_res_towel.readAll()); + font_towel = QFont(QFontDatabase::applicationFontFamilies(id).at(0)); + font_towel.setPixelSize(240); + font_towel.setLetterSpacing(QFont::PercentageSpacing, 42); + + + font_path = QString(ENGLISH_FONT_PATH); + QFile font_res_eng(font_path); + if (!font_res_eng.open(QIODevice::ReadOnly)) { + QMessageBox msgBox; + msgBox.setText("Can not load font file!" + font_path); + msgBox.exec(); + font_res_eng.close(); + } + + id = QFontDatabase::addApplicationFontFromData(font_res_eng.readAll()); + font_english = QFont(QFontDatabase::applicationFontFamilies(id).at(0)); + + + font_color = QColor(0, 0, 0); + + QFont tital_font = QFont(font); + tital_font.setPixelSize(20); + + QFont version_font = QFont(font); + version_font.setPixelSize(12); + + //ui.tital_label->setFont(tital_font); + + char c_font_name[64] = { 0 }; + sprintf(c_font_name, "%s", cht_fontname.toStdString().c_str()); + ui.font_name_label->setFont(version_font); + ui.font_name_label->setText(QString::fromLocal8Bit(c_font_name)); + + ui.version_label->setFont(version_font); + ui.version_label->setText(VERSION); + ui.font_comboBox->setFont(version_font); + + QList titals = findChildren(QRegularExpression("tital_label")); + foreach(auto tital, titals) { + tital->setFont(tital_font); + } + + qDebug() << "Load Font Succeed!"; + +} + + +void NameCreater::OnClickedReadBtn() { + auto sender = (QPushButton*)QObject::sender(); + +#ifdef Q_OS_WASM + + auto fileContentReady = [this, sender](const QString& fileName, const QByteArray& fileContent) { + if (!fileName.isEmpty()) { + this->execCreater(sender, fileName, fileContent); + } + + }; + QFileDialog::getOpenFileContent("CSV (*.csv)", fileContentReady); + +#else + QString filename = QFileDialog::getOpenFileName(nullptr, "Open Name File", QDir::currentPath(), "CSV file(*.csv)"); + if (!filename.isEmpty()) { + QFile _f(filename); + if (_f.open(QIODevice::ReadOnly)) { + execCreater(sender, filename, _f.readAll()); + } + } +#endif +} + +void NameCreater::execCreater(QObject* sender, const QString& fileName, const QByteArray& fileContent) { + + + // Use fileName and fileContent + if (sender == ui.fivesingle_btn) FiveToSingle().generaImageFromCSV(Name_Type_e::Name_zh, fileName, fileContent, this->font, this->font_color); + + if (sender == ui.birthday_btn) BirthdayCreater().generaImageFromCSV(Name_Type_e::Name_zh, fileName, fileContent, this->font, this->font_color); + if (sender == ui.fivenew_btn) NewFiveCreater().generaImageFromCSV(Name_Type_e::Name_zh, fileName, fileContent, this->font, this->font_color); + if (sender == ui.towel_btn) TowelCreater().generaImageFromCSV(Name_Type_e::Name_zh, fileName, fileContent, this->font_towel, this->font_color); + if (sender == ui.birthday_zh_eng_btn) { + BirthdayCreater creater; + creater.setEnglishFont(font_english); + creater.generaImageFromCSV(Name_Type_e::Name_zh_eng, fileName, fileContent, this->font, this->font_color); + } + if (sender == ui.birthday_eng_eng_btn) { + BirthdayCreater b; + b.setEnglishFont(font_english); + b.generaImageFromCSV(Name_Type_e::Name_eng, fileName, fileContent, this->font, this->font_color); + } + if (sender == ui.handkerchief_btn) { + QFont newFont(font); + newFont.setPixelSize(78); + QColor newColor(0, 0, 0); + HKHolderCreater().generaImageFromCSV(Name_Type_e::Name_zh, fileName, fileContent, newFont, newColor); + } + if (sender == ui.fivesingle_zh_eng_btn) { + FiveToSingle f; + f.setEnglishFont(this->font_english); + f.generaImageFromCSV(Name_Type_e::Name_zh_eng, fileName, fileContent, this->font, this->font_color); + return; + } + +} + + + +void NameCreater::OnClickedCustomLogoBtn() { + QEventLoop loop; + CustomLogo widget(&this->font); + widget.show(); + connect(&widget, &CustomLogo::finished, &loop, &QEventLoop::quit); + loop.exec(); + qDebug() << "exit event loop"; + +} + +void NameCreater::OnClickedCustomLogo2Btn() { + QEventLoop loop; + customlogo2 widget(&this->font); + connect(&widget, &CustomLogo::finished, &loop, &QEventLoop::quit); + widget.show(); + loop.exec(); +} + +void NameCreater::onFontDownloadFinished(QNetworkReply* reply) { + + if (reply->error() == QNetworkReply::NoError) { + QString url = reply->request().url().toString(); + int attri = reply->request().attribute(QNetworkRequest::User).toInt(); + + qDebug() << "req url:" << url << "attribi:" << QString::number(attri); + + if (url.contains("fonts.json") || attri == 10 || query_type == 10) { + qDebug() << "query fonts json succeed"; + parseFontJson(reply->readAll()); + + }else if (url.contains(".ttf") || url.contains(".otf") || attri == 20 || query_type == 20) { + qDebug() << "query font family succeed"; + loadFont(reply->readAll()); + } + + } + else { + + QMessageBox msgBox; + msgBox.setText("Can not load font file!" + reply->errorString()); + msgBox.exec(); + reply->deleteLater(); + + + return; + } + +} + +void NameCreater::OnFontComboBoxTextChanged(const QString& str) +{ + QComboBox* sender = (QComboBox*)QObject::sender(); + QString u = sender->currentData().toString(); + query_type = 20; + query(QUrl(u),20); +} + +void NameCreater::OnFontComboBoxIndexChanged(int idx) +{ + QComboBox* sender = (QComboBox*)QObject::sender(); + QString u = sender->currentData().toString(); + query_type = 20; + query(QUrl(u),20); +} + + + + diff --git a/NameCreater/NameCreater.h b/NameCreater/NameCreater.h index 75afe71..c6d194e 100644 --- a/NameCreater/NameCreater.h +++ b/NameCreater/NameCreater.h @@ -3,13 +3,46 @@ #include #include "ui_NameCreater.h" +#include +#include +#include + + + + + class NameCreater : public QMainWindow { Q_OBJECT public: NameCreater(QWidget *parent = Q_NULLPTR); + ~NameCreater(); private: Ui::NameCreaterClass ui; + + + QFont font, font_towel, font_english; + + QColor font_color; + + QNetworkAccessManager network_mgr; + int query_type; + + void query(const QUrl& url, int type = -1); + + void loadFont(const QByteArray& fontdata); + void execCreater(QObject*sender, const QString&fileName, const QByteArray &fileContent); + void parseFontJson(const QByteArray& data); + + private Q_SLOTS: + void OnClickedReadBtn(); + void OnClickedCustomLogoBtn(); + void OnClickedCustomLogo2Btn(); + void onFontDownloadFinished(QNetworkReply *reply); + + void OnFontComboBoxTextChanged(const QString& str); + void OnFontComboBoxIndexChanged(int idx); + }; diff --git a/NameCreater/NameCreater.pri b/NameCreater/NameCreater.pri index c0e878e..cc7b00f 100644 --- a/NameCreater/NameCreater.pri +++ b/NameCreater/NameCreater.pri @@ -7,8 +7,31 @@ message("You are running qmake on a generated .pro file. This may not work!") -HEADERS += ./NameCreater.h +HEADERS += ./resource.h \ + $$PWD/def.h \ + ./NameCreater.h \ + ./BirthdayCreater.h \ + ./FiveToSingle.h \ + ./INameCreater.h \ + ./OldFiveCreater.h \ + ./TowelCreater.h \ + ./NewFiveCreater.h \ + ./HKHolderCreater.h \ + ./customlogo.h \ + ./customlogo2.h + SOURCES += ./NameCreater.cpp \ - ./main.cpp -FORMS += ./NameCreater.ui -RESOURCES += ./NameCreater.qrc + ./main.cpp \ + ./BirthdayCreater.cpp \ + ./OldFiveCreater.cpp \ + ./FiveToSingle.cpp \ + ./INameCreater.cpp \ + ./TowelCreater.cpp \ + ./NewFiveCreater.cpp \ + ./HKHolderCreater.cpp \ + ./customlogo.cpp \ + ./customlogo2.cpp +FORMS += ./NameCreater.ui \ + ./customlogo.ui \ + ./customlogo2.ui +RESOURCES += NameCreater.qrc diff --git a/NameCreater/NameCreater.pro b/NameCreater/NameCreater.pro index 6594743..ab6097b 100644 --- a/NameCreater/NameCreater.pro +++ b/NameCreater/NameCreater.pro @@ -1,8 +1,10 @@ QT += core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets network +greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat + +CONFIG += c++11 resources_big -CONFIG += c++11 # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. @@ -17,5 +19,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target +wasm-emscripten{ + QMAKE_LFLAGS+= -s TOTAL_MEMORY=67108864 + QMAKE_LFLAGS += -s ALLOW_MEMORY_GROWTH=1 +} diff --git a/NameCreater/NameCreater.pro.user b/NameCreater/NameCreater.pro.user index 41d5092..9cab75f 100644 --- a/NameCreater/NameCreater.pro.user +++ b/NameCreater/NameCreater.pro.user @@ -1,10 +1,10 @@ - + EnvironmentId - {8bb291bd-a051-421c-ae4a-e741fd4db4a3} + {2e5b9b7d-86cb-4086-85fb-32be36077845} ProjectExplorer.Project.ActiveTarget @@ -37,6 +37,7 @@ true true 1 + 0 false true false @@ -54,6 +55,7 @@ *.md, *.MD, Makefile false true + true @@ -67,10 +69,14 @@ true true + false + 0 true - + + -fno-delayed-template-parsing + true Builtin.BuildSystem @@ -78,6 +84,7 @@ true Builtin.DefaultTidyAndClazy 2 + false @@ -88,17 +95,17 @@ ProjectExplorer.Project.Target.0 - Desktop - Desktop Qt 5.15.2 clang 64bit - Desktop Qt 5.15.2 clang 64bit - qt.qt5.5152.clang_64_kit - 1 - 0 + WebAssemblyDeviceType + QwbAssembly Qt 5.15.2 + QwbAssembly Qt 5.15.2 + {7751e2ea-88c1-4df7-b6c4-78f8275796e2} + 0 + -1 0 0 - /Users/shouchih_chen/Documents/namecreater/build-NameCreater-Desktop_Qt_5_15_2_clang_64bit-Debug - /Users/shouchih_chen/Documents/namecreater/build-NameCreater-Desktop_Qt_5_15_2_clang_64bit-Debug + C:\dev\namecreater\NameCreater\build\QwbAssembly_Qt_5_15_2-Debug + C:/dev/namecreater/NameCreater/build/QwbAssembly_Qt_5_15_2-Debug true @@ -136,8 +143,8 @@ 2 - /Users/shouchih_chen/Documents/namecreater/build-NameCreater-Desktop_Qt_5_15_2_clang_64bit-Release - /Users/shouchih_chen/Documents/namecreater/build-NameCreater-Desktop_Qt_5_15_2_clang_64bit-Release + C:\dev\namecreater\NameCreater\build\QwbAssembly_Qt_5_15_2-Release + C:/dev/namecreater/NameCreater/build/QwbAssembly_Qt_5_15_2-Release true @@ -177,8 +184,161 @@ 0 - /Users/shouchih_chen/Documents/namecreater/build-NameCreater-Desktop_Qt_5_15_2_clang_64bit-Profile - /Users/shouchih_chen/Documents/namecreater/build-NameCreater-Desktop_Qt_5_15_2_clang_64bit-Profile + C:\dev\namecreater\NameCreater\build\QwbAssembly_Qt_5_15_2-Profile + C:/dev/namecreater/NameCreater/build/QwbAssembly_Qt_5_15_2-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + 0 + + true + true + 0 + true + + + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + NameCreater + WebAssembly.RunConfiguration.EmrunC:/dev/namecreater/NameCreater/NameCreater.pro + C:/dev/namecreater/NameCreater/NameCreater.pro + false + true + true + chrome + + 1 + + + + ProjectExplorer.Project.Target.1 + + Desktop + Desktop Qt 5.15.2 MSVC2019 64bit + Desktop Qt 5.15.2 MSVC2019 64bit + {c81acbfe-eec2-40c2-b148-0e5ee627adfb} + 0 + 0 + 0 + + 0 + C:\dev\namecreater\NameCreater\build\Desktop_Qt_5_15_2_MSVC2019_64bit-Debug + C:/dev/namecreater/NameCreater/build/Desktop_Qt_5_15_2_MSVC2019_64bit-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + C:\dev\namecreater\NameCreater\build\Desktop_Qt_5_15_2_MSVC2019_64bit-Release + C:/dev/namecreater/NameCreater/build/Desktop_Qt_5_15_2_MSVC2019_64bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + C:\dev\namecreater\NameCreater\build\Desktop_Qt_5_15_2_MSVC2019_64bit-Profile + C:/dev/namecreater/NameCreater/build/Desktop_Qt_5_15_2_MSVC2019_64bit-Profile true @@ -234,25 +394,358 @@ true true + 0 true + 2 - Qt4ProjectManager.Qt4RunConfiguration:/Users/shouchih_chen/Documents/namecreater/NameCreater/NameCreater.pro - /Users/shouchih_chen/Documents/namecreater/NameCreater/NameCreater.pro - false + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + + Qt4ProjectManager.Qt4RunConfiguration:C:/dev/namecreater/NameCreater/NameCreater.pro + C:/dev/namecreater/NameCreater/NameCreater.pro + false true true - false true - /Users/shouchih_chen/Documents/namecreater/build-NameCreater-Desktop_Qt_5_15_2_clang_64bit-Release/NameCreater.app/Contents/MacOS 1 + + ProjectExplorer.Project.Target.2 + + Desktop + Desktop Qt 6.7.2 MSVC2019 64bit + Desktop Qt 6.7.2 MSVC2019 64bit + qt.qt6.672.win64_msvc2019_64_kit + 0 + 0 + 0 + + 0 + C:\dev\namecreater\NameCreater\build\Desktop_Qt_6_7_2_MSVC2019_64bit-Debug + C:/dev/namecreater/NameCreater/build/Desktop_Qt_6_7_2_MSVC2019_64bit-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + C:\dev\namecreater\NameCreater\build\Desktop_Qt_6_7_2_MSVC2019_64bit-Release + C:/dev/namecreater/NameCreater/build/Desktop_Qt_6_7_2_MSVC2019_64bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + C:\dev\namecreater\NameCreater\build\Desktop_Qt_6_7_2_MSVC2019_64bit-Profile + C:/dev/namecreater/NameCreater/build/Desktop_Qt_6_7_2_MSVC2019_64bit-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + + 2 + + false + -e cpu-cycles --call-graph "dwarf,4096" -F 250 + + Qt4ProjectManager.Qt4RunConfiguration:C:/dev/namecreater/NameCreater/NameCreater.pro + C:/dev/namecreater/NameCreater/NameCreater.pro + false + true + true + true + + 1 + + + + ProjectExplorer.Project.Target.3 + + Desktop + Desktop Qt 5.12.12 MinGW 64-bit + Desktop Qt 5.12.12 MinGW 64-bit + qt.qt5.51212.win64_mingw73_kit + 0 + 0 + 0 + + 0 + C:\dev\namecreater\build-NameCreater-Desktop_Qt_5_12_12_MinGW_64_bit-Debug + C:/dev/namecreater/build-NameCreater-Desktop_Qt_5_12_12_MinGW_64_bit-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + C:\dev\namecreater\build-NameCreater-Desktop_Qt_5_12_12_MinGW_64_bit-Release + C:/dev/namecreater/build-NameCreater-Desktop_Qt_5_12_12_MinGW_64_bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + C:\dev\namecreater\build-NameCreater-Desktop_Qt_5_12_12_MinGW_64_bit-Profile + C:/dev/namecreater/build-NameCreater-Desktop_Qt_5_12_12_MinGW_64_bit-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + true + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:C:/dev/namecreater/NameCreater/NameCreater.pro + C:/dev/namecreater/NameCreater/NameCreater.pro + false + true + true + false + true + C:/dev/namecreater/build-NameCreater-Desktop_Qt_5_12_12_MinGW_64_bit-Debug + + 1 + + ProjectExplorer.Project.TargetCount - 1 + 4 ProjectExplorer.Project.Updater.FileVersion diff --git a/NameCreater/NameCreater.qrc b/NameCreater/NameCreater.qrc index f9048fe..79cb57b 100644 --- a/NameCreater/NameCreater.qrc +++ b/NameCreater/NameCreater.qrc @@ -1,8 +1,107 @@ - resource/background.jpg + resource/custom_logo/bg_1.jpg resource/background_sample.jpg + resource/background_b.jpg + resource/background_g.jpg + resource/background_r.jpg + resource/background_y.jpg + resource/two_word_sample.jpg + resource/background_1.jpg + resource/background_2.jpg + resource/background_3.jpg + resource/background_4.jpg + resource/background_5.jpg + resource/background_6.jpg + resource/background_7.jpg + resource/background_8.jpg + resource/background_9.jpg + resource/background_10.jpg + resource/background_number_smaple.jpg + resource/background_11.jpg + resource/background_12.jpg + resource/background_13.jpg + resource/background_14.jpg + resource/background_15.jpg + resource/background_16.jpg + resource/background_17.jpg + resource/background_18.jpg + resource/background_19.jpg + resource/background_20.jpg + resource/background.jpg resource/background_boy.jpg resource/background_girl.jpg + resource/b.jpg + resource/boy_bg.jpg + resource/co.jpg + resource/g.jpg + resource/girl_bg.jpg + resource/m.jpg + resource/ol.jpg + resource/p.jpg + resource/r.jpg + resource/sn.jpg + resource/st.jpg + resource/w.jpg + resource/y.jpg + _exp/W1.ttc + resource/five/b_1.jpg + resource/five/b_2.jpg + resource/five/b_3.jpg + resource/five/b_4.jpg + resource/five/b_5.jpg + resource/five/g_1.jpg + resource/five/g_2.jpg + resource/five/g_3.jpg + resource/five/g_4.jpg + resource/five/g_5.jpg + resource/five/nb_1.jpg + resource/five/nb_2.jpg + resource/five/nb_3.jpg + resource/five/nb_4.jpg + resource/five/nb_5.jpg + resource/five/new_bg_sample.jpg + resource/five/ng_1.jpg + resource/five/ng_2.jpg + resource/five/ng_3.jpg + resource/five/ng_4.jpg + resource/five/ng_5.jpg + _exp/FontsFree-Net-Acumin-Pro-Semibold.ttf + resource/hk_holder/b.jpg + resource/hk_holder/g.jpg + resource/hk_holder/p.jpg + resource/hk_holder/r.jpg + resource/hk_holder/sample.jpg + resource/hk_holder/y.jpg + resource/hk_holder/m.jpg + resource/hk_holder/st.jpg + resource/hk_holder/w.jpg + resource/hk_holder/a.jpg + resource/hk_holder/pg.jpg + resource/a.jpg + resource/pg.jpg + resource/background_21.jpg + resource/background_22.jpg + resource/background_23.jpg + resource/background_24.jpg + resource/background_25.jpg + resource/background_26.jpg + resource/background_27.jpg + resource/background_28.jpg + resource/background_29.jpg + resource/background_30.jpg + resource/five/kb_1.jpg + resource/five/kb_2.jpg + resource/five/kb_3.jpg + resource/five/kb_4.jpg + resource/five/kb_5.jpg + resource/five/kg_1.jpg + resource/five/kg_2.jpg + resource/five/kg_3.jpg + resource/five/kg_4.jpg + resource/five/kg_5.jpg + resource/custom_logo/demo_2.jpg + _exp/Ubuntu-Medium.ttf + resource/custom_logo/bg_2.jpg diff --git a/NameCreater/NameCreater.rc b/NameCreater/NameCreater.rc new file mode 100644 index 0000000..19949bf --- /dev/null +++ b/NameCreater/NameCreater.rc @@ -0,0 +1,60 @@ +// Microsoft Visual C++ generated resource script. +// + +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// ^ () resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 4, 1 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // ^ () resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/NameCreater/NameCreater.ui b/NameCreater/NameCreater.ui index b9bbe18..70a3346 100644 --- a/NameCreater/NameCreater.ui +++ b/NameCreater/NameCreater.ui @@ -6,8 +6,8 @@ 0 0 - 977 - 716 + 902 + 780 @@ -16,50 +16,535 @@ NameCreater + + + - - - - 240 - 220 - 441 - 261 - - - - font: 26pt "華康圓體 Std W8"; - - - - - - :/NameCreater/resource/background.jpg - - - - - - - 0 - 0 - 977 - 22 - + + QWidget#centralWidget{ + background-color: rgb(0, 0, 0); +} + + + + + 100 + + + QLayout::SetDefaultConstraint + + + 0 + + + + + + Yu Gothic UI + 10 + 50 + false + false + + + + color: rgb(255, 255, 255); + + + + v1.0.0 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + Yu Gothic UI + 10 + 50 + false + false + + + + color: rgb(255, 255, 255); + + + + font_name + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 200 + 0 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + QFrame::NoFrame + + + QAbstractScrollArea::AdjustToContents + + + true + + + + + 0 + 0 + 884 + 734 + + + + + 0 + 0 + + + + QWidget#scrollAreaWidgetContents{ + background-color: rgb(0, 0, 0); +} + + + + + 0 + 0 + 861 + 681 + + + + QFrame#frame{ +border: 3px solid #FFFFFF; +border-color: rgb(255, 255, 255); + +} + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + +color: rgb(255, 255, 255); + + + + 生日禮產生器(英/英) + + + Qt::AlignCenter + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + +color: rgb(255, 255, 255); + + + + 生日禮產生器 + + + Qt::AlignCenter + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + color: rgb(255, 255, 255); + + + + 五入組產生器 + + + Qt::AlignCenter + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + +color: rgb(255, 255, 255); + + + + 客製底圖產生器 + + + Qt::AlignCenter + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + color: rgb(255, 255, 255); + + + + 小方巾產生器 + + + Qt::AlignCenter + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + +color: rgb(255, 255, 255); + + + + 生日禮產生器(中/英) + + + Qt::AlignCenter + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + 0 + 76 + + + + Open Dialog + + + + + + + + 0 + 76 + + + + Open Dialog + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + color: rgb(255, 255, 255); + + + + 五入組拆成單入產生器 + + + Qt::AlignCenter + + + + + + + + 0 + 76 + + + + Open File + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + +color: rgb(255, 255, 255); + + + + 扶輪社 + + + Qt::AlignCenter + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + color: rgb(255, 255, 255); + + + + 五入組拆成單入產生器(中/英) + + + Qt::AlignCenter + + + + + + + + Yu Gothic UI + 20 + 50 + false + false + + + + +color: rgb(250, 250, 250); + + + + 手帕夾產生器 + + + Qt::AlignCenter + + + + + + + + + - - - TopToolBarArea - - - false - - - + + + Open File + + - - - + diff --git a/NameCreater/NameCreater.vcxproj b/NameCreater/NameCreater.vcxproj index 515e723..24712a3 100644 --- a/NameCreater/NameCreater.vcxproj +++ b/NameCreater/NameCreater.vcxproj @@ -23,26 +23,28 @@ QtVS_v304 10.0 10.0 - 10.0.19041.0 - 10.0.19041.0 + 10.0.16299.0 + 10.0 $(MSBuildProjectDirectory)\QtMsBuild Application - v142 + v143 Application - v142 + v143 + NotSet Application - v142 + v143 Application - v142 + v143 + NotSet @@ -50,22 +52,22 @@ 5.15.2_msvc2019_64 - core;gui;widgets + core;gui;widgets;network debug - 5.15.2_msvc2019_64 - core;gui;widgets + $(DefaultQtVersion) + core;gui;widgets;network;core5compat debug - 5.15.2_msvc2019_64 + $(DefaultQtVersion) core;gui;widgets release - 5.15.2_msvc2019_64 - core;gui;widgets + $(DefaultQtVersion) + core;gui;widgets;network;core5compat release @@ -103,11 +105,23 @@ xcopy /y "$(ProjectDir)_exp\*" "$(TargetDir)" + + /Zm1000 + xcopy /y "$(ProjectDir)_exp\*" "$(TargetDir)" + + /Zm1000 + + + + + + + @@ -172,12 +186,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NameCreater/NameCreater.vcxproj.filters b/NameCreater/NameCreater.vcxproj.filters index 32317c8..ea95dbe 100644 --- a/NameCreater/NameCreater.vcxproj.filters +++ b/NameCreater/NameCreater.vcxproj.filters @@ -21,6 +21,9 @@ {639EADAA-A684-42e4-A9AD-28FC9BCB8F7C} ts + + {c0b8778b-3058-44d2-9adc-b902360289e6} + @@ -32,13 +35,90 @@ Header Files - - Source Files - Source Files + + Creaters + + + Creaters + + + Creaters + + + Source Files + + + Creaters + + + Creaters + + + Creaters + + + Creaters + + + Creaters + + + Creaters + + + + + Header Files + + + Creaters + + + Creaters + + + Creaters + + + Creaters + + + Creaters + + + Creaters + + + Creaters + + + Header Files + + + + + Resource Files + + + + + Form Files + + + Form Files + + + + + Creaters + + + Creaters + \ No newline at end of file diff --git a/NameCreater/NameCreater.vcxproj.user b/NameCreater/NameCreater.vcxproj.user index 7ca3388..258b523 100644 --- a/NameCreater/NameCreater.vcxproj.user +++ b/NameCreater/NameCreater.vcxproj.user @@ -17,15 +17,23 @@ WindowsLocalDebugger - 2022-12-28T13:37:06.0677688Z + 2024-05-14T07:08:49.3700216Z + + - 2022-12-28T13:37:06.0677688Z + 2024-05-14T07:08:49.6936159Z + + - 2022-12-28T13:37:06.1904219Z + 2024-05-14T07:08:49.8356144Z + + - 2022-12-28T13:37:06.1904219Z + 2024-05-14T07:08:49.9726151Z + + \ No newline at end of file diff --git a/NameCreater/NewFiveCreater.cpp b/NameCreater/NewFiveCreater.cpp new file mode 100644 index 0000000..20bc469 --- /dev/null +++ b/NameCreater/NewFiveCreater.cpp @@ -0,0 +1,144 @@ +#include "NewFiveCreater.h" +#include +#include +#include +#include +#include + + +static QString BG_SMAPLE_PATH = ":/NameCreater/resource/five/new_bg_sample.jpg"; +static QString LABEL_BG_PATH_FORMAT = ":/NameCreater/resource/five/%1_%2.jpg"; + +static int LABEL_HIGHT_LIMIT = 350; +static QPoint LABEL_POS_START = QPoint(145, 55); +static int LABEL_POS_X_OFFSET = 323; + +static QPoint NAME_OFFSET_START = QPoint(90, 335); +static QPoint NAME_OFFSET_REVERSE_START = QPoint(216, 1398); +static qreal NAME_TWO_WORD_OFFSET = 170; +static qreal NAME_THREE_WORD_OFFSET = 145; + +static int MAX_LABEL_IN_PAPER = 10; +static int FONT_PIXEL_SIZE = 120; + + +NewFiveCreater::NewFiveCreater() : INameCreater() +{ +} + +NewFiveCreater::~NewFiveCreater() +{ +} + +QList NewFiveCreater::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 = csvList.at(0); //QString::fromLocal8Bit(csvList.at(0)); + QString bg_type = csvList.at(1);//QString::fromLocal8Bit(csvList.at(1)); + + qDebug() << "row :" << row << " " << name << ", bg_type: " << bg_type; + + if (name.compare("name") == 0) { + //pass first line + continue; + } + + info.name1 = name; + info.bg_path = bg_type; + + nameList.append(info); + + row++; + } + return nameList; + +} + +void NewFiveCreater::generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color) +{ + + int export_times = 0; + + QList nameList = getNameByFileContent(type, filecontent); + if (nameList.isEmpty()) { + QMessageBox msgBox; + msgBox.setText(QString("Name is empty ! ").append(filename)); + msgBox.exec(); + } + + QGraphicsScene scene; + scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); + QGraphicsView view(&scene); + + + int idx = 0; + foreach(auto name, nameList) { + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = QGraphicsPixmapItem(QPixmap(BG_SMAPLE_PATH)); + scene.addItem(bg_item); + } + + for (int l = 0; l < 5; l++) { + int col_index = idx % MAX_LABEL_IN_PAPER; + QString label_rel_path = LABEL_BG_PATH_FORMAT.arg(name.bg_path, QString::number(l + 1)); + auto label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(LABEL_POS_START.x() + LABEL_POS_X_OFFSET * col_index, LABEL_POS_START.y()); + label_item->setOpacity(1); + scene.addItem(label_item); + + for (int i = 0; i < 2; i++) { + int name_word_len = name.name1.count(); + qreal two_word_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET / 2.0 : 0; + qreal offset_y = (name_word_len == 2) ? NAME_TWO_WORD_OFFSET : NAME_THREE_WORD_OFFSET; + + for (int w = 0; w < name_word_len; w++) { + QGraphicsTextItem* word_item = new QGraphicsTextItem(name.name1.at(w)); + word_item->setFont(font); + word_item->setDefaultTextColor(font_color); + qreal _x = (i == 0) ? label_item->x() + NAME_OFFSET_START.x() : label_item->x() + NAME_OFFSET_REVERSE_START.x(); + qreal _y = (i == 0) ? (label_item->y() + NAME_OFFSET_START.y() + two_word_y + offset_y * w) : (label_item->y() + NAME_OFFSET_REVERSE_START.y() - two_word_y - offset_y * w); + if (i == 1) word_item->setTransform(QTransform::fromScale(-1, -1)); + word_item->setPos(_x, _y); + scene.addItem(word_item); + + } + } + + if ((idx % MAX_LABEL_IN_PAPER == MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() * 5 - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("Five_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + saveToImage(file_name, &scene); + export_times++; + scene.clear(); + + } + + idx++; + } + + + + + } + + QMessageBox msgBox; + msgBox.setText(QString().asprintf("Export Finshed. Count:%d", export_times)); + msgBox.exec(); + +} diff --git a/NameCreater/NewFiveCreater.h b/NameCreater/NewFiveCreater.h new file mode 100644 index 0000000..76d94bf --- /dev/null +++ b/NameCreater/NewFiveCreater.h @@ -0,0 +1,19 @@ +#pragma once +#include "INameCreater.h" +class NewFiveCreater : + public INameCreater +{ +public: + NewFiveCreater(); + ~NewFiveCreater(); + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); +public: + virtual void generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color); + + + + +}; + diff --git a/NameCreater/OldFiveCreater.cpp b/NameCreater/OldFiveCreater.cpp new file mode 100644 index 0000000..bdc8e73 --- /dev/null +++ b/NameCreater/OldFiveCreater.cpp @@ -0,0 +1,152 @@ +#include "OldFiveCreater.h" +#include +#include +#include +#include +#include + +#define BG_MIX_PATH ":/NameCreater/resource/background.jpg" +#define BG_BOY_PATH ":/NameCreater/resource/background_boy.jpg" +#define BG_GIRL_PATH ":/NameCreater/resource/background_girl.jpg" + +static QPointF BOY_POS[] = { + QPointF(235, 387), QPointF(366, 1433), + QPointF(555, 387), QPointF(692, 1433), + QPointF(878, 387), QPointF(1014, 1433), + QPointF(1200, 387), QPointF(1337, 1433), + QPointF(1527, 387), QPointF(1663, 1433), +}; + +static int BOY_POS_COUNT = sizeof(BOY_POS) / sizeof(BOY_POS[0]); + + +static QPointF GIRL_POS[] = { + QPointF(1854, 387), QPointF(1987, 1433), + QPointF(2176, 387), QPointF(2314, 1433), + QPointF(2498, 387), QPointF(2635, 1433), + QPointF(2821, 387), QPointF(2958, 1433), + QPointF(3147, 387), QPointF(3285, 1433), +}; + +static int GIRL_POS_COUNT = sizeof(GIRL_POS) / sizeof(GIRL_POS[0]); + + +OldFiveCreater::OldFiveCreater():INameCreater() +{ +} + +OldFiveCreater::~OldFiveCreater() +{ +} + +QList OldFiveCreater::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 name1 = csvList.at(0); //QString::fromLocal8Bit(csvList.at(0)); + QString name2 = csvList.at(1);//QString::fromLocal8Bit(csvList.at(1)); + QString type_str = csvList.last();//QString::fromLocal8Bit(csvList.last()); + qDebug() << "row :" << row << " " << name1 << " " << name2; + + if (name1.compare("name_1") == 0 || name2.compare("name_2") == 0) { + continue; + } + + info.name1 = name1; + info.name2 = name2; + info.bg_type = type_str.contains(QRegularExpression("boy")) ? 1 : (type_str.contains(QRegularExpression("girl"))) ? 2 : 0; + + nameList.append(info); + + row++; + } + return nameList; +} + +void OldFiveCreater::generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color) +{ + int export_times = 0; + + QList nameList = getNameByFileContent(type, filecontent); + if (nameList.isEmpty()) { + QMessageBox msgBox; + msgBox.setText(QString("Name is empty ! ").append(filename)); + msgBox.exec(); + } + + + QGraphicsScene scene; + QGraphicsView view(&scene); + + + for (int n = 0; n < nameList.length(); n++) { + //msgBox.setText(QString().sprintf("Export: %d / %d", export_times, nameList.length())); + + NameInfo_t name_info = nameList.at(n); + + scene.clear(); + QImage image((name_info.bg_type == 1) ? BG_BOY_PATH : (name_info.bg_type == 2) ? BG_GIRL_PATH : BG_MIX_PATH); + QGraphicsPixmapItem* bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(image)); + scene.addItem(bgItem); + + + for (int j = 0; j < 2; j++) { + int flag = j % 2; + QString name = (flag == 0) ? name_info.name1 : name_info.name2; + for (int i = 0; i < BOY_POS_COUNT; i++) { + qreal xscale, yscale; + xscale = yscale = (i % 2 == 1) ? -1 : 1; + QPointF pos = (flag == 0) ? BOY_POS[i] : GIRL_POS[i]; + + QGraphicsTextItem* textItem1 = new QGraphicsTextItem(name.mid(0, 1)); + textItem1->setFont(font); + textItem1->setDefaultTextColor(font_color); + textItem1->setPos(pos); + textItem1->setTransform(QTransform::fromScale(xscale, yscale)); + scene.addItem(textItem1); + + QGraphicsTextItem* textItem2 = new QGraphicsTextItem(name.mid(1, 1)); + textItem2->setFont(font); + textItem2->setDefaultTextColor(font_color); + textItem2->setPos(pos.x(), pos.y() + 148.0 * xscale); + textItem2->setTransform(QTransform::fromScale(xscale, yscale)); + scene.addItem(textItem2); + + QGraphicsTextItem* textItem3 = new QGraphicsTextItem(name.mid(2, 1)); + textItem3->setFont(font); + textItem3->setDefaultTextColor(font_color); + textItem3->setPos(pos.x(), pos.y() + 294.0 * xscale); + textItem3->setTransform(QTransform::fromScale(xscale, yscale)); + scene.addItem(textItem3); + } + } + //if (name_info.bg_type == 0) { + // view.show(); + // break; + //} + + QString file_name = QString("%1_%2_%3.jpg").arg(QString::number(export_times + 1), name_info.name1, name_info.name2); + saveToImage(file_name, &scene); + export_times++; + } + + + QMessageBox msgBox; + msgBox.setText(QString().asprintf("Export Finshed. Count:%d", export_times)); + msgBox.exec(); + + +} diff --git a/NameCreater/OldFiveCreater.h b/NameCreater/OldFiveCreater.h new file mode 100644 index 0000000..e062d7d --- /dev/null +++ b/NameCreater/OldFiveCreater.h @@ -0,0 +1,15 @@ +#pragma once +#include "INameCreater.h" +class OldFiveCreater : + public INameCreater +{ +public: + OldFiveCreater(); + ~OldFiveCreater(); + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); +public: + virtual void generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color); +}; + diff --git a/NameCreater/TowelCreater.cpp b/NameCreater/TowelCreater.cpp new file mode 100644 index 0000000..21e67f0 --- /dev/null +++ b/NameCreater/TowelCreater.cpp @@ -0,0 +1,160 @@ +#include "TowelCreater.h" +#include +#include +#include +#include +#include + + + +static QString LABEL_BG_PATH[] = { ":/NameCreater/resource/girl_bg.jpg",":/NameCreater/resource/boy_bg.jpg" }; +static qreal LABEL_POS_X[] = { 250,1645,3300 }; + +static qreal LABEL_POS_Y_START = 120; +static qreal LABEL_POS_Y_DIFF = 315; + + +static qreal NAME_OFFSET_X[] = { 128, 715 }; +static qreal NAME_OFFSET_Y = 38; +static qreal NAME_TWO_WORD_OFFSET = 25; + +static int MAX_LABEL_IN_PAPER = 15; +static int LABEL_MAX_NUM_PER_COL = 7; +static int FONT_PIXEL_SIZE = 240; + +static qreal LABEL_HIGHT_LIMIT = 350; +static int TEXT_WIDTH = 800; + +TowelCreater::TowelCreater() +{ +} + +TowelCreater::~TowelCreater() +{ +} + +QList TowelCreater::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()) + { + + QString line = stream.readLine(); + QString name_tc = line; + QStringList csvList = name_tc.split(','); + + + QString name = csvList.at(0); //QString::fromLocal8Bit(csvList.at(0)); + QString bg_type = csvList.at(1);//QString::fromLocal8Bit(csvList.at(1)); + int num = csvList.last().toInt();//QString::fromLocal8Bit(csvList.last()); + qDebug() << "row :" << row << " " << name << ", bg_type: " << bg_type << "Count: " < nameList = getNameByFileContent(type, filecontent); + if (nameList.isEmpty()) { + QMessageBox msgBox; + msgBox.setText(QString("Name is empty ! ").append(filename)); + msgBox.exec(); + } + + QGraphicsScene scene; + scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); + QGraphicsView view(&scene); + + + for (int idx = 0; idx < nameList.length(); idx++) { + NameInfo_t name = nameList.at(idx); + if ((idx % MAX_LABEL_IN_PAPER) == 0) { + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + //QGraphicsPixmapItem* bg_item = QGraphicsPixmapItem(QPixmap(BG_SMAPLE_PATH)); + scene.addItem(bg_item); + + } + + int col_idx = (idx % MAX_LABEL_IN_PAPER) / LABEL_MAX_NUM_PER_COL; + int col_num = (idx % MAX_LABEL_IN_PAPER) % LABEL_MAX_NUM_PER_COL; + + QString label_rel_path = LABEL_BG_PATH[name.bg_type]; + + if (col_idx < 2) { + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setPos(LABEL_POS_X[col_idx], LABEL_POS_Y_START + LABEL_POS_Y_DIFF * col_num); + label_item->setOpacity(1); + scene.addItem(label_item); + + for (int i = 0; i < 2; ++i) { + qreal offset_x = name.name1.count() == 2 ? NAME_TWO_WORD_OFFSET : 0; + QGraphicsTextItem* name_item = new QGraphicsTextItem(name.name1); + name_item->setTextWidth(TEXT_WIDTH); + name_item->setFont(font); + name_item->setDefaultTextColor(font_color); + name_item->setPos(label_item->x() + NAME_OFFSET_X[i] + offset_x, label_item->y() + NAME_OFFSET_Y); + scene.addItem(name_item); + } + + } + else { + QGraphicsPixmapItem* label_item = new QGraphicsPixmapItem(QPixmap(label_rel_path)); + label_item->setRotation(90); + label_item->setPos(LABEL_POS_X[col_idx], LABEL_POS_Y_START + LABEL_POS_Y_DIFF * col_num); + label_item->setOpacity(1); + scene.addItem(label_item); + + + for (int i = 0; i < 2; ++i) { + qreal offset_x = name.name1.count() == 2 ? NAME_TWO_WORD_OFFSET : 0; + QGraphicsTextItem* name_item = new QGraphicsTextItem(name.name1); + name_item->setTextWidth(TEXT_WIDTH); + name_item->setFont(font); + name_item->setDefaultTextColor(font_color); + name_item->setRotation(90); + name_item->setPos(label_item->x() - NAME_OFFSET_Y, label_item->y() + NAME_OFFSET_X[i] + offset_x); + scene.addItem(name_item); + } + + } + + if ((idx % MAX_LABEL_IN_PAPER == MAX_LABEL_IN_PAPER - 1) || idx == nameList.count() - 1) { + QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); + QString file_name = QString("Towel_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); + saveToImage(file_name, &scene); + export_times++; + + scene.clear(); + } + + + } + + +} diff --git a/NameCreater/TowelCreater.h b/NameCreater/TowelCreater.h new file mode 100644 index 0000000..f0dec61 --- /dev/null +++ b/NameCreater/TowelCreater.h @@ -0,0 +1,14 @@ +#pragma once +#include "INameCreater.h" +class TowelCreater : public INameCreater +{ +public: + TowelCreater(); + ~TowelCreater(); + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); +public: + virtual void generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color); +}; + diff --git a/NameCreater/_exp/FontsFree-Net-Acumin-Pro-Semibold.ttf b/NameCreater/_exp/FontsFree-Net-Acumin-Pro-Semibold.ttf new file mode 100644 index 0000000..d8045b9 Binary files /dev/null and b/NameCreater/_exp/FontsFree-Net-Acumin-Pro-Semibold.ttf differ diff --git a/NameCreater/_exp/TaiwanPearl-SemiBold.ttf b/NameCreater/_exp/TaiwanPearl-SemiBold.ttf new file mode 100644 index 0000000..330224c Binary files /dev/null and b/NameCreater/_exp/TaiwanPearl-SemiBold.ttf differ diff --git a/NameCreater/_exp/Ubuntu-Medium.ttf b/NameCreater/_exp/Ubuntu-Medium.ttf new file mode 100644 index 0000000..5296045 Binary files /dev/null and b/NameCreater/_exp/Ubuntu-Medium.ttf differ diff --git a/NameCreater/_exp/W1.ttc b/NameCreater/_exp/W1.ttc new file mode 100644 index 0000000..14ee5f3 Binary files /dev/null and b/NameCreater/_exp/W1.ttc differ diff --git a/NameCreater/_exp/name.csv b/NameCreater/_exp/old_five.csv similarity index 100% rename from NameCreater/_exp/name.csv rename to NameCreater/_exp/old_five.csv diff --git a/NameCreater/_exp/五入拆單入範例.csv b/NameCreater/_exp/五入拆單入範例.csv new file mode 100644 index 0000000..10d2c83 --- /dev/null +++ b/NameCreater/_exp/五入拆單入範例.csv @@ -0,0 +1,26 @@ +name_1,bg_type +pF,1 +Lp,2 +dw,3 +p,4 +p,5 +Lp,g +dw,b +p,y +p,r +Lp,g +p,6 +Lp,7 +pF,8 +Lp,9 +dw,10 +u,11 +Ŵr,12 +dιa,13 +u,14 +Ŵr,15 +dιa,16 +u,17 +Ŵr,18 +dιa,19 +pF,20 diff --git a/NameCreater/_exp/五入拆單入範例_中英.csv b/NameCreater/_exp/五入拆單入範例_中英.csv new file mode 100644 index 0000000..554352e --- /dev/null +++ b/NameCreater/_exp/五入拆單入範例_中英.csv @@ -0,0 +1,32 @@ +name_1,eng_name,bg_type +pF,Elsa,1 +Lp,Ana,2 +dw,Jolin,3 +p,Elsa,4 +p,Elsa,5 +Lp,Elsa,g +dw,Elsa,b +p,Elsa,y +p,Elsa,r +Lp,Elsa,g +p,Elsa,21 +Lp,Elsa,22 +pF,Elsa,23 +Lp,Elsa,24 +dw,Elsa,10 +u,ShouChih,11 +Ŵr,Shirly,12 +dιa,Elsa,13 +u,Elsa,14 +Ŵr,Elsa,15 +dιa,Jolin,16 +u,Elsa,17 +Ŵr,Elsa,18 +dιa,Elsa,19 +pF,Elsa,25 +pF,Elsa,26 +pF,Elsa,27 +pF,Elsa,28 +pF,Elsa,29 +pF,Elsa,30 +pF,Elsa,1 diff --git a/NameCreater/_exp/五入組範例.csv b/NameCreater/_exp/五入組範例.csv new file mode 100644 index 0000000..a9adb38 --- /dev/null +++ b/NameCreater/_exp/五入組範例.csv @@ -0,0 +1,21 @@ +name,bg_type +L§,kb +Ŵr,kb +Ŵr,kg +Ŵr,kg +Ŵr,nb +Ŵr,nb +w,ng +Ŵr,ng +Ŵr,g +w,b +u,nb +,ng +u,g +u,g +,b +dιa,b +dιa,ng +da,kg +da,kb +da,nb diff --git a/NameCreater/_exp/客制背景範例_中.csv b/NameCreater/_exp/客制背景範例_中.csv new file mode 100644 index 0000000..ce8e058 --- /dev/null +++ b/NameCreater/_exp/客制背景範例_中.csv @@ -0,0 +1,61 @@ +name +޷ +¨K + +E +~ +[ +`ʹ +GYg +LRP +LMo +ˢ +T +D +ⴴ +l +p +l +iʹ +ɵY +tغ +{ +dl +\ +󭸿 +LN +Lְa +Ĭ˧g +ˡ +~ +L֦w +hP +GȨ +|C +ff +~ +ӿ +²g +ΩӼ +к +_ۨ +P +if +Lw +tw +L +dt +ڬ +Ť֪N +xw +ɳ +A +ո +O +LԦw +dq@ +GX +GӰa +կCn +w + diff --git a/NameCreater/_exp/小方巾範例.csv b/NameCreater/_exp/小方巾範例.csv new file mode 100644 index 0000000..4e7600c --- /dev/null +++ b/NameCreater/_exp/小方巾範例.csv @@ -0,0 +1,5 @@ +name,bg_type,num +u,b,16 +dιa,g,13 +Ŵr,b,1 +Ŵr,g,2 \ No newline at end of file diff --git a/NameCreater/_exp/手帕夾範例.csv b/NameCreater/_exp/手帕夾範例.csv new file mode 100644 index 0000000..06543c4 --- /dev/null +++ b/NameCreater/_exp/手帕夾範例.csv @@ -0,0 +1,21 @@ +name,bg_type +dta,a +¤_,m +¤_,g +¤_,b +¤_,w +²,r +⨰,pg +⨰,y +⨰,b +⨰,p +⨰,g +,st +u,r +u,p +,r +dιa,y +dιa,y +da,y +da,p +da,st diff --git a/NameCreater/_exp/生日禮範例.csv b/NameCreater/_exp/生日禮範例.csv new file mode 100644 index 0000000..5b46af4 --- /dev/null +++ b/NameCreater/_exp/生日禮範例.csv @@ -0,0 +1,21 @@ +name,bg_type +¤_,a +¤_,pg +¤_,r +¤_,r +¤_,r +⨰,sn +⨰,co +⨰,ol +⨰,m +⨰,y +⨰,b +,g +u,m +u,p +,r +dιa,co +dιa,ol +da,sn +da,st +da,b \ No newline at end of file diff --git a/NameCreater/_exp/生日禮範例_中英.csv b/NameCreater/_exp/生日禮範例_中英.csv new file mode 100644 index 0000000..012197f --- /dev/null +++ b/NameCreater/_exp/生日禮範例_中英.csv @@ -0,0 +1,21 @@ +name,eng_name,bg_type +¤_,Alice,r +¤_,Alice,r +¤_,Alice,r +¤_,Alice,r +¤_,Alice,r +⨰,George,sn +⨰,George,co +⨰,George,ol +⨰,George,m +⨰,George,y +⨰,George,b +,Jolin,g +u,Chirs,m +u,xxxxxxxdgde,p +,gfdgadgdd,r +dιa,Jolin,co +dιa,Jolin,ol +da,Jessica,sn +da,Arial,st +da,Arial,b diff --git a/NameCreater/_exp/生日禮範例_英英.csv b/NameCreater/_exp/生日禮範例_英英.csv new file mode 100644 index 0000000..743812e --- /dev/null +++ b/NameCreater/_exp/生日禮範例_英英.csv @@ -0,0 +1,21 @@ +eng_name,bg_type +Churchill,m +Alice,r +Alice,r +Alice,r +Alice,r +George,sn +George,co +George,ol +George,m +George,y +George,b +Jolin,g +Chirs,m +xxxxxxxdgde,p +gfdgadgdd,r +Jolin,co +Jolin,ol +Jessica,sn +Arial,st +Arial,b diff --git a/NameCreater/customlogo.cpp b/NameCreater/customlogo.cpp new file mode 100644 index 0000000..d51e3cd --- /dev/null +++ b/NameCreater/customlogo.cpp @@ -0,0 +1,441 @@ +#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); + ui->hor_label->setFont(_f); + ui->vel_label->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) +{ + (void)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); + } + +} + diff --git a/NameCreater/customlogo.h b/NameCreater/customlogo.h new file mode 100644 index 0000000..8faf591 --- /dev/null +++ b/NameCreater/customlogo.h @@ -0,0 +1,47 @@ +#ifndef CUSTOMLOGO_H +#define CUSTOMLOGO_H + +#include +#include "QFont" +#include "INameCreater.h" + +namespace Ui { +class CustomLogo; +} + +class CustomLogo : public QDialog +{ + Q_OBJECT + +public: + explicit CustomLogo(QFont *customFont, QDialog *parent = nullptr); + ~CustomLogo(); + +private: + Ui::CustomLogo *ui; + QFont* customFont; + QColor fontColor; + QGraphicsScene demo_scene; + + qreal x_adjust_offset, y_adjust_offset; + + void loadBGFromFile(); + void createDemoGraphicItemBG(const QPixmap& img); + void updateDemoGraphicItemBG(); + void loadListFromFile(); + void gerneraImageFromList(const QList& nameList, Name_Type_e type); + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); + +private Q_SLOTS: + void onClickedBtn(); + void onColorSelected(const QColor& color); + void onSliderValueChanged(int value); + void onCheckboxClicked(bool click); + + + +}; + +#endif // CUSTOMLOGO_H diff --git a/NameCreater/customlogo.ui b/NameCreater/customlogo.ui new file mode 100644 index 0000000..5cc6a16 --- /dev/null +++ b/NameCreater/customlogo.ui @@ -0,0 +1,199 @@ + + + CustomLogo + + + + 0 + 0 + 545 + 653 + + + + Form + + + + + 340 + 70 + 141 + 51 + + + + Load BG + + + + + + 340 + 160 + 141 + 51 + + + + Load List + + + + + + 370 + 240 + 91 + 51 + + + + + 20 + + + + 雙面 + + + + + + 340 + 310 + 160 + 80 + + + + + + + 選色 + + + + + + + + 18 + 75 + true + + + + + + + 顏色 + + + + + + + + + 10 + 50 + 311 + 561 + + + + + + + 330 + 410 + 201 + 141 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 水平 + + + + + + + -100 + + + 100 + + + Qt::Horizontal + + + false + + + + + + + -100 + + + 100 + + + Qt::Horizontal + + + + + + + 垂直 + + + + + + + X + + + Qt::AlignCenter + + + + + + + Y + + + Qt::AlignCenter + + + + + + + Reset + + + + + + + + + + + diff --git a/NameCreater/customlogo2.cpp b/NameCreater/customlogo2.cpp new file mode 100644 index 0000000..e250a66 --- /dev/null +++ b/NameCreater/customlogo2.cpp @@ -0,0 +1,231 @@ +#include "customlogo2.h" +#include "ui_customlogo2.h" +#include "def.h" + +#include +#include +#include +#include +#include +#include +#include +#include + + +//#define BG_DEMO_PATH ":/NameCreater/resource/custom_logo/demo_2.jpg" +#define BG_DEMO_PATH ":/NameCreater/resource/custom_logo/bg_2.jpg" +#define FONT_PATH ":/NameCreater/_exp/Ubuntu-Medium.ttf" + + +static QPoint BG_START_POS(20, 100); +static QPoint BG_ROT_START_POS(2080, 880); +static int BG_POS_COUNT = 12; + + + +customlogo2::customlogo2(QFont *font, QDialog*parent) + : QDialog(parent) + , ui(new Ui::customlogo2) + , zhFont(font) +{ + ui->setupUi(this); + + connect(ui->loadcsv_btn, &QPushButton::released, this,&customlogo2::OnClickedBtn); + + + // read ubuntu font + QFile font_file(FONT_PATH); + if (!font_file.open(QIODevice::ReadOnly)) { + QMessageBox msgBox; + msgBox.setText("Can not load font file!" + QString(FONT_PATH)); + msgBox.exec(); + font_file.close(); + } + + + int id = QFontDatabase::addApplicationFontFromData(font_file.readAll()); + QString font_families = QFontDatabase::applicationFontFamilies(id).at(0); + enFont = QFont(font_families); + enFont.setPixelSize(60); + + // set zh font size + zhFont->setPixelSize(120); + + +} + +customlogo2::~customlogo2() +{ + delete ui; +} + + +void customlogo2::OnClickedBtn(){ + QPushButton *sender = (QPushButton*)QObject::sender(); + + if(sender == ui->loadcsv_btn){ + loadListFromFile(); + } +} + + + +void customlogo2::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); + +} + +QList customlogo2::getNameByFileContent(Name_Type_e type, const QByteArray& conetent) +{ + QList nameList; + + QTextCodec* tc = QTextCodec::codecForName("Utf8"); + 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; + + switch (type) { + case Name_zh: + { + int n = 1; + name = csvList.at(0); + + while(n < csvList.count()){ + if(n==2)eng_name.append(","); + eng_name.append(csvList.at(n)); + n++; + } + eng_name.replace("\"",""); + } + + + break; + default: + break; + + } + + qDebug() << "row :" << row << " " << name << " eng: "<& nameList, Name_Type_e type) +{ + int export_times = 0; + QGraphicsScene scene; + scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); + QGraphicsView view(&scene); + QRectF itemRect(0, 0, 880, 280); + QColor fontColor(33,142,188); + + switch (type) { + case Name_zh: + { + for (int n = 0; n < nameList.length(); n++) { + int idx = n % BG_POS_COUNT; + NameInfo_t name_info = nameList.at(n); + + if (idx == 0) { + + QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_HEIGHT,BG_WIDTH); + bg_item->setBrush(QBrush(QColor(255, 255, 255))); + scene.addItem(bg_item); + } + + + QGraphicsPixmapItem* name_bgItem = new QGraphicsPixmapItem(QPixmap(BG_DEMO_PATH)); + bool rot = (idx == 10 || idx == 11); + name_bgItem->setRotation(rot ? 90 : 0); + if (!rot) + name_bgItem->setPos(BG_START_POS.x(), BG_START_POS.y() + (name_bgItem->boundingRect().height()+30)*idx); + else + name_bgItem->setPos(BG_ROT_START_POS.x()+ (name_bgItem->boundingRect().height()+30)*(idx-10), BG_ROT_START_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(); + } + + QString name = name_info.name1; + QGraphicsTextItem* textItem = new QGraphicsTextItem(name, name_bgItem); + QFont _font = QFont(*zhFont); + _font.setLetterSpacing(QFont::PercentageSpacing, 110); + textItem->setFont(_font); + textItem->setDefaultTextColor(fontColor); + textItem->setPos(20+(itemRect.width() - textItem->boundingRect().width())/2,42); + + + QString name_en = name_info.name_eng; + QGraphicsTextItem* textItem_en = new QGraphicsTextItem(name_en, name_bgItem); + textItem_en->setFont(enFont); + textItem_en->setDefaultTextColor(fontColor); + textItem_en->setPos(20+(itemRect.width() - textItem_en->boundingRect().width())/2,170); + + + bool is_export_page = ((idx + 1) % BG_POS_COUNT == 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); + 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(); + +} diff --git a/NameCreater/customlogo2.h b/NameCreater/customlogo2.h new file mode 100644 index 0000000..bafef0a --- /dev/null +++ b/NameCreater/customlogo2.h @@ -0,0 +1,37 @@ +#ifndef CUSTOMLOGO2_H +#define CUSTOMLOGO2_H + +#include +#include "INameCreater.h" +#include "QFont" + +namespace Ui { +class customlogo2; +} + +class customlogo2 : public QDialog +{ + Q_OBJECT + +public: + explicit customlogo2(QFont *font , QDialog*parent = nullptr); + ~customlogo2(); + +private: + Ui::customlogo2 *ui; + + QFont *zhFont,enFont; + + void loadListFromFile(); + void gerneraImageFromList(const QList& nameList, Name_Type_e type); + + +protected: + QList getNameByFileContent(Name_Type_e type, const QByteArray& conetent); + +private Q_SLOTS: + void OnClickedBtn(); + +}; + +#endif // CUSTOMLOGO2_H diff --git a/NameCreater/customlogo2.ui b/NameCreater/customlogo2.ui new file mode 100644 index 0000000..c655194 --- /dev/null +++ b/NameCreater/customlogo2.ui @@ -0,0 +1,28 @@ + + + customlogo2 + + + + 0 + 0 + 338 + 182 + + + + Form + + + + + + Load CSV + + + + + + + + diff --git a/NameCreater/def.h b/NameCreater/def.h new file mode 100644 index 0000000..c15871f --- /dev/null +++ b/NameCreater/def.h @@ -0,0 +1,7 @@ +#ifndef DEF_H +#define DEF_H + +#define VERSION "v2.10.0" + + +#endif // DEF_H diff --git a/NameCreater/main.cpp b/NameCreater/main.cpp index c3b819c..eee6861 100644 --- a/NameCreater/main.cpp +++ b/NameCreater/main.cpp @@ -1,237 +1,11 @@ #include "NameCreater.h" #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BG_MIX_PATH ":/NameCreater/resource/background.jpg" -#define BG_BOY_PATH ":/NameCreater/resource/background_boy.jpg" -#define BG_GIRL_PATH ":/NameCreater/resource/background_girl.jpg" -#define FONT_NAME "DFYuanStd-W8.otf" -#define FONT_SIZE 120 -//#define FONT_SIZE 74 - -#define BG_MIX_TYPE_STR "mix" -#define BG_BOY_TYPE_STR "boy" -#define BG_GIRL_TYPE_STR "girl" - -struct NameInfo_t { - QString name1; - QString name2; - int bg_type; -}; - -static QPointF BOY_POS[] = { - QPointF(235, 387), QPointF(366, 1433), - QPointF(555, 387), QPointF(692, 1433), - QPointF(878, 387), QPointF(1014, 1433), - QPointF(1200, 387), QPointF(1337, 1433), - QPointF(1527, 387), QPointF(1663, 1433), -}; - -static int BOY_POS_COUNT = sizeof(BOY_POS) / sizeof(BOY_POS[0]); - - -static QPointF GIRL_POS[] = { - QPointF(1854, 387), QPointF(1987, 1433), - QPointF(2176, 387), QPointF(2314, 1433), - QPointF(2498, 387), QPointF(2635, 1433), - QPointF(2821, 387), QPointF(2958, 1433), - QPointF(3147, 387), QPointF(3285, 1433), -}; - -static int GIRL_POS_COUNT = sizeof(GIRL_POS) / sizeof(GIRL_POS[0]); - - - -void saveToImage(const QString& filename, QGraphicsScene* scene) { - - scene->clearSelection(); // Selections would also render to the file - scene->setSceneRect(scene->itemsBoundingRect()); // Re-shrink the scene to it's bounding contents - QImage image(scene->sceneRect().size().toSize(), QImage::Format_ARGB32); // Create the image with the exact size of the shrunk scene - image.fill(Qt::transparent); // Start all pixels transparent - int dpm = 300 / 0.0254; // ~300 DPI - image.setDotsPerMeterX(dpm); - image.setDotsPerMeterY(dpm); - - - QPainter painter(&image); - scene->render(&painter); - -#ifdef Q_OS_MAC - QString folder_name = QCoreApplication::applicationDirPath()+"/../../../export_" + QDateTime::currentDateTime().toString("yyyyMMdd"); -#else - QString folder_name = QCoreApplication::applicationDirPath() + "/export_" + QDateTime::currentDateTime().toString("yyyyMMdd"); -#endif - - qDebug() << "folder_name :" << folder_name; - if (!QDir(folder_name).exists()) { - QDir().mkdir(folder_name); - } - - image.save(QString(folder_name).append("/").append(filename), "JPG", 100); - -} - -QList getNameByFile(const QString& filename) { - QList nameList; - -#ifdef Q_OS_MAC - QString root_path = QCoreApplication::applicationDirPath() + "/../../../"; -#else - QString root_path = QCoreApplication::applicationDirPath() + "/"; -#endif - - - QFile file(root_path.append(filename)); - - if (!file.open(QIODevice::ReadOnly)) { - QMessageBox msgBox; - msgBox.setText("Load file failed!"); - msgBox.exec(); - file.close(); - return nameList; - } - - int row = 0; - QTextCodec *tc = QTextCodec::codecForName("Big5"); - while (!file.atEnd()) - { - NameInfo_t info; - QByteArray line = file.readLine(); - QString name_tc = tc->toUnicode(line); - QStringList csvList = name_tc.split(','); - - - QString name1 = csvList.at(0); //QString::fromLocal8Bit(csvList.at(0)); - QString name2 = csvList.at(1);//QString::fromLocal8Bit(csvList.at(1)); - QString type_str = csvList.last();//QString::fromLocal8Bit(csvList.last()); - qDebug() << "row :" << row << " " << name1 << " " << name2; - - if (name1.compare("name_1") == 0 || name2.compare("name_2") == 0) { - continue; - } - - info.name1 = name1; - info.name2 = name2; - info.bg_type = type_str.contains(QRegExp("boy")) ? 1 : (type_str.contains(QRegExp("girl"))) ? 2 : 0; - - nameList.append(info); - - row++; - } - file.close(); - return nameList; -} int main(int argc, char* argv[]) { - int export_times = 0; - - - - QApplication a(argc, argv); -// NameCreater w; -// w.show(); -#ifdef Q_OS_MAC - QString root_path = QCoreApplication::applicationDirPath() + "/../../../"; -#else - QString root_path = QCoreApplication::applicationDirPath() + "/"; -#endif - - QString font_path = root_path.append(FONT_NAME); - QFile font_res(font_path); - if (!font_res.open(QIODevice::ReadOnly)) { - QMessageBox msgBox; - msgBox.setText("Can not load font file!" + font_path); - msgBox.exec(); - font_res.close(); - return 0; - } - int id = QFontDatabase::addApplicationFontFromData(font_res.readAll()); - QStringList family_list = QFontDatabase::applicationFontFamilies(id); - QFont font = QFont(family_list.at(0)); - font.setPixelSize(FONT_SIZE); - QColor font_color(0, 0, 0); - - - QList nameList = getNameByFile("name.csv"); - if (nameList.isEmpty()) { - QMessageBox msgBox; - msgBox.setText(("Name is empty !")); - msgBox.exec(); - } - - QGraphicsScene scene; - QGraphicsView view(&scene); - - - for (int n = 0; n < nameList.length(); n++) { - //msgBox.setText(QString().sprintf("Export: %d / %d", export_times, nameList.length())); - - NameInfo_t name_info = nameList.at(n); - - scene.clear(); - QImage image((name_info.bg_type == 1) ? BG_BOY_PATH : (name_info.bg_type == 2) ? BG_GIRL_PATH : BG_MIX_PATH); - QGraphicsPixmapItem* bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(image)); - scene.addItem(bgItem); - - - for (int j = 0; j < 2; j++) { - int flag = j % 2; - QString name = (flag == 0) ? name_info.name1 : name_info.name2; - for (int i = 0; i < BOY_POS_COUNT; i++) { - int xscale, yscale; - xscale = yscale = (i % 2 == 1) ? -1 : 1; - QPointF pos = (flag == 0) ? BOY_POS[i] : GIRL_POS[i]; - - QGraphicsTextItem* textItem1 = new QGraphicsTextItem(name.mid(0, 1)); - textItem1->setFont(font); - textItem1->setDefaultTextColor(font_color); - textItem1->setPos(pos); - textItem1->setTransform(QTransform::fromScale(xscale, yscale)); - scene.addItem(textItem1); - - QGraphicsTextItem* textItem2 = new QGraphicsTextItem(name.mid(1, 1)); - textItem2->setFont(font); - textItem2->setDefaultTextColor(font_color); - textItem2->setPos(pos.x(), pos.y() + 148 * xscale); - textItem2->setTransform(QTransform::fromScale(xscale, yscale)); - scene.addItem(textItem2); - - QGraphicsTextItem* textItem3 = new QGraphicsTextItem(name.mid(2, 1)); - textItem3->setFont(font); - textItem3->setDefaultTextColor(font_color); - textItem3->setPos(pos.x(), pos.y() + 294 * xscale); - textItem3->setTransform(QTransform::fromScale(xscale, yscale)); - scene.addItem(textItem3); - } - } -// if (name_info.bg_type == 0) { -// view.show(); -// break; -// } - - QString file_name = QString("%1_%2_%3.jpg").arg(QString::number(export_times+1),name_info.name1,name_info.name2); - saveToImage(file_name, &scene); - export_times++; - } - - - QMessageBox msgBox; - msgBox.setText(QString().asprintf("Export Finshed. Count:%d",export_times)); - msgBox.exec(); - - - - font_res.close(); - return 0; + + QApplication a(argc, argv); + NameCreater w; + w.show(); + return a.exec(); } diff --git a/NameCreater/resource.h b/NameCreater/resource.h new file mode 100644 index 0000000..f9db228 --- /dev/null +++ b/NameCreater/resource.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by NameCreater.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/NameCreater/resource/a.jpg b/NameCreater/resource/a.jpg new file mode 100644 index 0000000..4369954 Binary files /dev/null and b/NameCreater/resource/a.jpg differ diff --git a/NameCreater/resource/b.jpg b/NameCreater/resource/b.jpg new file mode 100644 index 0000000..2ca984a Binary files /dev/null and b/NameCreater/resource/b.jpg differ diff --git a/NameCreater/resource/background_1.jpg b/NameCreater/resource/background_1.jpg new file mode 100644 index 0000000..bec3777 Binary files /dev/null and b/NameCreater/resource/background_1.jpg differ diff --git a/NameCreater/resource/background_10.jpg b/NameCreater/resource/background_10.jpg new file mode 100644 index 0000000..11d704e Binary files /dev/null and b/NameCreater/resource/background_10.jpg differ diff --git a/NameCreater/resource/background_11.jpg b/NameCreater/resource/background_11.jpg new file mode 100644 index 0000000..bbf23ee Binary files /dev/null and b/NameCreater/resource/background_11.jpg differ diff --git a/NameCreater/resource/background_12.jpg b/NameCreater/resource/background_12.jpg new file mode 100644 index 0000000..3317036 Binary files /dev/null and b/NameCreater/resource/background_12.jpg differ diff --git a/NameCreater/resource/background_13.jpg b/NameCreater/resource/background_13.jpg new file mode 100644 index 0000000..335649f Binary files /dev/null and b/NameCreater/resource/background_13.jpg differ diff --git a/NameCreater/resource/background_14.jpg b/NameCreater/resource/background_14.jpg new file mode 100644 index 0000000..cbd6fa3 Binary files /dev/null and b/NameCreater/resource/background_14.jpg differ diff --git a/NameCreater/resource/background_15.jpg b/NameCreater/resource/background_15.jpg new file mode 100644 index 0000000..eca0a95 Binary files /dev/null and b/NameCreater/resource/background_15.jpg differ diff --git a/NameCreater/resource/background_16.jpg b/NameCreater/resource/background_16.jpg new file mode 100644 index 0000000..1cf470b Binary files /dev/null and b/NameCreater/resource/background_16.jpg differ diff --git a/NameCreater/resource/background_17.jpg b/NameCreater/resource/background_17.jpg new file mode 100644 index 0000000..02696d7 Binary files /dev/null and b/NameCreater/resource/background_17.jpg differ diff --git a/NameCreater/resource/background_18.jpg b/NameCreater/resource/background_18.jpg new file mode 100644 index 0000000..2182430 Binary files /dev/null and b/NameCreater/resource/background_18.jpg differ diff --git a/NameCreater/resource/background_19.jpg b/NameCreater/resource/background_19.jpg new file mode 100644 index 0000000..42fe700 Binary files /dev/null and b/NameCreater/resource/background_19.jpg differ diff --git a/NameCreater/resource/background_2.jpg b/NameCreater/resource/background_2.jpg new file mode 100644 index 0000000..d0554fe Binary files /dev/null and b/NameCreater/resource/background_2.jpg differ diff --git a/NameCreater/resource/background_20.jpg b/NameCreater/resource/background_20.jpg new file mode 100644 index 0000000..55e5ccf Binary files /dev/null and b/NameCreater/resource/background_20.jpg differ diff --git a/NameCreater/resource/background_21.jpg b/NameCreater/resource/background_21.jpg new file mode 100644 index 0000000..2559b4e Binary files /dev/null and b/NameCreater/resource/background_21.jpg differ diff --git a/NameCreater/resource/background_22.jpg b/NameCreater/resource/background_22.jpg new file mode 100644 index 0000000..9a1af10 Binary files /dev/null and b/NameCreater/resource/background_22.jpg differ diff --git a/NameCreater/resource/background_23.jpg b/NameCreater/resource/background_23.jpg new file mode 100644 index 0000000..8381c64 Binary files /dev/null and b/NameCreater/resource/background_23.jpg differ diff --git a/NameCreater/resource/background_24.jpg b/NameCreater/resource/background_24.jpg new file mode 100644 index 0000000..d1277cb Binary files /dev/null and b/NameCreater/resource/background_24.jpg differ diff --git a/NameCreater/resource/background_25.jpg b/NameCreater/resource/background_25.jpg new file mode 100644 index 0000000..7d03038 Binary files /dev/null and b/NameCreater/resource/background_25.jpg differ diff --git a/NameCreater/resource/background_26.jpg b/NameCreater/resource/background_26.jpg new file mode 100644 index 0000000..5b72232 Binary files /dev/null and b/NameCreater/resource/background_26.jpg differ diff --git a/NameCreater/resource/background_27.jpg b/NameCreater/resource/background_27.jpg new file mode 100644 index 0000000..345038f Binary files /dev/null and b/NameCreater/resource/background_27.jpg differ diff --git a/NameCreater/resource/background_28.jpg b/NameCreater/resource/background_28.jpg new file mode 100644 index 0000000..9108f4d Binary files /dev/null and b/NameCreater/resource/background_28.jpg differ diff --git a/NameCreater/resource/background_29.jpg b/NameCreater/resource/background_29.jpg new file mode 100644 index 0000000..77ac05f Binary files /dev/null and b/NameCreater/resource/background_29.jpg differ diff --git a/NameCreater/resource/background_3.jpg b/NameCreater/resource/background_3.jpg new file mode 100644 index 0000000..664ae0b Binary files /dev/null and b/NameCreater/resource/background_3.jpg differ diff --git a/NameCreater/resource/background_30.jpg b/NameCreater/resource/background_30.jpg new file mode 100644 index 0000000..53bfc5c Binary files /dev/null and b/NameCreater/resource/background_30.jpg differ diff --git a/NameCreater/resource/background_4.jpg b/NameCreater/resource/background_4.jpg new file mode 100644 index 0000000..e83c826 Binary files /dev/null and b/NameCreater/resource/background_4.jpg differ diff --git a/NameCreater/resource/background_5.jpg b/NameCreater/resource/background_5.jpg new file mode 100644 index 0000000..6492575 Binary files /dev/null and b/NameCreater/resource/background_5.jpg differ diff --git a/NameCreater/resource/background_6.jpg b/NameCreater/resource/background_6.jpg new file mode 100644 index 0000000..0a5c1f9 Binary files /dev/null and b/NameCreater/resource/background_6.jpg differ diff --git a/NameCreater/resource/background_7.jpg b/NameCreater/resource/background_7.jpg new file mode 100644 index 0000000..3d56815 Binary files /dev/null and b/NameCreater/resource/background_7.jpg differ diff --git a/NameCreater/resource/background_8.jpg b/NameCreater/resource/background_8.jpg new file mode 100644 index 0000000..cb6fc90 Binary files /dev/null and b/NameCreater/resource/background_8.jpg differ diff --git a/NameCreater/resource/background_9.jpg b/NameCreater/resource/background_9.jpg new file mode 100644 index 0000000..91c6aa9 Binary files /dev/null and b/NameCreater/resource/background_9.jpg differ diff --git a/NameCreater/resource/background_b.jpg b/NameCreater/resource/background_b.jpg new file mode 100644 index 0000000..8da36cd Binary files /dev/null and b/NameCreater/resource/background_b.jpg differ diff --git a/NameCreater/resource/background_g.jpg b/NameCreater/resource/background_g.jpg new file mode 100644 index 0000000..e68ef5c Binary files /dev/null and b/NameCreater/resource/background_g.jpg differ diff --git a/NameCreater/resource/background_number_smaple.jpg b/NameCreater/resource/background_number_smaple.jpg new file mode 100644 index 0000000..48e26b9 Binary files /dev/null and b/NameCreater/resource/background_number_smaple.jpg differ diff --git a/NameCreater/resource/background_r.jpg b/NameCreater/resource/background_r.jpg new file mode 100644 index 0000000..aa4afa1 Binary files /dev/null and b/NameCreater/resource/background_r.jpg differ diff --git a/NameCreater/resource/background_sample.jpg b/NameCreater/resource/background_sample.jpg index 55f7928..6f1ff07 100644 Binary files a/NameCreater/resource/background_sample.jpg and b/NameCreater/resource/background_sample.jpg differ diff --git a/NameCreater/resource/background_y.jpg b/NameCreater/resource/background_y.jpg new file mode 100644 index 0000000..044c67a Binary files /dev/null and b/NameCreater/resource/background_y.jpg differ diff --git a/NameCreater/resource/boy_bg.jpg b/NameCreater/resource/boy_bg.jpg new file mode 100644 index 0000000..d9b47e1 Binary files /dev/null and b/NameCreater/resource/boy_bg.jpg differ diff --git a/NameCreater/resource/co.jpg b/NameCreater/resource/co.jpg new file mode 100644 index 0000000..4c8b787 Binary files /dev/null and b/NameCreater/resource/co.jpg differ diff --git a/NameCreater/resource/custom_logo/bg_1.jpg b/NameCreater/resource/custom_logo/bg_1.jpg new file mode 100644 index 0000000..9e41326 Binary files /dev/null and b/NameCreater/resource/custom_logo/bg_1.jpg differ diff --git a/NameCreater/resource/custom_logo/bg_2.jpg b/NameCreater/resource/custom_logo/bg_2.jpg new file mode 100644 index 0000000..08512b3 Binary files /dev/null and b/NameCreater/resource/custom_logo/bg_2.jpg differ diff --git a/NameCreater/resource/custom_logo/demo_1.jpg b/NameCreater/resource/custom_logo/demo_1.jpg new file mode 100644 index 0000000..73a3564 Binary files /dev/null and b/NameCreater/resource/custom_logo/demo_1.jpg differ diff --git a/NameCreater/resource/custom_logo/demo_2.jpg b/NameCreater/resource/custom_logo/demo_2.jpg new file mode 100644 index 0000000..b5b5922 Binary files /dev/null and b/NameCreater/resource/custom_logo/demo_2.jpg differ diff --git a/NameCreater/resource/five/b_1.jpg b/NameCreater/resource/five/b_1.jpg new file mode 100644 index 0000000..bec3777 Binary files /dev/null and b/NameCreater/resource/five/b_1.jpg differ diff --git a/NameCreater/resource/five/b_2.jpg b/NameCreater/resource/five/b_2.jpg new file mode 100644 index 0000000..d0554fe Binary files /dev/null and b/NameCreater/resource/five/b_2.jpg differ diff --git a/NameCreater/resource/five/b_3.jpg b/NameCreater/resource/five/b_3.jpg new file mode 100644 index 0000000..664ae0b Binary files /dev/null and b/NameCreater/resource/five/b_3.jpg differ diff --git a/NameCreater/resource/five/b_4.jpg b/NameCreater/resource/five/b_4.jpg new file mode 100644 index 0000000..e83c826 Binary files /dev/null and b/NameCreater/resource/five/b_4.jpg differ diff --git a/NameCreater/resource/five/b_5.jpg b/NameCreater/resource/five/b_5.jpg new file mode 100644 index 0000000..6492575 Binary files /dev/null and b/NameCreater/resource/five/b_5.jpg differ diff --git a/NameCreater/resource/five/g_1.jpg b/NameCreater/resource/five/g_1.jpg new file mode 100644 index 0000000..0a5c1f9 Binary files /dev/null and b/NameCreater/resource/five/g_1.jpg differ diff --git a/NameCreater/resource/five/g_2.jpg b/NameCreater/resource/five/g_2.jpg new file mode 100644 index 0000000..3d56815 Binary files /dev/null and b/NameCreater/resource/five/g_2.jpg differ diff --git a/NameCreater/resource/five/g_3.jpg b/NameCreater/resource/five/g_3.jpg new file mode 100644 index 0000000..cb6fc90 Binary files /dev/null and b/NameCreater/resource/five/g_3.jpg differ diff --git a/NameCreater/resource/five/g_4.jpg b/NameCreater/resource/five/g_4.jpg new file mode 100644 index 0000000..91c6aa9 Binary files /dev/null and b/NameCreater/resource/five/g_4.jpg differ diff --git a/NameCreater/resource/five/g_5.jpg b/NameCreater/resource/five/g_5.jpg new file mode 100644 index 0000000..11d704e Binary files /dev/null and b/NameCreater/resource/five/g_5.jpg differ diff --git a/NameCreater/resource/five/kb_1.jpg b/NameCreater/resource/five/kb_1.jpg new file mode 100644 index 0000000..2559b4e Binary files /dev/null and b/NameCreater/resource/five/kb_1.jpg differ diff --git a/NameCreater/resource/five/kb_2.jpg b/NameCreater/resource/five/kb_2.jpg new file mode 100644 index 0000000..9a1af10 Binary files /dev/null and b/NameCreater/resource/five/kb_2.jpg differ diff --git a/NameCreater/resource/five/kb_3.jpg b/NameCreater/resource/five/kb_3.jpg new file mode 100644 index 0000000..8381c64 Binary files /dev/null and b/NameCreater/resource/five/kb_3.jpg differ diff --git a/NameCreater/resource/five/kb_4.jpg b/NameCreater/resource/five/kb_4.jpg new file mode 100644 index 0000000..d1277cb Binary files /dev/null and b/NameCreater/resource/five/kb_4.jpg differ diff --git a/NameCreater/resource/five/kb_5.jpg b/NameCreater/resource/five/kb_5.jpg new file mode 100644 index 0000000..7d03038 Binary files /dev/null and b/NameCreater/resource/five/kb_5.jpg differ diff --git a/NameCreater/resource/five/kg_1.jpg b/NameCreater/resource/five/kg_1.jpg new file mode 100644 index 0000000..5b72232 Binary files /dev/null and b/NameCreater/resource/five/kg_1.jpg differ diff --git a/NameCreater/resource/five/kg_2.jpg b/NameCreater/resource/five/kg_2.jpg new file mode 100644 index 0000000..345038f Binary files /dev/null and b/NameCreater/resource/five/kg_2.jpg differ diff --git a/NameCreater/resource/five/kg_3.jpg b/NameCreater/resource/five/kg_3.jpg new file mode 100644 index 0000000..9108f4d Binary files /dev/null and b/NameCreater/resource/five/kg_3.jpg differ diff --git a/NameCreater/resource/five/kg_4.jpg b/NameCreater/resource/five/kg_4.jpg new file mode 100644 index 0000000..77ac05f Binary files /dev/null and b/NameCreater/resource/five/kg_4.jpg differ diff --git a/NameCreater/resource/five/kg_5.jpg b/NameCreater/resource/five/kg_5.jpg new file mode 100644 index 0000000..53bfc5c Binary files /dev/null and b/NameCreater/resource/five/kg_5.jpg differ diff --git a/NameCreater/resource/five/nb_1.jpg b/NameCreater/resource/five/nb_1.jpg new file mode 100644 index 0000000..bbf23ee Binary files /dev/null and b/NameCreater/resource/five/nb_1.jpg differ diff --git a/NameCreater/resource/five/nb_2.jpg b/NameCreater/resource/five/nb_2.jpg new file mode 100644 index 0000000..3317036 Binary files /dev/null and b/NameCreater/resource/five/nb_2.jpg differ diff --git a/NameCreater/resource/five/nb_3.jpg b/NameCreater/resource/five/nb_3.jpg new file mode 100644 index 0000000..335649f Binary files /dev/null and b/NameCreater/resource/five/nb_3.jpg differ diff --git a/NameCreater/resource/five/nb_4.jpg b/NameCreater/resource/five/nb_4.jpg new file mode 100644 index 0000000..cbd6fa3 Binary files /dev/null and b/NameCreater/resource/five/nb_4.jpg differ diff --git a/NameCreater/resource/five/nb_5.jpg b/NameCreater/resource/five/nb_5.jpg new file mode 100644 index 0000000..eca0a95 Binary files /dev/null and b/NameCreater/resource/five/nb_5.jpg differ diff --git a/NameCreater/resource/five/new_bg_sample.jpg b/NameCreater/resource/five/new_bg_sample.jpg new file mode 100644 index 0000000..999e5a6 Binary files /dev/null and b/NameCreater/resource/five/new_bg_sample.jpg differ diff --git a/NameCreater/resource/five/ng_1.jpg b/NameCreater/resource/five/ng_1.jpg new file mode 100644 index 0000000..2182430 Binary files /dev/null and b/NameCreater/resource/five/ng_1.jpg differ diff --git a/NameCreater/resource/five/ng_2.jpg b/NameCreater/resource/five/ng_2.jpg new file mode 100644 index 0000000..42fe700 Binary files /dev/null and b/NameCreater/resource/five/ng_2.jpg differ diff --git a/NameCreater/resource/five/ng_3.jpg b/NameCreater/resource/five/ng_3.jpg new file mode 100644 index 0000000..55e5ccf Binary files /dev/null and b/NameCreater/resource/five/ng_3.jpg differ diff --git a/NameCreater/resource/five/ng_4.jpg b/NameCreater/resource/five/ng_4.jpg new file mode 100644 index 0000000..02696d7 Binary files /dev/null and b/NameCreater/resource/five/ng_4.jpg differ diff --git a/NameCreater/resource/five/ng_5.jpg b/NameCreater/resource/five/ng_5.jpg new file mode 100644 index 0000000..1cf470b Binary files /dev/null and b/NameCreater/resource/five/ng_5.jpg differ diff --git a/NameCreater/resource/g.jpg b/NameCreater/resource/g.jpg new file mode 100644 index 0000000..d5e1bff Binary files /dev/null and b/NameCreater/resource/g.jpg differ diff --git a/NameCreater/resource/girl_bg.jpg b/NameCreater/resource/girl_bg.jpg new file mode 100644 index 0000000..856a1d3 Binary files /dev/null and b/NameCreater/resource/girl_bg.jpg differ diff --git a/NameCreater/resource/hk_holder/a.jpg b/NameCreater/resource/hk_holder/a.jpg new file mode 100644 index 0000000..1d165a9 Binary files /dev/null and b/NameCreater/resource/hk_holder/a.jpg differ diff --git a/NameCreater/resource/hk_holder/b.jpg b/NameCreater/resource/hk_holder/b.jpg new file mode 100644 index 0000000..ac8f8c7 Binary files /dev/null and b/NameCreater/resource/hk_holder/b.jpg differ diff --git a/NameCreater/resource/hk_holder/g.jpg b/NameCreater/resource/hk_holder/g.jpg new file mode 100644 index 0000000..540e6b1 Binary files /dev/null and b/NameCreater/resource/hk_holder/g.jpg differ diff --git a/NameCreater/resource/hk_holder/m.jpg b/NameCreater/resource/hk_holder/m.jpg new file mode 100644 index 0000000..3d78720 Binary files /dev/null and b/NameCreater/resource/hk_holder/m.jpg differ diff --git a/NameCreater/resource/hk_holder/p.jpg b/NameCreater/resource/hk_holder/p.jpg new file mode 100644 index 0000000..32d365f Binary files /dev/null and b/NameCreater/resource/hk_holder/p.jpg differ diff --git a/NameCreater/resource/hk_holder/pg.jpg b/NameCreater/resource/hk_holder/pg.jpg new file mode 100644 index 0000000..946236e Binary files /dev/null and b/NameCreater/resource/hk_holder/pg.jpg differ diff --git a/NameCreater/resource/hk_holder/r.jpg b/NameCreater/resource/hk_holder/r.jpg new file mode 100644 index 0000000..63cc222 Binary files /dev/null and b/NameCreater/resource/hk_holder/r.jpg differ diff --git a/NameCreater/resource/hk_holder/sample.jpg b/NameCreater/resource/hk_holder/sample.jpg new file mode 100644 index 0000000..00ba7fa Binary files /dev/null and b/NameCreater/resource/hk_holder/sample.jpg differ diff --git a/NameCreater/resource/hk_holder/st.jpg b/NameCreater/resource/hk_holder/st.jpg new file mode 100644 index 0000000..85e28b1 Binary files /dev/null and b/NameCreater/resource/hk_holder/st.jpg differ diff --git a/NameCreater/resource/hk_holder/w.jpg b/NameCreater/resource/hk_holder/w.jpg new file mode 100644 index 0000000..b355241 Binary files /dev/null and b/NameCreater/resource/hk_holder/w.jpg differ diff --git a/NameCreater/resource/hk_holder/y.jpg b/NameCreater/resource/hk_holder/y.jpg new file mode 100644 index 0000000..e1a9e95 Binary files /dev/null and b/NameCreater/resource/hk_holder/y.jpg differ diff --git a/NameCreater/resource/m.jpg b/NameCreater/resource/m.jpg new file mode 100644 index 0000000..822230a Binary files /dev/null and b/NameCreater/resource/m.jpg differ diff --git a/NameCreater/resource/ol.jpg b/NameCreater/resource/ol.jpg new file mode 100644 index 0000000..53fe550 Binary files /dev/null and b/NameCreater/resource/ol.jpg differ diff --git a/NameCreater/resource/p.jpg b/NameCreater/resource/p.jpg new file mode 100644 index 0000000..2d9895f Binary files /dev/null and b/NameCreater/resource/p.jpg differ diff --git a/NameCreater/resource/pg.jpg b/NameCreater/resource/pg.jpg new file mode 100644 index 0000000..9e58761 Binary files /dev/null and b/NameCreater/resource/pg.jpg differ diff --git a/NameCreater/resource/r.jpg b/NameCreater/resource/r.jpg new file mode 100644 index 0000000..12ac494 Binary files /dev/null and b/NameCreater/resource/r.jpg differ diff --git a/NameCreater/resource/sn.jpg b/NameCreater/resource/sn.jpg new file mode 100644 index 0000000..31ca4a1 Binary files /dev/null and b/NameCreater/resource/sn.jpg differ diff --git a/NameCreater/resource/st.jpg b/NameCreater/resource/st.jpg new file mode 100644 index 0000000..fa69cd0 Binary files /dev/null and b/NameCreater/resource/st.jpg differ diff --git a/NameCreater/resource/two_word_sample.jpg b/NameCreater/resource/two_word_sample.jpg new file mode 100644 index 0000000..acd3b7b Binary files /dev/null and b/NameCreater/resource/two_word_sample.jpg differ diff --git a/NameCreater/resource/w.jpg b/NameCreater/resource/w.jpg new file mode 100644 index 0000000..9c01dcd Binary files /dev/null and b/NameCreater/resource/w.jpg differ diff --git a/NameCreater/resource/y.jpg b/NameCreater/resource/y.jpg new file mode 100644 index 0000000..bfe7eb0 Binary files /dev/null and b/NameCreater/resource/y.jpg differ diff --git a/NameCreater/resource/截圖 2022-01-27 上午9.26.22.png b/NameCreater/resource/截圖 2022-01-27 上午9.26.22.png deleted file mode 100644 index c910b77..0000000 Binary files a/NameCreater/resource/截圖 2022-01-27 上午9.26.22.png and /dev/null differ