diff --git a/document.cpp b/document.cpp index d68b708..d4fb4af 100644 --- a/document.cpp +++ b/document.cpp @@ -17,12 +17,46 @@ * along with QTeletextMaker. If not, see . */ +#include #include #include "document.h" #include "levelonepage.h" +ClutModel::ClutModel(QObject *parent): QAbstractListModel(parent) +{ + m_subPage = nullptr; +} + +int ClutModel::rowCount(const QModelIndex & /*parent*/) const +{ + return 32; +} + +QVariant ClutModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role == Qt::DisplayRole) + return QString("CLUT %1:%2").arg(index.row() >> 3).arg(index.row() & 0x07); + + if (role == Qt::DecorationRole && m_subPage != nullptr) + return m_subPage->CLUTtoQColor(index.row()); + + return QVariant(); +} + +void ClutModel::setSubPage(LevelOnePage *subPage) +{ + if (subPage != m_subPage) { + m_subPage = subPage; + emit dataChanged(createIndex(0, 0), createIndex(31, 0), QVector(Qt::DecorationRole)); + } +} + + TeletextDocument::TeletextDocument() { m_pageNumber = 0x199; @@ -36,10 +70,15 @@ TeletextDocument::TeletextDocument() m_cursorColumn = 0; m_selectionCornerRow = m_selectionCornerColumn = -1; m_selectionSubPage = nullptr; + + m_clutModel = new ClutModel; + m_clutModel->setSubPage(m_subPages[0]); } TeletextDocument::~TeletextDocument() { + delete m_clutModel; + for (auto &subPage : m_subPages) delete(subPage); for (auto &recycleSubPage : m_recycleSubPages) @@ -72,7 +111,10 @@ void TeletextDocument::selectSubPageIndex(int newSubPageIndex, bool forceRefresh // forceRefresh overrides "beyond the last subpage" check, so inserting a subpage after the last one still shows - dangerous workaround? if (forceRefresh || (newSubPageIndex != m_currentSubPageIndex && newSubPageIndex < m_subPages.size())) { emit aboutToChangeSubPage(); + m_currentSubPageIndex = newSubPageIndex; + + m_clutModel->setSubPage(m_subPages[m_currentSubPageIndex]); emit subPageSelected(); emit selectionMoved(); return; @@ -83,7 +125,10 @@ void TeletextDocument::selectSubPageNext() { if (m_currentSubPageIndex < m_subPages.size()-1) { emit aboutToChangeSubPage(); + m_currentSubPageIndex++; + + m_clutModel->setSubPage(m_subPages[m_currentSubPageIndex]); emit subPageSelected(); emit selectionMoved(); } @@ -93,7 +138,10 @@ void TeletextDocument::selectSubPagePrevious() { if (m_currentSubPageIndex > 0) { emit aboutToChangeSubPage(); + m_currentSubPageIndex--; + + m_clutModel->setSubPage(m_subPages[m_currentSubPageIndex]); emit subPageSelected(); emit selectionMoved(); } @@ -116,6 +164,8 @@ void TeletextDocument::insertSubPage(int beforeSubPageIndex, bool copySubPage) void TeletextDocument::deleteSubPage(int subPageToDelete) { + m_clutModel->setSubPage(nullptr); + delete(m_subPages[subPageToDelete]); m_subPages.erase(m_subPages.begin()+subPageToDelete); } diff --git a/document.h b/document.h index c22df18..d51552f 100644 --- a/document.h +++ b/document.h @@ -20,11 +20,28 @@ #ifndef DOCUMENT_H #define DOCUMENT_H +#include #include #include #include + #include "levelonepage.h" +class ClutModel : public QAbstractListModel +{ + Q_OBJECT + +public: + ClutModel(QObject *parent = 0); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + void setSubPage(LevelOnePage *page); + +private: + LevelOnePage *m_subPage; +}; + class TeletextDocument : public QObject { Q_OBJECT @@ -62,6 +79,7 @@ public: void setDescription(QString); void setFastTextLinkPageNumberOnAllSubPages(int, int); QUndoStack *undoStack() const { return m_undoStack; } + ClutModel *clutModel() const { return m_clutModel; } int cursorRow() const { return m_cursorRow; } int cursorColumn() const { return m_cursorColumn; } void cursorUp(bool shiftKey=false); @@ -104,6 +122,7 @@ private: QUndoStack *m_undoStack; int m_cursorRow, m_cursorColumn, m_selectionCornerRow, m_selectionCornerColumn; LevelOnePage *m_selectionSubPage; + ClutModel *m_clutModel; }; #endif diff --git a/pageenhancementsdockwidget.cpp b/pageenhancementsdockwidget.cpp index 60a2ffa..73d3bc7 100644 --- a/pageenhancementsdockwidget.cpp +++ b/pageenhancementsdockwidget.cpp @@ -47,12 +47,9 @@ PageEnhancementsDockWidget::PageEnhancementsDockWidget(TeletextWidget *parent): x28Layout->addWidget(new QLabel(tr("Default screen colour")), 0, 0, 1, 1); x28Layout->addWidget(new QLabel(tr("Default row colour")), 1, 0, 1, 1); m_defaultScreenColourCombo = new QComboBox; + m_defaultScreenColourCombo->setModel(m_parentMainWidget->document()->clutModel()); m_defaultRowColourCombo = new QComboBox; - for (int r=0; r<=3; r++) - for (int c=0; c<=7; c++) { - m_defaultScreenColourCombo->addItem(tr("CLUT %1:%2").arg(r).arg(c)); - m_defaultRowColourCombo->addItem(tr("CLUT %1:%2").arg(r).arg(c)); - } + m_defaultRowColourCombo->setModel(m_parentMainWidget->document()->clutModel()); x28Layout->addWidget(m_defaultScreenColourCombo, 0, 1, 1, 1, Qt::AlignTop); connect(m_defaultScreenColourCombo, QOverload::of(&QComboBox::currentIndexChanged), [=](int index){ m_parentMainWidget->setDefaultScreenColour(index); }); x28Layout->addWidget(m_defaultRowColourCombo, 1, 1, 1, 1, Qt::AlignTop); diff --git a/x26dockwidget.cpp b/x26dockwidget.cpp index 8520ce3..e17eeac 100644 --- a/x26dockwidget.cpp +++ b/x26dockwidget.cpp @@ -196,9 +196,7 @@ X26DockWidget::X26DockWidget(TeletextWidget *parent): QDockWidget(parent) QHBoxLayout *colourAndRowLayout = new QHBoxLayout; m_colourComboBox = new QComboBox; - for (int c=0; c<=3; c++) - for (int e=0; e<=7; e++) - m_colourComboBox->addItem(tr("CLUT %1:%2").arg(c).arg(e)); + m_colourComboBox->setModel(m_parentMainWidget->document()->clutModel()); colourAndRowLayout->addWidget(m_colourComboBox); connect(m_colourComboBox, QOverload::of(&QComboBox::activated), this, [=](const int value) { updateModelFromCookedWidget(value, Qt::UserRole+1); } ); diff --git a/x26model.cpp b/x26model.cpp index 52a8092..fb02d67 100644 --- a/x26model.cpp +++ b/x26model.cpp @@ -318,6 +318,17 @@ QVariant X26Model::data(const QModelIndex &index, int role) const if (role == Qt::DecorationRole && index.column() == 3) switch (triplet.modeExt()) { + case 0x00: // Full screen colour + case 0x20: // Foreground colour + case 0x23: // Background colour + if (!(triplet.data() & 0x60)) + return m_parentMainWidget->document()->currentSubPage()->CLUTtoQColor(triplet.data()); + break; + case 0x01: // Full row colour + case 0x07: // Address row 0 + if (((triplet.data() & 0x60) == 0x00) || ((triplet.data() & 0x60) == 0x60)) + return m_parentMainWidget->document()->currentSubPage()->CLUTtoQColor(triplet.data() & 0x1f); + break; case 0x21: // G1 mosaic character if (triplet.data() & 0x20) return m_fontBitmap.rawBitmap()->copy((triplet.data()-32)*12, 24*10, 12, 10);