diff --git a/x26dockwidget.cpp b/x26dockwidget.cpp index d7454b4..4aec3d0 100644 --- a/x26dockwidget.cpp +++ b/x26dockwidget.cpp @@ -1060,6 +1060,41 @@ void X26DockWidget::customMenuRequested(QPoint pos) connect(static_cast(customMenu)->action(m), &QAction::triggered, [=]() { cookedModeMenuSelected(m); }); customMenu->addSeparator(); + } else if (index.isValid() && index.column() == 3) { + const int modeExt = index.model()->data(index.model()->index(index.row(), 2), Qt::EditRole).toInt(); + + switch (modeExt) { + case 0x21: // G1 mosaic character + case 0x22: // G3 mosaic character at level 1.5 + case 0x2b: // G3 mosaic character at level >=2.5 + case 0x29: // G0 character + case 0x2f: // G2 character + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: // G0 character with diacritical + customMenu = new TripletCharacterQMenu(m_x26Model->data(index.model()->index(index.row(), 2), Qt::UserRole+2).toInt(), this); + + for (int m=0; m<96; m++) + connect(static_cast(customMenu)->action(m), &QAction::triggered, [=]() { updateModelFromCookedWidget(m+32, Qt::UserRole+1); updateAllCookedTripletWidgets(index); }); + + customMenu->addSeparator(); + break; + default: + customMenu = new QMenu(this); + } } else customMenu = new QMenu(this); diff --git a/x26menus.cpp b/x26menus.cpp index 3bd3bfa..7433c88 100644 --- a/x26menus.cpp +++ b/x26menus.cpp @@ -19,9 +19,12 @@ #include "x26menus.h" +#include #include #include +#include "render.h" + TripletModeQMenu::TripletModeQMenu(QWidget *parent): QMenu(parent) { addModeAction(this, 0x04); @@ -96,3 +99,16 @@ void TripletModeQMenu::addModeAction(QMenu *menu, int mode) { m_actions[mode] = menu->addAction(m_modeTripletNames.modeName(mode)); } + + +TripletCharacterQMenu::TripletCharacterQMenu(int charSet, QWidget *parent): QMenu(parent) +{ + QMenu *charRange[6]; + + for (int r=0; r<6; r++) { + charRange[r] = this->addMenu(QString("0x%010-0x%01f").arg(r+2)); + + for (int c=0; c<16; c++) + m_actions[r*16+c] = charRange[r]->addAction(QIcon(m_fontBitmap.charBitmap(r*16+c+32, charSet)), QString("0x%1").arg(r*16+c+32, 2, 16, QChar('0'))); + } +} diff --git a/x26menus.h b/x26menus.h index f4332a9..aa08050 100644 --- a/x26menus.h +++ b/x26menus.h @@ -23,6 +23,8 @@ #include #include +#include "render.h" + class ModeTripletNames { public: @@ -126,4 +128,17 @@ private: ModeTripletNames m_modeTripletNames; }; +class TripletCharacterQMenu : public QMenu +{ + Q_OBJECT + +public: + TripletCharacterQMenu(int charSet, QWidget *parent = nullptr); + QAction *action(int n) const { return m_actions[n]; }; + +private: + QAction *m_actions[96]; + TeletextFontBitmap m_fontBitmap; +}; + #endif