📄 qcssparser.cpp
字号:
if (i < values.count() - 1 && values.at(i + 1).type == Value::KnownIdentifier) { ++i; ++count; } Qt::Alignment a = parseAlignment(values.constData() + start, count); if (int(a) != 0) { *alignment = a; continue; } i -= count - 1; } *brush = parseBrushValue(v, pal); }}bool ValueExtractor::extractBackground(QBrush *brush, QString *image, Repeat *repeat, Qt::Alignment *alignment, Origin *origin, Attachment *attachment, Origin *clip){ bool hit = false; for (int i = 0; i < declarations.count(); ++i) { const Declaration &decl = declarations.at(i); if (decl.values.isEmpty()) continue; const Value val = decl.values.first(); switch (decl.propertyId) { case BackgroundColor: *brush = parseBrushValue(val, pal); break; case BackgroundImage: if (val.type == Value::Uri) *image = val.variant.toString(); break; case BackgroundRepeat: *repeat = static_cast<Repeat>(findKnownValue(val.variant.toString(), repeats, NumKnownRepeats)); break; case BackgroundPosition: *alignment = decl.alignmentValue(); break; case BackgroundOrigin: *origin = decl.originValue(); break; case BackgroundClip: *clip = decl.originValue(); break; case Background: parseShorthandBackgroundProperty(decl.values, brush, image, repeat, alignment, pal); break; case BackgroundAttachment: *attachment = decl.attachmentValue(); break; default: continue; } hit = true; } return hit;}static bool setFontSizeFromValue(Value value, QFont *font, int *fontSizeAdjustment){ if (value.type == Value::KnownIdentifier) { bool valid = true; switch (value.variant.toInt()) { case Value_Small: *fontSizeAdjustment = -1; break; case Value_Medium: *fontSizeAdjustment = 0; break; case Value_Large: *fontSizeAdjustment = 1; break; case Value_XLarge: *fontSizeAdjustment = 2; break; case Value_XXLarge: *fontSizeAdjustment = 3; break; default: valid = false; break; } return valid; } if (value.type != Value::Length) return false; bool valid = false; QString s = value.variant.toString(); if (s.endsWith(QLatin1String("pt"), Qt::CaseInsensitive)) { s.chop(2); value.variant = s; if (value.variant.convert(QVariant::Double)) { font->setPointSizeF(value.variant.toDouble()); valid = true; } } else if (s.endsWith(QLatin1String("px"), Qt::CaseInsensitive)) { s.chop(2); value.variant = s; if (value.variant.convert(QVariant::Int)) { font->setPixelSize(value.variant.toInt()); valid = true; } } return valid;}static bool setFontStyleFromValue(const Value &value, QFont *font){ if (value.type != Value::KnownIdentifier) return false ; switch (value.variant.toInt()) { case Value_Normal: font->setStyle(QFont::StyleNormal); return true; case Value_Italic: font->setStyle(QFont::StyleItalic); return true; case Value_Oblique: font->setStyle(QFont::StyleOblique); return true; default: break; } return false;}static bool setFontWeightFromValue(const Value &value, QFont *font){ if (value.type == Value::KnownIdentifier) { switch (value.variant.toInt()) { case Value_Normal: font->setWeight(QFont::Normal); return true; case Value_Bold: font->setWeight(QFont::Bold); return true; default: break; } return false; } if (value.type != Value::Number) return false; font->setWeight(qMin(value.variant.toInt() / 8, 99)); return true;}static bool setFontFamilyFromValues(const QVector<Value> &values, QFont *font){ QString family; for (int i = 0; i < values.count(); ++i) { const Value &v = values.at(i); if (v.type == Value::TermOperatorComma) break; const QString str = v.variant.toString(); if (str.isEmpty()) break; family += str; family += QLatin1Char(' '); } family = family.simplified(); if (family.isEmpty()) return false; font->setFamily(family); return true;}static void setTextDecorationFromValues(const QVector<Value> &values, QFont *font){ for (int i = 0; i < values.count(); ++i) { if (values.at(i).type != Value::KnownIdentifier) continue; switch (values.at(i).variant.toInt()) { case Value_Underline: font->setUnderline(true); break; case Value_Overline: font->setOverline(true); break; case Value_LineThrough: font->setStrikeOut(true); break; case Value_None: font->setUnderline(false); font->setOverline(false); font->setStrikeOut(false); break; default: break; } }}static void parseShorthandFontProperty(const QVector<Value> &values, QFont *font, int *fontSizeAdjustment){ font->setStyle(QFont::StyleNormal); font->setWeight(QFont::Normal); *fontSizeAdjustment = 0; int i = 0; while (i < values.count()) { if (setFontStyleFromValue(values.at(i), font) || setFontWeightFromValue(values.at(i), font)) ++i; else break; } if (i < values.count()) { setFontSizeFromValue(values.at(i), font, fontSizeAdjustment); ++i; } if (i < values.count()) { QString fam = values.at(i).variant.toString(); if (!fam.isEmpty()) font->setFamily(fam); }}bool ValueExtractor::extractFont(QFont *font, int *fontSizeAdjustment){ if (fontExtracted) { *font = f; *fontSizeAdjustment = adjustment; return fontExtracted == 1; } bool hit = false; for (int i = 0; i < declarations.count(); ++i) { const Declaration &decl = declarations.at(i); if (decl.values.isEmpty()) continue; const Value val = decl.values.first(); switch (decl.propertyId) { case FontSize: setFontSizeFromValue(val, font, fontSizeAdjustment); break; case FontStyle: setFontStyleFromValue(val, font); break; case FontWeight: setFontWeightFromValue(val, font); break; case FontFamily: setFontFamilyFromValues(decl.values, font); break; case TextDecoration: setTextDecorationFromValues(decl.values, font); break; case Font: parseShorthandFontProperty(decl.values, font, fontSizeAdjustment); break; default: continue; } hit = true; } f = *font; adjustment = *fontSizeAdjustment; fontExtracted = hit ? 1 : 2; return hit;}bool ValueExtractor::extractPalette(QBrush *fg, QBrush *sfg, QBrush *sbg, QBrush *abg){ bool hit = false; for (int i = 0; i < declarations.count(); ++i) { const Declaration &decl = declarations.at(i); switch (decl.propertyId) { case Color: *fg = decl.brushValue(pal); break; case QtSelectionForeground: *sfg = decl.brushValue(pal); break; case QtSelectionBackground: *sbg = decl.brushValue(pal); break; case QtAlternateBackground: *abg = decl.brushValue(pal); break; default: continue; } hit = true; } return hit;}void ValueExtractor::extractFont(){ if (fontExtracted) return; int dummy = -255; extractFont(&f, &dummy);}bool ValueExtractor::extractImage(QIcon *icon, Qt::Alignment *a, QSize *size){ bool hit = false; for (int i = 0; i < declarations.count(); ++i) { const Declaration &decl = declarations.at(i); switch (decl.propertyId) { case QtImage: *icon = decl.iconValue(); if (decl.values.count() > 0 && decl.values.at(0).type == Value::Uri) *size = QPixmap(decl.values.at(0).variant.toString()).size(); break; case QtImageAlignment: *a = decl.alignmentValue(); break; default: continue; } hit = true; } return hit;}///////////////////////////////////////////////////////////////////////////////// DeclarationQColor Declaration::colorValue(const QPalette &pal) const{ if (values.count() != 1) return QColor(); return parseColorValue(values.first(), pal);}QBrush Declaration::brushValue(const QPalette &pal) const{ if (values.count() != 1) return QBrush(); return parseBrushValue(values.first(), pal);}void Declaration::brushValues(QBrush *c, const QPalette &pal) const{ int i; for (i = 0; i < qMin(values.count(), 4); i++) c[i] = parseBrushValue(values.at(i), pal); if (i == 0) c[0] = c[1] = c[2] = c[3] = QBrush(); else if (i == 1) c[3] = c[2] = c[1] = c[0]; else if (i == 2) c[2] = c[0], c[3] = c[1]; else if (i == 3) c[3] = c[1];}bool Declaration::realValue(qreal *real, const char *unit) const{ if (values.count() != 1) return false; const Value &v = values.first(); if (unit && v.type != Value::Length) return false; QString s = v.variant.toString(); if (unit) { if (!s.endsWith(QLatin1String(unit), Qt::CaseInsensitive)) return false; s.chop(qstrlen(unit)); } bool ok = false; qreal val = s.toDouble(&ok); if (ok) *real = val; return ok;}static bool intValue(const Value &v, int *i, const char *unit){ if (unit && v.type != Value::Length) return false; QString s = v.variant.toString(); if (unit) { if (!s.endsWith(QLatin1String(unit), Qt::CaseInsensitive)) return false; s.chop(qstrlen(unit)); } bool ok = false; int val = s.toInt(&ok); if (ok) *i = val; return ok;}bool Declaration::intValue(int *i, const char *unit) const{ if (values.count() != 1) return false; return ::intValue(values.first(), i, unit);}QSize Declaration::sizeValue() const{ int x[2] = { 0, 0 }; if (values.count() > 0) ::intValue(values.at(0), &x[0], "px"); if (values.count() > 1) ::intValue(values.at(1), &x[1], "px"); else x[1] = x[0]; return QSize(x[0], x[1]);}QRect Declaration::rectValue() const{ if (values.count() != 1) return QRect(); const Value &v = values.first(); if (v.type != Value::Function) return QRect(); QStringList func = v.variant.toStringList(); if (func.count() != 2 || func.first().compare(QLatin1String("rect")) != 0) return QRect(); QStringList args = func[1].split(QLatin1String(" "), QString::SkipEmptyParts); if (args.count() != 4) return QRect(); return QRect(args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt());}void Declaration::colorValues(QColor *c, const QPalette &pal) const{ int i; for (i = 0; i < qMin(values.count(), 4); i++) c[i] = parseColorValue(values.at(i), pal); if (i == 0) c[0] = c[1] = c[2] = c[3] = QColor(); else if (i == 1) c[3] = c[2] = c[1] = c[0]; else if (i == 2) c[2] = c[0], c[3] = c[1]; else if (i == 3) c[3] = c[1];}BorderStyle Declaration::styleValue() const{ if (values.count() != 1) return BorderStyle_None; return parseStyleValue(values.first());}void Declaration::styleValues(BorderStyle *s) const{ int i; for (i = 0; i < qMin(values.count(), 4); i++) s[i] = parseStyleValue(values.at(i)); if (i == 0) s[0] = s[1] = s[2] = s[3] = BorderStyle_None; else if (i == 1) s[3] = s[2] = s[1] = s[0]; else if (i == 2) s[2] = s[0], s[3] = s[1]; else if (i == 3) s[3] = s[1];}Repeat Declaration::repeatValue() const{ if (values.count() != 1) return Repeat_Unknown; return static_cast<Repeat>(findKnownValue(values.first().variant.toString(), repeats, NumKnownRepeats));}Origin Declaration::originValue() const{ if (values.count() != 1) return Origin_Unknown; return static_cast<Origin>(findKnownValue(values.first().variant.toString(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -