From 9e64033d7ce6ea9e2db61fb241c5c62675396ea9 Mon Sep 17 00:00:00 2001 From: "G.K.MacGregor" Date: Mon, 22 Apr 2024 22:15:10 +0100 Subject: [PATCH] Break out triplet mode menu --- qteletextmaker.pro | 2 + x26dockwidget.cpp | 98 +++++----------------------------- x26dockwidget.h | 3 ++ x26menus.cpp | 98 ++++++++++++++++++++++++++++++++++ x26menus.h | 129 +++++++++++++++++++++++++++++++++++++++++++++ x26model.cpp | 3 +- x26model.h | 86 ++---------------------------- 7 files changed, 249 insertions(+), 170 deletions(-) create mode 100644 x26menus.cpp create mode 100644 x26menus.h 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;