Skip to content

Commit

Permalink
Working key interaction
Browse files Browse the repository at this point in the history
In horizontal mode left/right,pageup/pagedown changes active slider position
while up/down flips between selecting the upper, lower or range control

In vertical mode up/down/pageup/pagedown changes the active slider position
while left/right flips between the subcontrols
  • Loading branch information
nyalldawson committed Nov 26, 2020
1 parent b41a9a8 commit 62f751e
Show file tree
Hide file tree
Showing 3 changed files with 312 additions and 0 deletions.
2 changes: 2 additions & 0 deletions python/gui/auto_generated/qgsrangeslider.sip.in
Expand Up @@ -141,6 +141,8 @@ position for the widget. If the value is ``True``, the minimum and maximum appea

virtual void mouseReleaseEvent( QMouseEvent *event );

virtual void keyPressEvent( QKeyEvent *event );

virtual QSize sizeHint() const;

virtual QSize minimumSizeHint() const;
Expand Down
307 changes: 307 additions & 0 deletions src/gui/qgsrangeslider.cpp
Expand Up @@ -317,6 +317,69 @@ QRect QgsRangeSlider::selectedRangeRect()
return selectionRect.adjusted( -1, 1, 1, -1 );
}

void QgsRangeSlider::applyStep( int step )
{
switch ( mFocusControl )
{
case Lower:
{
int newLowerValue = std::min( mUpperValue, std::min( mStyleOption.maximum, std::max( mStyleOption.minimum, mLowerValue + step ) ) );
if ( newLowerValue != mLowerValue )
{
mLowerValue = newLowerValue;
emit rangeChanged( mLowerValue, mUpperValue );
update();
}
break;
}

case Upper:
{
int newUpperValue = std::max( mLowerValue, std::min( mStyleOption.maximum, std::max( mStyleOption.minimum, mUpperValue + step ) ) );
if ( newUpperValue != mUpperValue )
{
mUpperValue = newUpperValue;
emit rangeChanged( mLowerValue, mUpperValue );
update();
}
break;
}

case Range:
{
if ( step < 0 )
{
int previousWidth = mUpperValue - mLowerValue;
int newLowerValue = std::min( mUpperValue, std::min( mStyleOption.maximum, std::max( mStyleOption.minimum, mLowerValue + step ) ) );
if ( newLowerValue != mLowerValue )
{
mLowerValue = newLowerValue;
mUpperValue = std::min( mStyleOption.maximum, mLowerValue + previousWidth );
emit rangeChanged( mLowerValue, mUpperValue );
update();
}
}
else
{
int previousWidth = mUpperValue - mLowerValue;
int newUpperValue = std::max( mLowerValue, std::min( mStyleOption.maximum, std::max( mStyleOption.minimum, mUpperValue + step ) ) );
if ( newUpperValue != mUpperValue )
{
mUpperValue = newUpperValue;
mLowerValue = std::max( mStyleOption.minimum, mUpperValue - previousWidth );
emit rangeChanged( mLowerValue, mUpperValue );
update();
}
}
break;
}

case None:
case Both:
break;
}
}

int QgsRangeSlider::pageStep() const
{
return mPageStep;
Expand Down Expand Up @@ -643,6 +706,250 @@ void QgsRangeSlider::mouseReleaseEvent( QMouseEvent *event )
update();
}

void QgsRangeSlider::keyPressEvent( QKeyEvent *event )
{
switch ( event->key() )
{
case Qt::Key_Left:
{
switch ( mStyleOption.orientation )
{
case Qt::Horizontal:
applyStep( mFlipped ? mSingleStep : -mSingleStep );
break;

case Qt::Vertical:
if ( mFlipped )
{
switch ( mFocusControl )
{
case Lower:
mFocusControl = Range;
break;
case Range:
mFocusControl = Upper;
break;
case Upper:
case None:
case Both:
mFocusControl = Lower;
break;
}
}
else
{
switch ( mFocusControl )
{
case Lower:
case None:
case Both:
mFocusControl = Upper;
break;
case Range:
mFocusControl = Lower;
break;
case Upper:
mFocusControl = Range;
break;
}
}
update();
break;
}
break;
}

case Qt::Key_Right:
{
switch ( mStyleOption.orientation )
{
case Qt::Horizontal:
applyStep( mFlipped ? -mSingleStep : mSingleStep );
break;

case Qt::Vertical:
if ( mFlipped )
{
switch ( mFocusControl )
{
case Lower:
case None:
case Both:
mFocusControl = Upper;
break;
case Range:
mFocusControl = Lower;
break;
case Upper:
mFocusControl = Range;
break;
}
}
else
{
switch ( mFocusControl )
{
case Lower:
mFocusControl = Range;
break;
case Range:
mFocusControl = Upper;
break;
case Upper:
case None:
case Both:
mFocusControl = Lower;
break;
}
}
update();
break;
}
break;
}

case Qt::Key_Up:
{
switch ( mStyleOption.orientation )
{
case Qt::Horizontal:
if ( mFlipped )
{
switch ( mFocusControl )
{
case Lower:
mFocusControl = Range;
break;
case Range:
mFocusControl = Upper;
break;
case Upper:
case None:
case Both:
mFocusControl = Lower;
break;
}
}
else
{
switch ( mFocusControl )
{
case Lower:
mFocusControl = Upper;
break;
case Range:
case None:
case Both:
mFocusControl = Lower;
break;
case Upper:
mFocusControl = Range;
break;
}
}
update();
break;

case Qt::Vertical:
applyStep( mFlipped ? mSingleStep : -mSingleStep );
break;
}
break;
}

case Qt::Key_Down:
{
switch ( mStyleOption.orientation )
{
case Qt::Horizontal:
if ( mFlipped )
{
switch ( mFocusControl )
{
case Lower:
mFocusControl = Upper;
break;
case Range:
case None:
case Both:
mFocusControl = Lower;
break;
case Upper:
mFocusControl = Range;
break;
}
}
else
{
switch ( mFocusControl )
{
case Lower:
mFocusControl = Range;
break;
case Range:
mFocusControl = Upper;
break;
case Upper:
case None:
case Both:
mFocusControl = Lower;
break;
}
}
update();
break;

case Qt::Vertical:
applyStep( mFlipped ? -mSingleStep : mSingleStep );
break;
}
break;
}

case Qt::Key_PageUp:
{
switch ( mStyleOption.orientation )
{
case Qt::Horizontal:
applyStep( mFlipped ? -mPageStep : mPageStep );
break;

case Qt::Vertical:
applyStep( mFlipped ? mPageStep : -mPageStep );
break;
}
break;
}

case Qt::Key_PageDown:
{
switch ( mStyleOption.orientation )
{
case Qt::Horizontal:
applyStep( mFlipped ? mPageStep : -mPageStep );
break;

case Qt::Vertical:
applyStep( mFlipped ? -mPageStep : mPageStep );
break;
}
break;
}

#if 0
case Qt::Key_Home:
action = SliderToMinimum;
break;
case Qt::Key_End:
action = SliderToMaximum;
break;
#endif
default:
event->ignore();
break;
}
}

QSize QgsRangeSlider::sizeHint() const
{
ensurePolished();
Expand Down
3 changes: 3 additions & 0 deletions src/gui/qgsrangeslider.h
Expand Up @@ -145,6 +145,7 @@ class GUI_EXPORT QgsRangeSlider : public QWidget
void mousePressEvent( QMouseEvent *event ) override;
void mouseMoveEvent( QMouseEvent *event ) override;
void mouseReleaseEvent( QMouseEvent *event ) override;
void keyPressEvent( QKeyEvent *event ) override;
QSize sizeHint() const override;
QSize minimumSizeHint() const override;

Expand Down Expand Up @@ -263,6 +264,8 @@ class GUI_EXPORT QgsRangeSlider : public QWidget
QRect selectedRangeRect();
void drawFocusRect();

void applyStep( int step );

int mLowerValue = 0;
int mUpperValue = 0;

Expand Down

0 comments on commit 62f751e

Please sign in to comment.