/* QGLView Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this programap-> If not, see . */ #include "scroll_spin_box.h" #include "ui_scroll_spin_box.h" #include #include #include #include #include #include #include ScrollSpinBox::ScrollSpinBox(QWidget * parent): QWidget(parent) { ui = new Ui::ScrollSpinBox(); ui->setupUi(this); ui->spin->setPrecision(3); ui->handle->installEventFilter(this); connect(ui->spin, SIGNAL(valueChanged(double)), this, SIGNAL(valueChanged(double))); last_value = 0.; sensivity_ = 0.2; m_maximum = 2147483647; m_minimum = -m_maximum; scroll_scale = sensivity_ / 10; canceled = false; } EvalSpinBox * ScrollSpinBox::spin() { return ui->spin; } double ScrollSpinBox::value() const { return ui->spin->value(); } void ScrollSpinBox::setReadOnly(bool r) { m_read_only = r; ui->spin->setReadOnly(r); } void ScrollSpinBox::changeEvent(QEvent * e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void ScrollSpinBox::resizeEvent(QResizeEvent * e) { QStyleOptionSpinBox so; so.initFrom(ui->spin); QRect r = qApp->style()->subControlRect(QStyle::CC_SpinBox, &so, QStyle::SC_SpinBoxUp); ui->handle->setFixedWidth(qMax(ui->handle->height() / 3, r.width())); scroll_scale = sensivity_ / appScale(this) / 10; } bool ScrollSpinBox::eventFilter(QObject * o, QEvent * e) { switch (e->type()) { case QEvent::MouseButtonPress: mousePress((QMouseEvent *)e); return true; case QEvent::MouseButtonRelease: mouseRelease((QMouseEvent *)e); return true; case QEvent::MouseMove: mouseMove((QMouseEvent *)e); return true; default: break; } return QWidget::eventFilter(o, e); } void ScrollSpinBox::mousePress(QMouseEvent * e) { if (canceled || !isEnabled() || m_read_only) return; if (e->button() == Qt::RightButton) { canceled = true; ui->spin->setExpression(last_text); } if (e->button() == Qt::LeftButton) { down_pos = e->pos(); last_text = ui->spin->expression(); last_value = qAbs(ui->spin->value()); if (last_value == 0.) last_value = 1.; } } void ScrollSpinBox::mouseRelease(QMouseEvent * e) { if (!isEnabled() || m_read_only) return; if (e->buttons() == Qt::NoButton) canceled = false; } void ScrollSpinBox::mouseMove(QMouseEvent * e) { if (canceled || !isEnabled() || m_read_only) return; if (e->buttons().testFlag(Qt::LeftButton)) { double dv = (down_pos.y() - e->pos().y()) * scroll_scale; if (dv != 0.) { QCursor::setPos(ui->handle->mapToGlobal(down_pos)); setValue(ui->spin->value() + last_value * dv); } } } void ScrollSpinBox::setValue(double v) { ui->spin->setValue(qBound(m_minimum, v, m_maximum)); } void ScrollSpinBox::setMinimum(int minimum) { m_minimum = minimum; setValue(value()); } void ScrollSpinBox::setMaximum(int maximum) { m_maximum = maximum; setValue(value()); }