playfield.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "playfield.h"
  2. #include <QPainter>
  3. inline QString errorStr(Error error) {
  4. switch(error) {
  5. case NoError: return QObject::tr("-");
  6. case EliminationTrigger: return QObject::tr("Elimination Trigger released");
  7. case DataHunger: return QObject::tr("Data Hunger (Bank 1 empty and executed)");
  8. case DivisionByZero: return QObject::tr("Division by zero");
  9. case InvalidBankNumber: return QObject::tr("Invalid bank number (e.g. in TRANS or BJUMP)");
  10. case HigherInstructionSetRequired: return QObject::tr("Higher Instruction Set required");
  11. case MobilityRequired: return QObject::tr("Mobility required");
  12. case DieExecuted: return QObject::tr("DIE executed");
  13. case InvalidParameter: return QObject::tr("Invalid parameter (e.g. CREATE x, -1, x)");
  14. case Unemployment: return QObject::tr("No more tasks left in a robot (Unemployment)");
  15. case InstructionDurationTooHigh: return QObject::tr("Instruction duration too high (i.e. > MaxInstrDur)");
  16. }
  17. }
  18. Playfield::Playfield(Simulator& simulator, QWidget *parent)
  19. : QWidget(parent)
  20. , simulator(simulator)
  21. {
  22. }
  23. void Playfield::paintEvent(QPaintEvent* event) {
  24. QPainter painter(this);
  25. int w = qMin(width(), height()) / FIELDS_XY;
  26. int h = qMin(width(), height()) / FIELDS_XY;
  27. for(int y = 0; y < FIELDS_XY; ++y) {
  28. for(int x = 0; x < FIELDS_XY; ++x) {
  29. int xx = x * w;
  30. int yy = y * w;
  31. painter.setPen(Qt::black);
  32. painter.setBrush(Qt::gray);
  33. painter.drawRect(QRect(xx, yy,w, h));
  34. }
  35. }
  36. for (auto& program : simulator.programs) {
  37. if(program.error != NoError) {
  38. continue;
  39. }
  40. int xx = program.position.x * w;
  41. int yy = program.position.y * w;
  42. painter.setPen(QPen(program.color, 3));
  43. painter.setBrush(Qt::NoBrush);
  44. QRect rect(xx, yy,w+1, h+1);
  45. painter.drawEllipse(rect.center(), w/2.3, h/2.3);
  46. auto& taskIndex = program.taskIndex;
  47. if(program.tasks.empty()) {
  48. continue;
  49. }
  50. taskIndex += 1;
  51. taskIndex %= program.tasks.size();
  52. if (taskIndex < program.tasks.size()) {
  53. auto& task = program.tasks[taskIndex];
  54. switch(task.direction) {
  55. case Right: painter.drawLine(rect.center(), QPoint(rect.right(), rect.center().y())); break;
  56. case Down: painter.drawLine(rect.center(), QPoint(rect.center().x(), rect.bottom())); break;
  57. case Left: painter.drawLine(rect.center(), QPoint(rect.left(), rect.center().y())); break;
  58. case Up: painter.drawLine(rect.center(), QPoint(rect.center().x(), rect.top())); break;
  59. }
  60. // painter.drawText(rect, QString("%1:%2:%3").arg(program.banks.size()).arg(task.bankIndex).arg(task.instIndex));
  61. }
  62. }
  63. }