File indexing completed on 2024-05-05 03:50:46

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2013 Mohammed Nafees <nafees.technocool@gmail.com>
0004 //
0005 
0006 #include "NavigationSlider.h"
0007 
0008 #include <QPainter>
0009 #include <QMouseEvent>
0010 #include <QPixmapCache>
0011 
0012 namespace Marble
0013 {
0014 
0015 namespace {
0016     const int handleImageHeight = 32;
0017 }
0018 
0019 NavigationSlider::NavigationSlider(QWidget *parent) :
0020     QAbstractSlider( parent ),
0021     m_handleImagePath( "marble/navigation/navigational_slider_handle" )
0022 {
0023     setMouseTracking( true );
0024 }
0025 
0026 NavigationSlider::~NavigationSlider()
0027 {
0028     QPixmapCache::remove( "marble/navigation/navigational_slider_groove" );
0029     QPixmapCache::remove( "marble/navigation/navigational_slider_handle" );
0030     QPixmapCache::remove( "marble/navigation/navigational_slider_handle_hover" );
0031     QPixmapCache::remove( "marble/navigation/navigational_slider_handle_press" );
0032 }
0033 
0034 QPixmap NavigationSlider::pixmap( const QString &id )
0035 {
0036     QPixmap result;
0037     if ( !QPixmapCache::find( id, &result ) ) {
0038         result = QPixmap(QLatin1String(":/") + id + QLatin1String(".png"));
0039         QPixmapCache::insert( id, result );
0040     }
0041     return result;
0042 }
0043 
0044 void NavigationSlider::enterEvent( QEvent * )
0045 {
0046     setSliderDown( false );
0047     if (m_handleImagePath != QLatin1String("marble/navigation/navigational_slider_handle_hover")) {
0048         m_handleImagePath = "marble/navigation/navigational_slider_handle_hover";
0049         repaint();
0050     }
0051 }
0052 
0053 void NavigationSlider::mouseMoveEvent( QMouseEvent *mouseEvent )
0054 {
0055     if ( !isSliderDown() && mouseEvent->buttons() & Qt::LeftButton ) {
0056         setSliderDown( true );
0057     }
0058     if ( isSliderDown() ) {
0059         qreal const fraction = ( mouseEvent->pos().y() - handleImageHeight/2 ) / qreal ( height() - handleImageHeight );
0060         int v = ( int ) minimum() + ( ( maximum() - minimum() ) ) * ( 1 - fraction );
0061         setValue( v );
0062         repaint();
0063     }
0064 }
0065 
0066 void NavigationSlider::mousePressEvent( QMouseEvent * )
0067 {
0068     setSliderDown( true );
0069     if (m_handleImagePath != QLatin1String("marble/navigation/navigational_slider_handle_press")) {
0070         m_handleImagePath = "marble/navigation/navigational_slider_handle_press";
0071         repaint();
0072     }
0073 }
0074 
0075 void NavigationSlider::mouseReleaseEvent( QMouseEvent * )
0076 {
0077     setSliderDown( false );
0078     if (m_handleImagePath != QLatin1String("marble/navigation/navigational_slider_handle_hover")) {
0079         m_handleImagePath = "marble/navigation/navigational_slider_handle_hover";
0080         repaint();
0081     }
0082 }
0083 
0084 void NavigationSlider::leaveEvent( QEvent * )
0085 {
0086     setSliderDown( false );
0087     if (m_handleImagePath != QLatin1String("marble/navigation/navigational_slider_handle")) {
0088         m_handleImagePath = "marble/navigation/navigational_slider_handle";
0089         repaint();
0090     }
0091 }
0092 
0093 void NavigationSlider::repaint()
0094 {
0095     emit repaintNeeded();
0096 }
0097 
0098 void NavigationSlider::paintEvent( QPaintEvent * )
0099 {
0100     QPainter painter( this );
0101     for ( int y = 0; y <= 160; y+=10 ) {
0102         painter.drawPixmap( 0, y, pixmap( "marble/navigation/navigational_slider_groove" ) );
0103 
0104     }
0105     qreal const fraction = ( value() - minimum() ) / qreal( maximum() - minimum() );
0106     int const y = ( height() - handleImageHeight ) * ( 1 - fraction );
0107     painter.drawPixmap( 0, y, pixmap( m_handleImagePath ) );
0108     painter.end();
0109 }
0110 
0111 }
0112 
0113 #include "moc_NavigationSlider.cpp"