Auto-select level when loading

This commit is contained in:
G.K.MacGregor
2020-12-20 19:38:23 +00:00
parent c5d92eaf8a
commit 377470da47
6 changed files with 95 additions and 13 deletions

View File

@@ -225,3 +225,16 @@ void TeletextDocument::cancelSelection()
{ {
m_selectionSubPage = nullptr; m_selectionSubPage = nullptr;
} }
int TeletextDocument::levelRequired() const
{
int levelSeen = 0;
for (auto &subPage : m_subPages) {
levelSeen = qMax(levelSeen, subPage->levelRequired());
if (levelSeen == 3)
break;
}
return levelSeen;
}

View File

@@ -78,6 +78,7 @@ public:
bool selectionActive() const { return m_selectionSubPage == currentSubPage(); } bool selectionActive() const { return m_selectionSubPage == currentSubPage(); }
void setSelection(int, int, int, int); void setSelection(int, int, int, int);
void cancelSelection(); void cancelSelection();
int levelRequired() const;
signals: signals:
void cursorMoved(); void cursorMoved();

View File

@@ -446,6 +446,67 @@ bool LevelOnePage::isPaletteDefault(int fromColour, int toColour) const
return true; return true;
} }
int LevelOnePage::levelRequired() const
{
if (!isPaletteDefault(0, 15))
return 3;
// TODO Check for X/28/1 for DCLUT for mode 1-3 DRCS characters - return 3
int levelSeen = (!isPaletteDefault(16,31) || m_leftSidePanelDisplayed || m_rightSidePanelDisplayed || m_defaultScreenColour !=0 || m_defaultRowColour !=0 || m_blackBackgroundSubst || m_colourTableRemap !=0 || m_defaultCharSet != 0 || m_secondCharSet != 0xf) ? 2 : 0;
if (localEnhance.isEmpty())
return levelSeen;
for (int i=0; i<localEnhance.size(); i++) {
if (localEnhance.at(i).modeExt() == 0x2e) // Font style
return 3;
if (levelSeen == 0)
// Check for Level 1.5 triplets
switch (localEnhance.at(i).modeExt()) {
case 0x04: // Set Active Position
case 0x07: // Address Row 0
case 0x1f: // Termination
case 0x22: // G3 character @ Level 1.5
case 0x2f: // G2 character
case 0x30 ... 0x3f: // G0 character with diacritical
levelSeen = qMax(levelSeen, 1);
break;
}
if (levelSeen < 2)
switch (localEnhance.at(i).modeExt()) {
// Check for Level 2.5 triplets
case 0x00: // Full screen colour
case 0x01: // Full row colour
case 0x10 ... 0x13: // Origin Modifer and Object Invocation
case 0x15 ... 0x17: // Object Definition
// Check if Object Defition is required only at Level 3.5
if ((localEnhance.at(i).address() & 0x18) == 0x10)
return 3;
else
levelSeen = qMax(levelSeen, 2);
break;
case 0x18: // DRCS Mode
// Check if DRCS is required only at Level 3.5
if ((localEnhance.at(i).data() & 0x30) == 0x20)
return 3;
else
levelSeen = qMax(levelSeen, 2);
break;
case 0x20: // Foreground colour
case 0x21: // G1 character
case 0x23: // Background colour
case 0x27 ... 0x29: // Flash functions, G0 and G2 charset designation, G0 character @ Level 2.5
case 0x2b ... 0x2d: // G3 character @ Level 2.5, display attributes, DRCS character
levelSeen = qMax(levelSeen, 2);
break;
}
}
return levelSeen;
}
void LevelOnePage::setLeftSidePanelDisplayed(bool newLeftSidePanelDisplayed) { m_leftSidePanelDisplayed = newLeftSidePanelDisplayed; } void LevelOnePage::setLeftSidePanelDisplayed(bool newLeftSidePanelDisplayed) { m_leftSidePanelDisplayed = newLeftSidePanelDisplayed; }
void LevelOnePage::setRightSidePanelDisplayed(bool newRightSidePanelDisplayed) { m_rightSidePanelDisplayed = newRightSidePanelDisplayed; } void LevelOnePage::setRightSidePanelDisplayed(bool newRightSidePanelDisplayed) { m_rightSidePanelDisplayed = newRightSidePanelDisplayed; }
void LevelOnePage::setSidePanelColumns(int newSidePanelColumns) { m_sidePanelColumns = newSidePanelColumns; } void LevelOnePage::setSidePanelColumns(int newSidePanelColumns) { m_sidePanelColumns = newSidePanelColumns; }

