]> Shamusworld >> Repos - wozmaker/blob - src/diskwidget.cpp
Flesh out the disk settings dialog.
[wozmaker] / src / diskwidget.cpp
1 //
2 // diskwidget.cpp: Disk display widget
3 //
4 // Part of the WOZ Maker project
5 // by James Hammons
6 // (C) 2018 Underground Software
7 //
8
9 #include "diskwidget.h"
10 #include "analysisthread.h"
11 #include "diskdrawthread.h"
12 #include "fileio.h"
13 #include "global.h"
14
15
16 enum { green = 0, yellow, red, grey, dkGrey, ltGrey };
17
18
19 static inline int ColorForTrack(uint8_t num)
20 {
21         int trackColor;
22
23         switch (num)
24         {
25         case 1:
26                 trackColor = green;
27                 break;
28         case 2:
29                 trackColor = yellow;
30                 break;
31         case 3:
32                 trackColor = red;
33                 break;
34         default:
35                 trackColor = grey;
36         }
37
38         return trackColor;
39 }
40
41
42 DiskWidget::DiskWidget(QWidget * parent/*= 0*/): QWidget(parent)
43 {
44         setGeometry(QRect(0, 0, 1290, 340));
45         setMinimumWidth(1290);
46         setMinimumHeight(340);
47         setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
48         diskImg = new QImage(1024, 1024, QImage::Format_ARGB32);
49         DrawDisk();
50 }
51
52
53 DiskWidget::~DiskWidget(void)
54 {
55         delete diskImg;
56 }
57
58
59 void DiskWidget::HandleUpdate(void)
60 {
61         update();
62 }
63
64
65 void DiskWidget::paintEvent(QPaintEvent * /*event*/)
66 {
67         QPainter painter(this);
68         painter.setRenderHint(QPainter::Antialiasing);
69
70 //      QFont font("Monospace"); // ugly
71 //      QFont font("DejaVu Sans Mono"); // ugly
72         QFont font("Hack");
73         font.setPixelSize(10);
74         font.setWeight(QFont::Normal);
75         font.setHintingPreference(QFont::PreferFullHinting);
76         font.setStyleHint(QFont::Monospace);
77         painter.setFont(font);
78
79         QColor color[6] = {
80                 QColor(0x74, 0xC1, 0x60, 0xFF),         // Green
81                 QColor(0xFA, 0xC3, 0x48, 0xFF),         // Yellow
82                 QColor(0xE4, 0x4D, 0x54, 0xFF),         // Red
83                 QColor(0xD6, 0xDC, 0xD7, 0xFF),         // Grey
84                 QColor(0x3A, 0x3B, 0x3A, 0xFF),         // Dk. Grey
85                 QColor(0xE9, 0xE9, 0xE3, 0xFF)          // Lt. Grey
86         };
87
88         QBrush brush[6] = {
89                 QBrush(color[0]),
90                 QBrush(color[1]),
91                 QBrush(color[2]),
92                 QBrush(color[3]),
93                 QBrush(color[4]),
94                 QBrush(color[5])
95         };
96
97         QPen pen1[6] = {
98                 QPen(color[0], 1.0),
99                 QPen(color[1], 1.0),
100                 QPen(color[2], 1.0),
101                 QPen(color[3], 1.0),
102                 QPen(color[4]),
103                 QPen(color[5])
104         };
105
106         QPen pen2[6] = {
107                 QPen(color[0], 2.0),
108                 QPen(color[1], 2.0),
109                 QPen(color[2], 2.0),
110                 QPen(color[3], 2.0),
111                 QPen(color[4], 2.0),
112                 QPen(color[5], 2.0)
113         };
114
115         QPolygonF poly[4];
116         poly[0] << QPointF(-0.5, -0.5) << QPointF(18.5, -0.5) << QPointF(18.5, 17.5) << QPointF(-0.5, 26.5);
117         poly[1] << QPointF(6, 30) << QPointF(19, 24) << QPointF(19, 47) << QPointF(6, 53);
118         poly[2] << QPointF(6, 58) << QPointF(19, 52) << QPointF(19, 75) << QPointF(6, 81);
119         poly[3] << QPointF(6, 86) << QPointF(19, 80) << QPointF(19, 107) << QPointF(6, 107);
120
121         QPointF start(70.0, 62.0);
122
123         // Draw disk track data image
124         painter.drawImage(QRect(922, 8, 326, 326), diskImg->scaled(326, 326, Qt::KeepAspectRatio, Qt::SmoothTransformation));
125
126         // Draw quarter track legend
127         QRectF qtl = QRectF(start.x() - 29.0, start.y(), 29.0, 24.0);
128         painter.setPen(pen1[dkGrey]);
129         painter.drawText(qtl.translated(0.0, 0.0), Qt::AlignCenter, ".00");
130         painter.drawText(qtl.translated(0.0, 28.0), Qt::AlignCenter, ".25");
131         painter.drawText(qtl.translated(0.0, 56.0), Qt::AlignCenter, ".50");
132         painter.drawText(qtl.translated(0.0, 84.0), Qt::AlignCenter, ".75");
133
134         for(uint32_t i=0; i<36; i++)
135         {
136                 QRectF trkArc(start.x() + ((float)i * 24.0), 8.0, 326.0, 326.0);
137
138                 int trackColor = ColorForTrack(Global::trackStatus[i * 4]);
139
140                 painter.setPen(pen2[trackColor]);
141                 painter.drawLine(start.x() + (i * 24.0), start.y(), start.x() + (i * 24.0), start.y() + 112.0f);
142                 painter.drawArc(trkArc, 180 * 16, 45 * 16);
143
144                 painter.setPen(pen1[trackColor]);
145                 painter.setBrush(brush[trackColor]);
146                 painter.drawPolygon(poly[0].translated(start.x() + ((float)i * 24.0), start.y()));
147
148                 painter.setPen(pen1[dkGrey]);
149                 painter.drawText(start.x() + (i * 24.0), start.y() - 17.0, 20.0, 16.0, Qt::AlignCenter, QString("%1").arg((ushort)i, 2, 16, QChar('0')).toUpper());
150
151                 // Make sure we don't draw too many quarter tracks (e.g., none on 35)
152                 if (i == 35)
153                         continue;
154
155                 for(uint32_t j=1; j<4; j++)
156                 {
157                         trackColor = ColorForTrack(Global::trackStatus[(i * 4) + j]);
158
159                         painter.setBrush(brush[trackColor]);
160                         painter.setPen(pen1[trackColor]);
161                         painter.drawPolygon(poly[j].translated(69.5 + (i * 24.0), 61.5));
162                         painter.setPen(pen2[trackColor]);
163                         painter.drawArc(trkArc.translated(6 * j, 0), 181 * 16, 40 * 16);
164                 }
165         }
166 }
167
168
169 void DiskWidget::DrawDisk(void)
170 {
171         DiskDrawThread * ddt = new DiskDrawThread(this);
172         connect(ddt, &DiskDrawThread::ShowDisk, this, &DiskWidget::HandleUpdate);
173         connect(ddt, &DiskDrawThread::finished, ddt, &QObject::deleteLater);
174         ddt->StartRender(diskImg);
175
176         AnalysisThread * at = new AnalysisThread(this);
177         connect(at, &AnalysisThread::ShowTracks, this, &DiskWidget::HandleUpdate);
178         connect(at, &AnalysisThread::finished, at, &QObject::deleteLater);
179         at->StartAnalysis();
180 }
181
182
183 //
184 // Decode which track is being pointed at, and update everything
185 //
186 void DiskWidget::mousePressEvent(QMouseEvent * event)
187 {
188         if (event->button() == Qt::LeftButton)
189         {
190                 int32_t x = event->x(), y = event->y();
191
192                 if ((x >= 70) && (x <= 934) && (y >= 62) && (y <= 169))
193                 {
194                         int32_t startx = (x - 70) / 24;
195                         int32_t starty = (x <= 910 ? (y - 62) / 27 : 0);
196
197                         Global::trackNum = (startx * 4) + starty;
198                         emit(UpdateWaveform());
199                         emit(UpdateInfo());
200                 }
201
202                 event->accept();
203         }
204 }
205
206
207 void DiskWidget::mouseMoveEvent(QMouseEvent * event)
208 {
209         if (event->buttons() & Qt::LeftButton)
210         {
211                 event->accept();
212         }
213 }
214
215
216 void DiskWidget::mouseReleaseEvent(QMouseEvent * event)
217 {
218         if (event->button() == Qt::LeftButton)
219         {
220                 event->accept();
221         }
222 }
223
224
225 void DiskWidget::mouseDoubleClickEvent(QMouseEvent * event)
226 {
227         if (event->button() == Qt::LeftButton)
228         {
229                 event->accept();
230         }
231 }
232
233
234 void DiskWidget::keyPressEvent(QKeyEvent * event)
235 {
236         int key = event->key();
237
238         if (key == Qt::Key_Up)
239         {
240         }
241         else if (key == Qt::Key_Down)
242         {
243         }
244         else if (key == Qt::Key_Left)
245         {
246         }
247         else if (key == Qt::Key_Right)
248         {
249         }
250         else
251                 return;
252
253         // Only update if a key we recognize has been pressed!
254         update();
255 }
256
257
258 void DiskWidget::keyReleaseEvent(QKeyEvent * /*event*/)
259 {
260 }
261
262
263 void DiskWidget::resizeEvent(QResizeEvent * /*event*/)
264 {
265 //      ResizeGrid();
266 }
267