Revert "Suppress QWindowSystemInterface inclusion warnings."
[profile/ivi/qtwayland.git] / src / plugins / platforms / wayland / qwaylanddecoration.cpp
1 #include "qwaylanddecoration.h"
2
3 #include "qwaylandwindow.h"
4 #include "qwaylandshmbackingstore.h"
5 #include "qwaylandshellsurface.h"
6 #include "qwaylandinputdevice.h"
7
8 #include <QtGui/QGuiApplication>
9 #include <QtGui/QCursor>
10 #include <QtGui/QPainter>
11 #include <QtGui/QRadialGradient>
12 QWaylandDecoration::QWaylandDecoration(QWindow *window, QWaylandShmBackingStore *backing_store)
13     : m_window(window)
14     , m_wayland_window(static_cast<QWaylandWindow *>(window->handle()))
15     , m_backing_store(backing_store)
16     , m_margins(3,30,3,3)
17     , m_hasSetCursor(false)
18     , m_mouseButtons(Qt::NoButton)
19 {
20     m_wayland_window->setDecoration(this);
21     QTextOption option(Qt::AlignHCenter | Qt::AlignVCenter);
22     option.setWrapMode(QTextOption::NoWrap);
23     m_windowTitle.setTextOption(option);
24 }
25
26 QWaylandDecoration::~QWaylandDecoration()
27 {
28     m_wayland_window->setDecoration(0);
29 }
30
31 void QWaylandDecoration::paintDecoration()
32 {
33     QRect surfaceRect(QPoint(), m_backing_store->entireSurface()->size());
34     QRect clips[] =
35     {
36         QRect(0, 0, surfaceRect.width(), m_margins.top()),
37         QRect(0, surfaceRect.height() - m_margins.bottom(), surfaceRect.width(), m_margins.bottom()),
38         QRect(0, m_margins.top(), m_margins.left(), surfaceRect.height() - m_margins.top() - m_margins.bottom()),
39         QRect(surfaceRect.width() - m_margins.right(), m_margins.top(), m_margins.left(), surfaceRect.height() - m_margins.top() - m_margins.bottom())
40     };
41     QRect top = clips[0];
42     QPainter p(m_backing_store->entireSurface());
43     p.setRenderHint(QPainter::Antialiasing);
44     QPoint gradCenter(top.center()+ QPoint(30,60));
45     QRadialGradient grad(gradCenter, top.width() / 2, gradCenter);
46     QColor base(90, 90, 100);
47     grad.setColorAt(1, base);
48     grad.setColorAt(0, base.lighter(123));
49     QPainterPath roundedRect;
50     roundedRect.addRoundedRect(surfaceRect, 6, 6);
51     for (int i = 0; i < 4; ++i) {
52         p.save();
53         p.setClipRect(clips[i]);
54         p.fillPath(roundedRect, grad);
55         p.restore();
56     }
57
58
59     QString windowTitleText = m_window->windowTitle();
60     if (!windowTitleText.isEmpty()) {
61         if (m_windowTitle.text() != windowTitleText) {
62             m_windowTitle.setText(windowTitleText);
63             m_windowTitle.prepare();
64         }
65         p.save();
66         p.setClipRect(top);
67         p.setPen(QColor(0xee,0xee,0xee));
68         QSizeF size = m_windowTitle.size();
69         int dx = (top.width() - size.width()) /2;
70         int dy = (top.height()- size.height()) /2;
71         QPoint windowTitlePoint(top.topLeft().x() + dx,
72                  top.topLeft().y() + dy);
73         p.drawStaticText(windowTitlePoint,m_windowTitle);
74         p.restore();
75     }
76 }
77
78 void QWaylandDecoration::handleMouse(QWaylandInputDevice *inputDevice, const QPointF &local, const QPointF &global, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
79
80 {
81     Q_UNUSED(global);
82     //figure out what area mouse is in
83     if (local.y() <= m_margins.top()) {
84         processMouseTop(inputDevice,local,b,mods);
85     } else if (local.y() > m_window->height() - m_margins.bottom()) {
86         processMouseBottom(inputDevice,local,b,mods);
87     } else if (local.x() <= m_margins.left()) {
88         processMouseLeft(inputDevice,local,b,mods);
89     } else if (local.x() > m_window->width() - m_margins.right()) {
90         processMouseRight(inputDevice,local,b,mods);
91     } else {
92         restoreMouseCursor();
93     }
94     m_mouseButtons = b;
95 }
96
97 void QWaylandDecoration::restoreMouseCursor()
98 {
99     if (m_hasSetCursor) {
100         QGuiApplication::restoreOverrideCursor();
101         m_hasSetCursor = false;
102     }
103 }
104
105 bool QWaylandDecoration::inMouseButtonPressedState() const
106 {
107     return m_mouseButtons & Qt::NoButton;
108 }
109
110 void QWaylandDecoration::startResize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize resize, Qt::MouseButtons buttons)
111 {
112     if (isLeftClicked(buttons)) {
113         m_wayland_window->shellSurface()->resize(inputDevice, resize);
114         inputDevice->removeMouseButtonFromState(Qt::LeftButton);
115     }
116 }
117
118 void QWaylandDecoration::startMove(QWaylandInputDevice *inputDevice, Qt::MouseButtons buttons)
119 {
120     if (isLeftClicked(buttons)) {
121         m_wayland_window->shellSurface()->move(inputDevice);
122         inputDevice->removeMouseButtonFromState(Qt::LeftButton);
123     }
124 }
125
126 void QWaylandDecoration::processMouseTop(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
127 {
128     Q_UNUSED(mods);
129     if (local.y() <= m_margins.bottom()) {
130         if (local.x() <= margins().left()) {
131             //top left bit
132             startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_TOP_LEFT,b);
133         } else if (local.x() > m_window->width() - margins().right()) {
134             //top right bit
135             startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_TOP_RIGHT,b);
136         } else {
137             //top reszie bit
138             overrideCursor(Qt::SplitVCursor);
139             startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_TOP,b);
140         }
141     } else {
142         restoreMouseCursor();
143         startMove(inputDevice,b);
144     }
145
146 }
147
148 void QWaylandDecoration::processMouseBottom(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
149 {
150     Q_UNUSED(mods);
151     if (local.x() <= margins().left()) {
152         //bottom left bit
153         startResize(inputDevice, WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT,b);
154     } else if (local.x() > m_window->width() - margins().right()) {
155         //bottom right bit
156             startResize(inputDevice, WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT,b);
157     } else {
158         //bottom bit
159         overrideCursor(Qt::SplitVCursor);
160         startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_BOTTOM,b);
161     }
162 }
163
164 void QWaylandDecoration::processMouseLeft(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
165 {
166     Q_UNUSED(local);
167     Q_UNUSED(mods);
168     overrideCursor(Qt::SplitHCursor);
169     startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_LEFT,b);
170 }
171
172 void QWaylandDecoration::processMouseRight(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
173 {
174     Q_UNUSED(local);
175     Q_UNUSED(mods);
176     overrideCursor(Qt::SplitHCursor);
177     startResize(inputDevice, WL_SHELL_SURFACE_RESIZE_RIGHT,b);
178 }
179
180 bool QWaylandDecoration::isLeftClicked(Qt::MouseButtons newMouseButtonState)
181 {
182     if ((!m_mouseButtons & Qt::LeftButton) && (newMouseButtonState & Qt::LeftButton))
183         return true;
184     return false;
185 }
186
187 bool QWaylandDecoration::isLeftReleased(Qt::MouseButtons newMouseButtonState)
188 {
189     if ((m_mouseButtons & Qt::LeftButton) && !(newMouseButtonState & Qt::LeftButton))
190         return true;
191     return false;
192 }