first commit

This commit is contained in:
2026-04-29 14:10:10 +08:00
commit b28556d43d
1558 changed files with 241386 additions and 0 deletions
+141
View File
@@ -0,0 +1,141 @@
#include "PicCounterItem.h"
#include <QDebug>
#include <QFont>
#include <QFontMetrics>
#include <QString>
#include <QHash>
QHash<QString, int> defCharWidthMap;
int charWidth(QFont font, int height) {
font.setLetterSpacing(QFont::AbsoluteSpacing, 0);
font.setPixelSize(height);
QFontMetrics fm(font);
return fm.horizontalAdvance("0123456789") / 10;
}
PicCounterItem::PicCounterItem(QGraphicsItem *parent, QGraphicsScene *scene, const SourceType type)
:PicTextItem(parent, scene, type)
{
}
QVariant PicCounterItem::source()
{
return PicTextItem::source();
}
void PicCounterItem::setSource(QVariant var)
{
PicTextItem::setSource(var);
setCounter(counterType(), digitalNum());
}
void PicCounterItem::setCounter(COUNTER_TYPE type, int digitalNum)
{
// 直接修改字体,生成新的HTML占位图
auto font = this->font();
QString fontname = font.family();
int pixelSize = 9;
QString numStr = "";
for(int i = fontname.length() - 1; i >= 0; --i) {
if(fontname[i].isDigit()) {
numStr.prepend(fontname[i]);
} else {
break;
}
}
if(!numStr.isEmpty()) {
pixelSize = numStr.toInt();
}
font.setFamily(fontname);
font.setPixelSize(pixelSize);
font.setWeight(false && (pixelSize<=16) ? QFont::Bold : QFont::Normal);
font.setLetterSpacing(QFont::AbsoluteSpacing, 0);
// font.setLetterSpacing(QFont::AbsoluteSpacing, 0);
QFontMetrics fontMetrics(font);
int width = (fontMetrics.horizontalAdvance("0123456789")) / 10;
int height = font.pixelSize();
width += letterSpace();
int varType1 = type;
if(fontname.contains("SerifL") || fontname.contains("serifl"))
varType1 = 20 + type;
else if(fontname.contains("SerifR") || fontname.contains("serifr"))
varType1 = 20 + type;
else if(fontname.contains("bangla"))
varType1 = 30 + type;
else if(fontname.contains("biyangF"))
varType1 = 50 + type;
else if(fontname.contains("Roman"))
varType1 = 60 + type;
setHtml(QString("<img src=\":/%1/%5/../image/digitalWidth%2.bmp\" height=\"%3\" width=\"%4\" style=\"vertical-align: bottom;\" />")
.arg(type).arg(false && (pixelSize<=16)?(digitalNum*100 + 75):digitalNum)
.arg(height + 1).arg(width*digitalNum).arg(varType1));
m_counterType = type;
m_digitalNum = digitalNum;
m_digitalImg = QImage(QString(":/%1/image/digitalWidth%2.bmp").arg(type).arg(digitalNum));
m_digitalImg = m_digitalImg.scaled(width*digitalNum, height + 1, Qt::IgnoreAspectRatio, Qt::FastTransformation);
applyModify();
qInfo() << "Counter item set to " << type ;
qInfo() << ">\tdigitalNum: " << digitalNum << ", font name: " << fontname << ", pixel size: " << pixelSize;
qInfo() << ">\tletterSpace: " << letterSpace() << "charRom width: " << digitalNum * width << " width: " << width;
}
int PicCounterItem::charWidth()
{
if(!m_charWidthMap.contains(font().family()))
return 0;
return m_charWidthMap[font().family()];
}
void PicCounterItem::setCharWidth(int width)
{
m_charWidthMap[font().family()] = width;
setCounter(counterType(), digitalNum());
}
QImage PicCounterItem::itemImage()
{
return m_digitalImg;
}
void PicCounterItem::setCustomAttrs(const QXmlStreamAttributes &attrs)
{
auto typeRef = attrs.value("counter_type");
auto digitalNumRef = attrs.value("digital_num");
bool ok = false;
int counterType = typeRef.toInt(&ok);
if(!ok || (counterType != COUNTER_TYPE_1 && COUNTER_TYPE_2 != counterType)) {
qWarning() << "Invalied counter type: " << counterType;
return;
}
ok = false;
int digitalNum = digitalNumRef.toInt(&ok);
if(!ok || digitalNum <= 0) {
qWarning() << "Invalied counter digital number: " << digitalNum;
return;
}
setCounter(static_cast<COUNTER_TYPE>(counterType), digitalNum);
qInfo() << "Loaded attrs from xml: " << " counter type: " << counterType << ", digitalNum: " << digitalNum;
}
void PicCounterItem::saveCustomAttrs(QXmlStreamAttributes &attrs)
{
attrs.append("counter_type", QString::number(counterType()));
attrs.append("digital_num", QString::number(digitalNum()));
qInfo() << "Set attrs to xml: " << " counter type: " << counterType() << ", digitalNum: " << digitalNum();
}
void PicCounterItem::letterSpaceChanged()
{
setSource(source());
}