From kde-commits Mon Sep 14 08:51:45 2009 From: George Goldberg Date: Mon, 14 Sep 2009 08:51:45 +0000 To: kde-commits Subject: playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts Message-Id: <1252918305.917826.29279.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=125291832600496 SVN commit 1023212 by gberg: Reduce the amount of NIH (by using QValidators for int/uint types, rather than some crappy broken homebrew (yeah, it was my fault) validation code. Also make the validation results available through the model. M +28 -42 integer-edit.cpp M +9 -5 integer-edit.h M +16 -0 parameter-edit-delegate.cpp M +22 -6 parameter-edit-model.cpp M +3 -2 parameter-edit-model.h M +13 -0 parameter-item.cpp M +6 -2 parameter-item.h M +29 -28 unsigned-integer-edit.cpp M +9 -5 unsigned-integer-edit.h --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/integer-edit.cpp #1023211:1023212 @@ -22,12 +22,15 @@ #include -#include +#include IntegerEdit::IntegerEdit(QWidget *parent) : QLineEdit(parent) { connect(this, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString))); + + // Set the validator range to the range of values in a 32 bit integer (dbus-type 'i'). + setValidator(new QIntValidator(-2147483648, 2147483647, this)); } IntegerEdit::~IntegerEdit() @@ -35,64 +38,47 @@ } -int IntegerEdit::value() const +qint32 IntegerEdit::value() const { return text().toInt(); } -void IntegerEdit::setValue(int integer) +void IntegerEdit::setValue(qint32 integer) { setText(QString::number(integer)); } -void IntegerEdit::keyPressEvent(QKeyEvent *event) +QValidator::State IntegerEdit::validity() const { - kDebug() << "Key:" << event->key() << "Text:" << event->text(); + int cursorPos = cursorPosition(); + QString txt = text(); + return validator()->validate(txt, cursorPos); +} - // If the text is empty or a modifier, allow the keypress - if ((event->text().isEmpty()) || (event->key() < Qt::Key_Space)) { - event->ignore(); - QLineEdit::keyPressEvent(event); - return; - } +QPair IntegerEdit::validRange() const +{ + QPair ret; + ret.first = 0; + ret.second = 0; - // If the key is backspace or delete, allow it - if ((event->key() == Qt::Key_Delete) || (event->key() == Qt::Key_Backspace)) { - event->ignore(); - QLineEdit::keyPressEvent(event); - return; - } + const QIntValidator *intValidator = qobject_cast(validator()); - // Check for numbers (and ensure maximum input length is not expended - // FIXME: Have a better check to make sure the user doesn't enter a number too large. - QString validKeys("0123456789"); - if (validKeys.contains(event->text())) { - if (((text().contains(QString("-"))) && ((text().length() + 1) <= 5)) || - ((text().length() + 1) <= 4)) - { - kDebug() << "Key is a number."; - event->ignore(); - QLineEdit::keyPressEvent(event); - return; - } + if (!intValidator) { + kWarning() << "Somehow this is not an int validator :/"; + return ret; } - // Check for minus sign as the first character - if (event->text() == QString("-")) { - if (cursorPosition() == 0) { - if (!text().contains(QString("-"))) { - kDebug() << "Key is a minus-sign at the start."; - event->ignore(); - QLineEdit::keyPressEvent(event); - return; - } - } - } + ret.first = intValidator->bottom(); + ret.second = intValidator->top(); - // Anything else, reject the keypress. - event->accept(); + return ret; } +void IntegerEdit::setValidRange(qint32 minimum, qint32 maximum) +{ + setValidator(new QIntValidator(static_cast(minimum), static_cast(maximum), this)); +} + void IntegerEdit::onTextChanged(const QString &text) { Q_EMIT integerChanged(text.toInt()); --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/integer-edit.h #1023211:1023212 @@ -23,7 +23,9 @@ #include +#include #include +#include class KDE_EXPORT IntegerEdit : public QLineEdit { @@ -33,14 +35,16 @@ explicit IntegerEdit(QWidget *parent = 0); virtual ~IntegerEdit(); - int value() const; - void setValue(int integer); + qint32 value() const; + void setValue(qint32 integer); -protected: - void keyPressEvent(QKeyEvent *event); + QValidator::State validity() const; + QPair validRange() const; + void setValidRange(qint32 minimum, qint32 maximum); + Q_SIGNALS: - void integerChanged(int integer); + void integerChanged(qint32 integer); private Q_SLOTS: void onTextChanged(const QString &text); --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/parameter-edit-delegate.cpp #1023211:1023212 @@ -247,18 +247,34 @@ { kDebug(); + IntegerEdit *widget = qobject_cast(sender()); + + if (!widget) { + kWarning() << "Slot called by object of the wrong type."; + return; + } + QModelIndex index = focusedIndex(); Q_EMIT dataChanged(index, QVariant(text), ParameterEditModel::ValueRole); + Q_EMIT dataChanged(index, QVariant(widget->validity()), ParameterEditModel::ValidityRole); } void ParameterEditDelegate::onUnsignedIntegerEditTextChanged(const QString &text) { kDebug(); + UnsignedIntegerEdit *widget = qobject_cast(sender()); + + if (!widget) { + kWarning() << "Slot called by object of the wrong type."; + return; + } + QModelIndex index = focusedIndex(); Q_EMIT dataChanged(index, QVariant(text), ParameterEditModel::ValueRole); + Q_EMIT dataChanged(index, QVariant(widget->validity()), ParameterEditModel::ValidityRole); } --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/parameter-edit-model.cpp #1023211:1023212 @@ -24,6 +24,8 @@ #include +#include + #include ParameterEditModel::ParameterEditModel(QObject *parent) @@ -82,6 +84,9 @@ case ParameterEditModel::RequiredForRegistrationRole: data = QVariant(m_items.at(index.row())->isRequiredForRegistration()); break; + case ParameterEditModel::ValidityRole: + data = QVariant(m_items.at(index.row())->validity()); + break; default: break; } @@ -101,16 +106,27 @@ return false; } - switch(role) - { - case ParameterEditModel::ValueRole: + if (role == ParameterEditModel::ValueRole) { + m_items.at(index.row())->setValue(value); Q_EMIT dataChanged(index, index); return true; - break; - default: + + } else if (ParameterEditModel::ValidityRole) { + + if (value.toInt() == QValidator::Acceptable) { + m_items.at(index.row())->setValidity(QValidator::Acceptable); + } else if (value.toInt() == QValidator::Intermediate) { + m_items.at(index.row())->setValidity(QValidator::Intermediate); + } else { + m_items.at(index.row())->setValidity(QValidator::Invalid); + } + + Q_EMIT dataChanged(index, index); + return true; + + } else { return false; - break; } } --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/parameter-edit-model.h #1023211:1023212 @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef TELEPATHY_ACCOUNTS_KCM_PARAMETER_EDIT_MODEL_H -#define TELEPATHY_ACCOUNTS_KCM_PARAMETER_EDIT_MODEL_H +#ifndef LIB_KCM_TELEPATHY_ACCOUNTS_PARAMETER_EDIT_MODEL_H +#define LIB_KCM_TELEPATHY_ACCOUNTS_PARAMETER_EDIT_MODEL_H #include @@ -43,6 +43,7 @@ SecretRole, RequiredRole, RequiredForRegistrationRole, + ValidityRole, UserRole = Qt::UserRole + 42 }; --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/parameter-item.cpp #1023211:1023212 @@ -42,6 +42,9 @@ if (m_localizedName.isEmpty()) { m_localizedName = parameter->name(); } + + // Assume the default/un-altered value is valid. + m_validity = QValidator::Acceptable; } ParameterItem::~ParameterItem() @@ -89,6 +92,16 @@ return m_parameter; } +QValidator::State ParameterItem::validity() const +{ + return m_validity; +} + +void ParameterItem::setValidity(QValidator::State validity) +{ + m_validity = validity; +} + void ParameterItem::setValue(const QVariant &value) { m_currentValue = value; --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/parameter-item.h #1023211:1023212 @@ -18,11 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef TELEPATHY_ACCOUNTS_KCM_PARAMETER_ITEM_H -#define TELEPATHY_ACCOUNTS_KCM_PARAMETER_ITEM_H +#ifndef LIB_KCM_TELEPATHY_ACCOUNTS_PARAMETER_ITEM_H +#define LIB_KCM_TELEPATHY_ACCOUNTS_PARAMETER_ITEM_H #include #include +#include #include @@ -45,14 +46,17 @@ bool isRequired() const; bool isRequiredForRegistration() const; Tp::ProtocolParameter *parameter(); + QValidator::State validity() const; void setValue(const QVariant &value); + void setValidity(QValidator::State validity); private: Tp::ProtocolParameter *m_parameter; const QVariant m_originalValue; QVariant m_currentValue; QString m_localizedName; + QValidator::State m_validity; }; --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/unsigned-integer-edit.cpp #1023211:1023212 @@ -22,12 +22,16 @@ #include -#include +#include UnsignedIntegerEdit::UnsignedIntegerEdit(QWidget *parent) : QLineEdit(parent) { connect(this, SIGNAL(textChanged(QString)), SLOT(onTextChanged(QString))); + + // Set the validator range to the range of values in a 32 bit unsigned integer (dbus-type 'u'). + // FIXME: Maximum value must be a valid type "int" for the validator to work. What a POS + setValidator(new QIntValidator(0, 2147483647, this)); } UnsignedIntegerEdit::~UnsignedIntegerEdit() @@ -45,41 +49,38 @@ setText(QString::number(unsignedInteger)); } -void UnsignedIntegerEdit::keyPressEvent(QKeyEvent *event) +QValidator::State UnsignedIntegerEdit::validity() const { - kDebug() << "Key:" << event->key() << "Text:" << event->text(); + int cursorPos = cursorPosition(); + QString txt = text(); + return validator()->validate(txt, cursorPos); +} - // If the text is empty or a modifier, allow the keypress - if ((event->text().isEmpty()) || (event->key() < Qt::Key_Space)) { - event->ignore(); - QLineEdit::keyPressEvent(event); - return; - } +QPair UnsignedIntegerEdit::validRange() const +{ + QPair ret; + ret.first = 0; + ret.second = 0; - // If the key is backspace or delete, allow it - if ((event->key() == Qt::Key_Delete) || (event->key() == Qt::Key_Backspace)) { - event->ignore(); - QLineEdit::keyPressEvent(event); - return; - } + QIntValidator const *intValidator = qobject_cast(validator()); - // Check for numbers (and ensure maximum input length is not expended - // FIXME: Have a better check to make sure the user doesn't enter a number too large. - QString validKeys("0123456789"); - if (validKeys.contains(event->text())) { - if ((text().length() + 1) <= 4) - { - kDebug() << "Key is a number."; - event->ignore(); - QLineEdit::keyPressEvent(event); - return; - } + if (!intValidator) { + kWarning() << "Somehow this is not an int validator :/"; + return ret; } - // Anything else, reject the keypress. - event->accept(); + ret.first = intValidator->bottom(); + ret.second = intValidator->top(); + + return ret; } +// WARNING: Don't set a range outside of that supported by "int"!!! +void UnsignedIntegerEdit::setValidRange(quint32 minimum, quint32 maximum) +{ + setValidator(new QIntValidator(static_cast(minimum), static_cast(maximum), this)); +} + void UnsignedIntegerEdit::onTextChanged(const QString &text) { Q_EMIT unsignedIntegerChanged(text.toUInt()); --- trunk/playground/network/telepathy-accounts-kcm/src/KCMTelepathyAccounts/unsigned-integer-edit.h #1023211:1023212 @@ -23,7 +23,9 @@ #include +#include #include +#include class KDE_EXPORT UnsignedIntegerEdit : public QLineEdit { @@ -33,14 +35,16 @@ explicit UnsignedIntegerEdit(QWidget *parent = 0); virtual ~UnsignedIntegerEdit(); - uint value() const; - void setValue(uint unsignedInteger); + quint32 value() const; + void setValue(quint32 unsignedInteger); -protected: - void keyPressEvent(QKeyEvent *event); + QValidator::State validity() const; + QPair validRange() const; + void setValidRange(quint32 minimum, quint32 maximum); + Q_SIGNALS: - void unsignedIntegerChanged(uint unsignedInteger); + void unsignedIntegerChanged(quint32 unsignedInteger); private Q_SLOTS: void onTextChanged(const QString &text);