-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmenupainter.cpp
More file actions
executable file
·81 lines (73 loc) · 2.12 KB
/
Copy pathmenupainter.cpp
File metadata and controls
executable file
·81 lines (73 loc) · 2.12 KB
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
#include "menupainter.h"
MenuPainter::MenuPainter(QObject *parent) :
Menu(parent) {
}
MenuPainter::MenuPainter(TetrisPanel *ow) :
Menu(ow) {
mentries << "New game" << "Resume" << "Help" << "Exit";
menabled << true << false << false << true;
paintfont = QFont("Arial", 30);
selected = enc = 0;
for (int i = 0; i < mentries.length(); i++)
if (menabled[i])
enc++;
}
void MenuPainter::paint(QPainter& painter) {
painter.setFont(paintfont);
QFontMetrics fm(paintfont);
int h = fm.height(), nh = enc * h;
for (int i = 0, dc = 0; i < mentries.length(); i++) {
if (!menabled[i])
continue;
painter.setPen(dc == selected ? Qt::red : Qt::black);
int ws = fm.width(mentries[i]);
int x = 800 / 2 - ws / 2,
y = 500 / 2 - nh / 2 + h * dc;
painter.drawText(x, y, mentries[i]);
dc++;
}
}
void MenuPainter::mouseMove(QMouseEvent *ev) {
QFontMetrics fm(paintfont);
int h = fm.height(), nh = enc * h;
int dy = 500 / 2 - nh / 2 - h;
int my = ev->y();
if(my >= dy && my < dy + nh)
selected = (my - dy) / h;
repaint();
}
void MenuPainter::mousePress(QMouseEvent *) {
openSelected();
}
void MenuPainter::key(QKeyEvent *ev) {
if (ev->key() == Qt::Key_Up)
selected = (selected + enc - 1) % enc;
else if (ev->key() == Qt::Key_Down)
selected = (selected + enc + 1) % enc;
else if (ev->key() == Qt::Key_Return)
openSelected();
repaint();
}
void MenuPainter::openSelected() {
int rc = -1, i;
for (i = 0, rc = -1; rc < selected; i++)
if (menabled[i])
rc++;
if (mentries[i - 1] == "New game") {
setStarted(true);
owner->restartTetris();
}
else if (mentries[i - 1] == "Resume")
owner->openTetris();
else if (mentries[i - 1] == "Exit")
exit(0);
repaint();
}
void MenuPainter::setStarted(bool state) {
for (int i = 0; i < mentries.size(); i++)
if (mentries[i] == "Resume") {
enc += (int) state - menabled[i];
menabled[i] = state;
return;
}
}