diff options
author | Morten Sorvig <msorvig@trolltech.com> | 2009-06-26 07:58:01 +0200 |
---|---|---|
committer | Morten Sorvig <msorvig@trolltech.com> | 2009-06-26 07:58:01 +0200 |
commit | 71b1273c7cb3dea8259d2518cd2ae0f69455c4c5 (patch) | |
tree | 36281a191175e05effb2315f8ea5ee43f04fc52e /src | |
parent | 11f213b94d0c53378a7159ca2f5701b6565e61dc (diff) |
Move widget update handling to the widget event handler
Diffstat (limited to 'src')
-rw-r--r-- | src/eventqueue.cpp | 32 | ||||
-rw-r--r-- | src/eventqueue.h | 1 | ||||
-rw-r--r-- | src/webclientserver.cpp | 2 | ||||
-rw-r--r-- | src/widgeteventhandler.cpp | 74 | ||||
-rw-r--r-- | src/widgeteventhandler.h | 4 |
5 files changed, 77 insertions, 36 deletions
diff --git a/src/eventqueue.cpp b/src/eventqueue.cpp index cc8c9d6..9914277 100644 --- a/src/eventqueue.cpp +++ b/src/eventqueue.cpp @@ -15,12 +15,6 @@ bool imagesEqual(const QImage &a, const QImage &b, QRect rect) return true; } -class QLineEditAccess : public QLineEdit -{ -public: - void emitTextEdited(const QString &text) { QLineEdit::textChanged(text); QLineEdit::textEdited(text); } -}; - void encodeText(QString &text) { // encode "breakout" characters @@ -94,7 +88,7 @@ void EventQueue::handleRequest(HttpRequest *request, HttpResponse *response) jsonText.replace("%7D", "}"); jsonText.replace("%22", "\""); - qDebug() << "json request" << jsonText; + DEBUG << "json request" << jsonText; json_object* request = json_tokener_parse(jsonText.data()); json_object* type = json_object_object_get(request, "type"); @@ -114,29 +108,7 @@ void EventQueue::handleRequest(HttpRequest *request, HttpResponse *response) response->setBody(block); response->setContentType("image/png"); - } else if (typeText == "textupdate") { - json_object* idObject = json_object_object_get(request, "id"); - const int id = json_object_get_int(idObject); - json_object* tmp = json_object_object_get(request, "text"); - QByteArray text = json_object_get_string(tmp); - QLineEdit *lineEdit = ((QLineEdit *)(id)); - - disableUpdates.insert(lineEdit); - lineEdit->setText(text); - ((QLineEditAccess *)(id))->emitTextEdited(text); - disableUpdates.remove(lineEdit); - } else if (typeText == "positionupdate") { - const int id = json_object_get_int(json_object_object_get(request, "id")); - const int x = json_object_get_int(json_object_object_get(request, "x")); - const int y = json_object_get_int(json_object_object_get(request, "y")); - - QWidget *widget = ((QWidget *)(id)); - disableUpdates.insert(widget); - widget->move(x, y); - disableUpdates.remove(widget); -// qDebug() << "position update" << id << x << y; - } - + } json_object_put(request); //free } } diff --git a/src/eventqueue.h b/src/eventqueue.h index d31330b..d54dadf 100644 --- a/src/eventqueue.h +++ b/src/eventqueue.h @@ -53,7 +53,6 @@ public: QQueue<EventEntry> events; QHash<int, QImage> images; QHash<int, QRect> geometries; - QSet<QObject*> disableUpdates; }; #endif diff --git a/src/webclientserver.cpp b/src/webclientserver.cpp index fb01617..3cbd05b 100644 --- a/src/webclientserver.cpp +++ b/src/webclientserver.cpp @@ -277,12 +277,10 @@ FileServer::FileServer() << ":sessionhandler.js" << ":eventhandler.js"; } - void FileServer::handleRequest(HttpRequest *request, HttpResponse *response) { if (response->body != QByteArray()) return; - qDebug() << "foo"; const QByteArray path = request->path(); QByteArray filePath = path.right(path.size() - 1); // remove leading '/' diff --git a/src/widgeteventhandler.cpp b/src/widgeteventhandler.cpp index c170569..d0f4bff 100644 --- a/src/widgeteventhandler.cpp +++ b/src/widgeteventhandler.cpp @@ -4,6 +4,12 @@ bool takeEvents = true; +class QLineEditAccess : public QLineEdit +{ +public: + void emitTextEdited(const QString &text) { QLineEdit::textChanged(text); QLineEdit::textEdited(text); } +}; + QWidget * findEventTarget(QWidget *root, QPoint pos) { QWidget *current = root; @@ -106,7 +112,7 @@ bool WidgetEventHandler::eventFilter(QObject *object, QEvent *event) QRect geometry = globalGeometry(widget); // if (object->metaObject()->className() == "QPushbutton") // DEBUG << "move geometry" << object->metaObject()->className() << geometry; - if (events.disableUpdates.contains(sender()) == false) + if (disableUpdates.contains(sender()) == false) events.addGeometryEvent((int)widget, geometry); } @@ -141,14 +147,20 @@ void WidgetEventHandler::updatePendingWidgets() void WidgetEventHandler::handleRequest(HttpRequest *request, HttpResponse *response) { const QByteArray path = request->path(); + bool handled = false; DEBUG << "request" << path; if (path.startsWith("/mousepress") || path.startsWith("/mouserelease") || path.startsWith("/mousedoubleclick")) { // DEBUG << "handle mouse press"; handleMousePress(path); + handled = true; } else if (path.startsWith("/keypress") || path.startsWith("/keyrelease")) { // DEBUG << "handle key press"; handleKeyPress(path); - } else { + handled = true; + } else if (path.startsWith("/json")) { + handled = handleJsonMessage(path); + } + if (!handled) { if (path.startsWith("/content")) { events.reset(); // refresh everything recursivelyAddUpdate(rootWidget); @@ -157,6 +169,36 @@ void WidgetEventHandler::handleRequest(HttpRequest *request, HttpResponse *respo } } +bool WidgetEventHandler::handleJsonMessage(const QByteArray &message) +{ + QByteArray jsonText = message.mid(5); // remove "/json" + + // replace symbols that can't be a part of the url text. + jsonText.replace("%7B", "{"); + jsonText.replace("%7D", "}"); + jsonText.replace("%22", "\""); + + DEBUG << "json request" << jsonText; + json_object* request = json_tokener_parse(jsonText.data()); + json_object* type = json_object_object_get(request, "type"); + + QByteArray typeText = json_object_get_string(type); + DEBUG << typeText; + + if (typeText == "textupdate") { + handleTextUpdate(request); + json_object_put(request); //free + return true; + } else if (typeText == "positionupdate") { + handlePositionUpdate(request); + json_object_put(request); //free + return true; + } + json_object_put(request); //free + return false; +} + + void WidgetEventHandler::handleMousePress(const QByteArray &message) { QList<QByteArray> tokens = message.split('-'); @@ -206,6 +248,32 @@ void WidgetEventHandler::handleKeyPress(const QByteArray &message) qApp->processEvents(); } +void WidgetEventHandler::handleTextUpdate(json_object* request) +{ + json_object* idObject = json_object_object_get(request, "id"); + const int id = json_object_get_int(idObject); + json_object* tmp = json_object_object_get(request, "text"); + QByteArray text = json_object_get_string(tmp); + QLineEdit *lineEdit = ((QLineEdit *)(id)); + + disableUpdates.insert(lineEdit); + lineEdit->setText(text); + ((QLineEditAccess *)(id))->emitTextEdited(text); + disableUpdates.remove(lineEdit); +} + +void WidgetEventHandler::handlePositionUpdate(json_object *request) +{ + const int id = json_object_get_int(json_object_object_get(request, "id")); + const int x = json_object_get_int(json_object_object_get(request, "x")); + const int y = json_object_get_int(json_object_object_get(request, "y")); + + QWidget *widget = ((QWidget *)(id)); + disableUpdates.insert(widget); + widget->move(x, y); + disableUpdates.remove(widget); + // qDebug() << "position update" << id << x << y; +} void WidgetEventHandler::widgetPaint(QWidget *widget, const QRect &updateRect) { @@ -294,6 +362,6 @@ void WidgetEventHandler::addShowEvent(QWidget *widget) void WidgetEventHandler::lineEditTextChange() { - if (events.disableUpdates.contains(sender()) == false) + if (disableUpdates.contains(sender()) == false) events.addEvent((int)sender(), EventEntry::TextUpdate); } diff --git a/src/widgeteventhandler.h b/src/widgeteventhandler.h index 8dab3d2..403ca0f 100644 --- a/src/widgeteventhandler.h +++ b/src/widgeteventhandler.h @@ -21,8 +21,11 @@ protected slots: void lineEditTextChange(); protected: + bool handleJsonMessage(const QByteArray &message); void handleMousePress(const QByteArray &message); void handleKeyPress(const QByteArray &message); + void handleTextUpdate(json_object* object); + void handlePositionUpdate(json_object *object); void addPendingUpdate(QWidget* widget, const QRect &rect); bool eventFilter(QObject *object, QEvent *event); void widgetPaint(QWidget *widget, const QRect &updateRect); @@ -37,6 +40,7 @@ public: //private: bool grabbing; QWidget *rootWidget; QWidget *focusWidget; // hack hack + QSet<QObject*> disableUpdates; }; #endif |