diff --git a/qteletextmaker.pro b/qteletextmaker.pro
index 476b1ed..31dceca 100644
--- a/qteletextmaker.pro
+++ b/qteletextmaker.pro
@@ -19,6 +19,7 @@ HEADERS = decode.h \
render.h \
x26commands.h \
x26dockwidget.h \
+ x26menus.h \
x26model.h \
x26triplets.h
SOURCES = decode.cpp \
@@ -38,6 +39,7 @@ SOURCES = decode.cpp \
render.cpp \
x26commands.cpp \
x26dockwidget.cpp \
+ x26menus.cpp \
x26model.cpp \
x26triplets.cpp
RESOURCES = qteletextmaker.qrc
diff --git a/x26dockwidget.cpp b/x26dockwidget.cpp
index dca70c5..b6a42ee 100644
--- a/x26dockwidget.cpp
+++ b/x26dockwidget.cpp
@@ -17,6 +17,8 @@
* along with QTeletextMaker. If not, see .
*/
+#include "x26dockwidget.h"
+
#include
#include
#include
@@ -36,7 +38,7 @@
#include
#include "render.h"
-#include "x26dockwidget.h"
+#include "x26menus.h"
CharacterListModel::CharacterListModel(QObject *parent): QAbstractListModel(parent)
{
@@ -134,91 +136,15 @@ X26DockWidget::X26DockWidget(TeletextWidget *parent): QDockWidget(parent)
cookedTripletLayout->addWidget(m_cookedModePushButton);
// Cooked triplet menu
- // We build the menus for both "Insert" buttons at the same time
- m_cookedModeMenu = new QMenu(this);
- m_insertBeforeMenu = new QMenu(this);
- m_insertAfterMenu = new QMenu(this);
+ // We connect the menus for both "Insert" buttons at the same time
+ m_cookedModeMenu = new TripletModeQMenu(this);
+ m_insertBeforeMenu = new TripletModeQMenu(this);
+ m_insertAfterMenu = new TripletModeQMenu(this);
- for (int m=0; m<3; m++) {
- QMenu *menuToBuild;
-
- if (m == 0)
- menuToBuild = m_cookedModeMenu;
- else if (m == 1)
- menuToBuild = m_insertBeforeMenu;
- else // if (m == 2)
- menuToBuild = m_insertAfterMenu;
-
- auto newModeMenuAction=[&](QMenu *menu, int mode)
- {
- QAction *action = menu->addAction(m_x26Model->modeTripletName(mode));
- if (m == 0)
- connect(action, &QAction::triggered, [=]() { cookedModeMenuSelected(mode); });
- else if (m == 1)
- connect(action, &QAction::triggered, [=]() { insertTriplet(mode, false); });
- else // if (m == 2)
- connect(action, &QAction::triggered, [=]() { insertTriplet(mode, true); });
- };
-
- newModeMenuAction(menuToBuild, 0x04);
- QMenu *rowTripletSubMenu = menuToBuild->addMenu(tr("Row triplet"));
- newModeMenuAction(rowTripletSubMenu, 0x00);
- newModeMenuAction(rowTripletSubMenu, 0x01);
- newModeMenuAction(rowTripletSubMenu, 0x07);
- newModeMenuAction(rowTripletSubMenu, 0x18);
- QMenu *columnTripletSubMenu = menuToBuild->addMenu(tr("Column triplet"));
- newModeMenuAction(columnTripletSubMenu, 0x20);
- newModeMenuAction(columnTripletSubMenu, 0x23);
- newModeMenuAction(columnTripletSubMenu, 0x27);
- newModeMenuAction(columnTripletSubMenu, 0x2c);
- newModeMenuAction(columnTripletSubMenu, 0x2e);
- newModeMenuAction(columnTripletSubMenu, 0x28);
- columnTripletSubMenu->addSeparator();
- newModeMenuAction(columnTripletSubMenu, 0x29);
- newModeMenuAction(columnTripletSubMenu, 0x2f);
- newModeMenuAction(columnTripletSubMenu, 0x21);
- newModeMenuAction(columnTripletSubMenu, 0x22);
- newModeMenuAction(columnTripletSubMenu, 0x2b);
- newModeMenuAction(columnTripletSubMenu, 0x2d);
- QMenu *diacriticalSubMenu = columnTripletSubMenu->addMenu(tr("G0 diacritical"));
- for (int i=0; i<16; i++)
- newModeMenuAction(diacriticalSubMenu, 0x30 + i);
- QMenu *objectSubMenu = menuToBuild->addMenu(tr("Object"));
- newModeMenuAction(objectSubMenu, 0x10);
- newModeMenuAction(objectSubMenu, 0x11);
- newModeMenuAction(objectSubMenu, 0x12);
- newModeMenuAction(objectSubMenu, 0x13);
- newModeMenuAction(objectSubMenu, 0x15);
- newModeMenuAction(objectSubMenu, 0x16);
- newModeMenuAction(objectSubMenu, 0x17);
- newModeMenuAction(menuToBuild, 0x1f);
- menuToBuild->addSeparator();
- QMenu *pdcSubMenu = menuToBuild->addMenu(tr("PDC/reserved"));
- newModeMenuAction(pdcSubMenu, 0x08);
- newModeMenuAction(pdcSubMenu, 0x09);
- newModeMenuAction(pdcSubMenu, 0x0a);
- newModeMenuAction(pdcSubMenu, 0x0b);
- newModeMenuAction(pdcSubMenu, 0x0c);
- newModeMenuAction(pdcSubMenu, 0x0d);
- newModeMenuAction(pdcSubMenu, 0x26);
- QMenu *reservedRowSubMenu = pdcSubMenu->addMenu(tr("Reserved row"));
- newModeMenuAction(reservedRowSubMenu, 0x02);
- newModeMenuAction(reservedRowSubMenu, 0x03);
- newModeMenuAction(reservedRowSubMenu, 0x05);
- newModeMenuAction(reservedRowSubMenu, 0x06);
- newModeMenuAction(reservedRowSubMenu, 0x0e);
- newModeMenuAction(reservedRowSubMenu, 0x0f);
- newModeMenuAction(reservedRowSubMenu, 0x14);
- newModeMenuAction(reservedRowSubMenu, 0x19);
- newModeMenuAction(reservedRowSubMenu, 0x1a);
- newModeMenuAction(reservedRowSubMenu, 0x1b);
- newModeMenuAction(reservedRowSubMenu, 0x1c);
- newModeMenuAction(reservedRowSubMenu, 0x1d);
- newModeMenuAction(reservedRowSubMenu, 0x1e);
- QMenu *reservedColumnSubMenu = pdcSubMenu->addMenu(tr("Reserved column"));
- newModeMenuAction(reservedColumnSubMenu, 0x24);
- newModeMenuAction(reservedColumnSubMenu, 0x25);
- newModeMenuAction(reservedColumnSubMenu, 0x2a);
+ for (int m=0; m<64; m++) {
+ connect(static_cast(m_cookedModeMenu)->action(m), &QAction::triggered, [=]() { cookedModeMenuSelected(m); });
+ connect(static_cast(m_insertBeforeMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, false); });
+ connect(static_cast(m_insertAfterMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, true); });
}
m_cookedModePushButton->setMenu(m_cookedModeMenu);
@@ -718,7 +644,7 @@ void X26DockWidget::updateAllCookedTripletWidgets(const QModelIndex &index)
const int modeExt = index.model()->data(index.model()->index(index.row(), 2), Qt::EditRole).toInt();
m_cookedModePushButton->setEnabled(true);
- m_cookedModePushButton->setText(m_x26Model->modeTripletName(modeExt));
+ m_cookedModePushButton->setText(m_modeTripletNames.modeName(modeExt));
switch (modeExt) {
case 0x04: // Set active position
diff --git a/x26dockwidget.h b/x26dockwidget.h
index ff9708e..8a47d6a 100644
--- a/x26dockwidget.h
+++ b/x26dockwidget.h
@@ -35,6 +35,7 @@
#include "mainwidget.h"
#include "render.h"
+#include "x26menus.h"
#include "x26model.h"
class CharacterListModel : public QAbstractListModel
@@ -116,6 +117,8 @@ private:
QCheckBox *m_terminationMarkerMoreFollowsCheckBox;
QPushButton *m_insertBeforePushButton, *m_insertAfterPushButton, *m_insertCopyPushButton, *m_deletePushButton;
+ ModeTripletNames m_modeTripletNames;
+
TeletextWidget *m_parentMainWidget;
void disableTripletWidgets();
diff --git a/x26menus.cpp b/x26menus.cpp
new file mode 100644
index 0000000..3bd3bfa
--- /dev/null
+++ b/x26menus.cpp
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2020-2024 Gavin MacGregor
+ *
+ * This file is part of QTeletextMaker.
+ *
+ * QTeletextMaker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * QTeletextMaker is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with QTeletextMaker. If not, see .
+ */
+
+#include "x26menus.h"
+
+#include
+#include
+
+TripletModeQMenu::TripletModeQMenu(QWidget *parent): QMenu(parent)
+{
+ addModeAction(this, 0x04);
+
+ QMenu *rowTripletSubMenu = this->addMenu(tr("Row triplet"));
+ addModeAction(rowTripletSubMenu, 0x00);
+ addModeAction(rowTripletSubMenu, 0x01);
+ addModeAction(rowTripletSubMenu, 0x07);
+ addModeAction(rowTripletSubMenu, 0x18);
+
+ QMenu *columnTripletSubMenu = this->addMenu(tr("Column triplet"));
+ addModeAction(columnTripletSubMenu, 0x20);
+ addModeAction(columnTripletSubMenu, 0x23);
+ addModeAction(columnTripletSubMenu, 0x27);
+ addModeAction(columnTripletSubMenu, 0x2c);
+ addModeAction(columnTripletSubMenu, 0x2e);
+ addModeAction(columnTripletSubMenu, 0x28);
+ columnTripletSubMenu->addSeparator();
+ addModeAction(columnTripletSubMenu, 0x29);
+ addModeAction(columnTripletSubMenu, 0x2f);
+ addModeAction(columnTripletSubMenu, 0x21);
+ addModeAction(columnTripletSubMenu, 0x22);
+ addModeAction(columnTripletSubMenu, 0x2b);
+ addModeAction(columnTripletSubMenu, 0x2d);
+
+ QMenu *diacriticalSubMenu = columnTripletSubMenu->addMenu(tr("G0 diacritical"));
+ for (int i=0; i<16; i++)
+ addModeAction(diacriticalSubMenu, 0x30 + i);
+
+ QMenu *objectSubMenu = this->addMenu(tr("Object"));
+ addModeAction(objectSubMenu, 0x10);
+ addModeAction(objectSubMenu, 0x11);
+ addModeAction(objectSubMenu, 0x12);
+ addModeAction(objectSubMenu, 0x13);
+ addModeAction(objectSubMenu, 0x15);
+ addModeAction(objectSubMenu, 0x16);
+ addModeAction(objectSubMenu, 0x17);
+ addModeAction(this, 0x1f);
+ this->addSeparator();
+
+ QMenu *pdcSubMenu = this->addMenu(tr("PDC/reserved"));
+ addModeAction(pdcSubMenu, 0x08);
+ addModeAction(pdcSubMenu, 0x09);
+ addModeAction(pdcSubMenu, 0x0a);
+ addModeAction(pdcSubMenu, 0x0b);
+ addModeAction(pdcSubMenu, 0x0c);
+ addModeAction(pdcSubMenu, 0x0d);
+ addModeAction(pdcSubMenu, 0x26);
+
+ QMenu *reservedRowSubMenu = pdcSubMenu->addMenu(tr("Reserved row"));
+ addModeAction(reservedRowSubMenu, 0x02);
+ addModeAction(reservedRowSubMenu, 0x03);
+ addModeAction(reservedRowSubMenu, 0x05);
+ addModeAction(reservedRowSubMenu, 0x06);
+ addModeAction(reservedRowSubMenu, 0x0e);
+ addModeAction(reservedRowSubMenu, 0x0f);
+ addModeAction(reservedRowSubMenu, 0x14);
+ addModeAction(reservedRowSubMenu, 0x19);
+ addModeAction(reservedRowSubMenu, 0x1a);
+ addModeAction(reservedRowSubMenu, 0x1b);
+ addModeAction(reservedRowSubMenu, 0x1c);
+ addModeAction(reservedRowSubMenu, 0x1d);
+ addModeAction(reservedRowSubMenu, 0x1e);
+
+ QMenu *reservedColumnSubMenu = pdcSubMenu->addMenu(tr("Reserved column"));
+ addModeAction(reservedColumnSubMenu, 0x24);
+ addModeAction(reservedColumnSubMenu, 0x25);
+ addModeAction(reservedColumnSubMenu, 0x2a);
+}
+
+void TripletModeQMenu::addModeAction(QMenu *menu, int mode)
+{
+ m_actions[mode] = menu->addAction(m_modeTripletNames.modeName(mode));
+}
diff --git a/x26menus.h b/x26menus.h
new file mode 100644
index 0000000..f4332a9
--- /dev/null
+++ b/x26menus.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2020-2024 Gavin MacGregor
+ *
+ * This file is part of QTeletextMaker.
+ *
+ * QTeletextMaker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * QTeletextMaker is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with QTeletextMaker. If not, see .
+ */
+
+#ifndef X26MENUS_H
+#define X26MENUS_H
+
+#include
+#include
+
+class ModeTripletNames
+{
+public:
+ static const QString modeName(int i) { return m_modeTripletName[i]; }
+
+private:
+ static inline const QString m_modeTripletName[64] {
+ // Row triplet modes
+ "Full screen colour",
+ "Full row colour",
+ "Reserved 0x02",
+ "Reserved 0x03",
+
+ "Set Active Position",
+ "Reserved 0x05",
+ "Reserved 0x06",
+ "Address row 0",
+
+ "PDC origin, source",
+ "PDC month and day",
+ "PDC cursor and start hour",
+ "PDC cursor and end hour",
+
+ "PDC cursor local offset",
+ "PDC series ID and code",
+ "Reserved 0x0e",
+ "Reserved 0x0f",
+
+ "Origin modifier",
+ "Invoke active object",
+ "Invoke adaptive object",
+ "Invoke passive object",
+
+ "Reserved 0x14",
+ "Define active object",
+ "Define adaptive object",
+ "Define passive object",
+
+ "DRCS mode",
+ "Reserved 0x19",
+ "Reserved 0x1a",
+ "Reserved 0x1b",
+
+ "Reserved 0x1c",
+ "Reserved 0x1d",
+ "Reserved 0x1e",
+ "Termination marker",
+
+ // Column triplet modes
+ "Foreground colour",
+ "G1 block mosaic",
+ "G3 smooth mosaic, level 1.5",
+ "Background colour",
+
+ "Reserved 0x04",
+ "Reserved 0x05",
+ "PDC cursor, start end min",
+ "Additional flash functions",
+
+ "Modified G0/G2 character set",
+ "G0 character",
+ "Reserved 0x0a",
+ "G3 smooth mosaic, level 2.5",
+
+ "Display attributes",
+ "DRCS character",
+ "Font style, level 3.5",
+ "G2 supplementary character",
+
+ "G0 character no diacritical",
+ "G0 character diacritical 1",
+ "G0 character diacritical 2",
+ "G0 character diacritical 3",
+ "G0 character diacritical 4",
+ "G0 character diacritical 5",
+ "G0 character diacritical 6",
+ "G0 character diacritical 7",
+ "G0 character diacritical 8",
+ "G0 character diacritical 9",
+ "G0 character diacritical A",
+ "G0 character diacritical B",
+ "G0 character diacritical C",
+ "G0 character diacritical D",
+ "G0 character diacritical E",
+ "G0 character diacritical F"
+ };
+};
+
+class TripletModeQMenu : public QMenu
+{
+ Q_OBJECT
+
+public:
+ TripletModeQMenu(QWidget *parent = nullptr);
+ QAction *action(int n) const { return m_actions[n]; };
+
+private:
+ void addModeAction(QMenu *menu, int mode);
+
+ QAction *m_actions[64];
+ ModeTripletNames m_modeTripletNames;
+};
+
+#endif
diff --git a/x26model.cpp b/x26model.cpp
index 54d4845..e05c0a4 100644
--- a/x26model.cpp
+++ b/x26model.cpp
@@ -23,6 +23,7 @@
#include
#include "x26commands.h"
+#include "x26menus.h"
X26Model::X26Model(TeletextWidget *parent): QAbstractListModel(parent)
{
@@ -114,7 +115,7 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
if (role == Qt::DisplayRole) {
if (index.column() == 2)
- return (m_modeTripletName[triplet.modeExt()]);
+ return (m_modeTripletNames.modeName(triplet.modeExt()));
// Column 3 - describe effects of data/address triplet parameters in plain English
switch (triplet.modeExt()) {
case 0x01: // Full row colour
diff --git a/x26model.h b/x26model.h
index 6b45ff3..4d59630 100644
--- a/x26model.h
+++ b/x26model.h
@@ -21,7 +21,9 @@
#define X26MODEL_H
#include
+
#include "mainwidget.h"
+#include "x26menus.h"
class X26Model : public QAbstractListModel
{
@@ -40,8 +42,6 @@ public:
bool removeRows(int position, int rows, const QModelIndex &index);
// Qt::ItemFlags flags(const QModelIndex &index) const;
- const QString modeTripletName(int i) const { return m_modeTripletName[i]; }
-
// The x26commands classes manipulate the model but beginInsertRows and endInsertRows
// are protected methods, so we need to friend them
friend class InsertTripletCommand;
@@ -52,87 +52,7 @@ private:
TeletextWidget *m_parentMainWidget;
bool m_listLoaded;
TeletextFontBitmap m_fontBitmap;
-
- const QString m_modeTripletName[64] {
- // Row triplet modes
- "Full screen colour",
- "Full row colour",
- "Reserved 0x02",
- "Reserved 0x03",
-
- "Set Active Position",
- "Reserved 0x05",
- "Reserved 0x06",
- "Address row 0",
-
- "PDC origin, source",
- "PDC month and day",
- "PDC cursor and start hour",
- "PDC cursor and end hour",
-
- "PDC cursor local offset",
- "PDC series ID and code",
- "Reserved 0x0e",
- "Reserved 0x0f",
-
- "Origin modifier",
- "Invoke active object",
- "Invoke adaptive object",
- "Invoke passive object",
-
- "Reserved 0x14",
- "Define active object",
- "Define adaptive object",
- "Define passive object",
-
- "DRCS mode",
- "Reserved 0x19",
- "Reserved 0x1a",
- "Reserved 0x1b",
-
- "Reserved 0x1c",
- "Reserved 0x1d",
- "Reserved 0x1e",
- "Termination marker",
-
- // Column triplet modes
- "Foreground colour",
- "G1 block mosaic",
- "G3 smooth mosaic, level 1.5",
- "Background colour",
-
- "Reserved 0x04",
- "Reserved 0x05",
- "PDC cursor, start end min",
- "Additional flash functions",
-
- "Modified G0/G2 character set",
- "G0 character",
- "Reserved 0x0a",
- "G3 smooth mosaic, level 2.5",
-
- "Display attributes",
- "DRCS character",
- "Font style, level 3.5",
- "G2 supplementary character",
-
- "G0 character no diacritical",
- "G0 character diacritical 1",
- "G0 character diacritical 2",
- "G0 character diacritical 3",
- "G0 character diacritical 4",
- "G0 character diacritical 5",
- "G0 character diacritical 6",
- "G0 character diacritical 7",
- "G0 character diacritical 8",
- "G0 character diacritical 9",
- "G0 character diacritical A",
- "G0 character diacritical B",
- "G0 character diacritical C",
- "G0 character diacritical D",
- "G0 character diacritical E",
- "G0 character diacritical F"
- };
+ ModeTripletNames m_modeTripletNames;
struct tripletErrorShow {
QString message;