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

marble

  • sources
  • kde-4.14
  • 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, QPoint( 0, 0 ), QRegion(), QWidget::RenderFlags( QWidget::DrawChildren) );
69 }
70 
71 bool WidgetGraphicsItem::eventFilter( QObject *object, QEvent *e )
72 {
73  if ( !visible() || d->m_widget == 0 ) {
74  return false;
75  }
76 
77  MarbleWidget *widget = dynamic_cast<MarbleWidget*> (object);
78  if ( !widget ) {
79  return ScreenGraphicsItem::eventFilter(object, e);
80  }
81 
82  if ( d->m_marbleWidget != widget ) {
83  // Delayed initialization
84  d->m_marbleWidget = widget;
85  }
86 
87  Q_ASSERT(d->m_marbleWidget);
88 
89  if ( e->type() == QEvent::MouseButtonDblClick
90  || e->type() == QEvent::MouseMove
91  || e->type() == QEvent::MouseButtonPress
92  || e->type() == QEvent::MouseButtonRelease )
93  {
94  // Mouse events are forwarded to the underlying widget
95  QMouseEvent *event = static_cast<QMouseEvent*> ( e );
96 
97  QList<QPointF> widgetPositions = absolutePositions();
98  QRectF widgetItemRect;
99  QPoint shiftedPos;
100  QList<QPointF>::iterator it = widgetPositions.begin();
101  bool foundRightPosition = false;
102  for(; !foundRightPosition && it != widgetPositions.end(); ++it ) {
103  widgetItemRect = QRectF( *it, size() );
104 
105  if ( widgetItemRect.contains( event->pos() ) ) {
106  foundRightPosition = true;
107  shiftedPos = event->pos() - widgetItemRect.topLeft().toPoint();
108  }
109  }
110 
111  if ( foundRightPosition ) {
112  QWidget *child = d->m_widget->childAt( shiftedPos );
113 
114  if ( d->m_activeWidget && d->m_activeWidget != child ) {
115  QEvent leaveEvent( QEvent::Leave );
116  QApplication::sendEvent( d->m_activeWidget, &leaveEvent );
117  }
118 
119  if ( child && d->m_activeWidget != child ) {
120  QEvent enterEvent( QEvent::Enter );
121  QApplication::sendEvent( child, &enterEvent );
122  }
123  d->m_activeWidget = child;
124 
125  if ( child ) {
126  shiftedPos -= child->pos(); // transform to children's coordinates
127  QMouseEvent shiftedEvent = QMouseEvent( e->type(), shiftedPos,
128  event->globalPos(), event->button(), event->buttons(),
129  event->modifiers() );
130  if ( QApplication::sendEvent( child, &shiftedEvent ) ) {
131  d->m_marbleWidget->setCursor( d->m_widget->cursor() );
132  return true;
133  }
134  }
135  } else {
136  if ( d->m_activeWidget ) {
137  QEvent leaveEvent( QEvent::Leave );
138  QApplication::sendEvent( d->m_activeWidget, &leaveEvent );
139  d->m_activeWidget = 0;
140  }
141  }
142  }
143 
144  return ScreenGraphicsItem::eventFilter(object, e);
145 }
QSize::boundedTo
QSize boundedTo(const QSize &otherSize) const
QEvent
QWidget
QEvent::type
Type type() const
Marble::WidgetGraphicsItemPrivate::m_widget
QWidget * m_widget
Definition: WidgetGraphicsItem_p.h:28
Marble::WidgetGraphicsItem::setWidget
void setWidget(QWidget *widget)
Definition: WidgetGraphicsItem.cpp:48
QWidget::setCursor
void setCursor(const QCursor &)
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:71
Marble::WidgetGraphicsItemPrivate
Definition: WidgetGraphicsItem_p.h:21
QWidget::childAt
QWidget * childAt(int x, int y) const
Marble::MarbleGraphicsItem::size
QSizeF size() const
Returns the size of the item.
Definition: MarbleGraphicsItem.cpp:136
QPoint
QMouseEvent
QWidget::RenderFlags
typedef RenderFlags
Marble::WidgetGraphicsItem::~WidgetGraphicsItem
virtual ~WidgetGraphicsItem()
Definition: WidgetGraphicsItem.cpp:44
MarbleDebug.h
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:104
QWidget::size
size
QWidget::minimumSize
minimumSize
Marble::WidgetGraphicsItemPrivate::~WidgetGraphicsItemPrivate
~WidgetGraphicsItemPrivate()
Definition: WidgetGraphicsItem.cpp:33
QObject
Marble::WidgetGraphicsItem::WidgetGraphicsItem
WidgetGraphicsItem(MarbleGraphicsItem *parent=0)
Definition: WidgetGraphicsItem.cpp:38
QPainter
QRectF::topLeft
QPointF topLeft() const
QCoreApplication::sendEvent
bool sendEvent(QObject *receiver, QEvent *event)
QWidget::pos
pos
Marble::MarbleGraphicsItem
Definition: MarbleGraphicsItem.h:34
QList< QPointF >
Marble::MarbleGraphicsItem::visible
bool visible() const
Returns if the item is visible.
Definition: MarbleGraphicsItem.cpp:177
WidgetGraphicsItem.h
QList::end
iterator end()
QSize
QWidget::sizeHint
sizeHint
QWidget::maximumSize
maximumSize
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
QPointF::toPoint
QPoint toPoint() const
QSize::expandedTo
QSize expandedTo(const QSize &otherSize) const
QRectF
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
QRectF::contains
bool contains(const QPointF &point) const
Marble::WidgetGraphicsItem::paint
virtual void paint(QPainter *painter)
Paints the item in item coordinates.
Definition: WidgetGraphicsItem.cpp:62
QList::begin
iterator begin()
QRegion
QWidget::render
void render(QPaintDevice *target, const QPoint &targetOffset, const QRegion &sourceRegion, QFlags< QWidget::RenderFlag > renderFlags)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:42 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
  • 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