diff --git a/classes/cmdline/modeconvertfont.cpp b/classes/cmdline/modeconvertfont.cpp index b106e83..75c5c72 100644 --- a/classes/cmdline/modeconvertfont.cpp +++ b/classes/cmdline/modeconvertfont.cpp @@ -212,7 +212,7 @@ int ModeConvertFont::process() parameters); fontDocument.setDocumentName(docNameWS); - fontDocument.dataContainer()->setInfo("converted filename", QVariant(this->mOuputFilename)); + fontDocument.dataContainer()->setCommonInfo("converted filename", QVariant(this->mOuputFilename)); // save to output file QFile file(this->mOuputFilename); diff --git a/classes/cmdline/modeconvertimage.cpp b/classes/cmdline/modeconvertimage.cpp index 407e264..3393d89 100644 --- a/classes/cmdline/modeconvertimage.cpp +++ b/classes/cmdline/modeconvertimage.cpp @@ -124,7 +124,7 @@ int ModeConvertImage::process() imageDocument.dataContainer()->setImage(key, &imageConverted); imageDocument.setDocumentName(docNameWS); - imageDocument.dataContainer()->setInfo("converted filename", QVariant(this->mOuputFilename)); + imageDocument.dataContainer()->setCommonInfo("converted filename", QVariant(this->mOuputFilename)); // save to output file QFile file(this->mOuputFilename); diff --git a/classes/data/datacontainer.cpp b/classes/data/datacontainer.cpp index 424364b..05d0efa 100644 --- a/classes/data/datacontainer.cpp +++ b/classes/data/datacontainer.cpp @@ -20,9 +20,12 @@ #include "datacontainer.h" #include +#include #include "historykeeper.h" //----------------------------------------------------------------------------- const QString DataContainer::DataChangedKey = QString("data changed"); +const QString DataContainer::CommonInfoKeyPrefix = QString("common:"); +const QString DataContainer::ImageInfoKeyPrefix = QString("image:"); //----------------------------------------------------------------------------- DataContainer::DataContainer(QObject *parent) : QObject(parent) @@ -40,11 +43,11 @@ DataContainer::~DataContainer() delete this->mHistory; } //----------------------------------------------------------------------------- -const QImage *DataContainer::image(const QString &key) const +const QImage *DataContainer::image(const QString &imageKey) const { - if (this->mKeys.contains(key)) + if (this->mKeys.contains(imageKey)) { - return this->mImageMap.value(key, this->mDefaultImage); + return this->mImageMap.value(imageKey, this->mDefaultImage); } else { @@ -52,40 +55,40 @@ const QImage *DataContainer::image(const QString &key) const } } //----------------------------------------------------------------------------- -void DataContainer::setImage(const QString &key, const QImage *image) +void DataContainer::setImage(const QString &imageKey, const QImage *image) { - if (this->mKeys.contains(key)) + if (this->mKeys.contains(imageKey)) { - this->mImageMap.remove(key); + this->mImageMap.remove(imageKey); } else { - this->mKeys.append(key); + this->mKeys.append(imageKey); } QImage *imageNew = new QImage(*image); - this->mImageMap.insert(key, imageNew); + this->mImageMap.insert(imageKey, imageNew); this->setChanged(true); emit this->dataChanged(false); } //----------------------------------------------------------------------------- -QVariant DataContainer::info(const QString &key) const +QVariant DataContainer::commonInfo(const QString &infoKey) const { - if (this->mInfoMap.contains(key)) + if (this->mInfoMap.contains(DataContainer::CommonInfoKeyPrefix % infoKey)) { - return this->mInfoMap.value(key); + return this->mInfoMap.value(DataContainer::CommonInfoKeyPrefix % infoKey); } return QVariant(); } //----------------------------------------------------------------------------- -void DataContainer::setInfo(const QString &key, const QVariant &value) +void DataContainer::setCommonInfo(const QString &infoKey, const QVariant &value) { bool changed = false; //TODO: may be need to compare old and new values? - if (this->mInfoMap.contains(key)) + if (this->mInfoMap.contains(DataContainer::CommonInfoKeyPrefix % infoKey)) { - if (this->mInfoMap.value(key) != value) + if (this->mInfoMap.value(DataContainer::CommonInfoKeyPrefix % infoKey) != value) { changed = true; } @@ -97,7 +100,40 @@ void DataContainer::setInfo(const QString &key, const QVariant &value) if (changed) { - this->mInfoMap.insert(key, value); + this->mInfoMap.insert(DataContainer::CommonInfoKeyPrefix % infoKey, value); + this->setChanged(true); + emit this->dataChanged(false); + } +} +//----------------------------------------------------------------------------- +QVariant DataContainer::imageInfo(const QString &imageKey, const QString &infoKey) const +{ + if (this->mInfoMap.contains(DataContainer::ImageInfoKeyPrefix % imageKey % ":" % infoKey)) + { + return this->mInfoMap.value(DataContainer::ImageInfoKeyPrefix % imageKey % ":" % infoKey); + } + return QVariant(); +} +//----------------------------------------------------------------------------- +void DataContainer::setImageInfo(const QString &imageKey, const QString &infoKey, const QVariant &value) +{ + bool changed = false; + + if (this->mInfoMap.contains(DataContainer::ImageInfoKeyPrefix % imageKey % ":" % infoKey)) + { + if (this->mInfoMap.value(DataContainer::ImageInfoKeyPrefix % imageKey % ":" % infoKey) != value) + { + changed = true; + } + } + else + { + changed = true; + } + + if (changed) + { + this->mInfoMap.insert(DataContainer::ImageInfoKeyPrefix % imageKey % ":" % infoKey, value); this->setChanged(true); emit this->dataChanged(false); } @@ -202,11 +238,16 @@ bool DataContainer::canRedo() const //----------------------------------------------------------------------------- bool DataContainer::changed() const { - QVariant value = this->info(DataContainer::DataChangedKey); - if (!value.isNull()) + if (this->mInfoMap.contains(DataContainer::DataChangedKey)) { - return value.toBool(); + QVariant value = this->mInfoMap.value(DataContainer::DataChangedKey, QVariant(false)); + + if (!value.isNull()) + { + return value.toBool(); + } } + return false; } //----------------------------------------------------------------------------- diff --git a/classes/data/datacontainer.h b/classes/data/datacontainer.h index d5448b5..902ed43 100644 --- a/classes/data/datacontainer.h +++ b/classes/data/datacontainer.h @@ -38,11 +38,14 @@ public: explicit DataContainer(QObject *parent = 0); virtual ~DataContainer(); - const QImage *image(const QString &key) const; - void setImage(const QString &key, const QImage *image); + const QImage *image(const QString &imageKey) const; + void setImage(const QString &imageKey, const QImage *image); - QVariant info(const QString &key) const; - void setInfo(const QString &key, const QVariant &value); + QVariant commonInfo(const QString &infoKey) const; + void setCommonInfo(const QString &infoKey, const QVariant &value); + + QVariant imageInfo(const QString &imageKey, const QString &infoKey) const; + void setImageInfo(const QString &imageKey, const QString &infoKey, const QVariant &value); void clear(); int count() const; @@ -64,6 +67,8 @@ public: private: static const QString DataChangedKey; + static const QString CommonInfoKeyPrefix; + static const QString ImageInfoKeyPrefix; QMap mImageMap; QMap mInfoMap; diff --git a/classes/data/fontdocument.cpp b/classes/data/fontdocument.cpp index 9180cb0..2c9645b 100644 --- a/classes/data/fontdocument.cpp +++ b/classes/data/fontdocument.cpp @@ -88,6 +88,7 @@ bool FontDocument::load(const QString &fileName) QString fontFamily, style; int size = 0; + int ascent = 0, descent = 0; bool monospaced = false, antialiasing = false, alphaChannel = false; QDomNode n = root.firstChild(); @@ -112,6 +113,20 @@ bool FontDocument::load(const QString &fileName) if (ok) size = a; } + else if (e.tagName() == "ascent") + { + bool ok; + int a = e.text().toInt(&ok); + if (ok) + ascent = a; + } + else if (e.tagName() == "descent") + { + bool ok; + int a = e.text().toInt(&ok); + if (ok) + descent = a; + } else if (e.tagName() == "widthType") { monospaced = (e.text() == "monospaced"); @@ -165,6 +180,8 @@ bool FontDocument::load(const QString &fileName) this->setMonospaced(monospaced); this->setAntialiasing(antialiasing); this->setAlphaChannel(alphaChannel); + this->setAscent(ascent); + this->setDescent(descent); } } file.close(); @@ -210,6 +227,16 @@ bool FontDocument::save(const QString &fileName) nodeRoot.appendChild(nodeSize); nodeSize.appendChild(doc.createTextNode(QString("%1").arg(parameters.size))); + // ascent + QDomElement nodeAscent = doc.createElement("ascent"); + nodeRoot.appendChild(nodeAscent); + nodeAscent.appendChild(doc.createTextNode(QString("%1").arg(parameters.ascent))); + + // descent + QDomElement nodeDescent = doc.createElement("descent"); + nodeRoot.appendChild(nodeDescent); + nodeDescent.appendChild(doc.createTextNode(QString("%1").arg(parameters.descent))); + // style QDomElement nodeStyle = doc.createElement("style"); nodeRoot.appendChild(nodeStyle); @@ -305,30 +332,30 @@ bool FontDocument::changed() const //----------------------------------------------------------------------------- QString FontDocument::documentFilename() const { - QVariant result = this->mContainer->info("filename"); + QVariant result = this->mContainer->commonInfo("filename"); return result.toString(); } //----------------------------------------------------------------------------- QString FontDocument::documentName() const { - QVariant result = this->mContainer->info("document name"); + QVariant result = this->mContainer->commonInfo("document name"); return result.toString(); } //----------------------------------------------------------------------------- void FontDocument::setDocumentName(const QString &value) { - this->mContainer->setInfo("document name", value); + this->mContainer->setCommonInfo("document name", value); } //----------------------------------------------------------------------------- QString FontDocument::outputFilename() const { - QVariant result = this->mContainer->info("converted filename"); + QVariant result = this->mContainer->commonInfo("converted filename"); return result.toString(); } //----------------------------------------------------------------------------- void FontDocument::setOutputFilename(const QString &value) { - this->mContainer->setInfo("converted filename", QVariant(value)); + this->mContainer->setCommonInfo("converted filename", QVariant(value)); } //----------------------------------------------------------------------------- DataContainer *FontDocument::dataContainer() const @@ -352,9 +379,6 @@ QString FontDocument::convert(Preset *preset) tFontParameters parameters; this->fontCharacters(&chars, ¶meters); - QFontDatabase fonts; - QFont font = fonts.font(parameters.family, parameters.style, parameters.size); - QFontMetrics metrics(font); tags.setTagValue(Tags::DocumentDataType, "font"); tags.setTagValue(Tags::FontFamily, parameters.family); @@ -364,8 +388,8 @@ QString FontDocument::convert(Preset *preset) tags.setTagValue(Tags::FontAntiAliasing, parameters.antiAliasing ? "yes" : "no"); tags.setTagValue(Tags::FontAlphaChannel, parameters.alphaChannel ? "yes" : "no"); tags.setTagValue(Tags::FontWidthType, parameters.monospaced ? "monospaced" : "proportional"); - tags.setTagValue(Tags::FontAscent, QString("%1").arg(metrics.ascent())); - tags.setTagValue(Tags::FontDescent, QString("%1").arg(metrics.descent())); + tags.setTagValue(Tags::FontAscent, QString("%1").arg(parameters.ascent)); + tags.setTagValue(Tags::FontDescent, QString("%1").arg(parameters.descent)); Parser parser(Parser::TypeFont, preset, this); QString result = parser.convert(this, tags); @@ -442,6 +466,8 @@ void FontDocument::fontCharacters(QString *chars, parameters->monospaced = this->monospaced(); parameters->antiAliasing = this->antialiasing(); parameters->alphaChannel = this->alphaChannel(); + parameters->ascent = this->ascent(); + parameters->descent = this->descent(); } //----------------------------------------------------------------------------- void FontDocument::setFontCharacters(const QString &chars, @@ -456,11 +482,13 @@ void FontDocument::setFontCharacters(const QString &chars, if (this->mContainer->count() > 1) { if (this->usedFont().family() != parameters.family || - this->usedStyle() != parameters.style || - this->usedFont().pixelSize() != parameters.size || - this->monospaced() != parameters.monospaced || - this->antialiasing() != parameters.antiAliasing || - this->alphaChannel() != parameters.alphaChannel) + this->usedStyle() != parameters.style || + this->usedFont().pixelSize() != parameters.size || + this->monospaced() != parameters.monospaced || + this->antialiasing() != parameters.antiAliasing || + this->alphaChannel() != parameters.alphaChannel || + this->ascent() != parameters.ascent || + this->descent() != parameters.descent) { DialogFontChanged dialog(qobject_cast(this->parent())); if (dialog.exec() == QDialog::Accepted) @@ -500,6 +528,8 @@ void FontDocument::setFontCharacters(const QString &chars, this->setMonospaced(parameters.monospaced); this->setAntialiasing(parameters.antiAliasing); this->setAlphaChannel(parameters.alphaChannel); + this->setAscent(parameters.ascent); + this->setDescent(parameters.descent); } else { @@ -519,9 +549,10 @@ void FontDocument::setFontCharacters(const QString &chars, // find max size int width = 0, height = 0; + QFontMetrics metrics(fontNew); + if (parameters.monospaced) { - QFontMetrics metrics(fontNew); for (int i = 0; i < chars.count(); i++) { width = qMax(width, metrics.width(chars.at(i))); @@ -542,13 +573,13 @@ void FontDocument::setFontCharacters(const QString &chars, { keys.append(key); QImage image = FontHelper::drawCharacter(chars.at(i), - fontNew, - FontEditorOptions::foreColor(), - FontEditorOptions::backColor(), - width, - height, - parameters.antiAliasing, - parameters.alphaChannel); + fontNew, + FontEditorOptions::foreColor(), + FontEditorOptions::backColor(), + width, + height, + parameters.antiAliasing, + parameters.alphaChannel); this->mContainer->setImage(key, new QImage(image)); } } @@ -564,13 +595,13 @@ void FontDocument::setDocumentFilename(const QString &value) { if (this->documentFilename() != value) { - this->mContainer->setInfo("filename", QVariant(value)); + this->mContainer->setCommonInfo("filename", QVariant(value)); } } //----------------------------------------------------------------------------- QFont FontDocument::usedFont() const { - QVariant var = this->mContainer->info("used font"); + QVariant var = this->mContainer->commonInfo("used font"); if (!var.isNull()) { QFont result = var.value(); @@ -581,47 +612,67 @@ QFont FontDocument::usedFont() const //----------------------------------------------------------------------------- void FontDocument::setUsedFont(const QFont &value) { - this->mContainer->setInfo("used font", value); + this->mContainer->setCommonInfo("used font", value); } //----------------------------------------------------------------------------- QString FontDocument::usedStyle() const { - return this->mContainer->info("style").toString(); + return this->mContainer->commonInfo("style").toString(); } //----------------------------------------------------------------------------- void FontDocument::setUsedStyle(const QString &value) { - this->mContainer->setInfo("style", value); + this->mContainer->setCommonInfo("style", value); } //----------------------------------------------------------------------------- bool FontDocument::monospaced() const { - return this->mContainer->info("monospaced").toBool(); + return this->mContainer->commonInfo("monospaced").toBool(); } //----------------------------------------------------------------------------- void FontDocument::setMonospaced(const bool value) { - this->mContainer->setInfo("monospaced", value); + this->mContainer->setCommonInfo("monospaced", value); } //----------------------------------------------------------------------------- bool FontDocument::antialiasing() const { - return this->mContainer->info("antialiasing").toBool(); + return this->mContainer->commonInfo("antialiasing").toBool(); } //----------------------------------------------------------------------------- void FontDocument::setAntialiasing(const bool value) { - this->mContainer->setInfo("antialiasing", value); + this->mContainer->setCommonInfo("antialiasing", value); } //----------------------------------------------------------------------------- bool FontDocument::alphaChannel() const { - return this->mContainer->info("alphaChannel").toBool(); + return this->mContainer->commonInfo("alphaChannel").toBool(); } //----------------------------------------------------------------------------- void FontDocument::setAlphaChannel(const bool value) { - this->mContainer->setInfo("alphaChannel", value); + this->mContainer->setCommonInfo("alphaChannel", value); +} +//----------------------------------------------------------------------------- +int FontDocument::ascent() const +{ + return this->mContainer->commonInfo("ascent").toInt(); +} +//----------------------------------------------------------------------------- +void FontDocument::setAscent(int value) +{ + this->mContainer->setCommonInfo("ascent", value); +} +//----------------------------------------------------------------------------- +int FontDocument::descent() const +{ + return this->mContainer->commonInfo("descent").toInt(); +} +//----------------------------------------------------------------------------- +void FontDocument::setDescent(int value) +{ + this->mContainer->setCommonInfo("descent", value); } //----------------------------------------------------------------------------- void FontDocument::mon_container_dataChanged(bool historyStateMoved) diff --git a/classes/data/fontdocument.h b/classes/data/fontdocument.h index dcc047c..ee12ef4 100644 --- a/classes/data/fontdocument.h +++ b/classes/data/fontdocument.h @@ -81,6 +81,12 @@ private: bool alphaChannel() const; void setAlphaChannel(const bool value); + int ascent() const; + void setAscent(int value); + + int descent() const; + void setDescent(int value); + private slots: void mon_container_dataChanged(bool historyStateMoved); diff --git a/classes/data/imagedocument.cpp b/classes/data/imagedocument.cpp index ce0eb98..db2a5a4 100644 --- a/classes/data/imagedocument.cpp +++ b/classes/data/imagedocument.cpp @@ -179,30 +179,30 @@ bool ImageDocument::changed() const //----------------------------------------------------------------------------- QString ImageDocument::documentFilename() const { - QVariant result = this->mContainer->info("filename"); + QVariant result = this->mContainer->commonInfo("filename"); return result.toString(); } //----------------------------------------------------------------------------- QString ImageDocument::documentName() const { - QVariant result = this->mContainer->info("document name"); + QVariant result = this->mContainer->commonInfo("document name"); return result.toString(); } //----------------------------------------------------------------------------- void ImageDocument::setDocumentName(const QString &value) { - this->mContainer->setInfo("document name", value); + this->mContainer->setCommonInfo("document name", value); } //----------------------------------------------------------------------------- QString ImageDocument::outputFilename() const { - QVariant result = this->mContainer->info("converted filename"); + QVariant result = this->mContainer->commonInfo("converted filename"); return result.toString(); } //----------------------------------------------------------------------------- void ImageDocument::setOutputFilename(const QString &value) { - this->mContainer->setInfo("converted filename", QVariant(value)); + this->mContainer->setCommonInfo("converted filename", QVariant(value)); } //----------------------------------------------------------------------------- DataContainer *ImageDocument::dataContainer() const @@ -292,7 +292,7 @@ void ImageDocument::setDocumentFilename(const QString &value) { if (this->documentFilename() != value) { - this->mContainer->setInfo("filename", QVariant(value)); + this->mContainer->setCommonInfo("filename", QVariant(value)); } } //----------------------------------------------------------------------------- diff --git a/classes/data/tfontparameters.h b/classes/data/tfontparameters.h index f4792a3..f89f9d7 100644 --- a/classes/data/tfontparameters.h +++ b/classes/data/tfontparameters.h @@ -11,6 +11,8 @@ struct tFontParameters bool monospaced; bool antiAliasing; bool alphaChannel; + int ascent; + int descent; }; //----------------------------------------------------------------------------- #endif // TFONTPARAMETERS diff --git a/controls/fonts/font-new/dialogfontselectdata.cpp b/controls/fonts/font-new/dialogfontselectdata.cpp index b10634e..f4a1ea9 100644 --- a/controls/fonts/font-new/dialogfontselectdata.cpp +++ b/controls/fonts/font-new/dialogfontselectdata.cpp @@ -81,6 +81,16 @@ void DialogFontSelectData::getFontParameters(tFontParameters *parameters) parameters->monospaced = this->mMonospaced; parameters->antiAliasing = this->mAntialiasing; parameters->alphaChannel = this->mAlphaChannel; + + // ascent/descent + { + QFontDatabase fonts; + QFont font = fonts.font(parameters->family, parameters->style, parameters->size); + QFontMetrics metrics(font); + parameters->ascent = metrics.ascent(); + parameters->descent = metrics.descent(); + } + } //----------------------------------------------------------------------------- void DialogFontSelectData::setCharacters(const QString &value)