-
Notifications
You must be signed in to change notification settings - Fork 2
/
tipoverlay.cpp
99 lines (88 loc) · 4.1 KB
/
tipoverlay.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright 2023 by Linwood Ferguson, licensed under GNU GPLv3
#include <QTimer>
#include <QPainter>
#include <QStyleOption>
#include <QPropertyAnimation>
#include <QGraphicsOpacityEffect>
#include <cassert>
#include "piconstants.h"
#include "tipoverlay.h"
#include "mainwindow.h"
#include "oursettings.h"
TipOverlay::TipOverlay(QWidget* p, MainWindow * mp) : QLabel(p)
{
// Instructional overlay (optionally) showed during play mode to show areas of the screen
// where touches (clicks) turn pages or return to the library.
qDebug() << "created";
assert(p);
assert(mp);
mParent = mp;
ourParent = p;
overlayFade = new QGraphicsOpacityEffect(this);
this->setGraphicsEffect(overlayFade);
overlayAnimation = new QPropertyAnimation(overlayFade,"opacity");
overlayAnimation->setEasingCurve(QEasingCurve::Linear);
overlayAnimation->setDuration(mParent->ourSettingsPtr->getSetting("overlayDuration").toInt() / 3); // Must be <= first timer below
}
void TipOverlay::showEvent(QShowEvent* event)
{
int overlayFullWidth = ourParent->size().width();
int overlayTopHeight = mParent->ourSettingsPtr->getSetting("overlayTopPortion").toInt() * ourParent->size().height() / 100;
int overlayPanelWidth = mParent->ourSettingsPtr->getSetting("overlaySidePortion").toInt() * overlayFullWidth / 100;
QRect endPlayRect(0,0,overlayFullWidth,overlayTopHeight);
QRect backPlayRect(0,overlayTopHeight,overlayPanelWidth,ourParent->size().height() - overlayTopHeight);
QRect forwardPlayRect(overlayFullWidth - overlayPanelWidth,overlayTopHeight,overlayPanelWidth,ourParent->size().height() - overlayTopHeight);
this->setGeometry(QRect(0,0,ourParent->geometry().width(),ourParent->geometry().height()));
this->setAttribute(Qt::WA_TranslucentBackground);
QPixmap tmpPix = QPixmap(ourParent->size());
tmpPix.fill(Qt::transparent);
QPainter painter(&tmpPix);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.setOpacity(0.3); // For panels
painter.setBrush(QBrush(Qt::red));
painter.drawRect(endPlayRect);
painter.setBrush(QBrush(Qt::blue));
painter.drawRect(backPlayRect);
painter.setBrush(QBrush(Qt::green));
painter.drawRect(forwardPlayRect);
painter.setOpacity(1.0);
painter.setFont(QFont("Arial",QString(MUSICALPI_SETTINGS_TIPOVERLAY_FONT_SIZE).replace("px","").toInt(),1,false)); // ??? This breaks if we don't use pixels -- ??
painter.setPen(QColor("red"));
painter.drawText(endPlayRect,Qt::AlignCenter,"End Play");
painter.setPen(QColor("blue"));
painter.drawText(backPlayRect,Qt::AlignCenter,"Prior Page");
painter.setPen(QColor("green"));
painter.drawText(forwardPlayRect,Qt::AlignCenter,"Next Page");
qDebug() << "pixmap hasAlpha()=" << tmpPix.hasAlpha() << ", depth=" << tmpPix.depth()
<< ", size=(" << tmpPix.size().width() << "," << tmpPix.size().height() << ")";
this->setPixmap(tmpPix);
qDebug() << "TipOverlay:: create, after show, before animation start";
overlayAnimation->setEasingCurve(QEasingCurve::Linear);
overlayAnimation->setStartValue(0.0);
overlayAnimation->setEndValue(1.0);
overlayAnimation->start();
QTimer::singleShot(mParent->ourSettingsPtr->getSetting("overlayDuration").toInt() / 2,this, // Must be >= duration above
[=]
{
qDebug() << "TipOverlay:: in animation after first event";
overlayAnimation->setEndValue(0.0);
overlayAnimation->setStartValue(1.0);
overlayAnimation->start();
}
);
QTimer::singleShot(mParent->ourSettingsPtr->getSetting("overlayDuration").toInt(),this, // Must be >= 2* duration above
[=]
{
qDebug() << "TipOverlay:: in animation after second event";
this->hide();
}
);
QLabel::showEvent(event);
}
TipOverlay::~TipOverlay()
{
qDebug() << "TipOverlay:: in destructor";
if(overlayAnimation) delete overlayAnimation;
if(overlayFade) delete overlayFade;
}
// Note the replacement paint event used in other routines cannot be used here -- probably needs something more sophisticated.