23 #include <QApplication>
24 #include <QDeclarativeItem>
25 #include <QDesktopWidget>
26 #include <QGraphicsObject>
27 #include <QGraphicsWidget>
31 #include <KWindowSystem>
33 #include <Plasma/Corona>
34 #include <Plasma/Dialog>
35 #include <Plasma/WindowEffects>
38 int DialogProxy::offscreenX = 0;
39 int DialogProxy::offscreenY = 0;
43 m_left(0), m_top(0), m_right(0), m_bottom(0),
52 m_dialog->getContentsMargins(&left, &top, &right, &bottom);
62 if (right != m_right) {
66 if (bottom != m_bottom) {
94 m_declarativeItemContainer(0),
95 m_activeWindow(false),
96 m_location(Plasma::Floating)
98 m_dialog =
new Plasma::Dialog();
100 m_dialog->installEventFilter(
this);
101 m_flags = m_dialog->windowFlags();
106 delete m_declarativeItemContainer;
112 return m_mainItem.data();
117 if (m_mainItem.data() !=
mainItem) {
119 m_mainItem.data()->setParent(mainItem ? mainItem->parent() : 0);
125 mainItem->setParentItem(0);
126 mainItem->setParent(
this);
141 if (static_cast<QGraphicsObject *>(m_dialog->graphicsWidget()) == m_mainItem.data() ||
142 (m_declarativeItemContainer && m_declarativeItemContainer->
declarativeItem() == m_mainItem.data())) {
147 QGraphicsScene *scene = m_mainItem.data()->scene();
149 QObject *parent = m_mainItem.data();
150 while ((parent = parent->parent())) {
151 QGraphicsObject *qo = qobject_cast<QGraphicsObject *>(parent);
155 scene->addItem(m_mainItem.data());
167 m_mainItem.data()->setParentItem(qobject_cast<QGraphicsObject *>(m_mainItem.data()->parent()));
171 if (m_declarativeItemContainer) {
172 m_declarativeItemContainer->deleteLater();
173 m_declarativeItemContainer = 0;
178 if (!m_declarativeItemContainer) {
180 scene->addItem(m_declarativeItemContainer);
183 widget = m_declarativeItemContainer;
186 m_dialog->setGraphicsWidget(widget);
188 if (!qobject_cast<Plasma::Corona *>(scene)) {
191 widget->setPos(offscreenX, offscreenY);
197 return m_dialog->isVisible();
202 if (m_dialog->isVisible() !=
visible) {
204 const QSize s = m_dialog->size();
205 m_dialog->resize(0,0);
208 const QRect workArea(KWindowSystem::workArea());
209 if (!workArea.contains(m_dialog->geometry())) {
210 m_dialog->move(qBound(workArea.left(), m_dialog->x(), workArea.right() - m_dialog->width()),
211 qBound(workArea.top(), m_dialog->y(), workArea.bottom() - m_dialog->height())
215 m_dialog->setVisible(visible);
216 if (visible && !m_dialog->testAttribute(Qt::WA_X11NetWmWindowTypeDock)) {
224 QGraphicsObject *actualItem = item;
228 actualItem = qobject_cast<QGraphicsObject *>(parent());
232 QGraphicsObject *ancestor = qobject_cast<QGraphicsObject *>(actualItem->parent());
235 actualItem = ancestor;
247 m_dialog->syncToGraphicsWidget();
249 Plasma::Corona *corona = qobject_cast<Plasma::Corona *>(actualItem->scene());
250 if (corona && item) {
251 return corona->popupPosition(actualItem, m_dialog->size(), (Qt::AlignmentFlag)alignment);
254 if (!actualItem->scene()) {
258 QList<QGraphicsView*> views = actualItem->scene()->views();
261 if (views.size() < 1) {
265 QGraphicsView *view = 0;
266 if (views.size() == 1) {
269 QGraphicsView *found = 0;
270 QGraphicsView *possibleFind = 0;
272 foreach (QGraphicsView *v, views) {
273 if (v->sceneRect().intersects(actualItem->sceneBoundingRect()) ||
274 v->sceneRect().contains(actualItem->scenePos())) {
275 if (v->isActiveWindow()) {
282 view = found ? found : possibleFind;
291 return view->geometry().center() - QPoint(m_dialog->width()/2, m_dialog->height()/2);
295 if (QApplication::isRightToLeft() && alignment != Qt::AlignCenter) {
296 if (alignment == Qt::AlignRight) {
297 alignment = Qt::AlignLeft;
299 alignment = Qt::AlignRight;
305 if (alignment == Qt::AlignCenter) {
306 xOffset = actualItem->boundingRect().width()/2 - m_dialog->width()/2;
307 }
else if (alignment == Qt::AlignRight) {
308 xOffset = actualItem->boundingRect().width() - m_dialog->width();
311 const QRect avail = QApplication::desktop()->availableGeometry(view);
312 QPoint menuPos = view->mapToGlobal(view->mapFromScene(actualItem->scenePos()+QPoint(xOffset, actualItem->boundingRect().height())));
314 if (menuPos.y() + m_dialog->height() > avail.bottom()) {
315 menuPos = view->mapToGlobal(view->mapFromScene(actualItem->scenePos() - QPoint(-xOffset, m_dialog->height())));
324 return m_dialog->pos().x();
329 m_dialog->move(x, m_dialog->pos().y());
334 return m_dialog->pos().y();
339 m_dialog->move(m_dialog->pos().x(),
y);
344 return m_dialog->size().width();
349 return m_dialog->size().height();
354 return m_activeWindow;
359 m_dialog->activateWindow();
370 return m_dialog->winId();
376 m_flags = (Qt::WindowFlags)flags;
377 m_dialog->setWindowFlags(Qt::FramelessWindowHint|m_flags);
382 return (
int)m_location;
387 if (m_location == location) {
390 m_location = (Plasma::Location)location;
402 if (watched == m_dialog && event->type() == QEvent::Move) {
403 QMoveEvent *me =
static_cast<QMoveEvent *
>(event);
404 if (me->oldPos().x() != me->pos().x()) {
407 if (me->oldPos().y() != me->pos().y()) {
410 if ((me->oldPos().x() != me->pos().x()) || (me->oldPos().y() != me->pos().y())) {
413 }
else if (watched == m_dialog && event->type() == QEvent::Resize) {
414 QResizeEvent *re =
static_cast<QResizeEvent *
>(event);
415 if (re->oldSize().width() != re->size().width()) {
418 if (re->oldSize().height() != re->size().height()) {
421 }
else if (watched == m_dialog && event->type() == QEvent::Show) {
422 Plasma::WindowEffects::slideWindow(m_dialog, m_location);
423 if (m_dialog->testAttribute(Qt::WA_X11NetWmWindowTypeDock)) {
424 KWindowSystem::setOnAllDesktops(m_dialog->winId(),
true);
426 KWindowSystem::setOnAllDesktops(m_dialog->winId(),
false);
429 }
else if (watched == m_dialog && event->type() == QEvent::Hide) {
430 Plasma::WindowEffects::slideWindow(m_dialog, m_location);
432 }
else if (watched == m_dialog && event->type() == QEvent::WindowActivate) {
433 m_activeWindow =
true;
435 }
else if (watched == m_dialog && event->type() == QEvent::WindowDeactivate) {
436 m_activeWindow =
false;
444 m_dialog->setAttribute((Qt::WidgetAttribute)attribute, on);
446 if (attribute == Qt::WA_X11NetWmWindowTypeDock) {
447 KWindowSystem::setOnAllDesktops(m_dialog->winId(), on);
451 #include "dialog.moc"
void setDeclarativeItem(QDeclarativeItem *item, bool reparent=true)
Q_INVOKABLE void activateWindow()
Ask the window manager to activate the window.
DialogMargins(Plasma::Dialog *dialog, QObject *parent=0)
Q_INVOKABLE QPoint popupPosition(QGraphicsObject *item, int alignment=Qt::AlignLeft)
void setLocation(int location)
qulonglong windowId() const
Q_INVOKABLE void setAttribute(int attribute, bool on)
Set a Qt.WidgetAttribute to the dialog window.
QGraphicsObject * mainItem() const
QObject * margins() const
void activeWindowChanged()
bool isActiveWindow() const
QDeclarativeItem * declarativeItem() const
void setWindowFlags(const int)
void setMainItem(QGraphicsObject *mainItem)
bool eventFilter(QObject *watched, QEvent *event)
void setVisible(const bool visible)
bool visible
Visibility of the Dialog window.
DialogProxy(QDeclarativeItem *parent=0)