⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qcssparser.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -