use a window for dismiss area

animation done by kwin
This commit is contained in:
Marco Martin 2012-01-11 20:55:17 +01:00
parent ce2547c833
commit 7c3d1883c6
3 changed files with 67 additions and 72 deletions

View File

@ -21,6 +21,7 @@
#include "../core/declarativeitemcontainer_p.h"
#include "plasmacomponentsplugin.h"
#include <QApplication>
#include <QDeclarativeItem>
#include <QDeclarativeContext>
#include <QGraphicsObject>
@ -29,16 +30,57 @@
#include <QGraphicsWidget>
#include <QLayout>
#include <QTimer>
#include <QFile>
#include <QDesktopWidget>
#include <KWindowSystem>
#include <KStandardDirs>
#include <Plasma/Corona>
#include <Plasma/WindowEffects>
uint FullScreenDialog::s_numItems = 0;
class Background : public QWidget
{
public:
Background(FullScreenDialog *dialog)
: QWidget( 0L ),
m_dialog(dialog)
{
setAttribute( Qt::WA_NoSystemBackground );
setAttribute( Qt::WA_TranslucentBackground );
setWindowFlags(Qt::FramelessWindowHint | Qt::CustomizeWindowHint);
KWindowSystem::setOnAllDesktops(winId(), true);
unsigned long state = NET::Sticky | NET::StaysOnTop | NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager | NET::MaxVert | NET::MaxHoriz;
KWindowSystem::setState(effectiveWinId(), state);
}
~Background()
{}
void paintEvent( QPaintEvent *e )
{
QPainter painter( this );
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(e->rect(), QColor(0, 0, 0, 80));
}
void mousePressEvent(QMouseEvent *event)
{
event->accept();
}
void mouseReleaseEvent(QMouseEvent *event)
{
m_dialog->close();
}
private:
FullScreenDialog *m_dialog;
};
FullScreenDialog::FullScreenDialog(QDeclarativeItem *parent)
: QDeclarativeItem(parent),
m_declarativeItemContainer(0)
@ -53,10 +95,10 @@ FullScreenDialog::FullScreenDialog(QDeclarativeItem *parent)
m_view->setAttribute(Qt::WA_NoSystemBackground);
m_view->viewport()->setAttribute(Qt::WA_NoSystemBackground);
m_view->setCacheMode(QGraphicsView::CacheNone);
m_view->setWindowFlags(m_view->windowFlags() | Qt::FramelessWindowHint | Qt::CustomizeWindowHint);
m_view->setWindowFlags(Qt::FramelessWindowHint | Qt::CustomizeWindowHint);
m_view->setFrameShape(QFrame::NoFrame);
KWindowSystem::setOnAllDesktops(m_view->winId(), true);
unsigned long state = NET::Sticky | NET::StaysOnTop | NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager | NET::MaxVert | NET::MaxHoriz;
unsigned long state = NET::Sticky | NET::StaysOnTop | NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager;
KWindowSystem::setState(m_view->effectiveWinId(), state);
//Try to figure out the path of the dialog component
@ -102,6 +144,8 @@ FullScreenDialog::FullScreenDialog(QDeclarativeItem *parent)
connect(m_rootObject.data(), SIGNAL(rejected()), this, SIGNAL(rejected()));
connect(m_rootObject.data(), SIGNAL(clickedOutside()), this, SIGNAL(clickedOutside()));
}
m_background = new Background(this);
}
FullScreenDialog::~FullScreenDialog()
@ -183,15 +227,16 @@ void FullScreenDialog::syncMainItem()
if (m_declarativeItemContainer) {
m_declarativeItemContainer->resize(m_view->size());
m_view->resize(m_declarativeItemContainer->size().toSize());
m_view->setSceneRect(m_declarativeItemContainer->geometry());
} else {
m_mainItem.data()->setProperty("width", m_view->size().width());
m_mainItem.data()->setProperty("height", m_view->size().height());
QRectF itemGeometry(QPointF(m_mainItem.data()->x(), m_mainItem.data()->y()),
QSizeF(m_mainItem.data()->boundingRect().size()));
m_view->resize(itemGeometry.size().toSize());
m_view->setSceneRect(itemGeometry);
}
m_view->move(QApplication::desktop()->availableGeometry().center() - QPoint(m_view->width()/2, m_view->height()/2));
}
bool FullScreenDialog::isVisible() const
@ -202,11 +247,9 @@ bool FullScreenDialog::isVisible() const
void FullScreenDialog::setVisible(const bool visible)
{
if (m_view->isVisible() != visible) {
m_background->setVisible(visible);
m_view->setVisible(visible);
if (visible) {
unsigned long state = NET::Sticky | NET::StaysOnTop | NET::KeepAbove | NET::SkipTaskbar | NET::SkipPager | NET::MaxVert | NET::MaxHoriz;
m_view->setVisible(visible);
KWindowSystem::setState(m_view->effectiveWinId(), state);
m_view->raise();
}
}
@ -292,9 +335,13 @@ void FullScreenDialog::close()
bool FullScreenDialog::eventFilter(QObject *watched, QEvent *event)
{
if (watched == m_view &&
(event->type() == QEvent::Resize || event->type() == QEvent::Move)) {
if (watched == m_mainItem.data() &&
(event->type() == QEvent::GraphicsSceneResize)) {
syncMainItem();
} else if (watched == m_view && event->type() == QEvent::Show) {
Plasma::WindowEffects::slideWindow(m_view->winId(), Plasma::BottomEdge, 0);
} else if (watched == m_view && event->type() == QEvent::Hide) {
Plasma::WindowEffects::slideWindow(m_view->winId(), Plasma::BottomEdge, 0);
}
return false;
}

View File

@ -32,6 +32,7 @@ class QGraphicsObject;
class QGraphicsView;
class QGraphicsScene;
class DeclarativeItemContainer;
class Background;
class FullScreenDialog : public QDeclarativeItem
{
@ -86,6 +87,7 @@ private:
QGraphicsScene *m_scene;
QWeakPointer<QObject> m_rootObject;
static uint s_numItems;
Background *m_background;
//those only used in case of error, to not make plasma crash
QList<QGraphicsObject *> m_dummyTitleElements;

View File

@ -47,6 +47,8 @@ import "." 0.1
Item {
id: root
width: dialog.width
height: dialog.height
property alias title: titleBar.children
property alias content: contentItem.children
@ -91,12 +93,7 @@ Item {
dialog.state = "closed"
}
Rectangle {
id: fader
property double alpha: 0
color: Qt.rgba(0.0, 0.0, 0.0, alpha)
anchors.fill: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
@ -120,10 +117,6 @@ Item {
state: "closed"
transform: Translate {
id: dialogTransform
y: root.height - dialog.y
}
//state: "Hidden"
Item {
@ -183,65 +176,18 @@ Item {
State {
name: "closed"
PropertyChanges {
target: dialogTransform
y: root.height - dialog.y
}
PropertyChanges {
target: fader
alpha: 0
target: root
status: DialogStatus.Closed
}
},
State {
name: ""
PropertyChanges {
target: dialogTransform
y: 0
}
PropertyChanges {
target: fader
alpha: 0.6
target: root
status: DialogStatus.Open
}
}
]
transitions: [
// Transition between open and closed states.
Transition {
from: ""
to: "closed"
reversible: false
SequentialAnimation {
ScriptAction {
script: root.status = DialogStatus.Closing
}
PropertyAnimation {
properties: "y, alpha"
easing.type: Easing.InOutQuad
duration: 250
}
ScriptAction {
script: root.status = DialogStatus.Closed
}
}
},
Transition {
from: "closed"
to: ""
reversible: false
SequentialAnimation {
ScriptAction {
script: root.status = DialogStatus.Opening
}
PropertyAnimation {
properties: "y, alpha"
easing.type: Easing.InOutQuad
duration: 250
}
ScriptAction {
script: root.status = DialogStatus.Open
}
}
}
]
}
}