63c95633d289f763ad689d89163d3815c53a00ee
[quick-widgets] / quickwidget.cpp
1 #include <QtDeclarative>\r
2 #include <QtMaemo5>\r
3 #include <QtGui/QX11Info>\r
4 #include <X11/Xlib.h>\r
5 #include <X11/Xatom.h>\r
6 #include <X11/Xutil.h>\r
7 #include "quickwidget.hpp"\r
8 \r
9 #define SETTING_QUICK_FILE "QuickWidgetFile"\r
10 #define SETTING_QUICK_SIZE "QuickWidgetSize"\r
11 #define SETTING_SAVE_WAITINTERVAL 3000\r
12 \r
13 static Atom onCurrentHomescreenAtom;\r
14 static bool _atomsInitialized = false;\r
15 \r
16 QuickWidget *QuickWidget::createAndShowNew(const QString& fileName, const QSize& size)\r
17 {\r
18     QuickWidget *widget = new QuickWidget;\r
19     widget->initView(fileName, size);\r
20     widget->show();\r
21     QeMaemo5DynamicWidgetHelper::globalInstance()->registerWidget(widget);\r
22     return widget;\r
23 }\r
24 \r
25 void QuickWidget::initView(const QString& fileName, const QSize& size)\r
26 {\r
27     size_ = size;\r
28     saveSetting(SETTING_QUICK_FILE, fileName);\r
29     saveSetting(SETTING_QUICK_SIZE, size_);\r
30     view_->setSource(QUrl::fromLocalFile(fileName));\r
31     if ( view_->status() == QDeclarativeView::Error) {\r
32         errorWidget();\r
33     }\r
34     else if (size_.isValid())\r
35     {\r
36         // use given fixed size and scale to it\r
37         qDebug() << "scaling";\r
38         view_->setResizeMode(QDeclarativeView::SizeRootObjectToView);\r
39     }\r
40     else\r
41     {\r
42         size_ = view_->sceneRect().size().toSize();\r
43     }\r
44     view_->setFixedSize(size_);\r
45     view_->show();\r
46 }\r
47 \r
48 \r
49 QuickWidget::QuickWidget(QWidget *parent)\r
50     : QeMaemo5DynamicHomescreenWidget(true, parent),\r
51     size_(QSize()),\r
52     view_(0)\r
53 {\r
54     if (!_atomsInitialized) {\r
55        onCurrentHomescreenAtom = XInternAtom(QX11Info::display(),\r
56                                              "_HILDON_APPLET_ON_CURRENT_DESKTOP",\r
57                                              false);\r
58        _atomsInitialized = true;\r
59     }\r
60     view_ = new QDeclarativeView(this);\r
61     view_->setStyleSheet("background:transparent");\r
62     view_->setAttribute(Qt::WA_TranslucentBackground);\r
63     wrapper_ = new QuickWidgetWrapper(this);\r
64     view_->rootContext()->setContextProperty("runtime", wrapper_);\r
65 \r
66 }\r
67 \r
68 QuickWidget::~QuickWidget()\r
69 {\r
70     delete wrapper_;\r
71 }\r
72 \r
73 bool QuickWidget::x11Event(XEvent *event)\r
74 {\r
75     bool passon = QeMaemo5DynamicHomescreenWidget::x11Event(event);\r
76 \r
77     if (event->xclient.message_type == onCurrentHomescreenAtom)\r
78     {\r
79         bool visible = isVisibleOnCurrentHomescreen() ;\r
80         if (visible != wrapper_->onHomeScreen())\r
81         {\r
82             wrapper_->setOnHomeScreen(visible);\r
83         }\r
84     }\r
85     return passon;\r
86 }\r
87 \r
88 bool QuickWidget::restoreWidgetState()\r
89 {\r
90     QString fileName = loadSetting(SETTING_QUICK_FILE).toString();\r
91     QSize size = loadSetting(SETTING_QUICK_SIZE, QSize()).value<QSize>();\r
92     initView(fileName, size);\r
93     return true;\r
94 }\r
95 \r
96 void QuickWidget::errorWidget()\r
97 {\r
98     const QList<QDeclarativeError>& errs = view_->errors();\r
99     qDebug() << errs;\r
100     QByteArray errmsg;\r
101     QTextStream qts(&errmsg);\r
102     qts << "import Qt 4.7" << endl\r
103         << "Rectangle { width: 200; height: txt.height; color: \"#ff0000\"; radius: 8" << endl\r
104         << "Text { id: txt; anchors.centerIn: parent; text: \"";\r
105     for (int i = 0; i < errs.size(); ++i) {\r
106         qts << errs.at(i).toString().replace(QString("\""), QString("\\\"")) <<\r
107 endl;\r
108     }\r
109     qts << "\"; font.pixelSize: 15; wrapMode: Text.Wrap; width: parent.width-20}" << endl\r
110         << "}" << endl;\r
111     qDebug() <<  errmsg;\r
112     QDeclarativeComponent component(view_->engine());\r
113     component.setData(errmsg, QUrl());\r
114     qDebug() << component.errorString();\r
115     QDeclarativeItem *errwdgt =\r
116       qobject_cast<QDeclarativeItem*>(component.create(view_->rootContext()));\r
117     view_->scene()->addItem(errwdgt);\r
118     size_ = QSize(errwdgt->width(), errwdgt->height());\r
119 }\r