src/platform/qt/MessagePainter.cpp (view raw)
1/* Copyright (c) 2013-2015 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include "MessagePainter.h"
7
8#include <QPainter>
9
10extern "C" {
11#include "gba/video.h"
12}
13
14using namespace QGBA;
15
16MessagePainter::MessagePainter(QObject* parent)
17 : QObject(parent)
18 , m_messageTimer(this)
19{
20 m_messageFont.setFamily("Source Code Pro");
21 m_messageFont.setStyleHint(QFont::Monospace);
22 m_messageFont.setPixelSize(13);
23 connect(&m_messageTimer, SIGNAL(timeout()), this, SLOT(clearMessage()));
24 m_messageTimer.setSingleShot(true);
25 m_messageTimer.setInterval(5000);
26
27 clearMessage();
28}
29
30void MessagePainter::resize(const QSize& size, bool lockAspectRatio) {
31 int w = size.width();
32 int h = size.height();
33 int drawW = w;
34 int drawH = h;
35 if (lockAspectRatio) {
36 if (w * 2 > h * 3) {
37 drawW = h * 3 / 2;
38 } else if (w * 2 < h * 3) {
39 drawH = w * 2 / 3;
40 }
41 }
42 m_world.reset();
43 m_world.translate((w - drawW) / 2, (h - drawH) / 2);
44 m_world.scale(qreal(drawW) / VIDEO_HORIZONTAL_PIXELS, qreal(drawH) / VIDEO_VERTICAL_PIXELS);
45 m_message.prepare(m_world, m_messageFont);
46}
47
48void MessagePainter::paint(QPainter* painter) {
49 painter->setWorldTransform(m_world);
50 painter->setRenderHint(QPainter::Antialiasing);
51 painter->setFont(m_messageFont);
52 painter->setPen(Qt::black);
53 painter->translate(1, VIDEO_VERTICAL_PIXELS - m_messageFont.pixelSize() - 1);
54 const static int ITERATIONS = 11;
55 for (int i = 0; i < ITERATIONS; ++i) {
56 painter->save();
57 painter->translate(cos(i * 2.0 * M_PI / ITERATIONS) * 0.8, sin(i * 2.0 * M_PI / ITERATIONS) * 0.8);
58 painter->drawStaticText(0, 0, m_message);
59 painter->restore();
60 }
61 painter->setPen(Qt::white);
62 painter->drawStaticText(0, 0, m_message);
63}
64
65void MessagePainter::showMessage(const QString& message) {
66 m_message.setText(message);
67 m_message.prepare(m_world, m_messageFont);
68 m_messageTimer.stop();
69 m_messageTimer.start();
70}
71
72void MessagePainter::clearMessage() {
73 m_message.setText(QString());
74 m_messageTimer.stop();
75}