From abdf3b1eaba8151f1b8e862750c38cb7a5411d2a Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Mon, 13 Aug 2012 21:31:52 +0200 Subject: make watchsimulator work again --- libsowatch/declarativewatchlet.cpp | 23 ++++++++++++- libsowatch/graphicswatchlet.cpp | 56 +++++++++++++++++++++++------- libsowatch/graphicswatchlet.h | 7 ++-- libsowatch/libsowatch.pro | 8 ++--- libsowatch/notificationsmodel.cpp | 70 ++++++++++++++++++++++++++++++++++++++ libsowatch/notificationsmodel.h | 37 ++++++++++++++++++++ libsowatch/sowatch.h | 1 - libsowatch/watchlet.cpp | 10 ++++++ libsowatch/watchlet.h | 3 ++ libsowatch/watchpaintengine.cpp | 46 ++++++++++++++++++++----- libsowatch/watchserver.cpp | 5 +++ libsowatch/watchserver.h | 1 + libsowatch/watchsimulator.cpp | 11 ------ libsowatch/watchsimulator.h | 19 ----------- 14 files changed, 238 insertions(+), 59 deletions(-) create mode 100644 libsowatch/notificationsmodel.cpp create mode 100644 libsowatch/notificationsmodel.h delete mode 100644 libsowatch/watchsimulator.cpp delete mode 100644 libsowatch/watchsimulator.h (limited to 'libsowatch') diff --git a/libsowatch/declarativewatchlet.cpp b/libsowatch/declarativewatchlet.cpp index 68d6c28..510a68f 100644 --- a/libsowatch/declarativewatchlet.cpp +++ b/libsowatch/declarativewatchlet.cpp @@ -1,6 +1,7 @@ #include #include #include "watchserver.h" +#include "watch.h" #include "gconfkey.h" #include "declarativewatchwrapper.h" #include "declarativewatchlet.h" @@ -17,6 +18,8 @@ DeclarativeWatchlet::DeclarativeWatchlet(WatchServer* server, const QString& id) _wrapper(0) { setScene(new QGraphicsScene(this)); + scene()->setItemIndexMethod(QGraphicsScene::NoIndex); + scene()->setStickyFocus(true); if (!_registered) { qmlRegisterUncreatableType("com.javispedro.sowatch", 1, 0, @@ -27,7 +30,13 @@ DeclarativeWatchlet::DeclarativeWatchlet(WatchServer* server, const QString& id) } _engine = new QDeclarativeEngine(this); +#if !defined(QT_NO_DEBUG) + QString qmlDir = QDir::current().absoluteFilePath(SOWATCH_QML_DIR); + qDebug() << "Using debug QML import path: " << qmlDir; _engine->addImportPath(SOWATCH_QML_DIR); +#else + _engine->addImportPath(SOWATCH_QML_DIR); +#endif _wrapper = new DeclarativeWatchWrapper(server, server->watch(), this); _engine->rootContext()->setContextProperty("watch", _wrapper); @@ -80,6 +89,19 @@ QDeclarativeItem* DeclarativeWatchlet::rootObject() void DeclarativeWatchlet::activate() { + // Now we certainly know the watch's area, so it is a good moment to + // resize the root object if needed. + if (_item) { + Watch *watch = this->watch(); + if (!qFuzzyCompare(watch->width(), _item->width())) { + qDebug() << "Resizing root object to width" << watch->width(); + _item->setWidth(watch->width()); + } + if (!qFuzzyCompare(watch->height(), _item->height())) { + qDebug() << "Resizing root object to height" << watch->width(); + _item->setHeight(watch->height()); + } + } GraphicsWatchlet::activate(); _wrapper->activate(); } @@ -99,7 +121,6 @@ void DeclarativeWatchlet::setRootObject(QDeclarativeItem *item) } _item = item; - // TODO Resize _item scene()->addItem(_item); } diff --git a/libsowatch/graphicswatchlet.cpp b/libsowatch/graphicswatchlet.cpp index e11d5cc..2d58ff6 100644 --- a/libsowatch/graphicswatchlet.cpp +++ b/libsowatch/graphicswatchlet.cpp @@ -16,7 +16,6 @@ GraphicsWatchlet::GraphicsWatchlet(WatchServer* server, const QString& id) : GraphicsWatchlet::~GraphicsWatchlet() { - } QGraphicsScene* GraphicsWatchlet::scene() @@ -36,27 +35,55 @@ void GraphicsWatchlet::setScene(QGraphicsScene *scene) } } -void GraphicsWatchlet::sceneChanged(const QList ®ion) +QRectF GraphicsWatchlet::sceneRect() const { - foreach(const QRectF& r, region) { - _damaged += r.toRect(); + if (_scene) { + return _scene->sceneRect(); + } else { + return QRectF(); } - if (!_damaged.isEmpty()) { - _frameTimer.start(frameDelay); +} + +QRect GraphicsWatchlet::viewportRect() const +{ + if (_active) { + const Watch *watch = this->watch(); + return QRect(0, 0, watch->width(), watch->height()); + } else { + return QRect(); + } +} + +void GraphicsWatchlet::sceneChanged(const QList &rects) +{ + if (_active) { + // Only consider scene updates if the watchlet is active + QRect viewport = viewportRect(); + foreach(const QRectF& frect, rects) { + QRect rect = frect.toAlignedRect() & viewport; + _damaged += rect; + } + + // Start frame timer if we got new data + if (!_damaged.isEmpty() && !_frameTimer.isActive()) { + _frameTimer.start(frameDelay); + } } } void GraphicsWatchlet::frameTimeout() { - if (!_active) return; // Watchlet was ejected, do not draw. + // Do not draw if watchlet is not active + if (!_active) return; + if (watch()->busy()) { + // Watch is busy, delay this frame. _frameTimer.start(busyFrameDelay); return; } const QVector rects = _damaged.rects(); QPainter p(watch()); - foreach(const QRect& r, rects) { _scene->render(&p, r, r, Qt::IgnoreAspectRatio); } @@ -66,14 +93,19 @@ void GraphicsWatchlet::frameTimeout() void GraphicsWatchlet::activate() { Watchlet::activate(); - // We have to assume that the watch has completely forgot about everything. - QRect area(0, 0, watch()->width(), watch()->height()); - _damaged += area; - _scene->update(area); + // We have to assume that the watch has completely forgot about everything + // So assume the entire viewport is damaged + QRect viewport = viewportRect(); + _damaged += viewport; + // This will emit sceneChanged and start the frame timer. + _scene->update(viewport); } void GraphicsWatchlet::deactivate() { + // Stop updates _frameTimer.stop(); + _damaged = QRegion(); + Watchlet::deactivate(); } diff --git a/libsowatch/graphicswatchlet.h b/libsowatch/graphicswatchlet.h index 6456a18..34f69cb 100644 --- a/libsowatch/graphicswatchlet.h +++ b/libsowatch/graphicswatchlet.h @@ -20,13 +20,16 @@ public: QGraphicsScene* scene(); void setScene(QGraphicsScene* scene); - static const int frameDelay = 25; - static const int busyFrameDelay = 50; + QRectF sceneRect() const; + QRect viewportRect() const; protected: void activate(); void deactivate(); + static const int frameDelay = 25; + static const int busyFrameDelay = 50; + QGraphicsScene* _scene; QTimer _frameTimer; diff --git a/libsowatch/libsowatch.pro b/libsowatch/libsowatch.pro index 1057a87..59f2eee 100644 --- a/libsowatch/libsowatch.pro +++ b/libsowatch/libsowatch.pro @@ -16,7 +16,6 @@ VERSION = 1.0.0 DEFINES += SOWATCH_LIBRARY SOURCES += \ - watchsimulator.cpp \ watchserver.cpp \ watchpaintengine.cpp \ watchlet.cpp \ @@ -34,10 +33,10 @@ SOURCES += \ watchscanner.cpp \ allwatchscanner.cpp \ configkey.cpp \ - gconfkey.cpp + gconfkey.cpp \ + notificationsmodel.cpp HEADERS += \ - watchsimulator.h \ watchserver.h \ watchpaintengine.h \ watchlet.h \ @@ -57,7 +56,8 @@ HEADERS += \ watchscanner.h \ allwatchscanner.h \ configkey.h \ - gconfkey.h + gconfkey.h \ + notificationsmodel.h install_headers.files = $$HEADERS diff --git a/libsowatch/notificationsmodel.cpp b/libsowatch/notificationsmodel.cpp new file mode 100644 index 0000000..2eba9a0 --- /dev/null +++ b/libsowatch/notificationsmodel.cpp @@ -0,0 +1,70 @@ +#include "notificationsmodel.h" + +using namespace sowatch; + +#define FOREACH_TYPE_FROM_TO(x, from, to) \ + for(Notification::Type x = from; x < to; x = static_cast(x + 1)) + +#define FOREACH_TYPE_UNTIL(x, to) FOREACH_TYPE_FROM_TO(x, Notification::OtherNotification, to) + +#define FOREACH_TYPE(x) FOREACH_TYPE_FROM_TO(x, Notification::OtherNotification, Notification::TypeCount) + +NotificationsModel::NotificationsModel(QObject *parent) : + QAbstractListModel(parent) +{ +} + +int NotificationsModel::rowCount(const QModelIndex &parent) const +{ + int count = 0; + Q_UNUSED(parent); + FOREACH_TYPE(type) { + count += _list[type].count(); + } + return count; +} + +QVariant NotificationsModel::data(const QModelIndex &index, int role) const +{ +} + +void NotificationsModel::add(Notification *n) +{ +} + +void NotificationsModel::remove(Notification *n) +{ + +} + +int NotificationsModel::fullCount() const +{ + int count = 0; + FOREACH_TYPE(type) { + count += fullCountByType(type); + } + return count; +} + +int NotificationsModel::fullCountByType(Notification::Type type) const +{ + int count = 0; + Q_FOREACH(const Notification *n, _list[type]) { + count += n->count(); + } + return count; +} + +bool NotificationsModel::removeDeletedNotification(Notification *n) +{ + // Can't call any methods of 'n' +} + +int NotificationsModel::getOffsetForType(Notification::Type type) +{ + int count = 0; + FOREACH_TYPE_UNTIL(t, type) { + count += _list[type].count(); + } + return count; +} diff --git a/libsowatch/notificationsmodel.h b/libsowatch/notificationsmodel.h new file mode 100644 index 0000000..5e7e029 --- /dev/null +++ b/libsowatch/notificationsmodel.h @@ -0,0 +1,37 @@ +#ifndef SOWATCH_NOTIFICATIONSMODEL_H +#define SOWATCH_NOTIFICATIONSMODEL_H + +#include + +#include "notification.h" + +namespace sowatch +{ + +class NotificationsModel : public QAbstractListModel +{ + Q_OBJECT +public: + explicit NotificationsModel(QObject *parent = 0); + + int rowCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + + void add(Notification *n); + void remove(Notification *n); + + int fullCount() const; + int fullCountByType(Notification::Type type) const; + + bool removeDeletedNotification(Notification *n); + +private: + int getOffsetForType(Notification::Type type); + +private: + QList _list[Notification::TypeCount]; +}; + +} + +#endif // SOWATCH_NOTIFICATIONSMODEL_H diff --git a/libsowatch/sowatch.h b/libsowatch/sowatch.h index 921e69c..e0ace02 100644 --- a/libsowatch/sowatch.h +++ b/libsowatch/sowatch.h @@ -8,7 +8,6 @@ #include "watch.h" #include "watchserver.h" -#include "watchsimulator.h" #include "watchscanner.h" #include "watchplugininterface.h" diff --git a/libsowatch/watchlet.cpp b/libsowatch/watchlet.cpp index 9b3567e..555443f 100644 --- a/libsowatch/watchlet.cpp +++ b/libsowatch/watchlet.cpp @@ -24,6 +24,16 @@ Watch* Watchlet::watch() return _server->watch(); } +const WatchServer* Watchlet::server() const +{ + return _server; +} + +const Watch* Watchlet::watch() const +{ + return _server->watch(); +} + QString Watchlet::id() const { return _id; diff --git a/libsowatch/watchlet.h b/libsowatch/watchlet.h index dad1ddc..f442086 100644 --- a/libsowatch/watchlet.h +++ b/libsowatch/watchlet.h @@ -23,6 +23,9 @@ public: WatchServer* server(); Watch* watch(); + const WatchServer* server() const; + const Watch* watch() const; + Q_INVOKABLE QString id() const; bool isActive() const; diff --git a/libsowatch/watchpaintengine.cpp b/libsowatch/watchpaintengine.cpp index 90ad8bf..78e6dfd 100644 --- a/libsowatch/watchpaintengine.cpp +++ b/libsowatch/watchpaintengine.cpp @@ -5,6 +5,9 @@ using namespace sowatch; +#define TRACE(x) +//#define TRACE(x) x + WatchPaintEngine::WatchPaintEngine() : QPaintEngine(QPaintEngine::AllFeatures), _painter() @@ -26,6 +29,7 @@ bool WatchPaintEngine::begin(QPaintDevice *pdev) _hasBrush = false; _clipEnabled = false; _clipRegion = _area; + _transform = QTransform(); return _painter.begin(pdev); } @@ -75,46 +79,51 @@ void WatchPaintEngine::damagePenStroke(const QLineF &line) void WatchPaintEngine::updateClipRegion(const QRegion& region, Qt::ClipOperation op) { - switch(op) { + QRegion mapped = _transform.map(region); + switch (op) { case Qt::NoClip: _clipEnabled = false; _clipRegion = _area; break; case Qt::ReplaceClip: _clipEnabled = true; - _clipRegion = region; + _clipRegion = mapped; break; case Qt::IntersectClip: _clipEnabled = true; - _clipRegion &= region; + _clipRegion &= mapped; break; case Qt::UniteClip: _clipEnabled = true; - _clipRegion |= region; + _clipRegion |= mapped; break; } } void WatchPaintEngine::drawEllipse(const QRectF &r) { + TRACE(qDebug() << __func__ << r); damageRect(r); _painter.drawEllipse(r); } void WatchPaintEngine::drawEllipse(const QRect &r) { + TRACE(qDebug() << __func__ << r); damageRect(r); _painter.drawEllipse(r); } void WatchPaintEngine::drawImage(const QRectF &r, const QImage &pm, const QRectF &sr, Qt::ImageConversionFlags flags) { + TRACE(qDebug() << __func__ << r); damageRect(r); _painter.drawImage(r, pm, sr, flags); } void WatchPaintEngine::drawLines(const QLineF *lines, int lineCount) { + TRACE(qDebug() << __func__ << lines << lineCount); int i; for (i = 0; i < lineCount; i++) { const QLineF& line = lines[i]; @@ -125,6 +134,7 @@ void WatchPaintEngine::drawLines(const QLineF *lines, int lineCount) void WatchPaintEngine::drawLines(const QLine *lines, int lineCount) { + TRACE(qDebug() << __func__ << lines << lineCount); int i; for (i = 0; i < lineCount; i++) { const QLine& line = lines[i]; @@ -135,6 +145,7 @@ void WatchPaintEngine::drawLines(const QLine *lines, int lineCount) void WatchPaintEngine::drawPath(const QPainterPath &path) { + TRACE(qDebug() << __func__ << path); damageRect(path.boundingRect()); _painter.drawPath(path); } @@ -193,6 +204,7 @@ void WatchPaintEngine::drawPolygon(const QPoint *points, int pointCount, Polygon void WatchPaintEngine::drawRects(const QRectF *rects, int rectCount) { + TRACE(qDebug() << __func__ << rects << rectCount); int i; for (i = 0; i < rectCount; i++) { const QRectF& r = rects[i]; @@ -211,6 +223,7 @@ void WatchPaintEngine::drawRects(const QRectF *rects, int rectCount) void WatchPaintEngine::drawRects(const QRect *rects, int rectCount) { + TRACE(qDebug() << __func__ << rects << rectCount); int i; for (i = 0; i < rectCount; i++) { const QRect& r = rects[i]; @@ -230,6 +243,7 @@ void WatchPaintEngine::drawRects(const QRect *rects, int rectCount) void WatchPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) { + TRACE(qDebug() << __func__ << p << textItem.text()); const qreal ascent = textItem.ascent(); const qreal descent = textItem.descent(); const qreal w = textItem.width(); @@ -239,6 +253,7 @@ void WatchPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) void WatchPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s) { + TRACE(qDebug() << __func__ << r << pixmap << s); damageRect(r); _painter.drawTiledPixmap(r, pixmap, s); } @@ -251,14 +266,26 @@ QPaintEngine::Type WatchPaintEngine::type() const void WatchPaintEngine::updateState(const QPaintEngineState &state) { const QPaintEngine::DirtyFlags flags = state.state(); + + TRACE(qDebug() << __func__ << flags); + + if (flags & QPaintEngine::DirtyTransform) + { + TRACE(qDebug() << " " << "DirtyTransform" << state.transform()); + _transform = state.transform(); + _painter.setTransform(_transform); + } + if (flags & QPaintEngine::DirtyBackground) { _painter.setBackground(state.backgroundBrush()); } + if (flags & QPaintEngine::DirtyBackgroundMode) { _painter.setBackgroundMode(state.backgroundMode()); } + if (flags & QPaintEngine::DirtyBrush) { QBrush brush = state.brush(); @@ -271,22 +298,26 @@ void WatchPaintEngine::updateState(const QPaintEngineState &state) } if (flags & QPaintEngine::DirtyClipEnabled) { + TRACE(qDebug() << " " << "DirtyClipEnabled" << state.isClipEnabled()); _clipEnabled = state.isClipEnabled(); _painter.setClipping(_clipEnabled); } if (flags & QPaintEngine::DirtyClipPath) { + TRACE(qDebug() << " " << "DirtyClipPath" << state.clipPath().boundingRect()); QRegion region = state.clipPath().boundingRect().toAlignedRect(); updateClipRegion(region, state.clipOperation()); _painter.setClipPath(state.clipPath(), state.clipOperation()); } if (flags & QPaintEngine::DirtyClipRegion) { + TRACE(qDebug() << " " << "DirtyClipRegion" << state.clipRegion()); updateClipRegion(state.clipRegion(), state.clipOperation()); _painter.setClipRegion(state.clipRegion(), state.clipOperation()); } if (flags & QPaintEngine::DirtyCompositionMode) { + TRACE(qDebug() << " " << "DirtyCompositionMode" << state.compositionMode()); _painter.setCompositionMode(state.compositionMode()); } if (flags & QPaintEngine::DirtyFont) @@ -304,9 +335,6 @@ void WatchPaintEngine::updateState(const QPaintEngineState &state) _penWidth = pen.widthF(); _painter.setPen(pen); } - if (flags & QPaintEngine::DirtyTransform) - { - _transform = state.transform(); - _painter.setTransform(_transform); - } + + TRACE(qDebug() << __func__ << "end"); } diff --git a/libsowatch/watchserver.cpp b/libsowatch/watchserver.cpp index 35d2429..a6b5886 100644 --- a/libsowatch/watchserver.cpp +++ b/libsowatch/watchserver.cpp @@ -29,6 +29,11 @@ Watch* WatchServer::watch() return _watch; } +const Watch* WatchServer::watch() const +{ + return _watch; +} + QString WatchServer::nextWatchletButton() const { if (_nextWatchletButton >= 0) { diff --git a/libsowatch/watchserver.h b/libsowatch/watchserver.h index edb4e1a..af2a8de 100644 --- a/libsowatch/watchserver.h +++ b/libsowatch/watchserver.h @@ -28,6 +28,7 @@ public: explicit WatchServer(Watch *watch, QObject *parent = 0); Watch* watch(); + const Watch* watch() const; QString nextWatchletButton() const; void setNextWatchletButton(const QString& value); diff --git a/libsowatch/watchsimulator.cpp b/libsowatch/watchsimulator.cpp deleted file mode 100644 index 47496f2..0000000 --- a/libsowatch/watchsimulator.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#include "watchsimulator.h" - -using namespace sowatch; - -WatchSimulator::WatchSimulator(QObject* parent) : - Watch(parent) -{ - -} diff --git a/libsowatch/watchsimulator.h b/libsowatch/watchsimulator.h deleted file mode 100644 index 8189dfe..0000000 --- a/libsowatch/watchsimulator.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef SOWATCH_WATCHSIMULATOR_H -#define SOWATCH_WATCHSIMULATOR_H - -#include "watch.h" -#include "sowatch_global.h" - -namespace sowatch -{ - -class SOWATCH_EXPORT WatchSimulator : public Watch -{ - Q_OBJECT -public: - explicit WatchSimulator(QObject *parent = 0); -}; - -} - -#endif // SOWATCH_WATCHSIMULATOR_H -- cgit v1.2.3