Restored overwriting paintEvent.
[quick-widgets] / quickwidget.cpp
index 63c9563..2c72a3b 100644 (file)
-#include <QtDeclarative>\r
-#include <QtMaemo5>\r
-#include <QtGui/QX11Info>\r
-#include <X11/Xlib.h>\r
-#include <X11/Xatom.h>\r
-#include <X11/Xutil.h>\r
-#include "quickwidget.hpp"\r
-\r
-#define SETTING_QUICK_FILE "QuickWidgetFile"\r
-#define SETTING_QUICK_SIZE "QuickWidgetSize"\r
-#define SETTING_SAVE_WAITINTERVAL 3000\r
-\r
-static Atom onCurrentHomescreenAtom;\r
-static bool _atomsInitialized = false;\r
-\r
-QuickWidget *QuickWidget::createAndShowNew(const QString& fileName, const QSize& size)\r
-{\r
-    QuickWidget *widget = new QuickWidget;\r
-    widget->initView(fileName, size);\r
-    widget->show();\r
-    QeMaemo5DynamicWidgetHelper::globalInstance()->registerWidget(widget);\r
-    return widget;\r
-}\r
-\r
-void QuickWidget::initView(const QString& fileName, const QSize& size)\r
-{\r
-    size_ = size;\r
-    saveSetting(SETTING_QUICK_FILE, fileName);\r
-    saveSetting(SETTING_QUICK_SIZE, size_);\r
-    view_->setSource(QUrl::fromLocalFile(fileName));\r
-    if ( view_->status() == QDeclarativeView::Error) {\r
-        errorWidget();\r
-    }\r
-    else if (size_.isValid())\r
-    {\r
-        // use given fixed size and scale to it\r
-        qDebug() << "scaling";\r
-        view_->setResizeMode(QDeclarativeView::SizeRootObjectToView);\r
-    }\r
-    else\r
-    {\r
-        size_ = view_->sceneRect().size().toSize();\r
-    }\r
-    view_->setFixedSize(size_);\r
-    view_->show();\r
-}\r
-\r
-\r
-QuickWidget::QuickWidget(QWidget *parent)\r
-    : QeMaemo5DynamicHomescreenWidget(true, parent),\r
-    size_(QSize()),\r
-    view_(0)\r
-{\r
-    if (!_atomsInitialized) {\r
-       onCurrentHomescreenAtom = XInternAtom(QX11Info::display(),\r
-                                             "_HILDON_APPLET_ON_CURRENT_DESKTOP",\r
-                                             false);\r
-       _atomsInitialized = true;\r
-    }\r
-    view_ = new QDeclarativeView(this);\r
-    view_->setStyleSheet("background:transparent");\r
-    view_->setAttribute(Qt::WA_TranslucentBackground);\r
-    wrapper_ = new QuickWidgetWrapper(this);\r
-    view_->rootContext()->setContextProperty("runtime", wrapper_);\r
-\r
-}\r
-\r
-QuickWidget::~QuickWidget()\r
-{\r
-    delete wrapper_;\r
-}\r
-\r
-bool QuickWidget::x11Event(XEvent *event)\r
-{\r
-    bool passon = QeMaemo5DynamicHomescreenWidget::x11Event(event);\r
-\r
-    if (event->xclient.message_type == onCurrentHomescreenAtom)\r
-    {\r
-        bool visible = isVisibleOnCurrentHomescreen() ;\r
-        if (visible != wrapper_->onHomeScreen())\r
-        {\r
-            wrapper_->setOnHomeScreen(visible);\r
-        }\r
-    }\r
-    return passon;\r
-}\r
-\r
-bool QuickWidget::restoreWidgetState()\r
-{\r
-    QString fileName = loadSetting(SETTING_QUICK_FILE).toString();\r
-    QSize size = loadSetting(SETTING_QUICK_SIZE, QSize()).value<QSize>();\r
-    initView(fileName, size);\r
-    return true;\r
-}\r
-\r
-void QuickWidget::errorWidget()\r
-{\r
-    const QList<QDeclarativeError>& errs = view_->errors();\r
-    qDebug() << errs;\r
-    QByteArray errmsg;\r
-    QTextStream qts(&errmsg);\r
-    qts << "import Qt 4.7" << endl\r
-        << "Rectangle { width: 200; height: txt.height; color: \"#ff0000\"; radius: 8" << endl\r
-        << "Text { id: txt; anchors.centerIn: parent; text: \"";\r
-    for (int i = 0; i < errs.size(); ++i) {\r
-        qts << errs.at(i).toString().replace(QString("\""), QString("\\\"")) <<\r
-endl;\r
-    }\r
-    qts << "\"; font.pixelSize: 15; wrapMode: Text.Wrap; width: parent.width-20}" << endl\r
-        << "}" << endl;\r
-    qDebug() <<  errmsg;\r
-    QDeclarativeComponent component(view_->engine());\r
-    component.setData(errmsg, QUrl());\r
-    qDebug() << component.errorString();\r
-    QDeclarativeItem *errwdgt =\r
-      qobject_cast<QDeclarativeItem*>(component.create(view_->rootContext()));\r
-    view_->scene()->addItem(errwdgt);\r
-    size_ = QSize(errwdgt->width(), errwdgt->height());\r
-}\r
+#include <QtDeclarative>
+#include <QtMaemo5>
+
+#include <mce/dbus-names.h>
+#include <mce/mode-names.h>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusMessage>
+
+#include "quickwidget.hpp"
+
+#define SETTING_QUICK_FILE "QuickWidgetFile"
+#define SETTING_QUICK_SIZE "QuickWidgetSize"
+#define SETTING_QUICK_ROTATE "QuickWidgetRotate"
+#define SETTING_SAVE_WAITINTERVAL 3000
+
+
+QuickWidget *QuickWidget::createAndShowNew(const QString& fileName, 
+                                          const QSize& size,
+                                          bool rotate)
+{
+    QuickWidget *widget = new QuickWidget;
+    widget->initView(fileName, size, rotate);
+    widget->show();
+    QeMaemo5DynamicWidgetHelper::globalInstance()->registerWidget(widget);
+    return widget;
+}
+
+void QuickWidget::initView(const QString& fileName, const QSize& size, bool rotate)
+{
+    size_ = size;
+    saveSetting(SETTING_QUICK_FILE, fileName);
+    saveSetting(SETTING_QUICK_SIZE, size_);
+    saveSetting(SETTING_QUICK_ROTATE, rotate);
+    view_->setSource(QUrl::fromLocalFile(fileName));
+    if ( view_->status() == QDeclarativeView::Error) {
+        errorWidget();
+    }
+    else if (size_.isValid())
+    {
+        // use given fixed size and scale to it
+        qDebug() << "scaling";
+        view_->setResizeMode(QDeclarativeView::SizeRootObjectToView);
+    }
+    else
+    {
+      size_ = view_->sceneRect().size().toSize();
+    }    
+    connect(view_, SIGNAL(sceneResized(QSize)), this, SLOT(resizer(QSize)));
+    qDebug() << size_;
+    view_->resize(size_);
+    if (rotate) {
+      QDBusConnection::systemBus()                     \
+       .call(QDBusMessage::createMethodCall(MCE_SERVICE, 
+                                            MCE_REQUEST_PATH, 
+                                            MCE_REQUEST_IF, 
+                                            MCE_ACCELEROMETER_ENABLE_REQ));
+      QDBusConnection::systemBus().connect(QString(), MCE_SIGNAL_PATH, MCE_SIGNAL_IF,
+                                          MCE_DEVICE_ORIENTATION_SIG, 
+                                          this, SLOT(rotateScreen(QString)));
+    }
+}
+
+void QuickWidget::rotateScreen(const QString& orientation) {
+
+  qreal angle = 90;
+  if (orientation == QLatin1String(MCE_ORIENTATION_PORTRAIT) ||
+      orientation == QLatin1String(MCE_ORIENTATION_PORTRAIT_INVERTED)) {
+    if (!landscape_) {
+      return;
+    }
+    angle = -90;
+    landscape_ = false;
+  } else {
+    if (landscape_) {
+      return;
+    }
+    landscape_ = true;
+  }
+  size_.transpose();
+  view_->resize(size_);
+  view_->rotate(angle);
+}
+
+QuickWidget::QuickWidget(QWidget *parent)
+    : QeMaemo5DynamicHomescreenWidget(true, parent),
+      size_(QSize()),
+      view_(0),
+      wrapper_(0)
+{
+    //layout()->setSizeConstraint(QLayout::SetNoConstraint);
+    view_ = new QDeclarativeView(this);
+    view_->engine()->addImportPath(QString("/opt/qtm12/imports"));
+    view_->setStyleSheet("background:transparent");
+    view_->setAttribute(Qt::WA_TranslucentBackground);
+    wrapper_ = new QuickWidgetWrapper(this);
+    connect(this, SIGNAL(isVisibleOnCurrentHomescreenChanged(bool)), 
+           wrapper_, SLOT(setOnHomeScreen(bool)));
+    view_->rootContext()->setContextProperty("runtime", wrapper_);
+    landscape_ = true;
+}
+
+QuickWidget::~QuickWidget()
+{
+
+  QDBusConnection::systemBus().call(QDBusMessage::createMethodCall(MCE_SERVICE, 
+                                                                  MCE_REQUEST_PATH, 
+                                                                  MCE_REQUEST_IF, 
+                                                                  MCE_ACCELEROMETER_DISABLE_REQ));
+      delete wrapper_;
+}
+
+
+
+bool QuickWidget::restoreWidgetState()
+{
+    QString fileName = loadSetting(SETTING_QUICK_FILE).toString();
+    QSize size = loadSetting(SETTING_QUICK_SIZE, QSize()).value<QSize>();
+    bool rotate = loadSetting(SETTING_QUICK_ROTATE).toBool();
+    initView(fileName, size, rotate);
+    return true;
+}
+
+void QuickWidget::errorWidget()
+{
+    const QList<QDeclarativeError>& errs = view_->errors();
+    qDebug() << errs;
+    QByteArray errmsg;
+    QTextStream qts(&errmsg);
+    qts << "import Qt 4.7" << endl
+        << "Rectangle { width: 200; height: txt.height; color: \"#ff0000\"; radius: 8" << endl
+        << "Text { id: txt; anchors.centerIn: parent; text: \"";
+    for (int i = 0; i < errs.size(); ++i) {
+        qts << errs.at(i).toString().replace(QString("\""), QString("\\\"")) <<
+endl;
+    }
+    qts << "\"; font.pixelSize: 15; wrapMode: Text.Wrap; width: parent.width-20}" << endl
+        << "}" << endl;
+    qDebug() <<  errmsg;
+    QDeclarativeComponent component(view_->engine());
+    component.setData(errmsg, QUrl());
+    qDebug() << component.errorString();
+    QDeclarativeItem *errwdgt =
+      qobject_cast<QDeclarativeItem*>(component.create(view_->rootContext()));
+    view_->scene()->addItem(errwdgt);
+    size_ = QSize(errwdgt->width(), errwdgt->height());
+}
+
+//disable base class widget's paint method
+void QuickWidget::paintEvent(QPaintEvent *event)
+{
+    QWidget::paintEvent(event);
+}
+
+void QuickWidget::resizer(const QSize& size)
+{
+  if (size_.isValid())
+  {
+      resize(size);
+  }
+}