summaryrefslogtreecommitdiffstats
path: root/examples/uml
diff options
context:
space:
mode:
authorSandro S. Andrade <sandroandrade@kde.org>2013-03-04 00:50:22 -0300
committerSandro S. Andrade <sandroandrade@kde.org>2013-03-04 04:51:02 +0100
commitfb81585888ac1a493b581db7d543740cc120429a (patch)
treee809bb855be71c42d535f971423b9bac2b8e9d6f /examples/uml
parent4db215d9145a77aa06fb6fcad6bcd3a99bd48856 (diff)
Add simple code completion in UML javascript browser
Change-Id: Id3f5c0e2225942a575df00a5e3b0cdf3a10f2694 Reviewed-by: Sandro S. Andrade <sandroandrade@kde.org>
Diffstat (limited to 'examples/uml')
-rw-r--r--examples/uml/qtumleditor/mainwindow.cpp56
-rw-r--r--examples/uml/qtumleditor/mainwindow.h5
2 files changed, 60 insertions, 1 deletions
diff --git a/examples/uml/qtumleditor/mainwindow.cpp b/examples/uml/qtumleditor/mainwindow.cpp
index 95e21bba..d6091f1d 100644
--- a/examples/uml/qtumleditor/mainwindow.cpp
+++ b/examples/uml/qtumleditor/mainwindow.cpp
@@ -5,16 +5,21 @@
#include <QtCore/QPluginLoader>
#include <QtCore/QStringListModel>
#include <QtCore/QTimer>
+#include <QtCore/QStringListModel>
#include <QtScript/QScriptValueIterator>
#include <QtWidgets/QListView>
#include <QtWidgets/QFileDialog>
#include <QtWidgets/QMessageBox>
+#include <QtWidgets/QListWidget>
+
+#include <QtGui/QKeyEvent>
#include <QtWrappedObjects/QXmiWriter>
#include <QtWrappedObjects/QXmiReader>
#include <QtWrappedObjects/QWrappedObject>
+#include <QtWrappedObjects/QMetaWrappedObject>
#include <QtWrappedObjects/QMetaModelPlugin>
#include <QtWrappedObjectsWidgets/QWrappedObjectModel>
#include <QtWrappedObjectsWidgets/QWrappedObjectPropertyModel>
@@ -24,9 +29,13 @@ MainWindow::MainWindow(QWidget *parent) :
ui(new Ui::MainWindow),
_wrappedObjectModel(new QWrappedObjectModel(this)),
_aboutPluginsDialog(new QDialog(this)),
- _aboutPlugins(new Ui::AboutPlugins)
+ _aboutPlugins(new Ui::AboutPlugins),
+ _codeCompletionView(new QListView)
{
ui->setupUi(this);
+ _codeCompletionView->setParent(ui->txeJavaScript);
+ _codeCompletionView->hide();
+
_aboutPlugins->setupUi(_aboutPluginsDialog);
ui->wrappedObjectView->setModel(_wrappedObjectModel);
@@ -52,6 +61,9 @@ MainWindow::MainWindow(QWidget *parent) :
tabifyDockWidget(ui->dckXPath, ui->dckOcl);
tabifyDockWidget(ui->dckOcl, ui->dckJavaScript);
ui->dckIssues->raise();
+
+ ui->txeJavaScript->installEventFilter(this);
+ _codeCompletionView->installEventFilter(this);
}
MainWindow::~MainWindow()
@@ -144,6 +156,48 @@ void MainWindow::on_psbJSEvaluate_clicked()
ui->wrappedObjectView->updateSelected();
}
+bool MainWindow::eventFilter(QObject *obj, QEvent *event)
+{
+ if (event->type() == QEvent::KeyPress && obj == ui->txeJavaScript) {
+ QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
+ if (keyEvent->key() == 46) {
+ QWrappedObject *wrappedObject = qwrappedobject_cast<QWrappedObject *>(dynamic_cast<QWrappedObject *>(_engine.evaluate(ui->txeJavaScript->toPlainText()).toQObject()));
+ if (wrappedObject) {
+ const QMetaWrappedObject *metaWrappedObject = wrappedObject->metaWrappedObject();
+ int propertyCount = metaWrappedObject->propertyCount();
+ QStringList propertyList;
+ for (int i = 0; i < propertyCount; ++i)
+ propertyList << metaWrappedObject->property(i).metaProperty.name();
+ _codeCompletionView->setModel(new QStringListModel(propertyList));
+ QFont font;
+ QFontMetrics fm(font);
+ _codeCompletionView->setGeometry(ui->txeJavaScript->cursorRect().x(), ui->txeJavaScript->cursorRect().y()+fm.height(), 200, 100);
+ _codeCompletionView->show();
+ _codeCompletionView->setFocus();
+ }
+ }
+ return QObject::eventFilter(obj, event);
+ } else if (event->type() == QEvent::KeyPress && obj == _codeCompletionView) {
+ QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
+ if (keyEvent->key() == 16777220 || keyEvent->key() == 32) { // spacebar or enter
+ ui->txeJavaScript->insertPlainText(_codeCompletionView->model()->data(_codeCompletionView->selectionModel()->selectedIndexes().first()).toString());
+ _codeCompletionView->hide();
+ ui->txeJavaScript->setFocus();
+ return true;
+ }
+ else if (keyEvent->key() == 16777235 || keyEvent->key() == 16777237 || keyEvent->key() == 16777239 || keyEvent->key() == 16777238) { // uparrow and downarrow, pageup, pagedown
+ return QObject::eventFilter(obj, event);
+ }
+ else {
+ _codeCompletionView->hide();
+ ui->txeJavaScript->setFocus();
+ return true;
+ }
+ }
+ // standard event processing
+ return QObject::eventFilter(obj, event);
+}
+
void MainWindow::loadPlugins()
{
QMetaModelPlugin *metaModelPlugin = 0;
diff --git a/examples/uml/qtumleditor/mainwindow.h b/examples/uml/qtumleditor/mainwindow.h
index a19ddc44..897c9fe7 100644
--- a/examples/uml/qtumleditor/mainwindow.h
+++ b/examples/uml/qtumleditor/mainwindow.h
@@ -9,6 +9,7 @@
#include <QtScript/QScriptEngine>
class QDialog;
+class QListView;
namespace Ui {
class MainWindow;
@@ -34,6 +35,9 @@ private Q_SLOTS:
void on_actionAboutPlugins_triggered();
void on_psbJSEvaluate_clicked();
+protected:
+ bool eventFilter(QObject *obj, QEvent *event);
+
private:
void loadPlugins();
void saveXmi(QWrappedObject *rootElement);
@@ -48,6 +52,7 @@ private:
Ui::AboutPlugins *_aboutPlugins;
QScriptEngine _engine;
+ QListView *_codeCompletionView;
};
#endif // MAINWINDOW_H