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