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

📄 qcssparser.cpp

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