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"