• 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
  • lib
  • marble
  • graphicsview
WidgetGraphicsItem.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 2010 Bastian Holst <bastianholst@gmx.de>
9 //
10 
11 // Self
12 #include "WidgetGraphicsItem.h"
13 #include "WidgetGraphicsItem_p.h"
14 
15 // Marble
16 #include "MarbleWidget.h"
17 #include "MarbleDebug.h"
18 
19 // Qt
20 #include <QApplication>
21 #include <QMouseEvent>
22 #include <QPainter>
23 #include <QWidget>
24 
25 using namespace Marble;
26 
27 WidgetGraphicsItemPrivate::WidgetGraphicsItemPrivate() :
28  m_widget(0), m_marbleWidget(0), m_activeWidget( 0 )
29 {
30  // nothing to do
31 }
32 
33 WidgetGraphicsItemPrivate::~WidgetGraphicsItemPrivate()
34 {
35  delete m_widget;
36 }
37 
38 WidgetGraphicsItem::WidgetGraphicsItem( MarbleGraphicsItem *parent )
39  : ScreenGraphicsItem( parent ),
40  d( new WidgetGraphicsItemPrivate() )
41 {
42 }
43 
44 WidgetGraphicsItem::~WidgetGraphicsItem() {
45  delete d;
46 }
47 
48 void WidgetGraphicsItem::setWidget( QWidget *widget ) {
49  d->m_widget = widget;
50 
51  QSize size = widget->sizeHint().expandedTo( widget->size() );
52  size = size.expandedTo( widget->minimumSize() );
53  size = size.boundedTo( widget->maximumSize() );
54  setSize( size );
55  widget->resize( size );
56 }
57 
58 QWidget *WidgetGraphicsItem::widget() const {
59  return d->m_widget;
60 }
61 
62 void WidgetGraphicsItem::paint( QPainter *painter )
63 {
64  if( d->m_widget == 0 )
65  return;
66 
67  // Paint widget without a background
68  d->m_widget->render( painter,
69  QPoint( 0, 0 ),
70  QRegion(),
71  QWidget::RenderFlags(QWidget::DrawChildren) );
72 }
73 
74 bool WidgetGraphicsItem::eventFilter( QObject *object, QEvent *e )
75 {
76  if ( !visible() || d->m_widget == 0 ) {
77  return false;
78  }
79 
80  MarbleWidget *widget = dynamic_cast<MarbleWidget*> (object);
81  if ( !widget ) {
82  return ScreenGraphicsItem::eventFilter(object, e);
83  }
84 
85  if ( d->m_marbleWidget != widget ) {
86  // Delayed initialization
87  d->m_marbleWidget = widget;
88  }
89 
90  Q_ASSERT(d->m_marbleWidget);
91 
92  if ( e->type() == QEvent::MouseButtonDblClick
93  || e->type() == QEvent::MouseMove
94  || e->type() == QEvent::MouseButtonPress
95  || e->type() == QEvent::MouseButtonRelease )
96  {
97  // Mouse events are forwarded to the underlying widget
98  QMouseEvent *event = static_cast<QMouseEvent*> ( e );
99 
100  QList<QPointF> widgetPositions = absolutePositions();
101  QRectF widgetItemRect;
102  QPoint shiftedPos;
103  QList<QPointF>::iterator it = widgetPositions.begin();
104  bool foundRightPosition = false;
105  for(; !foundRightPosition && it != widgetPositions.end(); ++it ) {
106  widgetItemRect = QRectF( *it, size() );
107 
108  if ( widgetItemRect.contains( event->pos() ) ) {
109  foundRightPosition = true;
110  shiftedPos = event->pos() - widgetItemRect.topLeft().toPoint();
111  }
112  }
113 
114  if ( foundRightPosition ) {
115  QWidget *child = d->m_widget->childAt( shiftedPos );
116 
117  if ( d->m_activeWidget && d->m_activeWidget != child ) {
118  QEvent leaveEvent( QEvent::Leave );
119  QApplication::sendEvent( d->m_activeWidget, &leaveEvent );
120  }
121 
122  if ( child && d->m_activeWidget != child ) {
123  QEvent enterEvent( QEvent::Enter );
124  QApplication::sendEvent( child, &enterEvent );
125  }
126  d->m_activeWidget = child;
127 
128  if ( child ) {
129  shiftedPos -= child->pos(); // transform to children's coordinates
130  QMouseEvent shiftedEvent = QMouseEvent( e->type(), shiftedPos,
131  event->globalPos(), event->button(), event->buttons(),
132  event->modifiers() );
133  if ( QApplication::sendEvent( child, &shiftedEvent ) ) {
134  d->m_marbleWidget->setCursor( d->m_widget->cursor() );
135  return true;
136  }
137  }
138  } else {
139  if ( d->m_activeWidget ) {
140  QEvent leaveEvent( QEvent::Leave );
141  QApplication::sendEvent( d->m_activeWidget, &leaveEvent );
142  d->m_activeWidget = 0;
143  }
144  }
145  }
146 
147  return ScreenGraphicsItem::eventFilter(object, e);
148 }
QPainter
Marble::WidgetGraphicsItemPrivate::m_widget
QWidget * m_widget
Definition: WidgetGraphicsItem_p.h:28
Marble::WidgetGraphicsItem::setWidget
void setWidget(QWidget *widget)
Definition: WidgetGraphicsItem.cpp:48
Marble::ScreenGraphicsItem::absolutePositions
QList< QPointF > absolutePositions() const
Return the absolute position of the ScreenGraphicsItem.
Definition: ScreenGraphicsItem.cpp:54
Marble::MarbleGraphicsItem::setSize
void setSize(const QSizeF &size)
Set the size of the item.
Definition: MarbleGraphicsItem.cpp:197
Marble::WidgetGraphicsItem::eventFilter
virtual bool eventFilter(QObject *, QEvent *)
Definition: WidgetGraphicsItem.cpp:74
Marble::WidgetGraphicsItemPrivate
Definition: WidgetGraphicsItem_p.h:21
QWidget
Marble::MarbleGraphicsItem::size
QSizeF size() const
Returns the size of the item.
Definition: MarbleGraphicsItem.cpp:136
Marble::WidgetGraphicsItem::~WidgetGraphicsItem
virtual ~WidgetGraphicsItem()
Definition: WidgetGraphicsItem.cpp:44
QObject
MarbleDebug.h
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:102
Marble::WidgetGraphicsItemPrivate::~WidgetGraphicsItemPrivate
~WidgetGraphicsItemPrivate()
Definition: WidgetGraphicsItem.cpp:33
Marble::WidgetGraphicsItem::WidgetGraphicsItem
WidgetGraphicsItem(MarbleGraphicsItem *parent=0)
Definition: WidgetGraphicsItem.cpp:38
Marble::MarbleGraphicsItem
Definition: MarbleGraphicsItem.h:34
Marble::MarbleGraphicsItem::visible
bool visible() const
Returns if the item is visible.
Definition: MarbleGraphicsItem.cpp:177
WidgetGraphicsItem.h
Marble::ScreenGraphicsItem::eventFilter
virtual bool eventFilter(QObject *, QEvent *)
Definition: ScreenGraphicsItem.cpp:69
Marble::WidgetGraphicsItem::widget
QWidget * widget() const
Definition: WidgetGraphicsItem.cpp:58
Marble::WidgetGraphicsItemPrivate::m_marbleWidget
QWidget * m_marbleWidget
Definition: WidgetGraphicsItem_p.h:29
WidgetGraphicsItem_p.h
Marble::ScreenGraphicsItem
Definition: ScreenGraphicsItem.h:30
Marble::WidgetGraphicsItemPrivate::WidgetGraphicsItemPrivate
WidgetGraphicsItemPrivate()
Definition: WidgetGraphicsItem.cpp:27
MarbleWidget.h
This file contains the headers for MarbleWidget.
Marble::WidgetGraphicsItemPrivate::m_activeWidget
QWidget * m_activeWidget
Definition: WidgetGraphicsItem_p.h:30
Marble::WidgetGraphicsItem::paint
virtual void paint(QPainter *painter)
Paints the item in item coordinates.
Definition: WidgetGraphicsItem.cpp:62
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:53 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