diff options
Diffstat (limited to 'src/frontend/keychooser/cscrollbutton.cpp')
-rw-r--r-- | src/frontend/keychooser/cscrollbutton.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/frontend/keychooser/cscrollbutton.cpp b/src/frontend/keychooser/cscrollbutton.cpp new file mode 100644 index 0000000..742bc53 --- /dev/null +++ b/src/frontend/keychooser/cscrollbutton.cpp @@ -0,0 +1,85 @@ +/********* +* +* This file is part of BibleTime's source code, http://www.bibletime.info/. +* +* Copyright 1999-2008 by the BibleTime developers. +* The BibleTime source code is licensed under the GNU General Public License version 2.0. +* +**********/ + + + +#include "cscrollbutton.h" + + +#include <stdlib.h> +#include <math.h> + +//Qt includes +#include <QEvent> +#include <QApplication> +#include <QCursor> +#include <QPoint> +#include <QMouseEvent> +#include <QWheelEvent> + +CScrollButton::CScrollButton(QWidget *parent) : QToolButton(parent) { + setFocusPolicy(Qt::WheelFocus); + setCursor(Qt::SplitVCursor ); + + m_isLocked = false; + connect(this, SIGNAL(pressed() ), SLOT(was_pressed() )); + connect(this, SIGNAL(released()), SLOT(was_released())); +} + +bool CScrollButton::isLocked( ) const { + return m_isLocked; +} + +void CScrollButton::was_pressed( ) { + QApplication::setOverrideCursor(Qt::BlankCursor); + m_isLocked = true; + lock_Point = get_lock_Point(); + + emit lock() + ; +} + +void CScrollButton::was_released( ) { + QApplication::restoreOverrideCursor(); + m_isLocked = false; + + emit unlock(); +} + +const QPoint CScrollButton::get_lock_Point() const { + return mapToGlobal( QPoint( width()/2, height()/2 ) ); +} + +void CScrollButton::mouseMoveEvent( QMouseEvent* e ) { + if (m_isLocked) { + int vchange = (QCursor::pos().y() - lock_Point.y()); + + if (abs(vchange) < 10) { + vchange = (int)((vchange>0 ? 1 : -1) * pow(abs(vchange), 0.3)); + } + else if (abs(vchange) < 30) { + vchange = (int)((vchange>0 ? 1 : -1) * pow(abs(vchange), 0.6)); + } + else if (abs(vchange) < 40) { + vchange = (int)((vchange>0 ? 1 : -1) * pow(abs(vchange), 1.2)); + } + else { + vchange = (int)((vchange>0 ? 1 : -1) * pow(abs(vchange), 2.0)); + } + + if (vchange) { //not emit 0 + emit change_requested( vchange ); + } + + QCursor::setPos( lock_Point ); + } + else { + QToolButton::mouseMoveEvent(e); + } +} |