qmenu bindings with the QtComponents api

This commit is contained in:
Marco Martin 2011-10-28 18:57:34 +02:00
parent a8aa755fe9
commit 5788424702
9 changed files with 86 additions and 30 deletions

View File

@ -4,6 +4,8 @@ set(plasmacomponents_SRCS
plasmacomponentsplugin.cpp
qrangemodel.cpp
enums.cpp
qmenu.cpp
qmenuitem.cpp
)
INCLUDE_DIRECTORIES(
@ -16,7 +18,7 @@ qt4_automoc(${plasmacomponents_SRCS})
add_library(plasmacomponentsplugin SHARED ${plasmacomponents_SRCS})
target_link_libraries(plasmacomponentsplugin ${QT_QTCORE_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY})
target_link_libraries(plasmacomponentsplugin ${QT_QTCORE_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY} ${QT_QTGUI_LIBRARY})
install(TARGETS plasmacomponentsplugin DESTINATION ${IMPORTS_INSTALL_DIR}/org/kde/plasma/components)

View File

@ -24,7 +24,8 @@
#include "qrangemodel.h"
#include "enums.h"
#include "qmenu.h"
#include "qmenuitem.h"
void PlasmaComponentsPlugin::registerTypes(const char *uri)
@ -32,6 +33,9 @@ void PlasmaComponentsPlugin::registerTypes(const char *uri)
Q_ASSERT(uri == QLatin1String("org.kde.plasma.components"));
qmlRegisterType<QMenuProxy>(uri, 0, 1, "Menu");
qmlRegisterType<QMenuProxy>(uri, 0, 1, "ContextMenu");
qmlRegisterType<QMenuItem>(uri, 0, 1, "MenuItem");
qmlRegisterType<Plasma::QRangeModel>(uri, 0, 1, "RangeModel");

View File

@ -18,7 +18,10 @@
***************************************************************************/
#include "qmenu.h"
#include <QApplication>
#include <QGraphicsObject>
#include <QGraphicsView>
QMenuProxy::QMenuProxy (QObject *parent)
: QObject (parent)
@ -31,9 +34,9 @@ QMenuProxy::~QMenuProxy()
delete m_menu;
}
QDeclarativeListProperty<QMenuAction> QMenuProxy::actions()
QDeclarativeListProperty<QMenuItem> QMenuProxy::actions()
{
return QDeclarativeListProperty<QMenuAction>(this, m_actions);
return QDeclarativeListProperty<QMenuItem>(this, m_actions);
}
int QMenuProxy::actionCount() const
@ -41,7 +44,7 @@ int QMenuProxy::actionCount() const
return m_actions.count();
}
QMenuAction *QMenuProxy::action(int index) const
QMenuItem *QMenuProxy::action(int index) const
{
return m_actions.at(index);
}
@ -49,7 +52,7 @@ QMenuAction *QMenuProxy::action(int index) const
void QMenuProxy::showMenu(int x, int y)
{
m_menu->clear();
foreach(QMenuAction* item, m_actions) {
foreach(QMenuItem* item, m_actions) {
m_menu->addAction (item);
}
@ -57,5 +60,54 @@ void QMenuProxy::showMenu(int x, int y)
m_menu->popup(screenPos);
}
void QMenuProxy::open()
{
QGraphicsObject *parentItem = qobject_cast<QGraphicsObject *>(parent());
if (!parentItem || !parentItem->scene()) {
showMenu(0, 0);
return;
}
QList<QGraphicsView*> views = parentItem->scene()->views();
if (views.size() < 1) {
showMenu(0, 0);
return;
}
QGraphicsView *view = 0;
if (views.size() == 1) {
view = views[0];
} else {
QGraphicsView *found = 0;
QGraphicsView *possibleFind = 0;
foreach (QGraphicsView *v, views) {
if (v->sceneRect().intersects(parentItem->sceneBoundingRect()) ||
v->sceneRect().contains(parentItem->scenePos())) {
if (v->isActiveWindow()) {
found = v;
} else {
possibleFind = v;
}
}
}
view = found ? found : possibleFind;
}
if (!view) {
showMenu(0, 0);
return;
}
QPoint viewPos = view->mapFromScene(parentItem->scenePos());
showMenu(viewPos.x(), viewPos.y());
}
void QMenuProxy::close()
{
m_menu->hide();
}
#include "qmenu.moc"

View File

@ -23,27 +23,29 @@
#include <QObject>
#include <QMenu>
#include <QDeclarativeListProperty>
#include "qmenuaction.h"
#include "qmenuitem.h"
class QMenuProxy : public QObject
{
Q_OBJECT
Q_PROPERTY(QDeclarativeListProperty<QMenuAction> actions READ actions)
Q_PROPERTY(QDeclarativeListProperty<QMenuItem> actions READ actions)
Q_CLASSINFO("DefaultProperty", "actions")
public:
QMenuProxy(QObject *parent = 0);
~QMenuProxy();
QDeclarativeListProperty<QMenuAction> actions();
QDeclarativeListProperty<QMenuItem> actions();
int actionCount() const;
QMenuAction *action(int) const;
QMenuItem *action(int) const;
Q_INVOKABLE void showMenu(int x, int y);
void showMenu(int x, int y);
Q_INVOKABLE void open();
Q_INVOKABLE void close();
private:
QList<QMenuAction*> m_actions;
QList<QMenuItem*> m_actions;
QMenu *m_menu;
};

View File

@ -17,11 +17,13 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#include "qmenuaction.h"
#include "qmenuitem.h"
QMenuAction::QMenuAction(QObject *parent) : QAction(parent)
QMenuItem::QMenuItem(QObject *parent)
: QAction(parent)
{
connect(this, SIGNAL(triggered(bool)), this, SIGNAL(clicked()));
}
#include "qmenuaction.moc"
#include "qmenuitem.moc"

View File

@ -17,21 +17,24 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#ifndef QMENUACTION_H
#define QMENUACTION_H
#ifndef QMENUITEM_H
#define QMENUITEM_H
#include <QAction>
#include <QObject>
class QMenuAction : public QAction
class QMenuItem : public QAction
{
Q_OBJECT
Q_PROPERTY(bool separator READ isSeparator WRITE setSeparator)
public:
QMenuAction(QObject *parent = 0);
QMenuItem(QObject *parent = 0);
Q_SIGNALS:
void clicked();
};
#endif // QMENUACTION_H
#endif // QMENUITEM_H

View File

@ -25,15 +25,11 @@ ToolButton 0.1 ToolButton.qml
ListItem 0.1 ToolButton.qml
Window 0.1 Window.qml
Menu 0.1 Menu.qml
MenuItem 0.1 MenuItem.qml
MenuLayout 0.1 MenuLayout.qml
Page 0.1 Page.qml
PageStack 0.1 PageStack.qml
SelectionDialog 0.1 SelectionDialog.qml
Dialog 0.1 Dialog.qml
QueryDialog 0.1 QueryDialog.qml
ContextMenu 0.1 ContextMenu.qml
TabBar 0.1 TabBar.qml
TabBarLayout 0.1 TabBarLayout.qml
TabButton 0.1 TabButton.qml

View File

@ -7,8 +7,6 @@ set(qtextracomponents_SRCS
qpixmapitem.cpp
qimageitem.cpp
qiconitem.cpp
qmenu.cpp
qmenuaction.cpp
)
INCLUDE_DIRECTORIES(

View File

@ -26,8 +26,7 @@
#include "qpixmapitem.h"
#include "qimageitem.h"
#include "qiconitem.h"
#include "qmenu.h"
#include "qmenuaction.h"
void QtExtraComponentsPlugin::registerTypes(const char *uri)
{
@ -36,8 +35,6 @@ void QtExtraComponentsPlugin::registerTypes(const char *uri)
qmlRegisterType<QPixmapItem>(uri, 0, 1, "QPixmapItem");
qmlRegisterType<QImageItem>(uri, 0, 1, "QImageItem");
qmlRegisterType<QIconItem>(uri, 0, 1, "QIconItem");
qmlRegisterType<QMenuProxy>(uri, 0, 1, "QMenu");
qmlRegisterType<QMenuAction>(uri, 0, 1, "QMenuAction");
}