diff options
author | Sandro S. Andrade <sandroandrade@kde.org> | 2013-03-04 00:50:22 -0300 |
---|---|---|
committer | Sandro S. Andrade <sandroandrade@kde.org> | 2013-03-04 04:51:02 +0100 |
commit | fb81585888ac1a493b581db7d543740cc120429a (patch) | |
tree | e809bb855be71c42d535f971423b9bac2b8e9d6f /examples/uml | |
parent | 4db215d9145a77aa06fb6fcad6bcd3a99bd48856 (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.cpp | 56 | ||||
-rw-r--r-- | examples/uml/qtumleditor/mainwindow.h | 5 |
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 |