summaryrefslogtreecommitdiffstats
path: root/lib/koproperty/editors/spinbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/koproperty/editors/spinbox.cpp')
-rw-r--r--lib/koproperty/editors/spinbox.cpp329
1 files changed, 329 insertions, 0 deletions
diff --git a/lib/koproperty/editors/spinbox.cpp b/lib/koproperty/editors/spinbox.cpp
new file mode 100644
index 000000000..2e4bcc7c3
--- /dev/null
+++ b/lib/koproperty/editors/spinbox.cpp
@@ -0,0 +1,329 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
+ Copyright (C) 2004 Alexander Dymo <cloudtemple@mskat.net>
+
+ 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 "spinbox.h"
+
+#include "property.h"
+
+#include <qlayout.h>
+#include <qobjectlist.h>
+#include <qvariant.h>
+#include <qpainter.h>
+#include <qlineedit.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+
+using namespace KoProperty;
+
+IntSpinBox::IntSpinBox(int lower, int upper, int step, int value, int base, IntEdit *parent, const char *name)
+: KIntSpinBox(lower, upper, step, value, base, parent, name)
+{
+ editor()->setAlignment(Qt::AlignLeft);
+ installEventFilter(editor());
+ installEventFilter(this);
+ QObjectList *spinwidgets = queryList( "QSpinWidget", 0, false, true );
+ QSpinWidget* spin = static_cast<QSpinWidget*>(spinwidgets->first());
+ if (spin)
+ spin->installEventFilter(this);
+ delete spinwidgets;
+}
+
+void IntSpinBox::setValue(const QVariant &value)
+{
+ if (dynamic_cast<IntEdit*>(parentWidget()) && dynamic_cast<IntEdit*>(parentWidget())->isReadOnly())
+ return;
+ if (value.isNull())
+ editor()->clear();
+ else
+ KIntSpinBox::setValue(value.toInt());
+}
+
+bool
+IntSpinBox::eventFilter(QObject *o, QEvent *e)
+{
+ if(o == editor())
+ {
+ if(e->type() == QEvent::KeyPress)
+ {
+ QKeyEvent* ev = static_cast<QKeyEvent*>(e);
+ if((ev->key()==Key_Up || ev->key()==Key_Down) && ev->state() !=ControlButton)
+ {
+ parentWidget()->eventFilter(o, e);
+ return true;
+ }
+ }
+ }
+ if ((o == editor() || o == this || o->parent() == this)
+ && e->type() == QEvent::Wheel && static_cast<IntEdit*>(parentWidget())->isReadOnly())
+ {
+ return true; //avoid value changes for read-only widget
+ }
+
+ return KIntSpinBox::eventFilter(o, e);
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+IntEdit::IntEdit(Property *property, QWidget *parent, const char *name)
+ : Widget(property, parent, name)
+{
+ QVariant minVal( property ? property->option("min") : 0 );
+ QVariant maxVal( property ? property->option("max") : QVariant() );
+ QVariant minValueText( property ? property->option("minValueText") : QVariant() );
+ if (minVal.isNull())
+ minVal = 0;
+ if (maxVal.isNull())
+ maxVal = INT_MAX;
+
+ m_edit = new IntSpinBox(minVal.toInt(), maxVal.toInt(), 1, 0, 10, this);
+ if (!minValueText.isNull())
+ m_edit->setSpecialValueText(minValueText.toString());
+ m_edit->setMinimumHeight(5);
+ setEditor(m_edit);
+
+ setLeavesTheSpaceForRevertButton(true);
+ setFocusWidget(m_edit);
+ connect(m_edit, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged(int)));
+}
+
+IntEdit::~IntEdit()
+{}
+
+QVariant
+IntEdit::value() const
+{
+ if (m_edit->cleanText().isEmpty())
+ return QVariant();
+ return m_edit->value();
+}
+
+void
+IntEdit::setValue(const QVariant &value, bool emitChange)
+{
+ m_edit->blockSignals(true);
+ m_edit->setValue(value);
+ updateSpinWidgets();
+ m_edit->blockSignals(false);
+ if (emitChange)
+ emit valueChanged(this);
+}
+
+void
+IntEdit::drawViewer(QPainter *p, const QColorGroup &cg, const QRect &r, const QVariant &value)
+{
+ QString valueText = value.toString();
+ if (property() && property()->hasOptions()) {
+ //replace min value with minValueText if defined
+ QVariant minValue( property()->option("min") );
+ QVariant minValueText( property()->option("minValueText") );
+ if (!minValue.isNull() && !minValueText.isNull() && minValue.toInt() == value.toInt()) {
+ valueText = minValueText.toString();
+ }
+ }
+
+ Widget::drawViewer(p, cg, r, valueText);
+// p->eraseRect(r);
+// p->drawText(r, Qt::AlignLeft | Qt::AlignVCenter | Qt::SingleLine, valueText);
+}
+
+void
+IntEdit::slotValueChanged(int)
+{
+ emit valueChanged(this);
+}
+
+void
+IntEdit::updateSpinWidgets()
+{
+ QObjectList *spinwidgets = queryList( "QSpinWidget", 0, false, true );
+ QSpinWidget* spin = static_cast<QSpinWidget*>(spinwidgets->first());
+ if (spin) {
+ spin->setUpEnabled(!isReadOnly());
+ spin->setDownEnabled(!isReadOnly());
+ }
+ delete spinwidgets;
+}
+
+void
+IntEdit::setReadOnlyInternal(bool readOnly)
+{
+ //disable editor and spin widget
+ m_edit->editor()->setReadOnly(readOnly);
+ updateSpinWidgets();
+ if (readOnly)
+ setLeavesTheSpaceForRevertButton(false);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+DoubleSpinBox::DoubleSpinBox (double lower, double upper, double step, double value, int precision, DoubleEdit *parent)
+: KDoubleSpinBox(lower, upper, step, value, precision, parent)
+{
+ editor()->setAlignment(Qt::AlignLeft);
+ installEventFilter(editor());
+ installEventFilter(this);
+ QObjectList *spinwidgets = queryList( "QSpinWidget", 0, false, true );
+ QSpinWidget* spin = static_cast<QSpinWidget*>(spinwidgets->first());
+ if (spin)
+ spin->installEventFilter(this);
+ delete spinwidgets;
+}
+
+bool
+DoubleSpinBox::eventFilter(QObject *o, QEvent *e)
+{
+ if(o == editor())
+ {
+ if(e->type() == QEvent::KeyPress)
+ {
+ QKeyEvent* ev = static_cast<QKeyEvent*>(e);
+ if((ev->key()==Key_Up || ev->key()==Key_Down) && ev->state()!=ControlButton)
+ {
+ parentWidget()->eventFilter(o, e);
+ return true;
+ }
+ }
+ }
+ if ((o == editor() || o == this || o->parent() == this)
+ && e->type() == QEvent::Wheel && static_cast<IntEdit*>(parentWidget())->isReadOnly())
+ {
+ return true; //avoid value changes for read-only widget
+ }
+
+ return KDoubleSpinBox::eventFilter(o, e);
+}
+
+
+void DoubleSpinBox::setValue( const QVariant& value )
+{
+ if (dynamic_cast<DoubleEdit*>(parentWidget()) && dynamic_cast<DoubleEdit*>(parentWidget())->isReadOnly())
+ return;
+ if (value.isNull())
+ editor()->clear();
+ else
+ KDoubleSpinBox::setValue(value.toDouble());
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+DoubleEdit::DoubleEdit(Property *property, QWidget *parent, const char *name)
+ : Widget(property, parent, name)
+{
+ QVariant minVal( property ? property->option("min") : 0 );
+ QVariant maxVal( property ? property->option("max") : QVariant() );
+ QVariant step( property ? property->option("step") : QVariant());
+ QVariant precision( property ? property->option("precision") : QVariant());
+ QVariant minValueText( property ? property->option("minValueText") : QVariant() );
+ if (minVal.isNull())
+ minVal = 0;
+ if (maxVal.isNull())
+ maxVal = (double)(INT_MAX/100);
+ if(step.isNull())
+ step = 0.1;
+ if(precision.isNull())
+ precision = 2;
+
+ m_edit = new DoubleSpinBox(minVal.toDouble(), maxVal.toDouble(), step.toDouble(),
+ 0, precision.toInt(), this);
+ if (!minValueText.isNull())
+ m_edit->setSpecialValueText(minValueText.toString());
+ m_edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_edit->setMinimumHeight(5);
+ setEditor(m_edit);
+
+ setLeavesTheSpaceForRevertButton(true);
+ setFocusWidget(m_edit);
+ connect(m_edit, SIGNAL(valueChanged(double)), this, SLOT(slotValueChanged(double)));
+}
+
+DoubleEdit::~DoubleEdit()
+{}
+
+QVariant
+DoubleEdit::value() const
+{
+ if (m_edit->cleanText().isEmpty())
+ return QVariant();
+ return m_edit->value();
+}
+
+void
+DoubleEdit::setValue(const QVariant &value, bool emitChange)
+{
+ m_edit->blockSignals(true);
+ m_edit->setValue(value);
+ updateSpinWidgets();
+ m_edit->blockSignals(false);
+ if (emitChange)
+ emit valueChanged(this);
+}
+
+void
+DoubleEdit::drawViewer(QPainter *p, const QColorGroup &cg, const QRect &r, const QVariant &value)
+{
+ QString valueText;
+ if (property() && property()->hasOptions()) {
+ //replace min value with minValueText if defined
+ QVariant minValue( property()->option("min") );
+ QVariant minValueText( property()->option("minValueText") );
+ if (!minValue.isNull() && !minValueText.isNull() && minValue.toString().toDouble() == value.toString().toDouble()) {
+ valueText = minValueText.toString();
+ }
+ }
+ if (valueText.isEmpty())
+ valueText = QString(value.toString()).replace('.', KGlobal::locale()->decimalSymbol());
+
+ Widget::drawViewer(p, cg, r, valueText);
+// p->eraseRect(r);
+// p->drawText(r, Qt::AlignLeft | Qt::AlignVCenter | Qt::SingleLine, valueText);
+}
+
+void
+DoubleEdit::slotValueChanged(double)
+{
+ emit valueChanged(this);
+}
+
+void
+DoubleEdit::updateSpinWidgets()
+{
+ QObjectList *spinwidgets = queryList( "QSpinWidget", 0, false, true );
+ QSpinWidget* spin = static_cast<QSpinWidget*>(spinwidgets->first());
+ if (spin) {
+ spin->setUpEnabled(!isReadOnly());
+ spin->setDownEnabled(!isReadOnly());
+ }
+ delete spinwidgets;
+}
+
+void
+DoubleEdit::setReadOnlyInternal(bool readOnly)
+{
+ //disable editor and spin widget
+ m_edit->editor()->setReadOnly(readOnly);
+ updateSpinWidgets();
+ if (readOnly)
+ setLeavesTheSpaceForRevertButton(false);
+}
+
+#include "spinbox.moc"