diff --git a/mainwidget.cpp b/mainwidget.cpp index b9410d0..d36b760 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -50,7 +51,6 @@ TeletextWidget::TeletextWidget(QFrame *parent) : QFrame(parent) m_pageRender.setTeletextPage(m_levelOnePage); m_insertMode = false; m_selectionInProgress = false; - m_grid = false; setFocusPolicy(Qt::StrongFocus); m_flashTiming = m_flashPhase = 0; connect(&m_pageRender, &TeletextPageRender::flashChanged, this, &TeletextWidget::updateFlashTimer); @@ -161,14 +161,6 @@ void TeletextWidget::toggleMix(bool mixOn) update(); } -void TeletextWidget::toggleGrid(bool gridOn) -{ - m_grid = gridOn; - m_pageRender.setGrid(gridOn); - m_pageRender.renderPage(); - update(); -} - void TeletextWidget::setControlBit(int bitNumber, bool active) { m_levelOnePage->setControlBit(bitNumber, active); @@ -480,7 +472,12 @@ void TeletextWidget::focusOutEvent(QFocusEvent *event) LevelOneScene::LevelOneScene(QWidget *levelOneWidget, QObject *parent) : QGraphicsScene(parent) { + m_grid = false; + + // These dimensions are scratch, setBorderDimensions will get called straight away to adjust them setSceneRect(0, 0, 600, 288); + + // Full screen colours m_fullScreenTopRectItem = new QGraphicsRectItem(0, 0, 600, 19); m_fullScreenTopRectItem->setPen(Qt::NoPen); m_fullScreenTopRectItem->setBrush(QBrush(QColor(0, 0, 0))); @@ -490,6 +487,7 @@ LevelOneScene::LevelOneScene(QWidget *levelOneWidget, QObject *parent) : QGraphi m_fullScreenBottomRectItem->setBrush(QBrush(QColor(0, 0, 0))); addItem(m_fullScreenBottomRectItem); + // Full row colours for (int r=0; r<25; r++) { m_fullRowLeftRectItem[r] = new QGraphicsRectItem(0, 19+r*10, 60, 10); m_fullRowLeftRectItem[r]->setPen(Qt::NoPen); @@ -501,16 +499,43 @@ LevelOneScene::LevelOneScene(QWidget *levelOneWidget, QObject *parent) : QGraphi addItem(m_fullRowRightRectItem[r]); } + // Main text widget m_levelOneProxyWidget = addWidget(levelOneWidget); m_levelOneProxyWidget->setPos(60, 19); m_levelOneProxyWidget->setAutoFillBackground(false); + + // Optional grid overlay for text widget + m_mainGridItemGroup = new QGraphicsItemGroup; + m_mainGridItemGroup->setVisible(false); + addItem(m_mainGridItemGroup); + // Additional vertical pieces of grid for side panels + for (int i=0; i<32; i++) { + m_sidePanelGridNeeded[i] = false; + m_sidePanelGridItemGroup[i] = new QGraphicsItemGroup; + m_sidePanelGridItemGroup[i]->setVisible(false); + addItem(m_sidePanelGridItemGroup[i]); + } + for (int r=1; r<25; r++) { + for (int c=0; c<40; c++) { + QGraphicsRectItem *gridPiece = new QGraphicsRectItem(c*12, r*10, 12, 10); + gridPiece->setPen(QPen(QBrush(QColor(128, 128, 128, r<24 ? 192 : 128)), 0)); + m_mainGridItemGroup->addToGroup(gridPiece); + } + + if (r < 24) + for (int c=0; c<32; c++) { + QGraphicsRectItem *gridPiece = new QGraphicsRectItem(0, r*10, 12, 10); + gridPiece->setPen(QPen(QBrush(QColor(128, 128, 128, 64)), 0)); + m_sidePanelGridItemGroup[c]->addToGroup(gridPiece); + } + } } -void LevelOneScene::setDimensions(int sceneWidth, int sceneHeight, int widgetWidth) +void LevelOneScene::setBorderDimensions(int sceneWidth, int sceneHeight, int widgetWidth, int leftSidePanelColumns, int rightSidePanelColumns) { setSceneRect(0, 0, sceneWidth, sceneHeight); - // Assume widget height is always 250 + // Assume text widget height is always 250 int topBottomBorders = (sceneHeight-250) / 2; // Ideally we'd use m_levelOneProxyWidget->size() to discover the widget width ourselves // but this causes a stubborn segfault, so we have to receive the widgetWidth as a parameter @@ -518,15 +543,48 @@ void LevelOneScene::setDimensions(int sceneWidth, int sceneHeight, int widgetWid m_levelOneProxyWidget->setPos(leftRightBorders, topBottomBorders); + // Position grid to cover central 40 columns + m_mainGridItemGroup->setPos(leftRightBorders + leftSidePanelColumns*12, topBottomBorders); + // Grid for right side panel + for (int c=0; c<16; c++) + if (rightSidePanelColumns > c) { + m_sidePanelGridItemGroup[c]->setPos(leftRightBorders + leftSidePanelColumns*12 + 480 + c*12, topBottomBorders); + m_sidePanelGridItemGroup[c]->setVisible(m_grid); + m_sidePanelGridNeeded[c] = true; + } else { + m_sidePanelGridItemGroup[c]->setVisible(false); + m_sidePanelGridNeeded[c] = false; + } + // Grid for left side panel + for (int c=0; c<16; c++) + if (c < leftSidePanelColumns) { + m_sidePanelGridItemGroup[31-c]->setPos(leftRightBorders + (leftSidePanelColumns-c-1)*12, topBottomBorders); + m_sidePanelGridItemGroup[31-c]->setVisible(m_grid); + m_sidePanelGridNeeded[31-c] = true; + } else { + m_sidePanelGridItemGroup[31-c]->setVisible(false); + m_sidePanelGridNeeded[31-c] = false; + } + + // Full screen colours m_fullScreenTopRectItem->setRect(0, 0, sceneWidth, topBottomBorders); m_fullScreenBottomRectItem->setRect(0, 250+topBottomBorders, sceneWidth, topBottomBorders); - + // Full row colours for (int r=0; r<25; r++) { m_fullRowLeftRectItem[r]->setRect(0, topBottomBorders+r*10, leftRightBorders+1, 10); m_fullRowRightRectItem[r]->setRect(sceneWidth-leftRightBorders-1, topBottomBorders+r*10, leftRightBorders+1, 10); } } +void LevelOneScene::toggleGrid(bool gridOn) +{ + m_grid = gridOn; + m_mainGridItemGroup->setVisible(gridOn); + for (int i=0; i<32; i++) + if (m_sidePanelGridNeeded[i]) + m_sidePanelGridItemGroup[i]->setVisible(gridOn); +} + void LevelOneScene::setFullScreenColour(const QColor &newColor) { m_fullScreenTopRectItem->setBrush(QBrush(newColor)); diff --git a/mainwidget.h b/mainwidget.h index 3bee553..32bcf4c 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -62,7 +63,6 @@ public slots: void refreshPage(); void toggleReveal(bool); void toggleMix(bool); - void toggleGrid(bool); void updateFlashTimer(int); void refreshRow(int); @@ -91,14 +91,12 @@ protected: private: TeletextDocument* m_teletextDocument; LevelOnePage* m_levelOnePage; - bool m_insertMode, m_grid, m_selectionInProgress; + bool m_insertMode, m_selectionInProgress; QBasicTimer m_flashTimer; int m_flashTiming, m_flashPhase; void timerEvent(QTimerEvent *event) override; - void calculateDimensions(); - QPair mouseToRowAndColumn(const QPoint &); }; @@ -108,9 +106,10 @@ class LevelOneScene : public QGraphicsScene public: LevelOneScene(QWidget *, QObject *parent = nullptr); - void setDimensions(int, int, int); + void setBorderDimensions(int, int, int, int, int); public slots: + void toggleGrid(bool); void setFullScreenColour(const QColor &); void setFullRowColour(int, const QColor &); @@ -118,6 +117,8 @@ private: QGraphicsRectItem *m_fullScreenTopRectItem, *m_fullScreenBottomRectItem; QGraphicsRectItem *m_fullRowLeftRectItem[25], *m_fullRowRightRectItem[25]; QGraphicsProxyWidget *m_levelOneProxyWidget; + QGraphicsItemGroup *m_mainGridItemGroup, *m_sidePanelGridItemGroup[32]; + bool m_grid, m_sidePanelGridNeeded[32]; }; #endif diff --git a/mainwindow.cpp b/mainwindow.cpp index c706a1b..64363ff 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -157,13 +157,13 @@ void MainWindow::init() m_paletteDockWidget = new PaletteDockWidget(m_textWidget); addDockWidget(Qt::RightDockWidgetArea, m_paletteDockWidget); + m_textScene = new LevelOneScene(m_textWidget, this); + createActions(); createStatusBar(); readSettings(); - m_textScene = new LevelOneScene(m_textWidget, this); - m_textView = new QGraphicsView(this); m_textView->setScene(m_textScene); m_textView->setRenderHints(QPainter::SmoothPixmapTransform); @@ -374,7 +374,7 @@ void MainWindow::createActions() gridAct->setCheckable(true); gridAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_G)); gridAct->setStatusTip(tr("Toggle the text grid")); - connect(gridAct, &QAction::toggled, m_textWidget, &TeletextWidget::toggleGrid); + connect(gridAct, &QAction::toggled, m_textScene, &LevelOneScene::toggleGrid); QAction *showCodesAct = viewMenu->addAction(tr("Show codes")); showCodesAct->setCheckable(true); @@ -568,7 +568,7 @@ void MainWindow::setSceneDimensions() else newSceneWidth = m_textWidget->width() + leftRightBorders[m_viewBorder]*2; - m_textScene->setDimensions(newSceneWidth, 250+topBottomBorders[m_viewBorder]*2, m_textWidget->width()); + m_textScene->setBorderDimensions(newSceneWidth, 250+topBottomBorders[m_viewBorder]*2, m_textWidget->width(), m_textWidget->pageRender()->leftSidePanelColumns(), m_textWidget->pageRender()->rightSidePanelColumns()); m_textView->setTransform(QTransform((1+(float)m_viewZoom/2)*aspectRatioHorizontalScaling[m_viewAspectRatio], 0, 0, 1+(float)m_viewZoom/2, 0, 0)); } diff --git a/render.cpp b/render.cpp index 9bb6b0b..30793fb 100644 --- a/render.cpp +++ b/render.cpp @@ -34,7 +34,7 @@ TeletextPageRender::TeletextPageRender() for (int i=0; i<6; i++) m_pagePixmap[i] = new QPixmap(864, 250); m_pagePixmap[0]->fill(Qt::transparent); - m_grid = m_mix = m_reveal = m_showCodes = false; + m_mix = m_reveal = m_showCodes = false; m_renderLevel = 0; m_flashRequired = 0; m_finalFullScreenColour = 0; @@ -92,7 +92,6 @@ void TeletextPageRender::setRenderLevel(int newRenderLevel) renderPage(); } -void TeletextPageRender::setGrid(bool newGrid) { m_grid = newGrid; } void TeletextPageRender::setShowCodes(bool newShowCodes) { m_showCodes = newShowCodes; @@ -360,12 +359,6 @@ void TeletextPageRender::renderPage(int r) else pixmapPainter.drawRect(c*12, r*10+18, charWidth-1, 1); } - - if (m_grid) { - pixmapPainter.setPen(QColor(128, 128, 128, (c <= 39) ? 192 : 64)); - pixmapPainter.drawRect(c*12, r*10, 11, 9); - } - }; pixmapPainter.begin(m_pagePixmap[0]); diff --git a/render.h b/render.h index f6a7342..9700395 100644 --- a/render.h +++ b/render.h @@ -217,7 +217,7 @@ protected: int m_finalFullScreenColour, m_renderLevel; QColor m_finalFullScreenQColor; int m_leftSidePanelColumns, m_rightSidePanelColumns; - bool m_reveal, m_mix, m_grid, m_showCodes; + bool m_reveal, m_mix, m_showCodes; Level1Layer m_level1Layer; std::vector m_textLayer; const int m_foregroundRemap[8] = { 0, 0, 0, 8, 8, 16, 16, 16 };