124 lines
3.5 KiB
C++
124 lines
3.5 KiB
C++
#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);
|
|
|
|
QFontMetrics fontMetrics(font);
|
|
int width = (fontMetrics.horizontalAdvance("0123456789")) / 10;
|
|
int height = font.pixelSize();
|
|
width += letterSpace();
|
|
|
|
m_counterType = type;
|
|
m_digitalNum = digitalNum;
|
|
m_digitalImg = strToImage(QString("8").repeated(digitalNum));
|
|
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());
|
|
}
|