1 /****************************************************************************
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
6 ** This file is part of the examples of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
14 ** * Redistributions of source code must retain the above copyright
15 ** notice, this list of conditions and the following disclaimer.
16 ** * Redistributions in binary form must reproduce the above copyright
17 ** notice, this list of conditions and the following disclaimer in
18 ** the documentation and/or other materials provided with the
20 ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
21 ** of its contributors may be used to endorse or promote products derived
22 ** from this software without specific prior written permission.
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
39 ****************************************************************************/
43 #include <private/qguiapplication_p.h>
45 #include <QBackingStore>
48 static int colorIndexId = 0;
57 Window::Window(QScreen *screen)
59 , m_backgroundColorIndex(colorIndexId++)
64 Window::Window(QWindow *parent)
66 , m_backgroundColorIndex(colorIndexId++)
71 void Window::initialize()
74 setGeometry(QRect(160, 120, 320, 240));
76 setFlags(flags() | Qt::WindowTitleHint | Qt::WindowSystemMenuHint
77 | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
78 const QSize baseSize = QSize(640, 480);
79 setGeometry(QRect(geometry().topLeft(), baseSize));
81 setSizeIncrement(QSize(10, 10));
82 setBaseSize(baseSize);
83 setMinimumSize(QSize(240, 160));
84 setMaximumSize(QSize(800, 600));
88 m_backingStore = new QBackingStore(this);
90 m_image = QImage(geometry().size(), QImage::Format_RGB32);
91 m_image.fill(colorTable[m_backgroundColorIndex % (sizeof(colorTable) / sizeof(colorTable[0]))].rgba());
93 m_lastPos = QPoint(-1, -1);
97 void Window::mousePressEvent(QMouseEvent *event)
99 m_lastPos = event->pos();
102 void Window::mouseMoveEvent(QMouseEvent *event)
104 if (m_lastPos != QPoint(-1, -1)) {
105 QPainter p(&m_image);
106 p.setRenderHint(QPainter::Antialiasing);
107 p.drawLine(m_lastPos, event->pos());
108 m_lastPos = event->pos();
114 void Window::mouseReleaseEvent(QMouseEvent *event)
116 if (m_lastPos != QPoint(-1, -1)) {
117 QPainter p(&m_image);
118 p.setRenderHint(QPainter::Antialiasing);
119 p.drawLine(m_lastPos, event->pos());
120 m_lastPos = QPoint(-1, -1);
126 void Window::exposeEvent(QExposeEvent *)
131 void Window::resizeEvent(QResizeEvent *)
133 QImage old = m_image;
135 int width = qMax(geometry().width(), old.width());
136 int height = qMax(geometry().height(), old.height());
138 if (width > old.width() || height > old.height()) {
139 m_image = QImage(width, height, QImage::Format_RGB32);
140 m_image.fill(colorTable[(m_backgroundColorIndex) % (sizeof(colorTable) / sizeof(colorTable[0]))].rgba());
142 QPainter p(&m_image);
143 p.drawImage(0, 0, old);
148 void Window::keyPressEvent(QKeyEvent *event)
150 switch (event->key()) {
151 case Qt::Key_Backspace:
159 m_text.append(event->text());
165 void Window::scheduleRender()
168 m_renderTimer = startTimer(1);
171 void Window::timerEvent(QTimerEvent *)
175 killTimer(m_renderTimer);
179 void Window::render()
181 QRect rect(QPoint(), geometry().size());
182 m_backingStore->resize(rect.size());
184 m_backingStore->beginPaint(rect);
186 QPaintDevice *device = m_backingStore->paintDevice();
189 p.drawImage(0, 0, m_image);
192 font.setPixelSize(32);
195 p.drawText(rect, 0, m_text);
197 m_backingStore->endPaint();
198 m_backingStore->flush(rect);