summaryrefslogtreecommitdiffstats
path: root/src/widgets/qspinwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/qspinwidget.cpp')
-rw-r--r--src/widgets/qspinwidget.cpp465
1 files changed, 465 insertions, 0 deletions
diff --git a/src/widgets/qspinwidget.cpp b/src/widgets/qspinwidget.cpp
new file mode 100644
index 000000000..cf9608616
--- /dev/null
+++ b/src/widgets/qspinwidget.cpp
@@ -0,0 +1,465 @@
+/****************************************************************************
+**
+** Implementation of TQSpinWidget class
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the widgets module of the TQt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qrangecontrol.h"
+
+#ifndef QT_NO_SPINWIDGET
+
+#include "qrect.h"
+#include "qtimer.h"
+#include "qstyle.h"
+#include "qpainter.h"
+
+class TQSpinWidgetPrivate
+{
+public:
+ TQSpinWidgetPrivate()
+ : upEnabled( TRUE ),
+ downEnabled( TRUE ),
+ theButton( 0 ),
+ buttonDown( 0 ),
+ timerUp( 0 ),
+ bsyms( TQSpinWidget::UpDownArrows ),
+ ed ( 0 ) {}
+ uint upEnabled :1;
+ uint downEnabled :1;
+ uint theButton :2;
+ uint buttonDown :2;
+ uint timerUp : 1;
+ TQRect up;
+ TQRect down;
+ TQTimer auRepTimer;
+ TQSpinWidget::ButtonSymbols bsyms;
+ TQWidget *ed;
+ void startTimer( int msec ) { auRepTimer.start( msec, TRUE ); }
+ void startTimer( bool up, int msec ) { timerUp = up; startTimer( msec ); }
+ void stopTimer() { auRepTimer.stop(); }
+};
+
+/*!
+
+ \class TQSpinWidget qspinwidget.h
+ \brief The TQSpinWidget class is an internal range control related class.
+
+ \internal
+
+ Constructs an empty range control widget with parent \a parent
+ called \a name.
+
+*/
+
+TQSpinWidget::TQSpinWidget( TQWidget* parent, const char* name )
+ : TQWidget( parent, name )
+{
+ d = new TQSpinWidgetPrivate();
+ connect( &d->auRepTimer, SIGNAL( timeout() ), this, SLOT( timerDone() ) );
+ setFocusPolicy( StrongFocus );
+
+ arrange();
+ updateDisplay();
+}
+
+
+/*! Destroys the object and frees any allocated resources.
+
+*/
+
+TQSpinWidget::~TQSpinWidget()
+{
+ delete d;
+}
+
+/*! */
+TQWidget * TQSpinWidget::editWidget()
+{
+ return d->ed;
+}
+
+/*!
+ Sets the editing widget to \a w.
+*/
+void TQSpinWidget::setEditWidget( TQWidget * w )
+{
+ if ( w ) {
+ if (w->parentWidget() != this)
+ w->reparent( this, TQPoint( 0, 0 ) );
+ setFocusProxy( w );
+ }
+ d->ed = w;
+ arrange();
+ updateDisplay();
+}
+
+/*! \reimp
+
+*/
+
+void TQSpinWidget::mousePressEvent( TQMouseEvent *e )
+{
+ if ( e->button() != LeftButton ) {
+ d->stopTimer();
+ d->buttonDown = 0;
+ d->theButton = 0;
+ repaint( d->down.unite( d->up ), FALSE );
+ return;
+ }
+
+ uint oldButtonDown = d->buttonDown;
+
+ if ( d->down.contains( e->pos() ) && d->downEnabled )
+ d->buttonDown = 1;
+ else if ( d->up.contains( e->pos() ) && d->upEnabled )
+ d->buttonDown = 2;
+ else
+ d->buttonDown = 0;
+
+ d->theButton = d->buttonDown;
+ if ( oldButtonDown != d->buttonDown ) {
+ if ( !d->buttonDown ) {
+ repaint( d->down.unite( d->up ), FALSE );
+ } else if ( d->buttonDown & 1 ) {
+ repaint( d->down, FALSE );
+ stepDown();
+ d->startTimer( FALSE, 300 );
+ } else if ( d->buttonDown & 2 ) {
+ repaint( d->up, FALSE );
+ stepUp();
+ d->startTimer( TRUE, 300 );
+ }
+ }
+}
+
+/*!
+
+*/
+
+void TQSpinWidget::arrange()
+{
+ d->up = TQStyle::visualRect( style().querySubControlMetrics( TQStyle::CC_SpinWidget, this,
+ TQStyle::SC_SpinWidgetUp ), this );
+ d->down = TQStyle::visualRect( style().querySubControlMetrics( TQStyle::CC_SpinWidget, this,
+ TQStyle::SC_SpinWidgetDown ), this );
+ if ( d->ed ) {
+ TQRect r = TQStyle::visualRect( style().querySubControlMetrics( TQStyle::CC_SpinWidget, this,
+ TQStyle::SC_SpinWidgetEditField ), this );
+ d->ed->setGeometry( r );
+ }
+}
+
+/*!
+
+*/
+
+void TQSpinWidget::stepUp()
+{
+ emit stepUpPressed();
+}
+
+void TQSpinWidget::resizeEvent( TQResizeEvent* )
+{
+ arrange();
+}
+
+/*!
+
+*/
+
+void TQSpinWidget::stepDown()
+{
+ emit stepDownPressed();
+}
+
+
+void TQSpinWidget::timerDone()
+{
+ // we use a double timer to make it possible for users to do
+ // something with 0-timer on valueChanged.
+ TQTimer::singleShot( 1, this, SLOT( timerDoneEx() ) );
+}
+
+void TQSpinWidget::timerDoneEx()
+{
+ if ( !d->buttonDown )
+ return;
+ if ( d->timerUp )
+ stepUp();
+ else
+ stepDown();
+ d->startTimer( 100 );
+}
+
+
+void TQSpinWidget::windowActivationChange( bool oldActive )
+{
+ //was active, but lost focus
+ if ( oldActive && d->buttonDown ) {
+ d->stopTimer();
+ d->buttonDown = 0;
+ d->theButton = 0;
+ }
+ TQWidget::windowActivationChange( oldActive );
+}
+
+
+
+/*!
+ The event is passed in \a e.
+*/
+
+void TQSpinWidget::mouseReleaseEvent( TQMouseEvent *e )
+{
+ if ( e->button() != LeftButton )
+ return;
+
+ uint oldButtonDown = d->theButton;
+ d->theButton = 0;
+ if ( oldButtonDown != d->theButton ) {
+ if ( oldButtonDown & 1 )
+ repaint( d->down, FALSE );
+ else if ( oldButtonDown & 2 )
+ repaint( d->up, FALSE );
+ }
+ d->stopTimer();
+ d->buttonDown = 0;
+}
+
+
+/*!
+ The event is passed in \a e.
+*/
+
+void TQSpinWidget::mouseMoveEvent( TQMouseEvent *e )
+{
+ if ( !(e->state() & LeftButton ) )
+ return;
+
+ uint oldButtonDown = d->theButton;
+ if ( oldButtonDown & 1 && !d->down.contains( e->pos() ) ) {
+ d->stopTimer();
+ d->theButton = 0;
+ repaint( d->down, FALSE );
+ } else if ( oldButtonDown & 2 && !d->up.contains( e->pos() ) ) {
+ d->stopTimer();
+ d->theButton = 0;
+ repaint( d->up, FALSE );
+ } else if ( !oldButtonDown && d->up.contains( e->pos() ) && d->buttonDown & 2 ) {
+ d->startTimer( 500 );
+ d->theButton = 2;
+ repaint( d->up, FALSE );
+ } else if ( !oldButtonDown && d->down.contains( e->pos() ) && d->buttonDown & 1 ) {
+ d->startTimer( 500 );
+ d->theButton = 1;
+ repaint( d->down, FALSE );
+ }
+}
+
+
+/*!
+ The event is passed in \a e.
+*/
+#ifndef QT_NO_WHEELEVENT
+void TQSpinWidget::wheelEvent( TQWheelEvent *e )
+{
+ e->accept();
+ static float offset = 0;
+ static TQSpinWidget* offset_owner = 0;
+ if ( offset_owner != this ) {
+ offset_owner = this;
+ offset = 0;
+ }
+ offset += -e->delta()/120;
+ if ( TQABS( offset ) < 1 )
+ return;
+ int ioff = int(offset);
+ int i;
+ for( i=0; i < TQABS( ioff ); i++ )
+ offset > 0 ? stepDown() : stepUp();
+ offset -= ioff;
+}
+#endif
+
+/*!
+
+*/
+void TQSpinWidget::paintEvent( TQPaintEvent * )
+{
+ TQPainter p( this );
+
+ TQStyle::SFlags flags = TQStyle::Style_Default;
+ if (isEnabled())
+ flags |= TQStyle::Style_Enabled;
+ if (hasFocus() || focusProxy() && focusProxy()->hasFocus())
+ flags |= TQStyle::Style_HasFocus;
+
+ TQStyle::SCFlags active;
+ if ( d->theButton & 1 )
+ active = TQStyle::SC_SpinWidgetDown;
+ else if ( d->theButton & 2 )
+ active = TQStyle::SC_SpinWidgetUp;
+ else
+ active = TQStyle::SC_None;
+
+ TQRect fr = TQStyle::visualRect(
+ style().querySubControlMetrics( TQStyle::CC_SpinWidget, this,
+ TQStyle::SC_SpinWidgetFrame ), this );
+ style().drawComplexControl( TQStyle::CC_SpinWidget, &p, this,
+ fr, colorGroup(),
+ flags,
+ (uint)TQStyle::SC_All,
+ active );
+}
+
+
+/*!
+ The previous style is passed in \a old.
+*/
+
+void TQSpinWidget::styleChange( TQStyle& old )
+{
+ arrange();
+ TQWidget::styleChange( old );
+}
+
+/*!
+*/
+
+TQRect TQSpinWidget::upRect() const
+{
+ return d->up;
+}
+
+/*!
+*/
+
+TQRect TQSpinWidget::downRect() const
+{
+ return d->down;
+}
+
+/*!
+*/
+
+void TQSpinWidget::updateDisplay()
+{
+ if ( !isEnabled() ) {
+ d->upEnabled = FALSE;
+ d->downEnabled = FALSE;
+ }
+ if ( d->theButton & 1 && ( d->downEnabled ) == 0 ) {
+ d->theButton &= ~1;
+ d->buttonDown &= ~1;
+ }
+
+ if ( d->theButton & 2 && ( d->upEnabled ) == 0 ) {
+ d->theButton &= ~2;
+ d->buttonDown &= ~2;
+ }
+ repaint( FALSE );
+}
+
+
+/*!
+ The previous enabled state is passed in \a old.
+*/
+
+void TQSpinWidget::enableChanged( bool )
+{
+ d->upEnabled = isEnabled();
+ d->downEnabled = isEnabled();
+ updateDisplay();
+}
+
+
+/*!
+ Sets up-enabled to \a on.
+*/
+
+void TQSpinWidget::setUpEnabled( bool on )
+{
+ if ( (bool)d->upEnabled != on ) {
+ d->upEnabled = on;
+ updateDisplay();
+ }
+}
+
+/*!
+*/
+
+bool TQSpinWidget::isUpEnabled() const
+{
+ return d->upEnabled;
+}
+
+/*!
+ Sets down-enabled to \a on.
+*/
+
+void TQSpinWidget::setDownEnabled( bool on )
+{
+ if ( (bool)d->downEnabled != on ) {
+ d->downEnabled = on;
+ updateDisplay();
+ }
+}
+
+/*!
+*/
+
+bool TQSpinWidget::isDownEnabled() const
+{
+ return d->downEnabled;
+}
+
+/*!
+ Sets the button symbol to \a bs.
+*/
+
+void TQSpinWidget::setButtonSymbols( ButtonSymbols bs )
+{
+ d->bsyms = bs;
+}
+
+/*!
+*/
+
+TQSpinWidget::ButtonSymbols TQSpinWidget::buttonSymbols() const
+{
+ return d->bsyms;
+}
+
+#endif