diff --git a/mainwindow.cpp b/mainwindow.cpp index 4df0278..ea31a29 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -836,10 +836,10 @@ void MainWindow::createStatusBar() statusBar()->addPermanentWidget(m_levelRadioButton[i]); } m_levelRadioButton[0]->toggle(); - connect(m_levelRadioButton[0], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(0); m_textWidget->update(); }); - connect(m_levelRadioButton[1], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(1); m_textWidget->update(); }); - connect(m_levelRadioButton[2], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(2); m_textWidget->update(); }); - connect(m_levelRadioButton[3], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(3); m_textWidget->update(); }); + connect(m_levelRadioButton[0], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(0); m_textWidget->update(); m_paletteDockWidget->setLevel3p5Accepted(false); }); + connect(m_levelRadioButton[1], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(1); m_textWidget->update(); m_paletteDockWidget->setLevel3p5Accepted(false);}); + connect(m_levelRadioButton[2], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(2); m_textWidget->update(); m_paletteDockWidget->setLevel3p5Accepted(false);}); + connect(m_levelRadioButton[3], &QAbstractButton::clicked, [=]() { m_textWidget->pageDecode()->setLevel(3); m_textWidget->update(); m_paletteDockWidget->setLevel3p5Accepted(true);}); statusBar()->showMessage(tr("Ready")); } @@ -952,6 +952,8 @@ void MainWindow::loadFile(const QString &fileName) levelSeen = m_textWidget->document()->levelRequired(); m_levelRadioButton[levelSeen]->toggle(); m_textWidget->pageDecode()->setLevel(levelSeen); + if (levelSeen == 3) + m_paletteDockWidget->setLevel3p5Accepted(true); updatePageWidgets(); QApplication::restoreOverrideCursor(); diff --git a/palettedockwidget.cpp b/palettedockwidget.cpp index 956befc..1c00f38 100644 --- a/palettedockwidget.cpp +++ b/palettedockwidget.cpp @@ -39,6 +39,9 @@ PaletteDockWidget::PaletteDockWidget(TeletextWidget *parent): QDockWidget(parent m_parentMainWidget = parent; + m_level3p5Accepted = false; // true when Level 3.5 radio button is checked in main window + m_level3p5Seen = false; // true when CLUT 0 or 1 is redefined + this->setObjectName("PaletteDockWidget"); this->setWindowTitle("Palette"); for (int c=0; c<=7; c++) @@ -57,6 +60,9 @@ PaletteDockWidget::PaletteDockWidget(TeletextWidget *parent): QDockWidget(parent connect(m_colourButton[i], &QAbstractButton::clicked, [=]() { selectColour(i); }); } } + + updateLevel3p5Cursor(); + m_showHexValuesCheckBox = new QCheckBox(tr("Show colour hex values")); paletteGridLayout->addWidget(m_showHexValuesCheckBox, 5, 1, 1, 8); connect(m_showHexValuesCheckBox, &QCheckBox::stateChanged, this, &PaletteDockWidget::updateAllColourButtons); @@ -70,26 +76,34 @@ void PaletteDockWidget::updateColourButton(int colourIndex) { if (colourIndex == 8) return; + QString colourString = QString("%1").arg(m_parentMainWidget->document()->currentSubPage()->CLUT(colourIndex), 3, 16, QChar('0')); if (m_showHexValuesCheckBox->isChecked()) m_colourButton[colourIndex]->setText(colourString); else m_colourButton[colourIndex]->setText(nullptr); - // Set text itself to black or white so it can be seen over background colour - http://alienryderflex.com/hsp.html int r = m_parentMainWidget->document()->currentSubPage()->CLUT(colourIndex) >> 8; int g = (m_parentMainWidget->document()->currentSubPage()->CLUT(colourIndex) >> 4) & 0xf; int b = m_parentMainWidget->document()->currentSubPage()->CLUT(colourIndex) & 0xf; + // Set text itself to black or white so it can be seen over background colour - http://alienryderflex.com/hsp.html char blackOrWhite = (sqrt(r*r*0.299 + g*g*0.587 + b*b*0.114) > 7.647) ? '0' : 'f'; QString qss = QString("background-color: #%1; color: #%2%2%2; border: none").arg(colourString).arg(blackOrWhite); m_colourButton[colourIndex]->setStyleSheet(qss); - if (m_parentMainWidget->document()->currentSubPage()->isPaletteDefault(colourIndex)) - // Default colour was set, disable Reset button if all colours in row are default as well - m_resetButton[colourIndex>>3]->setEnabled(!m_parentMainWidget->document()->currentSubPage()->isPaletteDefault(colourIndex & 0x18, colourIndex | 0x07)); - else - m_resetButton[colourIndex>>3]->setEnabled(true); + if (m_parentMainWidget->document()->currentSubPage()->isPaletteDefault(colourIndex)) { + // Default colour was set, disable Reset button if all colours in a CLUT row are default as well + m_resetButton[colourIndex >> 3]->setEnabled(!m_parentMainWidget->document()->currentSubPage()->isPaletteDefault(colourIndex & 0x18, colourIndex | 0x07)); + // Check if CLUTs 0 and 1 are all default if necessary + if (colourIndex < 16 && m_parentMainWidget->document()->currentSubPage()->isPaletteDefault(0, 15)) + setLevel3p5Seen(false); + } else { + // Custom colour was set, enable Reset button for that CLUT + m_resetButton[colourIndex >> 3]->setEnabled(true); + if (colourIndex < 16) + setLevel3p5Seen(true); + } } void PaletteDockWidget::updateAllColourButtons() @@ -98,6 +112,41 @@ void PaletteDockWidget::updateAllColourButtons() updateColourButton(i); } +void PaletteDockWidget::setLevel3p5Accepted(bool b) +{ + if (b == m_level3p5Accepted) + return; + + m_level3p5Accepted = b; + + updateLevel3p5Cursor(); +} + +void PaletteDockWidget::setLevel3p5Seen(bool b) +{ + if (b == m_level3p5Seen) + return; + + m_level3p5Seen = b; + + updateLevel3p5Cursor(); +} + +void PaletteDockWidget::updateLevel3p5Cursor() +{ + const Qt::CursorShape cursor = (m_level3p5Accepted || m_level3p5Seen) ? Qt::ArrowCursor : Qt::ForbiddenCursor; + + if (m_colourButton[0]->cursor() == cursor) + return; + + for (int i=0; i<16; i++) { + if (i == 8) + continue; + + m_colourButton[i]->setCursor(cursor); + } +} + void PaletteDockWidget::showEvent(QShowEvent *event) { Q_UNUSED(event); @@ -106,6 +155,9 @@ void PaletteDockWidget::showEvent(QShowEvent *event) void PaletteDockWidget::selectColour(int colourIndex) { + if (colourIndex < 16 && !m_level3p5Accepted && !m_level3p5Seen) + return; + const QColor newColour = QColorDialog::getColor(m_parentMainWidget->document()->currentSubPage()->CLUTtoQColor(colourIndex), this, "Select Colour"); if (newColour.isValid()) diff --git a/palettedockwidget.h b/palettedockwidget.h index e8b23ee..8f2729e 100644 --- a/palettedockwidget.h +++ b/palettedockwidget.h @@ -36,18 +36,22 @@ public: public slots: void updateColourButton(int); + void setLevel3p5Accepted(bool); protected: void showEvent(QShowEvent *); private slots: void selectColour(int); + void setLevel3p5Seen(bool); + void updateLevel3p5Cursor(); private: void resetCLUT(int); QPushButton *m_colourButton[32], *m_resetButton[4]; QCheckBox *m_showHexValuesCheckBox; + bool m_level3p5Accepted, m_level3p5Seen; TeletextWidget *m_parentMainWidget; };