View File

@@ -83,6 +83,7 @@ public:
void setCLUT(int, int); void setCLUT(int, int);
bool isPaletteDefault(int) const; bool isPaletteDefault(int) const;
bool isPaletteDefault(int, int) const; bool isPaletteDefault(int, int) const;
int levelRequired() const;
bool leftSidePanelDisplayed() const { return m_leftSidePanelDisplayed; } bool leftSidePanelDisplayed() const { return m_leftSidePanelDisplayed; }
void setLeftSidePanelDisplayed(bool); void setLeftSidePanelDisplayed(bool);
bool rightSidePanelDisplayed() const { return m_rightSidePanelDisplayed; } bool rightSidePanelDisplayed() const { return m_rightSidePanelDisplayed; }

View File

@@ -629,19 +629,19 @@ void MainWindow::createStatusBar()
statusBar()->addPermanentWidget(new QLabel("Level")); statusBar()->addPermanentWidget(new QLabel("Level"));
QRadioButton *level1 = new QRadioButton("1"); m_levelRadioButton[0] = new QRadioButton("1");
QRadioButton *level15 = new QRadioButton("1.5"); m_levelRadioButton[1] = new QRadioButton("1.5");
QRadioButton *level25 = new QRadioButton("2.5"); m_levelRadioButton[2] = new QRadioButton("2.5");
QRadioButton *level35 = new QRadioButton("3.5"); m_levelRadioButton[3] = new QRadioButton("3.5");
statusBar()->addPermanentWidget(level1); statusBar()->addPermanentWidget(m_levelRadioButton[0]);
statusBar()->addPermanentWidget(level15); statusBar()->addPermanentWidget(m_levelRadioButton[1]);
statusBar()->addPermanentWidget(level25); statusBar()->addPermanentWidget(m_levelRadioButton[2]);
statusBar()->addPermanentWidget(level35); statusBar()->addPermanentWidget(m_levelRadioButton[3]);
level1->toggle(); m_levelRadioButton[0]->toggle();
connect(level1, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(0); m_textWidget->update(); }); connect(m_levelRadioButton[0], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(0); m_textWidget->update(); });
connect(level15, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(1); m_textWidget->update(); }); connect(m_levelRadioButton[1], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(1); m_textWidget->update(); });
connect(level25, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(2); m_textWidget->update(); }); connect(m_levelRadioButton[2], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(2); m_textWidget->update(); });
connect(level35, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(3); m_textWidget->update(); }); connect(m_levelRadioButton[3], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(3); m_textWidget->update(); });
statusBar()->showMessage(tr("Ready")); statusBar()->showMessage(tr("Ready"));
} }
@@ -717,6 +717,8 @@ bool MainWindow::maybeSave()
void MainWindow::loadFile(const QString &fileName) void MainWindow::loadFile(const QString &fileName)
{ {
int levelSeen;
QFile file(fileName); QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) { if (!file.open(QFile::ReadOnly | QFile::Text)) {
QMessageBox::warning(this, tr("QTeletextMaker"), tr("Cannot read file %1:\n%2.").arg(QDir::toNativeSeparators(fileName), file.errorString())); QMessageBox::warning(this, tr("QTeletextMaker"), tr("Cannot read file %1:\n%2.").arg(QDir::toNativeSeparators(fileName), file.errorString()));
@@ -726,6 +728,9 @@ void MainWindow::loadFile(const QString &fileName)
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
loadTTI(&file, m_textWidget->document()); loadTTI(&file, m_textWidget->document());
levelSeen = m_textWidget->document()->levelRequired();
m_levelRadioButton[levelSeen]->toggle();
m_textWidget->pageRender()->setRenderLevel(levelSeen);
updatePageWidgets(); updatePageWidgets();
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();

View File

@@ -115,6 +115,7 @@ private:
QLabel *m_subPageLabel, *m_cursorPositionLabel; QLabel *m_subPageLabel, *m_cursorPositionLabel;
QToolButton *m_previousSubPageButton, *m_nextSubPageButton; QToolButton *m_previousSubPageButton, *m_nextSubPageButton;
QRadioButton *m_levelRadioButton[4];
QString m_curFile; QString m_curFile;
bool m_isUntitled; bool m_isUntitled;