12#include <KLocalizedString>
34const QMap<KoUnit::Type, CssQmlUnitConverter::UserUnits>
koUnitMap = {
60 Q_FOREACH(QVariant var, unitMap) {
61 QVariantMap m = var.toMap();
63 const int user = m.value(
"user").toInt(&ok);
64 const int data = m.value(
"data").toInt(&ok);
66 qWarning() << Q_FUNC_INFO <<
"unitMap has wrong format";
69 map.insert(user, data);
72 if (
d->dataUnitMap != map) {
81 int parentLineHeight = -1;
82 if (textPropertiesModel) {
98 if (info.
size < 0)
return;
99 if (
d->fontInfo == info) {
102 d->fontInfo =
main.cssFontInfo();
103 d->metrics =
main.metrics(
false);
104 d->fontLineGap =
d->metrics.lineGap;
106 d->metrics =
main.applyLineHeight(
d->metrics);
108 d->metrics.lineGap = parentLineHeight - (
d->metrics.ascender-
d->metrics.descender);
114 const qreal multiplier =
d->fontInfo.
size /
d->metrics.fontSize;
115 qreal normalLineHeight = (
d->metrics.ascender -
d->metrics.descender +
d->fontLineGap)*multiplier;
122 const bool updateUnit =
d->dataUnit != unit;
123 if (!updateVal && !updateUnit) {
157 return d->dataMultiplier;
164 d->dataMultiplier = newDataMultiplier;
177 d->dataValue = newDataValue;
189 if (
d->dataUnit == newDataUnit)
191 if (
d->dataUnitMap.key(
d->dataUnit) ==
d->userUnit)
199 return (isAbsolute?
d->absoluteUnitConverter.toUserValue(
d->dataValue):
d->dataValue) *
d->dataMultiplier;
207 d->dataValue = isAbsolute?
d->absoluteUnitConverter.fromUserValue(newUserValue/
d->dataMultiplier): (newUserValue/
d->dataMultiplier);
219 if (
d->userUnit == newUserUnit)
222 const bool newIsAbsolute =
koUnitMap.values().contains(newType);
225 const qreal currentAbsoluteValue = oldIsAbsolute?
226 d->absoluteUnitConverter.fromUserValue(
d->dataValue):
229 if (newIsAbsolute && oldIsAbsolute) {
231 d->absoluteUnitConverter = newUnitConverter;
233 }
else if (newIsAbsolute) {
235 d->absoluteUnitConverter = newUnitConverter;
240 d->dataUnit =
d->dataUnitMap.value(newUserUnit);
245 d->userUnit = newUserUnit;
253 const QString descriptionKey =
"description";
254 const QString valueKey =
"value";
255 Q_FOREACH(
const int key,
d->dataUnitMap.keys()) {
262 unit.insert(valueKey,
koUnitMap.value(koUnitKey));
268 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Font Size (em)"));
269 }
else if (keyUnit ==
Ex) {
270 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"X Height (ex)"));
271 }
else if (keyUnit ==
Cap) {
272 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Cap Height (cap)"));
273 }
else if (keyUnit ==
Ch) {
274 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Proportional Advance (ch)"));
275 }
else if (keyUnit ==
Ic) {
276 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Ideographic Advance (ic)"));
277 }
else if (keyUnit ==
Lh) {
278 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Line Height (lh)"));
279 }
else if (keyUnit ==
Spaces) {
280 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Spaces (Sp)"));
281 }
else if (keyUnit ==
Lines) {
282 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Lines (Ln)"));
284 unit.insert(descriptionKey, i18nc(
"@label:inlistbox",
"Percentage (%)"));
286 unit.insert(valueKey, keyUnit);
297 const bool isAbsolute =
koUnitMap.values().contains(unit);
299 return d->absoluteUnitConverter.symbol();
302 return QString(
"em");
303 }
else if (unit ==
Ex) {
304 return QString(
"ex");
305 }
else if (unit ==
Cap) {
306 return QString(
"cap");
307 }
else if (unit ==
Ch) {
308 return QString(
"ch");
309 }
else if (unit ==
Ic) {
310 return QString(
"ic");
311 }
else if (unit ==
Lh) {
312 return QString(
"lh");
313 }
else if (unit ==
Lines) {
314 return QString(
"Ln");
315 }
else if (unit ==
Spaces) {
316 return QString(
"Sp");
325 return d->percentageReference;
330 if (
qFuzzyCompare(
d->percentageReference, newPercentageReference))
332 d->percentageReference = newPercentageReference;
337 const qreal multiplier = fontSize / metrics.
fontSize;
341 return metrics.
xHeight * multiplier;
355 return percentageReference;
const QMap< KoUnit::Type, CssQmlUnitConverter::UserUnits > koUnitMap
qreal metricsMultiplier(const CssQmlUnitConverter::UserUnits type, const KoSvgText::FontMetrics metrics, const qreal fontSize, const qreal percentageReference)
float value(const T *src, size_t ch)
QString symbol
The symbol.
void setPercentageReference(qreal newPercentageReference)
@ Ic
average full-width advance
@ Lines
Used by lineHeight.
@ Px
Pixels, dpi relative.
@ Ch
average proportional advance
Q_INVOKABLE void setFontMetricsFromTextPropertiesModel(KoSvgTextPropertiesModel *textPropertiesModel, bool isFontSize=false, bool isLineHeight=false)
setFontMetricsFromTextPropertiesModel Set the current font metrics from the text properties model.
qreal convertToRelativeValue(const qreal value, const UserUnits type) const
const QScopedPointer< Private > d
qreal percentageReference
value to represent 100%
void setDataMultiplier(qreal newDataMultiplier)
QVariantList userUnitModel
A model for the available user units.
void userUnitModelChanged()
void dataMultiplierChanged()
void setDataUnit(int newDataUnit)
void setUserUnit(int newUserUnit)
qreal convertFromRelativeValue(const qreal value, const UserUnits type) const
void setDpi(qreal newDpi)
CssQmlUnitConverter(QObject *parent=nullptr)
void setUserValue(qreal newUserValue)
qreal dpi
The DPI used to calculate pixel to physical properties.
void setDataValue(qreal newDataValue)
void percentageReferenceChanged()
Q_INVOKABLE void setDataUnitMap(const QVariantList &unitMap)
setDataUnitMap
Q_INVOKABLE void setFromNormalLineHeight()
setFromNormalLineHeight set the current value from line-height:normal metrics.
qreal userValue
userValue and userUnit represent the user-visible data. This can include synthetic units like px and ...
qreal dataMultiplier
Data multiplier is used if for some reason the user-value needs to be multiplied by a certain factor.
Q_INVOKABLE void setDataValueAndUnit(const qreal value, const int unit)
setDataValueAndUnit set data unit and value in one go.
qreal dataValue
dataValue and dataUnit represent the data as used by the text properties.
The KoSvgTextPropertiesModel class.
lager::cursor< KoSvgTextPropertyData > textData
static const KoSvgTextProperties & defaultProperties()
KoCSSFontInfo cssFontInfo() const
cssFontInfo
KoSvgText::FontMetrics metrics(const bool withResolvedLineHeight=true) const
metrics Return the metrics of the first available font.
void inheritFrom(const KoSvgTextProperties &parentProperties, bool resolve=false)
static QString unitDescription(KoUnit::Type type)
Get the description string of the given unit.
@ Point
Postscript point, 1/72th of an Inco.
static bool qFuzzyCompare(half p1, half p2)
int main(int argc, char **argv)
qreal percentageReference
12.0 pt is the default we use for font-size, which most css text properties' % resolve against.
KoUnit absoluteUnitConverter
KoSvgText::FontMetrics metrics
QMap< int, int > dataUnitMap
The KoCSSFontInfo class Convenience struct to make it easier to use KoFontRegistry....
The KoSvgTextPropertyData struct.
KoSvgTextProperties commonProperties
The properties common between all the selected text.
KoSvgTextProperties inheritedProperties
The properties that are inherited, so that widgets may be set correctly.
The FontMetrics class A class to keep track of a variety of font metrics. Note that values are in Fre...
qint32 xHeight
height of X, defaults to 0.5 fontsize.
qint32 lineGap
additional linegap between consecutive lines.
qint32 zeroAdvance
Advance of the character '0', CSS Unit 'ch', defaults to 0.5 em in horizontal and 1....
qint32 ideographicAdvance
Advance of the character '水' (U+6C34), CSS Unit ic, defaults to 1 em.
qint32 fontSize
Currently set size, CSS unit 'em'.
qint32 descender
distance for origin to bottom.
qint32 ascender
distance from origin to top.
qint32 capHeight
Height of capital letters, defaults to ascender.
qint32 spaceAdvance
Advance of the character ' ', used by tabs.