all repos — mgba @ 2141868cf29a979c4ee7c8436bbae1bf4ab4be50

mGBA Game Boy Advance Emulator

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}