2 // diskwidget.cpp: Disk display widget
4 // Part of the WOZ Maker project
6 // (C) 2018 Underground Software
9 #include "diskwidget.h"
10 #include "analysisthread.h"
11 #include "diskdrawthread.h"
16 enum { green = 0, yellow, red, grey, dkGrey, ltGrey };
19 static inline int ColorForTrack(uint8_t num)
42 DiskWidget::DiskWidget(QWidget * parent/*= 0*/): QWidget(parent)
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);
53 DiskWidget::~DiskWidget(void)
59 void DiskWidget::HandleUpdate(void)
65 void DiskWidget::paintEvent(QPaintEvent * /*event*/)
67 QPainter painter(this);
68 painter.setRenderHint(QPainter::Antialiasing);
70 // QFont font("Monospace"); // ugly
71 // QFont font("DejaVu Sans Mono"); // ugly
73 font.setPixelSize(10);
74 font.setWeight(QFont::Normal);
75 font.setHintingPreference(QFont::PreferFullHinting);
76 font.setStyleHint(QFont::Monospace);
77 painter.setFont(font);
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
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);
121 QPointF start(70.0, 62.0);
123 // Draw disk track data image
124 painter.drawImage(QRect(922, 8, 326, 326), diskImg->scaled(326, 326, Qt::KeepAspectRatio, Qt::SmoothTransformation));
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");
134 for(uint32_t i=0; i<36; i++)
136 QRectF trkArc(start.x() + ((float)i * 24.0), 8.0, 326.0, 326.0);
138 int trackColor = ColorForTrack(Global::trackStatus[i * 4]);
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);
144 painter.setPen(pen1[trackColor]);
145 painter.setBrush(brush[trackColor]);
146 painter.drawPolygon(poly[0].translated(start.x() + ((float)i * 24.0), start.y()));
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());
151 // Make sure we don't draw too many quarter tracks (e.g., none on 35)
155 for(uint32_t j=1; j<4; j++)
157 trackColor = ColorForTrack(Global::trackStatus[(i * 4) + j]);
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);
169 void DiskWidget::DrawDisk(void)
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);
176 AnalysisThread * at = new AnalysisThread(this);
177 connect(at, &AnalysisThread::ShowTracks, this, &DiskWidget::HandleUpdate);
178 connect(at, &AnalysisThread::finished, at, &QObject::deleteLater);
184 // Decode which track is being pointed at, and update everything
186 void DiskWidget::mousePressEvent(QMouseEvent * event)
188 if (event->button() == Qt::LeftButton)
190 int32_t x = event->x(), y = event->y();
192 if ((x >= 70) && (x <= 934) && (y >= 62) && (y <= 169))
194 int32_t startx = (x - 70) / 24;
195 int32_t starty = (x <= 910 ? (y - 62) / 27 : 0);
197 Global::trackNum = (startx * 4) + starty;
198 emit(UpdateWaveform());
207 void DiskWidget::mouseMoveEvent(QMouseEvent * event)
209 if (event->buttons() & Qt::LeftButton)
216 void DiskWidget::mouseReleaseEvent(QMouseEvent * event)
218 if (event->button() == Qt::LeftButton)
225 void DiskWidget::mouseDoubleClickEvent(QMouseEvent * event)
227 if (event->button() == Qt::LeftButton)
234 void DiskWidget::keyPressEvent(QKeyEvent * event)
236 int key = event->key();
238 if (key == Qt::Key_Up)
241 else if (key == Qt::Key_Down)
244 else if (key == Qt::Key_Left)
247 else if (key == Qt::Key_Right)
253 // Only update if a key we recognize has been pressed!
258 void DiskWidget::keyReleaseEvent(QKeyEvent * /*event*/)
263 void DiskWidget::resizeEvent(QResizeEvent * /*event*/)