Auto-select level when loading
This commit is contained in:
13
document.cpp
13
document.cpp
@@ -225,3 +225,16 @@ void TeletextDocument::cancelSelection()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -78,6 +78,7 @@ public:
|
||||
bool selectionActive() const { return m_selectionSubPage == currentSubPage(); }
|
||||
void setSelection(int, int, int, int);
|
||||
void cancelSelection();
|
||||
int levelRequired() const;
|
||||
|
||||
signals:
|
||||
void cursorMoved();
|
||||
|
||||
@@ -446,6 +446,67 @@ bool LevelOnePage::isPaletteDefault(int fromColour, int toColour) const
|
||||
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::setRightSidePanelDisplayed(bool newRightSidePanelDisplayed) { m_rightSidePanelDisplayed = newRightSidePanelDisplayed; }
|
||||
void LevelOnePage::setSidePanelColumns(int newSidePanelColumns) { m_sidePanelColumns = newSidePanelColumns; }
|
||||
|
||||
@@ -83,6 +83,7 @@ public:
|
||||
void setCLUT(int, int);
|
||||
bool isPaletteDefault(int) const;
|
||||
bool isPaletteDefault(int, int) const;
|
||||
int levelRequired() const;
|
||||
bool leftSidePanelDisplayed() const { return m_leftSidePanelDisplayed; }
|
||||
void setLeftSidePanelDisplayed(bool);
|
||||
bool rightSidePanelDisplayed() const { return m_rightSidePanelDisplayed; }
|
||||
|
||||
@@ -629,19 +629,19 @@ void MainWindow::createStatusBar()
|
||||
|
||||
statusBar()->addPermanentWidget(new QLabel("Level"));
|
||||
|
||||
QRadioButton *level1 = new QRadioButton("1");
|
||||
QRadioButton *level15 = new QRadioButton("1.5");
|
||||
QRadioButton *level25 = new QRadioButton("2.5");
|
||||
QRadioButton *level35 = new QRadioButton("3.5");
|
||||
statusBar()->addPermanentWidget(level1);
|
||||
statusBar()->addPermanentWidget(level15);
|
||||
statusBar()->addPermanentWidget(level25);
|
||||
statusBar()->addPermanentWidget(level35);
|
||||
level1->toggle();
|
||||
connect(level1, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(0); m_textWidget->update(); });
|
||||
connect(level15, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(1); m_textWidget->update(); });
|
||||
connect(level25, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(2); m_textWidget->update(); });
|
||||
connect(level35, &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(3); m_textWidget->update(); });
|
||||
m_levelRadioButton[0] = new QRadioButton("1");
|
||||
m_levelRadioButton[1] = new QRadioButton("1.5");
|
||||
m_levelRadioButton[2] = new QRadioButton("2.5");
|
||||
m_levelRadioButton[3] = new QRadioButton("3.5");
|
||||
statusBar()->addPermanentWidget(m_levelRadioButton[0]);
|
||||
statusBar()->addPermanentWidget(m_levelRadioButton[1]);
|
||||
statusBar()->addPermanentWidget(m_levelRadioButton[2]);
|
||||
statusBar()->addPermanentWidget(m_levelRadioButton[3]);
|
||||
m_levelRadioButton[0]->toggle();
|
||||
connect(m_levelRadioButton[0], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(0); m_textWidget->update(); });
|
||||
connect(m_levelRadioButton[1], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(1); m_textWidget->update(); });
|
||||
connect(m_levelRadioButton[2], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(2); m_textWidget->update(); });
|
||||
connect(m_levelRadioButton[3], &QAbstractButton::clicked, [=]() { m_textWidget->pageRender()->setRenderLevel(3); m_textWidget->update(); });
|
||||
statusBar()->showMessage(tr("Ready"));
|
||||
}
|
||||
|
||||
@@ -717,6 +717,8 @@ bool MainWindow::maybeSave()
|
||||
|
||||
void MainWindow::loadFile(const QString &fileName)
|
||||
{
|
||||
int levelSeen;
|
||||
|
||||
QFile file(fileName);
|
||||
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()));
|
||||
@@ -726,6 +728,9 @@ void MainWindow::loadFile(const QString &fileName)
|
||||
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
loadTTI(&file, m_textWidget->document());
|
||||
levelSeen = m_textWidget->document()->levelRequired();
|
||||
m_levelRadioButton[levelSeen]->toggle();
|
||||
m_textWidget->pageRender()->setRenderLevel(levelSeen);
|
||||
updatePageWidgets();
|
||||
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
@@ -115,6 +115,7 @@ private:
|
||||
|
||||
QLabel *m_subPageLabel, *m_cursorPositionLabel;
|
||||
QToolButton *m_previousSubPageButton, *m_nextSubPageButton;
|
||||
QRadioButton *m_levelRadioButton[4];
|
||||
|
||||
QString m_curFile;
|
||||
bool m_isUntitled;
|
||||
|
||||
Reference in New Issue
Block a user