• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • src
  • plugins
  • render
  • navigation
ArrowDiscWidget.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2013 Mohammed Nafees <nafees.technocool@gmail.com>
9 //
10 
11 #include "ArrowDiscWidget.h"
12 
13 #include "MarbleWidget.h"
14 
15 #include <qmath.h>
16 #include <QPainter>
17 #include <QMouseEvent>
18 #include <QPixmapCache>
19 #include <QPainterPath>
20 
21 namespace Marble
22 {
23 
24 ArrowDiscWidget::ArrowDiscWidget( QWidget *parent ) :
25  QWidget( parent ),
26  m_arrowPressed( Qt::NoArrow ),
27  m_repetitions( 0 ),
28  m_marbleWidget( 0 ),
29  m_imagePath( "marble/navigation/navigational_arrows" )
30 {
31  setMouseTracking( true );
32 
33  m_initialPressTimer.setSingleShot( true );
34  connect( &m_initialPressTimer, SIGNAL(timeout()), SLOT(startPressRepeat()) );
35  connect( &m_repeatPressTimer, SIGNAL(timeout()), SLOT(repeatPress()) );
36 }
37 
38 ArrowDiscWidget::~ArrowDiscWidget()
39 {
40  QPixmapCache::remove( "marble/navigation/navigational_arrows" );
41  QPixmapCache::remove( "marble/navigation/navigational_arrows_hover_bottom" );
42  QPixmapCache::remove( "marble/navigation/navigational_arrows_hover_left" );
43  QPixmapCache::remove( "marble/navigation/navigational_arrows_hover_right" );
44  QPixmapCache::remove( "marble/navigation/navigational_arrows_hover_top" );
45  QPixmapCache::remove( "marble/navigation/navigational_arrows_press_bottom" );
46  QPixmapCache::remove( "marble/navigation/navigational_arrows_press_left" );
47  QPixmapCache::remove( "marble/navigation/navigational_arrows_press_right" );
48  QPixmapCache::remove( "marble/navigation/navigational_arrows_press_top" );
49 }
50 
51 void ArrowDiscWidget::setMarbleWidget( MarbleWidget *marbleWidget )
52 {
53  m_marbleWidget = marbleWidget;
54 }
55 
56 QPixmap ArrowDiscWidget::pixmap( const QString &id )
57 {
58  QPixmap result;
59  if ( !QPixmapCache::find( id, result ) ) {
60  result = QPixmap( QString( ":/%1.png" ).arg( id ) );
61  QPixmapCache::insert( id, result );
62  }
63  return result;
64 }
65 
66 void ArrowDiscWidget::mousePressEvent( QMouseEvent *mouseEvent )
67 {
68  if ( mouseEvent->button() == Qt::LeftButton ) {
69 
70  if ( !m_initialPressTimer.isActive() && !m_repeatPressTimer.isActive() ) {
71  m_repetitions = 0;
72  m_initialPressTimer.start( 300 );
73  }
74 
75  m_arrowPressed = arrowUnderMouse( mouseEvent->pos() );
76  switch ( m_arrowPressed ) {
77  case Qt::NoArrow:
78  m_imagePath = "marble/navigation/navigational_arrows";
79  break;
80  case Qt::UpArrow:
81  m_imagePath = "marble/navigation/navigational_arrows_press_top";
82  m_marbleWidget->moveUp();
83  break;
84  case Qt::DownArrow:
85  m_imagePath = "marble/navigation/navigational_arrows_press_bottom";
86  m_marbleWidget->moveDown();
87  break;
88  case Qt::LeftArrow:
89  m_imagePath = "marble/navigation/navigational_arrows_press_left";
90  m_marbleWidget->moveLeft();
91  break;
92  case Qt::RightArrow:
93  m_imagePath = "marble/navigation/navigational_arrows_press_right";
94  m_marbleWidget->moveRight();
95  break;
96  }
97  }
98 
99  repaint();
100 }
101 
102 void ArrowDiscWidget::mouseReleaseEvent( QMouseEvent *mouseEvent )
103 {
104  m_initialPressTimer.stop();
105  m_repeatPressTimer.stop();
106  mouseMoveEvent( mouseEvent );
107 }
108 
109 void ArrowDiscWidget::leaveEvent( QEvent* )
110 {
111  if ( m_imagePath != "marble/navigation/navigational_arrows" ) {
112  m_imagePath = "marble/navigation/navigational_arrows";
113  repaint();
114  }
115 
116  m_initialPressTimer.stop();
117  m_repeatPressTimer.stop();
118 }
119 
120 void ArrowDiscWidget::startPressRepeat()
121 {
122  repeatPress();
123 
124  if ( m_arrowPressed != Qt::NoArrow ) {
125  m_repeatPressTimer.start( 100 );
126  }
127 }
128 
129 void ArrowDiscWidget::repeatPress()
130 {
131  if ( m_repetitions <= 200 ) {
132  ++m_repetitions;
133  switch ( m_arrowPressed ) {
134  case Qt::NoArrow:
135  break;
136  case Qt::UpArrow:
137  m_marbleWidget->moveUp();
138  break;
139  case Qt::DownArrow:
140  m_marbleWidget->moveDown();
141  break;
142  case Qt::LeftArrow:
143  m_marbleWidget->moveLeft();
144  break;
145  case Qt::RightArrow:
146  m_marbleWidget->moveRight();
147  break;
148  }
149  } else {
150  m_repeatPressTimer.stop();
151  }
152 }
153 
154 void ArrowDiscWidget::mouseMoveEvent( QMouseEvent *mouseEvent )
155 {
156  QString const oldPath = m_imagePath;
157  switch ( arrowUnderMouse( mouseEvent->pos() ) ) {
158  case Qt::NoArrow:
159  m_imagePath = "marble/navigation/navigational_arrows";
160  break;
161  case Qt::UpArrow:
162  m_imagePath = "marble/navigation/navigational_arrows_hover_top";
163  m_arrowPressed = Qt::UpArrow;
164  break;
165  case Qt::DownArrow:
166  m_imagePath = "marble/navigation/navigational_arrows_hover_bottom";
167  m_arrowPressed = Qt::DownArrow;
168  break;
169  case Qt::LeftArrow:
170  m_imagePath = "marble/navigation/navigational_arrows_hover_left";
171  m_arrowPressed = Qt::LeftArrow;
172  break;
173  case Qt::RightArrow:
174  m_imagePath = "marble/navigation/navigational_arrows_hover_right";
175  m_arrowPressed = Qt::RightArrow;
176  break;
177  }
178 
179  if ( m_imagePath != oldPath ) {
180  repaint();
181  }
182 }
183 
184 void ArrowDiscWidget::repaint()
185 {
186  emit repaintNeeded();
187 }
188 
189 Qt::ArrowType ArrowDiscWidget::arrowUnderMouse(const QPoint &position) const
190 {
191  const int min_radius_pow2 = 5*5;
192  const int max_radius_pow2 = 28*28;
193 
194  // mouse coordinates relative to widget topleft
195  int mx = position.x();
196  int my = position.y();
197 
198  // center coordinates relative to widget topleft
199  int cx = width()/2;
200  int cy = height()/2;
201 
202  int px = mx - cx;
203  int py = my - cy;
204 
205  int const distance_pow2 = px*px + py*py;
206 
207  if ( distance_pow2 >= min_radius_pow2 && distance_pow2 <= max_radius_pow2 ) {
208  int const angle = int( qAtan2( py, px ) * RAD2DEG );
209  Q_ASSERT( -180 <= angle && angle <= 180 );
210 
211  if ( angle >= 135 || angle < -135 ) {
212  return Qt::LeftArrow;
213  } else if ( angle < -45 ) {
214  return Qt::UpArrow;
215  } else if ( angle < 45 ) {
216  return Qt::RightArrow;
217  } else {
218  return Qt::DownArrow;
219  }
220  }
221 
222  return Qt::NoArrow;
223 }
224 
225 void ArrowDiscWidget::paintEvent( QPaintEvent * )
226 {
227  Q_ASSERT( !pixmap( m_imagePath ).isNull() );
228  QPainter painter( this );
229  painter.drawPixmap( 0, 0, pixmap( m_imagePath ) );
230  painter.end();
231 }
232 
233 }
234 
235 #include "ArrowDiscWidget.moc"
QPainter
Marble::RAD2DEG
const qreal RAD2DEG
Definition: MarbleGlobal.h:201
Marble::MarbleWidget::moveUp
void moveUp(FlyToMode mode=Automatic)
Move up by the moveStep.
Definition: MarbleWidget.cpp:718
angle
double angle(double vec1[3], double vec2[3])
Definition: sgp4ext.cpp:164
Marble::ArrowDiscWidget::mousePressEvent
void mousePressEvent(QMouseEvent *mouseEvent)
Definition: ArrowDiscWidget.cpp:66
Marble::ArrowDiscWidget::repaint
void repaint()
Definition: ArrowDiscWidget.cpp:184
QWidget
Marble::ArrowDiscWidget::pixmap
QPixmap pixmap(const QString &id)
Definition: ArrowDiscWidget.cpp:56
Marble::ArrowDiscWidget::setMarbleWidget
void setMarbleWidget(MarbleWidget *marbleWidget)
Definition: ArrowDiscWidget.cpp:51
Marble::MarbleWidget::moveDown
void moveDown(FlyToMode mode=Automatic)
Move down by the moveStep.
Definition: MarbleWidget.cpp:723
Marble::MarbleWidget::moveLeft
void moveLeft(FlyToMode mode=Automatic)
Move left by the moveStep.
Definition: MarbleWidget.cpp:707
Marble::ArrowDiscWidget::leaveEvent
void leaveEvent(QEvent *event)
Definition: ArrowDiscWidget.cpp:109
Marble::ArrowDiscWidget::mouseReleaseEvent
void mouseReleaseEvent(QMouseEvent *mouseEvent)
Definition: ArrowDiscWidget.cpp:102
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:102
Marble::ArrowDiscWidget::repaintNeeded
void repaintNeeded()
Marble::ArrowDiscWidget::mouseMoveEvent
void mouseMoveEvent(QMouseEvent *mouseEvent)
Definition: ArrowDiscWidget.cpp:154
Marble::ArrowDiscWidget::ArrowDiscWidget
ArrowDiscWidget(QWidget *parent=0)
Definition: ArrowDiscWidget.cpp:24
Marble::ArrowDiscWidget::~ArrowDiscWidget
~ArrowDiscWidget()
Definition: ArrowDiscWidget.cpp:38
MarbleWidget.h
This file contains the headers for MarbleWidget.
ArrowDiscWidget.h
Marble::ArrowDiscWidget::paintEvent
void paintEvent(QPaintEvent *)
Definition: ArrowDiscWidget.cpp:225
Marble::MarbleWidget::moveRight
void moveRight(FlyToMode mode=Automatic)
Move right by the moveStep.
Definition: MarbleWidget.cpp:712
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:49 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal