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);