📄 qcssparser.cpp
字号:
return hit;}bool ValueExtractor::extractPosition(int *left, int *top, int *right, int *bottom, QCss::Origin *origin, Qt::Alignment *position, QCss::PositionMode *mode, Qt::Alignment *textAlignment){ extractFont(); bool hit = false; for (int i = 0; i < declarations.count(); i++) { const Declaration &decl = declarations.at(i); switch (decl.propertyId) { case Left: *left = lengthValue(decl); break; case Top: *top = lengthValue(decl); break; case Right: *right = lengthValue(decl); break; case Bottom: *bottom = lengthValue(decl); break; case QtOrigin: *origin = decl.originValue(); break; case QtPosition: *position = decl.alignmentValue(); break; case TextAlignment: *textAlignment = decl.alignmentValue(); break; case Position: *mode = decl.positionValue(); break; default: continue; } hit = true; } return hit;}bool ValueExtractor::extractBox(int *margins, int *paddings, int *spacing){ extractFont(); bool hit = false; for (int i = 0; i < declarations.count(); i++) { const Declaration &decl = declarations.at(i); switch (decl.propertyId) { case PaddingLeft: paddings[LeftEdge] = lengthValue(decl); break; case PaddingRight: paddings[RightEdge] = lengthValue(decl); break; case PaddingTop: paddings[TopEdge] = lengthValue(decl); break; case PaddingBottom: paddings[BottomEdge] = lengthValue(decl); break; case Padding: lengthValues(decl, paddings); break; case MarginLeft: margins[LeftEdge] = lengthValue(decl); break; case MarginRight: margins[RightEdge] = lengthValue(decl); break; case MarginTop: margins[TopEdge] = lengthValue(decl); break; case MarginBottom: margins[BottomEdge] = lengthValue(decl); break; case Margin: lengthValues(decl, margins); break; case QtSpacing: if (spacing) *spacing = lengthValue(decl); break; default: continue; } hit = true; } return hit;}int ValueExtractor::extractStyleFeatures(){ int features = StyleFeature_None; for (int i = 0; i < declarations.count(); i++) { const Declaration &decl = declarations.at(i); if (decl.propertyId == QtStyleFeatures) features = decl.styleFeaturesValue(); } return features;}QSize ValueExtractor::sizeValue(const Declaration &decl){ int x[2] = { 0, 0 }; if (decl.values.count() > 0) x[0] = lengthValue(decl.values.at(0)); if (decl.values.count() > 1) x[1] = lengthValue(decl.values.at(1)); else x[1] = x[0]; return QSize(x[0], x[1]);}void ValueExtractor::sizeValues(const Declaration &decl, QSize *radii){ radii[0] = sizeValue(decl); for (int i = 1; i < 4; i++) radii[i] = radii[0];}bool ValueExtractor::extractBorder(int *borders, QBrush *colors, BorderStyle *styles, QSize *radii){ extractFont(); bool hit = false; for (int i = 0; i < declarations.count(); i++) { const Declaration &decl = declarations.at(i); switch (decl.propertyId) { case BorderLeftWidth: borders[LeftEdge] = lengthValue(decl); break; case BorderRightWidth: borders[RightEdge] = lengthValue(decl); break; case BorderTopWidth: borders[TopEdge] = lengthValue(decl); break; case BorderBottomWidth: borders[BottomEdge] = lengthValue(decl); break; case BorderWidth: lengthValues(decl, borders); break; case BorderLeftColor: colors[LeftEdge] = decl.brushValue(pal); break; case BorderRightColor: colors[RightEdge] = decl.brushValue(pal); break; case BorderTopColor: colors[TopEdge] = decl.brushValue(pal); break; case BorderBottomColor: colors[BottomEdge] = decl.brushValue(pal); break; case BorderColor: decl.brushValues(colors, pal); break; case BorderTopStyle: styles[TopEdge] = decl.styleValue(); break; case BorderBottomStyle: styles[BottomEdge] = decl.styleValue(); break; case BorderLeftStyle: styles[LeftEdge] = decl.styleValue(); break; case BorderRightStyle: styles[RightEdge] = decl.styleValue(); break; case BorderStyles: decl.styleValues(styles); break; case BorderTopLeftRadius: radii[0] = sizeValue(decl); break; case BorderTopRightRadius: radii[1] = sizeValue(decl); break; case BorderBottomLeftRadius: radii[2] = sizeValue(decl); break; case BorderBottomRightRadius: radii[3] = sizeValue(decl); break; case BorderRadius: sizeValues(decl, radii); break; case BorderLeft: borderValue(decl, &borders[LeftEdge], &styles[LeftEdge], &colors[LeftEdge]); break; case BorderTop: borderValue(decl, &borders[TopEdge], &styles[TopEdge], &colors[TopEdge]); break; case BorderRight: borderValue(decl, &borders[RightEdge], &styles[RightEdge], &colors[RightEdge]); break; case BorderBottom: borderValue(decl, &borders[BottomEdge], &styles[BottomEdge], &colors[BottomEdge]); break; case Border: borderValue(decl, &borders[LeftEdge], &styles[LeftEdge], &colors[LeftEdge]); borders[TopEdge] = borders[RightEdge] = borders[BottomEdge] = borders[LeftEdge]; styles[TopEdge] = styles[RightEdge] = styles[BottomEdge] = styles[LeftEdge]; colors[TopEdge] = colors[RightEdge] = colors[BottomEdge] = colors[LeftEdge]; break; default: continue; } hit = true; } return hit;}static Qt::Alignment parseAlignment(const Value *values, int count){ Qt::Alignment a[2] = { 0, 0 }; for (int i = 0; i < qMin(2, count); i++) { if (values[i].type != Value::KnownIdentifier) break; switch (values[i].variant.toInt()) { case Value_Left: a[i] = Qt::AlignLeft; break; case Value_Right: a[i] = Qt::AlignRight; break; case Value_Top: a[i] = Qt::AlignTop; break; case Value_Bottom: a[i] = Qt::AlignBottom; break; case Value_Center: a[i] = Qt::AlignCenter; break; default: break; } } if (a[0] == Qt::AlignCenter && a[1] != 0 && a[1] != Qt::AlignCenter) a[0] = (a[1] == Qt::AlignLeft || a[1] == Qt::AlignRight) ? Qt::AlignVCenter : Qt::AlignHCenter; if ((a[1] == 0 || a[1] == Qt::AlignCenter) && a[0] != Qt::AlignCenter) a[1] = (a[0] == Qt::AlignLeft || a[0] == Qt::AlignRight) ? Qt::AlignVCenter : Qt::AlignHCenter; return a[0] | a[1];}static QColor parseColorValue(Value v, const QPalette &pal){ if (v.type == Value::Identifier || v.type == Value::String) { v.variant.convert(QVariant::Color); v.type = Value::Color; } if (v.type == Value::Color) return qvariant_cast<QColor>(v.variant); if (v.type == Value::KnownIdentifier && v.variant.toInt() == Value_Transparent) return Qt::transparent; if (v.type != Value::Function) return QColor(); QStringList lst = v.variant.toStringList(); if (lst.count() != 2) return QColor(); if ((lst.at(0).compare(QLatin1String("palette"), Qt::CaseInsensitive)) == 0) { int role = findKnownValue(lst.at(1), values, NumKnownValues); if (role >= Value_FirstColorRole && role <= Value_LastColorRole) return pal.color((QPalette::ColorRole)(role-Value_FirstColorRole)); return QColor(); } bool rgb = true; // function name if ((lst.at(0).compare(QLatin1String("rgb"), Qt::CaseInsensitive) != 0) && (rgb = (lst.at(0).compare(QLatin1String("rgba"), Qt::CaseInsensitive) != 0))) return QColor(); Parser p(lst.at(1)); if (!p.testExpr()) return QColor(); QVector<Value> colorDigits; if (!p.parseExpr(&colorDigits)) return QColor(); if ((colorDigits.count() != (rgb ? 5 : 7)) || colorDigits.at(1).type != Value::TermOperatorComma || colorDigits.at(3).type != Value::TermOperatorComma || (!rgb && colorDigits.at(5).type != Value::TermOperatorComma)) return QColor(); for (int i = 0; i < (rgb ? 5 : 7); i += 2) { if (colorDigits.at(i).type == Value::Percentage) { colorDigits[i].variant = colorDigits.at(i).variant.toDouble() * 255. / 100.; colorDigits[i].type = Value::Number; } } return QColor(colorDigits.at(0).variant.toInt(), colorDigits.at(2).variant.toInt(), colorDigits.at(4).variant.toInt(), !rgb ? colorDigits.at(6).variant.toInt() : 255);}static QBrush parseBrushValue(Value v, const QPalette &pal){ QColor c = parseColorValue(v, pal); if (c.isValid()) return QBrush(c); if (v.type != Value::Function) return QBrush(); QStringList lst = v.variant.toStringList(); if (lst.count() != 2) return QBrush(); QStringList gradFuncs; gradFuncs << QLatin1String("qlineargradient") << QLatin1String("qradialgradient") << QLatin1String("qconicalgradient") << QLatin1String("qgradient"); int gradType = -1; if ((gradType = gradFuncs.indexOf(lst.at(0).toLower())) == -1) return QBrush(); QHash<QString, qreal> vars; QVector<QGradientStop> stops; int spread = -1; QStringList spreads; spreads << QLatin1String("pad") << QLatin1String("reflect") << QLatin1String("repeat"); Parser parser(lst.at(1)); while (parser.hasNext()) { parser.skipSpace(); if (!parser.test(IDENT)) return QBrush(); QString attr = parser.lexem(); parser.skipSpace(); if (!parser.test(COLON)) return QBrush(); parser.skipSpace(); if (attr.compare(QLatin1String("stop"), Qt::CaseInsensitive) == 0) { Value stop, color; parser.next(); if (!parser.parseTerm(&stop)) return QBrush(); parser.skipSpace(); parser.next(); if (!parser.parseTerm(&color)) return QBrush(); stops.append(QGradientStop(stop.variant.toDouble(), parseColorValue(color, pal))); } else { parser.next(); Value value; parser.parseTerm(&value); if (attr.compare(QLatin1String("spread"), Qt::CaseInsensitive) == 0) { spread = spreads.indexOf(value.variant.toString()); } else { vars[attr] = value.variant.toString().toDouble(); } } parser.skipSpace(); parser.test(COMMA); } if (gradType == 0) { QLinearGradient lg(vars.value(QLatin1String("x1")), vars.value(QLatin1String("y1")), vars.value(QLatin1String("x2")), vars.value(QLatin1String("y2"))); lg.setCoordinateMode(QGradient::ObjectBoundingMode); lg.setStops(stops); if (spread != -1) lg.setSpread(QGradient::Spread(spread)); return QBrush(lg); } if (gradType == 1) { QRadialGradient rg(vars.value(QLatin1String("cx")), vars.value(QLatin1String("cy")), vars.value(QLatin1String("radius")), vars.value(QLatin1String("fx")), vars.value(QLatin1String("fy"))); rg.setCoordinateMode(QGradient::ObjectBoundingMode); rg.setStops(stops); if (spread != -1) rg.setSpread(QGradient::Spread(spread)); return QBrush(rg); } if (gradType == 2) { QConicalGradient cg(vars.value(QLatin1String("cx")), vars.value(QLatin1String("cy")), vars.value(QLatin1String("angle"))); cg.setCoordinateMode(QGradient::ObjectBoundingMode); cg.setStops(stops); if (spread != -1) cg.setSpread(QGradient::Spread(spread)); return QBrush(cg); } return QBrush();}static BorderStyle parseStyleValue(Value v){ if (v.type == Value::KnownIdentifier) { switch (v.variant.toInt()) { case Value_None: return BorderStyle_None; case Value_Dotted: return BorderStyle_Dotted; case Value_Dashed: return BorderStyle_Dashed; case Value_Solid: return BorderStyle_Solid; case Value_Double: return BorderStyle_Double; case Value_DotDash: return BorderStyle_DotDash; case Value_DotDotDash: return BorderStyle_DotDotDash; case Value_Groove: return BorderStyle_Groove; case Value_Ridge: return BorderStyle_Ridge; case Value_Inset: return BorderStyle_Inset; case Value_Outset: return BorderStyle_Outset; case Value_Native: return BorderStyle_Native; default: break; } } return BorderStyle_Unknown;}void ValueExtractor::borderValue(const Declaration &decl, int *width, QCss::BorderStyle *style, QBrush *color){ *width = 0; *style = BorderStyle_None; *color = QColor(); if (decl.values.isEmpty()) return; int i = 0; if (decl.values.at(i).type == Value::Length || decl.values.at(i).type == Value::Number) { *width = lengthValue(decl.values.at(i)); if (++i >= decl.values.count()) return; } *style = parseStyleValue(decl.values.at(i)); if (*style != BorderStyle_Unknown) { if (++i >= decl.values.count()) return; } else { *style = BorderStyle_None; } *color = parseBrushValue(decl.values.at(i), pal);}static void parseShorthandBackgroundProperty(const QVector<Value> &values, QBrush *brush, QString *image, Repeat *repeat, Qt::Alignment *alignment, const QPalette &pal){ *brush = QBrush(); *image = QString(); *repeat = Repeat_XY; *alignment = Qt::AlignTop | Qt::AlignLeft; for (int i = 0; i < values.count(); ++i) { const Value v = values.at(i); if (v.type == Value::Uri) { *image = v.variant.toString(); continue; } else if (v.type == Value::KnownIdentifier && v.variant.toInt() == Value_None) { *image = QString(); continue; } Repeat repeatAttempt = static_cast<Repeat>(findKnownValue(v.variant.toString(), repeats, NumKnownRepeats)); if (repeatAttempt != Repeat_Unknown) { *repeat = repeatAttempt; continue; } if (v.type == Value::KnownIdentifier) { const int start = i; int count = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -