22 #include <QApplication>
24 #include <QDesktopWidget>
25 #include <QGraphicsObject>
26 #include <QGraphicsView>
27 #include <QDeclarativeItem>
34 m_menu =
new QMenu(0);
36 this, SLOT(itemTriggered(
QAction *)));
37 connect(m_menu, SIGNAL(aboutToHide()), SLOT(markAsClosed()));
47 return QDeclarativeListProperty<QMenuItem>(
this, m_items);
52 return m_items.count();
57 return m_items.at(index);
67 return m_visualParent.data();
72 if (m_visualParent.data() == parent) {
83 action = qobject_cast<
QAction *>(parent);
85 action->setMenu(m_menu);
88 m_menu->addAction(item);
90 m_menu->updateGeometry();
93 m_visualParent = parent;
99 switch (event->type()) {
100 case QEvent::ChildAdded: {
101 QChildEvent *ce =
static_cast<QChildEvent *
>(
event);
104 if (mi && !m_items.contains(mi)) {
105 m_menu->addAction(mi);
111 case QEvent::ChildRemoved: {
112 QChildEvent *ce =
static_cast<QChildEvent *
>(
event);
117 m_menu->removeAction(mi);
118 m_items.removeAll(mi);
127 return QObject::event(event);
140 m_menu->addAction(item);
146 m_menu->addAction(item);
150 void QMenuProxy::itemTriggered(
QAction *action)
155 int index = m_items.indexOf(item);
166 m_menu->addAction (item);
171 QGraphicsObject *parentItem;
172 if (m_visualParent) {
173 parentItem = qobject_cast<QGraphicsObject *>(m_visualParent.data());
175 parentItem = qobject_cast<QGraphicsObject *>(parent());
178 if (!parentItem || !parentItem->scene()) {
179 m_menu->popup(QPoint(0, 0));
185 QList<QGraphicsView*> views = parentItem->scene()->views();
187 if (views.size() < 1) {
188 m_menu->popup(QPoint(0, 0));
194 QGraphicsView *view = 0;
195 if (views.size() == 1) {
198 QGraphicsView *found = 0;
199 QGraphicsView *possibleFind = 0;
200 foreach (QGraphicsView *v, views) {
201 if (v->sceneRect().intersects(parentItem->sceneBoundingRect()) ||
202 v->sceneRect().contains(parentItem->scenePos())) {
203 if (v->isActiveWindow()) {
210 view = found ? found : possibleFind;
214 screenPos = view->mapToGlobal(view->mapFromScene(parentItem->scenePos()+ QPoint(x, y)));
216 screenPos = QApplication::activeWindow()->mapToGlobal(QPoint(x, y));
219 m_menu->popup(screenPos);
229 m_menu->addAction (item);
231 m_menu->updateGeometry();
233 QGraphicsObject *parentItem;
234 if (m_visualParent) {
235 parentItem = qobject_cast<QGraphicsObject *>(m_visualParent.data());
237 parentItem = qobject_cast<QGraphicsObject *>(parent());
240 if (!parentItem || !parentItem->scene()) {
241 m_menu->popup(QPoint(0, 0));
247 QList<QGraphicsView*> views = parentItem->scene()->views();
249 if (views.size() < 1) {
250 m_menu->popup(QPoint(0, 0));
256 QGraphicsView *view = 0;
257 if (views.size() == 1) {
260 QGraphicsView *found = 0;
261 QGraphicsView *possibleFind = 0;
262 foreach (QGraphicsView *v, views) {
263 if (v->sceneRect().intersects(parentItem->sceneBoundingRect()) ||
264 v->sceneRect().contains(parentItem->scenePos())) {
265 if (v->isActiveWindow()) {
272 view = found ? found : possibleFind;
276 m_menu->popup(QPoint(0, 0));
282 const QRect avail = QApplication::desktop()->availableGeometry(view);
283 QPoint menuPos = view->mapToGlobal(view->mapFromScene(parentItem->scenePos()+QPoint(0, parentItem->boundingRect().height())));
285 if (menuPos.y() + m_menu->sizeHint().height() > avail.bottom()) {
286 menuPos = view->mapToGlobal(view->mapFromScene(parentItem->scenePos() - QPoint(0, m_menu->sizeHint().height())));
289 m_menu->popup(menuPos);
299 void QMenuProxy::markAsClosed()