diff options
| author | Erik Verbruggen <erik.verbruggen@digia.com> | 2013-12-10 12:53:20 +0100 |
|---|---|---|
| committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2013-12-10 12:53:20 +0100 |
| commit | 9f831dde07cb2411808534e76669b28a1b76e21d (patch) | |
| tree | ed6252d64c9a3ab27aa93786272cda1b6008f3c7 /src/libs/utils/execmenu.cpp | |
| parent | cdac81f896ef4b052d76f96485a08e6ec13696b8 (diff) | |
| parent | ea1a92484ac99057b06130a012164bf9788650e9 (diff) | |
| download | qt-creator-wip/clang.tar.gz | |
Merge remote-tracking branch 'origin/master' into wip/clangwip/clang
Change-Id: I8a2c8068a3f2b15034fb1bf6304c9a0f3f0e3c8f
Diffstat (limited to 'src/libs/utils/execmenu.cpp')
| -rw-r--r-- | src/libs/utils/execmenu.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/libs/utils/execmenu.cpp b/src/libs/utils/execmenu.cpp new file mode 100644 index 0000000000..b760132801 --- /dev/null +++ b/src/libs/utils/execmenu.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "execmenu.h" + +#include <QApplication> +#include <QDesktopWidget> +#include <QMenu> +#include <QPoint> +#include <QRect> +#include <QSize> +#include <QWidget> + +namespace Utils { + +/*! + * Opens \a menu at the specified \a widget position. + * This function computes the position where to show the menu, and opens it with + * QMenu::exec(). + */ +QAction *execMenuAtWidget(QMenu *menu, QWidget *widget) +{ + QPoint p; + QRect screen = qApp->desktop()->availableGeometry(widget); + QSize sh = menu->sizeHint(); + QRect rect = widget->rect(); + if (widget->isRightToLeft()) { + if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height()) + p = widget->mapToGlobal(rect.bottomRight()); + else + p = widget->mapToGlobal(rect.topRight() - QPoint(0, sh.height())); + p.rx() -= sh.width(); + } else { + if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height()) + p = widget->mapToGlobal(rect.bottomLeft()); + else + p = widget->mapToGlobal(rect.topLeft() - QPoint(0, sh.height())); + } + p.rx() = qMax(screen.left(), qMin(p.x(), screen.right() - sh.width())); + p.ry() += 1; + + return menu->exec(p); +} + +} // namespace Utils |
