diff options
| author | Jenkins CI <null@kde.org> | 2013-12-18 00:45:18 +0000 | 
|---|---|---|
| committer | Jenkins CI <null@kde.org> | 2013-12-18 00:45:18 +0000 | 
| commit | 867e7a50e6396338ab4fe9aa22ad141e4cd344d2 (patch) | |
| tree | 1d6f8d6c912fa04dc268b5580bcfe696fa538743 /src/gui/kconfiggroupgui.cpp | |
| parent | c38b88497a833e482e6892b72c8f52adec6de857 (diff) | |
| download | kconfig-867e7a50e6396338ab4fe9aa22ad141e4cd344d2.tar.gz kconfig-867e7a50e6396338ab4fe9aa22ad141e4cd344d2.tar.bz2 | |
Move kconfig code to the root directory.
Diffstat (limited to 'src/gui/kconfiggroupgui.cpp')
| -rw-r--r-- | src/gui/kconfiggroupgui.cpp | 197 | 
1 files changed, 197 insertions, 0 deletions
| diff --git a/src/gui/kconfiggroupgui.cpp b/src/gui/kconfiggroupgui.cpp new file mode 100644 index 00000000..22706e77 --- /dev/null +++ b/src/gui/kconfiggroupgui.cpp @@ -0,0 +1,197 @@ +/* +   This file is part of the KDE libraries +   Copyright (c) 2007 Thiago Macieira <thiago@kde.org> + +   This library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Library General Public +   License as published by the Free Software Foundation; either +   version 2 of the License, or (at your option) any later version. + +   This library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Library General Public License for more details. + +   You should have received a copy of the GNU Library General Public License +   along with this library; see the file COPYING.LIB.  If not, write to +   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +   Boston, MA 02110-1301, USA. +*/ + +#include <kconfiggroup.h> + +#include <QtCore/QMutableStringListIterator> +#include <QColor> +#include <QDebug> +#include <QFont> + +#include <kconfiggroup_p.h> + +/** + * Try to read a GUI type from config group @p cg at key @p key. + * @p input is the default value and also indicates the type to be read. + * @p output is to be set with the value that has been read. + * + * @returns true if something was handled (even if output was set to clear or default) + *          or false if nothing was handled (e.g., Core type) + */ +static bool readEntryGui(const QByteArray& data, const char* key, const QVariant &input, +                         QVariant &output) +{ +    const QString errString = QString::fromLatin1("\"%1\" - conversion from \"%3\" to %2 failed") +                              .arg(QLatin1String(key)) +                              .arg(QLatin1String(QVariant::typeToName(input.type()))) +                              .arg(QLatin1String(data.constData())); +    const QString formatError = QString::fromLatin1(" (wrong format: expected '%1' items, read '%2')"); + +    // set in case of failure +    output = input; + +    switch (input.type()) { +    case QVariant::Color: { +        if (data.isEmpty() || data == "invalid") { +            output = QColor();  // return what was stored +            return true; +        } else if (data.at(0) == '#') { +            QColor col; +            col.setNamedColor(QString::fromUtf8(data.constData(), data.length())); +            output = col; +            return true; +        } else if (!data.contains(',')) { +            QColor col; +            col.setNamedColor(QString::fromUtf8(data.constData(), data.length())); +            if (!col.isValid()) +                qCritical() << qPrintable(errString); +            output = col; +            return true; +        } else { +            const QList<QByteArray> list = data.split(','); +            const int count = list.count(); + +            if (count != 3 && count != 4) { +                qCritical() << qPrintable(errString) << qPrintable(formatError.arg(QLatin1String("3' or '4")).arg(count)); +                return true;    // return default +            } + +            int temp[4]; +            // bounds check components +            for(int i = 0; i < count; i++) { +                bool ok; +                const int j = temp[i] = list.at(i).toInt(&ok); +                if (!ok) { // failed to convert to int +                    qCritical() << qPrintable(errString) << " (integer conversion failed)"; +                    return true; // return default +                } +                if (j < 0 || j > 255) { +                    static const char *const components[6] = { +                        "red", "green", "blue", "alpha" +                    }; +                    const QString boundsError = QLatin1String(" (bounds error: %1 component %2)"); +                    qCritical() << qPrintable(errString) +                             << qPrintable(boundsError.arg(QLatin1String(components[i])).arg(j < 0? QLatin1String("< 0"): QLatin1String("> 255"))); +                    return true; // return default +                } +            } +            QColor aColor(temp[0], temp[1], temp[2]); +            if (count == 4) +                aColor.setAlpha(temp[3]); + +            if (aColor.isValid()) +                output = aColor; +            else +                qCritical() << qPrintable(errString); +            return true; +        } +    } + +    case QVariant::Font: { +        QVariant tmp = QString::fromUtf8(data.constData(), data.length()); +        if (tmp.convert(QVariant::Font)) +            output = tmp; +        else +            qCritical() << qPrintable(errString); +        return true; +    } +    case QVariant::Pixmap: +    case QVariant::Image: +    case QVariant::Brush: +    case QVariant::Palette: +    case QVariant::Icon: +    case QVariant::Region: +    case QVariant::Bitmap: +    case QVariant::Cursor: +    case QVariant::SizePolicy: +    case QVariant::Pen: +        // we may want to handle these in the future + +    default: +        break; +    } + +    return false;               // not handled +} + +/** + * Try to write a GUI type @p prop to config group @p cg at key @p key. + * + * @returns true if something was handled (even if an empty value was written) + *          or false if nothing was handled (e.g., Core type) + */ +static bool writeEntryGui(KConfigGroup *cg, const char* key, const QVariant &prop, +                          KConfigGroup::WriteConfigFlags pFlags) +{ +    switch (prop.type()) { +    case QVariant::Color: { +        const QColor rColor = prop.value<QColor>(); + +        if (!rColor.isValid()) { +            cg->writeEntry(key, "invalid", pFlags); +            return true; +        } + +        QList<int> list; +        list.insert(0, rColor.red()); +        list.insert(1, rColor.green()); +        list.insert(2, rColor.blue()); +        if (rColor.alpha() != 255) +            list.insert(3, rColor.alpha()); + +        cg->writeEntry( key, list, pFlags ); +        return true; +    } +    case QVariant::Font: +        cg->writeEntry( key, prop.toString().toUtf8(), pFlags ); +        return true; + +    case QVariant::Pixmap: +    case QVariant::Image: +    case QVariant::Brush: +    case QVariant::Palette: +    case QVariant::Icon: +    case QVariant::Region: +    case QVariant::Bitmap: +    case QVariant::Cursor: +    case QVariant::SizePolicy: +    case QVariant::Pen: +        // we may want to handle one of these in the future +        break; + +    default: +        break; +    } + +    return false; +} + +static int initKConfigGroupGui() +{ +    _kde_internal_KConfigGroupGui.readEntryGui = readEntryGui; +    _kde_internal_KConfigGroupGui.writeEntryGui = writeEntryGui; +    return 42;                  // because 42 is nicer than 1 or 0 +} + +#ifdef Q_CONSTRUCTOR_FUNCTION +Q_CONSTRUCTOR_FUNCTION(initKConfigGroupGui) +#else +static int dummyKConfigGroupGui = initKConfigGroupGui(); +#endif | 
