21 #include "../core/declarativeitemcontainer_p.h"
24 #include <QApplication>
25 #include <QDeclarativeItem>
26 #include <QDeclarativeContext>
27 #include <QGraphicsObject>
28 #include <QGraphicsScene>
29 #include <QGraphicsView>
30 #include <QGraphicsWidget>
33 #include <QDesktopWidget>
36 #include <KWindowSystem>
37 #include <KStandardDirs>
39 #include <kdeclarative.h>
41 #include <Plasma/Corona>
42 #include <Plasma/WindowEffects>
45 uint FullScreenWindow::s_numItems = 0;
47 class Background :
public QWidget
54 setAttribute( Qt::WA_NoSystemBackground );
55 setAttribute( Qt::WA_TranslucentBackground );
57 setWindowFlags(Qt::FramelessWindowHint | Qt::CustomizeWindowHint);
58 KWindowSystem::setOnAllDesktops(winId(),
true);
59 unsigned long state = NET::Sticky | NET::StaysOnTop | NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager | NET::MaxVert | NET::MaxHoriz;
60 KWindowSystem::setState(effectiveWinId(), state);
66 void paintEvent( QPaintEvent *e )
68 QPainter painter(
this );
69 painter.setCompositionMode(QPainter::CompositionMode_Source);
70 painter.fillRect(e->rect(), QColor(0, 0, 0, 80));
73 void mousePressEvent(QMouseEvent *event)
76 m_dialog->view()->winId();
77 KWindowSystem::forceActiveWindow(m_dialog->view()->winId());
80 void mouseReleaseEvent(QMouseEvent *event)
82 if (!m_dialog->view()->geometry().contains(event->globalPos())) {
83 emit m_dialog->clickedOutside();
94 m_declarativeItemContainer(0)
96 m_view =
new QGraphicsView();
97 m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
98 m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
99 m_view->installEventFilter(
this);
100 m_view->setAutoFillBackground(
false);
101 m_view->viewport()->setAutoFillBackground(
false);
102 m_view->setAttribute(Qt::WA_TranslucentBackground);
103 m_view->setAttribute(Qt::WA_NoSystemBackground);
104 m_view->viewport()->setAttribute(Qt::WA_NoSystemBackground);
105 m_view->setCacheMode(QGraphicsView::CacheNone);
106 m_view->setWindowFlags(Qt::FramelessWindowHint | Qt::CustomizeWindowHint);
107 m_view->setFrameShape(QFrame::NoFrame);
108 KWindowSystem::setOnAllDesktops(m_view->winId(),
true);
109 unsigned long state = NET::Sticky | NET::StaysOnTop | NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager;
110 KWindowSystem::setState(m_view->effectiveWinId(), state);
127 const QString target = KDeclarative::componentsTarget();
129 if (target != KDeclarative::defaultComponentsTarget()) {
130 const QString file =
"platformimports/" % target %
"/org/kde/plasma/components/" % componentName %
".qml";
131 filePath = KStandardDirs::locate(
"module", file);
134 if (filePath.isEmpty()) {
135 const QString file =
"imports/org/kde/plasma/components/" % componentName %
".qml";
136 filePath = KStandardDirs::locate(
"module", file);
139 if (filePath.isEmpty()) {
140 kWarning() <<
"Component not found:" << componentName;
146 kWarning() <<
"Warning, no QDeclarativeEngines available anymore, should never happen";
149 QDeclarativeComponent *component =
new QDeclarativeComponent(engine, filePath,
this);
151 QDeclarativeContext *creationContext = component->creationContext();
152 m_rootObject = component->create(creationContext);
153 if (component->status() == QDeclarativeComponent::Error) {
154 kWarning()<<component->errors();
158 setMainItem(qobject_cast<QGraphicsObject *>(m_rootObject.data()));
159 connect(m_rootObject.data(), SIGNAL(
statusChanged()),
this, SLOT(statusHasChanged()));
168 return m_mainItem.data();
173 if (m_mainItem.data() !=
mainItem) {
175 m_mainItem.data()->setParent(mainItem->parent());
176 m_mainItem.data()->removeEventFilter(
this);
177 m_mainItem.data()->setY(0);
182 mainItem->setParentItem(0);
183 mainItem->setParent(
this);
184 m_scene = mainItem->scene();
185 m_view->resize(mainItem->boundingRect().size().toSize());
186 mainItem->installEventFilter(
this);
190 QTimer::singleShot(0,
this, SLOT(syncViewToMainItem()));
194 void FullScreenWindow::syncViewToMainItem()
201 QGraphicsScene *scene = m_mainItem.data()->scene();
203 QObject *parent = m_mainItem.data();
204 while ((parent = parent->parent())) {
205 QGraphicsObject *qo = qobject_cast<QGraphicsObject *>(parent);
210 scene->addItem(m_mainItem.data());
212 Plasma::Corona *corona = qobject_cast<Plasma::Corona *>(scene);
216 if (!m_declarativeItemContainer) {
217 m_declarativeItemContainer =
new DeclarativeItemContainer();
218 scene->addItem(m_declarativeItemContainer);
219 corona->addOffscreenWidget(m_declarativeItemContainer);
221 m_declarativeItemContainer->setDeclarativeItem(di);
223 m_mainItem.data()->setY(-10000*s_numItems);
224 m_mainItem.data()->setY(10000*s_numItems);
236 m_view->setScene(scene);
239 QRectF itemGeometry(QPointF(m_mainItem.data()->x(), m_mainItem.data()->y()),
240 QSizeF(m_mainItem.data()->boundingRect().size()));
241 if (m_declarativeItemContainer) {
242 m_view->resize(itemGeometry.size().toSize());
243 m_view->setSceneRect(m_declarativeItemContainer->geometry());
246 QRectF itemGeometry(QPointF(m_mainItem.data()->x(), m_mainItem.data()->y()),
247 QSizeF(m_mainItem.data()->boundingRect().size()));
248 m_view->resize(itemGeometry.size().toSize());
249 m_view->setSceneRect(itemGeometry);
252 m_view->move(QApplication::desktop()->availableGeometry().center() - QPoint(m_view->width()/2, m_view->height()/2));
255 void FullScreenWindow::syncMainItemToView()
261 m_mainItem.data()->setProperty(
"width", m_view->width());
262 m_mainItem.data()->setProperty(
"height", m_view->height());
264 if (m_declarativeItemContainer) {
265 m_declarativeItemContainer->resize(m_view->size());
266 m_view->setSceneRect(m_declarativeItemContainer->geometry());
268 QRectF itemGeometry(QPointF(m_mainItem.data()->x(), m_mainItem.data()->y()),
269 QSizeF(m_mainItem.data()->boundingRect().size()));
270 m_view->setSceneRect(itemGeometry);
276 return m_view->isVisible();
281 if (m_view->isVisible() != visible) {
282 m_background->setVisible(visible);
283 Plasma::WindowEffects::slideWindow(m_view->winId(), Plasma::BottomEdge, 0);
284 m_view->setVisible(visible);
285 unsigned long state = NET::Sticky | NET::StaysOnTop | NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager;
286 KWindowSystem::setState(m_view->effectiveWinId(), state);
287 KWindowSystem::setState(m_background->effectiveWinId(), state);
290 KWindowSystem::forceActiveWindow(m_view->effectiveWinId());
304 return m_rootObject.data()->property(
"title").value<QDeclarativeListProperty<QGraphicsObject> >();
306 return QDeclarativeListProperty<QGraphicsObject>(
this, m_dummyTitleElements);
313 return m_rootObject.data()->property(
"content").value<QDeclarativeListProperty<QGraphicsObject> >();
315 return QDeclarativeListProperty<QGraphicsObject>(
this, m_dummyContentElements);
322 return m_rootObject.data()->property(
"buttons").value<QDeclarativeListProperty<QGraphicsObject> >();
324 return QDeclarativeListProperty<QGraphicsObject>(
this, m_dummyButtonsElements);
338 void FullScreenWindow::statusHasChanged()
351 QMetaObject::invokeMethod(m_rootObject.data(),
"open");
358 QMetaObject::invokeMethod(m_rootObject.data(),
"accept");
365 QMetaObject::invokeMethod(m_rootObject.data(),
"reject");
372 QMetaObject::invokeMethod(m_rootObject.data(),
"close");
381 if (watched == m_mainItem.data() &&
382 (
event->type() == QEvent::GraphicsSceneResize)) {
383 syncViewToMainItem();
384 }
else if (watched == m_view &&
385 (event->type() == QEvent::Resize)) {
386 syncMainItemToView();
393 #include "fullscreenwindow.moc"
QDeclarativeListProperty< QGraphicsObject > content()
QDeclarativeEngine * engine() const
bool eventFilter(QObject *watched, QEvent *event)
DialogStatus::Status status() const
QDeclarativeListProperty< QGraphicsObject > title()
Q_INVOKABLE void accept()
QDeclarativeListProperty< QGraphicsObject > buttons()
void setMainItem(QGraphicsObject *mainItem)
QGraphicsObject * mainItem() const
FullScreenWindow(QDeclarativeItem *parent=0)
void setVisible(const bool visible)
static EngineBookKeeping * self()
QGraphicsView * view() const
Q_INVOKABLE void reject()
void init(const QString &componentName)