We now have a current svn snapshot of libqxt in our contrib dir, and
[quassel.git] / src / contrib / libqxt-2007-10-24 / src / gui / qxtstringspinbox.cpp
diff --git a/src/contrib/libqxt-2007-10-24/src/gui/qxtstringspinbox.cpp b/src/contrib/libqxt-2007-10-24/src/gui/qxtstringspinbox.cpp
new file mode 100644 (file)
index 0000000..e04b67e
--- /dev/null
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) Qxt Foundation. Some rights reserved.
+**
+** This file is part of the QxtGui module of the Qt eXTension library
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of th Common Public License, version 1.0, as published by
+** IBM.
+**
+** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+** FITNESS FOR A PARTICULAR PURPOSE.
+**
+** You should have received a copy of the CPL along with this file.
+** See the LICENSE file and the cpl1.0.txt file included with the source
+** distribution for more information. If you did not receive a copy of the
+** license, contact the Qxt Foundation.
+**
+** <http://libqxt.sourceforge.net>  <foundation@libqxt.org>
+**
+****************************************************************************/
+#include "qxtstringspinbox.h"
+
+class QxtStringSpinBoxPrivate : public QxtPrivate<QxtStringSpinBox>
+{
+public:
+    QXT_DECLARE_PUBLIC(QxtStringSpinBox);
+    int startsWith(const QString& start, QString& string) const;
+    QStringList strings;
+};
+
+int QxtStringSpinBoxPrivate::startsWith(const QString& start, QString& string) const
+{
+    const int size = strings.size();
+    for (int i = 0; i < size; ++i)
+    {
+        if (strings.at(i).startsWith(start, Qt::CaseInsensitive))
+        {
+            // found
+            string = strings.at(i);
+            return i;
+        }
+    }
+    // not found
+    return -1;
+}
+
+/*!
+    \class QxtStringSpinBox QxtStringSpinBox
+    \ingroup QxtGui
+    \brief A spin box with string items.
+
+    QxtStringSpinBox is spin box that takes strings. QxtStringSpinBox allows
+    the user to choose a value by clicking the up and down buttons or by
+    pressing Up or Down on the keyboard to increase or decrease the value
+    currently displayed. The user can also type the value in manually.
+
+    \image html qxtstringspinbox.png "QxtStringSpinBox in Cleanlooks style."
+ */
+
+/*!
+    Constructs a new QxtStringSpinBox with \a parent.
+ */
+QxtStringSpinBox::QxtStringSpinBox(QWidget* pParent) : QSpinBox(pParent)
+{
+    setRange(0, 0);
+}
+
+/*!
+    Destructs the spin box.
+ */
+QxtStringSpinBox::~QxtStringSpinBox()
+{}
+
+/*!
+    \property QxtStringSpinBox::strings
+    \brief This property holds the string items of the spin box.
+ */
+const QStringList& QxtStringSpinBox::strings() const
+{
+    return qxt_d().strings;
+}
+
+void QxtStringSpinBox::setStrings(const QStringList& strings)
+{
+    qxt_d().strings = strings;
+    setRange(0, strings.size() - 1);
+    if (!strings.isEmpty())
+        setValue(0);
+}
+
+void QxtStringSpinBox::fixup(QString& input) const
+{
+    // just attempt to change the input string to be valid according to the string list
+    // no need to result in a valid string, callers of this function are responsible to
+    // re-test the validity afterwards
+
+    // try finding a string from the list which starts with input
+    input = input.simplified();
+    if (!input.isEmpty())
+    {
+        qxt_d().startsWith(input, input);
+    }
+}
+
+QValidator::State QxtStringSpinBox::validate(QString& input, int& pos) const
+{
+    // Invalid:                input is invalid according to the string list
+    // Intermediate:   it is likely that a little more editing will make the input acceptable
+    //                 (e.g. the user types "A" and stringlist contains "ABC")
+    // Acceptable:             the input is valid.
+    Q_UNUSED(pos);
+    QString temp;
+    QValidator::State state = QValidator::Invalid;
+    if (qxt_d().strings.contains(input))
+    {
+        // exact match
+        state = QValidator::Acceptable;
+    }
+    else if (input.isEmpty() || qxt_d().startsWith(input, temp) != -1)
+    {
+        // still empty or some string in the list starts with input
+        state = QValidator::Intermediate;
+    }
+    // else invalid
+    return state;
+}
+
+QString QxtStringSpinBox::textFromValue(int value) const
+{
+    Q_ASSERT(qxt_d().strings.isEmpty() || (value >= 0 && value < qxt_d().strings.size()));
+    return qxt_d().strings.isEmpty() ? QLatin1String("") : qxt_d().strings.at(value);
+}
+
+int QxtStringSpinBox::valueFromText(const QString& text) const
+{
+    return qxt_d().strings.indexOf(text);
+}