Restored overwriting paintEvent.
[quick-widgets] / quickwidget.cpp
1 #include <QtDeclarative>
2 #include <QtMaemo5>
3
4 #include <mce/dbus-names.h>
5 #include <mce/mode-names.h>
6 #include <QtDBus/QDBusConnection>
7 #include <QtDBus/QDBusMessage>
8
9 #include "quickwidget.hpp"
10
11 #define SETTING_QUICK_FILE "QuickWidgetFile"
12 #define SETTING_QUICK_SIZE "QuickWidgetSize"
13 #define SETTING_QUICK_ROTATE "QuickWidgetRotate"
14 #define SETTING_SAVE_WAITINTERVAL 3000
15
16
17 QuickWidget *QuickWidget::createAndShowNew(const QString& fileName, 
18                                            const QSize& size,
19                                            bool rotate)
20 {
21     QuickWidget *widget = new QuickWidget;
22     widget->initView(fileName, size, rotate);
23     widget->show();
24     QeMaemo5DynamicWidgetHelper::globalInstance()->registerWidget(widget);
25     return widget;
26 }
27
28 void QuickWidget::initView(const QString& fileName, const QSize& size, bool rotate)
29 {
30     size_ = size;
31     saveSetting(SETTING_QUICK_FILE, fileName);
32     saveSetting(SETTING_QUICK_SIZE, size_);
33     saveSetting(SETTING_QUICK_ROTATE, rotate);
34     view_->setSource(QUrl::fromLocalFile(fileName));
35     if ( view_->status() == QDeclarativeView::Error) {
36         errorWidget();
37     }
38     else if (size_.isValid())
39     {
40         // use given fixed size and scale to it
41         qDebug() << "scaling";
42         view_->setResizeMode(QDeclarativeView::SizeRootObjectToView);
43     }
44     else
45     {
46       size_ = view_->sceneRect().size().toSize();
47     }    
48     connect(view_, SIGNAL(sceneResized(QSize)), this, SLOT(resizer(QSize)));
49     qDebug() << size_;
50     view_->resize(size_);
51     if (rotate) {
52       QDBusConnection::systemBus()                      \
53         .call(QDBusMessage::createMethodCall(MCE_SERVICE, 
54                                              MCE_REQUEST_PATH, 
55                                              MCE_REQUEST_IF, 
56                                              MCE_ACCELEROMETER_ENABLE_REQ));
57       QDBusConnection::systemBus().connect(QString(), MCE_SIGNAL_PATH, MCE_SIGNAL_IF,
58                                            MCE_DEVICE_ORIENTATION_SIG, 
59                                            this, SLOT(rotateScreen(QString)));
60     }
61 }
62
63 void QuickWidget::rotateScreen(const QString& orientation) {
64
65   qreal angle = 90;
66   if (orientation == QLatin1String(MCE_ORIENTATION_PORTRAIT) ||
67       orientation == QLatin1String(MCE_ORIENTATION_PORTRAIT_INVERTED)) {
68     if (!landscape_) {
69       return;
70     }
71     angle = -90;
72     landscape_ = false;
73   } else {
74     if (landscape_) {
75       return;
76     }
77     landscape_ = true;
78   }
79   size_.transpose();
80   view_->resize(size_);
81   view_->rotate(angle);
82 }
83
84 QuickWidget::QuickWidget(QWidget *parent)
85     : QeMaemo5DynamicHomescreenWidget(true, parent),
86       size_(QSize()),
87       view_(0),
88       wrapper_(0)
89 {
90     //layout()->setSizeConstraint(QLayout::SetNoConstraint);
91     view_ = new QDeclarativeView(this);
92     view_->engine()->addImportPath(QString("/opt/qtm12/imports"));
93     view_->setStyleSheet("background:transparent");
94     view_->setAttribute(Qt::WA_TranslucentBackground);
95     wrapper_ = new QuickWidgetWrapper(this);
96     connect(this, SIGNAL(isVisibleOnCurrentHomescreenChanged(bool)), 
97             wrapper_, SLOT(setOnHomeScreen(bool)));
98     view_->rootContext()->setContextProperty("runtime", wrapper_);
99     landscape_ = true;
100 }
101
102 QuickWidget::~QuickWidget()
103 {
104
105   QDBusConnection::systemBus().call(QDBusMessage::createMethodCall(MCE_SERVICE, 
106                                                                    MCE_REQUEST_PATH, 
107                                                                    MCE_REQUEST_IF, 
108                                                                    MCE_ACCELEROMETER_DISABLE_REQ));
109       delete wrapper_;
110 }
111
112
113
114 bool QuickWidget::restoreWidgetState()
115 {
116     QString fileName = loadSetting(SETTING_QUICK_FILE).toString();
117     QSize size = loadSetting(SETTING_QUICK_SIZE, QSize()).value<QSize>();
118     bool rotate = loadSetting(SETTING_QUICK_ROTATE).toBool();
119     initView(fileName, size, rotate);
120     return true;
121 }
122
123 void QuickWidget::errorWidget()
124 {
125     const QList<QDeclarativeError>& errs = view_->errors();
126     qDebug() << errs;
127     QByteArray errmsg;
128     QTextStream qts(&errmsg);
129     qts << "import Qt 4.7" << endl
130         << "Rectangle { width: 200; height: txt.height; color: \"#ff0000\"; radius: 8" << endl
131         << "Text { id: txt; anchors.centerIn: parent; text: \"";
132     for (int i = 0; i < errs.size(); ++i) {
133         qts << errs.at(i).toString().replace(QString("\""), QString("\\\"")) <<
134 endl;
135     }
136     qts << "\"; font.pixelSize: 15; wrapMode: Text.Wrap; width: parent.width-20}" << endl
137         << "}" << endl;
138     qDebug() <<  errmsg;
139     QDeclarativeComponent component(view_->engine());
140     component.setData(errmsg, QUrl());
141     qDebug() << component.errorString();
142     QDeclarativeItem *errwdgt =
143       qobject_cast<QDeclarativeItem*>(component.create(view_->rootContext()));
144     view_->scene()->addItem(errwdgt);
145     size_ = QSize(errwdgt->width(), errwdgt->height());
146 }
147
148 //disable base class widget's paint method
149 void QuickWidget::paintEvent(QPaintEvent *event)
150 {
151     QWidget::paintEvent(event);
152 }
153
154 void QuickWidget::resizer(const QSize& size)
155 {
156   if (size_.isValid())
157   {
158       resize(size);
159   }
160 }