diff --git a/x26dockwidget.cpp b/x26dockwidget.cpp index 0a6003b..534a9f3 100644 --- a/x26dockwidget.cpp +++ b/x26dockwidget.cpp @@ -1080,11 +1080,22 @@ void X26DockWidget::customMenuRequested(QPoint pos) if (!customMenu) customMenu = new TripletCLUTQMenu(false, this); - for (int m=0; m<32; m++) { - static_cast(customMenu)->setColour(m, m_parentMainWidget->document()->currentSubPage()->CLUTtoQColor(m)); - connect(static_cast(customMenu)->action(m), &QAction::triggered, [=]() { updateModelFromCookedWidget(m, Qt::UserRole+1); updateAllCookedTripletWidgets(index); }); + for (int i=0; i<32; i++) { + static_cast(customMenu)->setColour(i, m_parentMainWidget->document()->currentSubPage()->CLUTtoQColor(i)); + connect(static_cast(customMenu)->action(i), &QAction::triggered, [=]() { updateModelFromCookedWidget(i, Qt::UserRole+1); updateAllCookedTripletWidgets(index); }); } break; + case 0x27: // Additional flash functions + customMenu = new TripletFlashQMenu(this); + + static_cast(customMenu)->setModeChecked(index.model()->data(index.model()->index(index.row(), 0), Qt::UserRole+1).toInt()); + static_cast(customMenu)->setRatePhaseChecked(index.model()->data(index.model()->index(index.row(), 0), Qt::UserRole+2).toInt()); + + for (int i=0; i<4; i++) + connect(static_cast(customMenu)->modeAction(i), &QAction::triggered, [=]() { updateModelFromCookedWidget(i, Qt::UserRole+1); updateAllCookedTripletWidgets(index); }); + for (int i=0; i<6; i++) + connect(static_cast(customMenu)->ratePhaseAction(i), &QAction::triggered, [=]() { updateModelFromCookedWidget(i, Qt::UserRole+2); updateAllCookedTripletWidgets(index); }); + break; case 0x21: // G1 mosaic character case 0x22: // G3 mosaic character at level 1.5 case 0x2b: // G3 mosaic character at level >=2.5 @@ -1108,8 +1119,8 @@ void X26DockWidget::customMenuRequested(QPoint pos) 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); }); + for (int i=0; i<96; i++) + connect(static_cast(customMenu)->action(i), &QAction::triggered, [=]() { updateModelFromCookedWidget(i+32, Qt::UserRole+1); updateAllCookedTripletWidgets(index); }); break; } @@ -1119,7 +1130,7 @@ void X26DockWidget::customMenuRequested(QPoint pos) customMenu = new QMenu(this); TripletModeQMenu *modeChangeMenu = new TripletModeQMenu(this); - modeChangeMenu->setTitle(tr("Change mode")); + modeChangeMenu->setTitle(tr("Change triplet mode")); customMenu->addMenu(modeChangeMenu); customMenu->addSeparator(); @@ -1132,10 +1143,10 @@ void X26DockWidget::customMenuRequested(QPoint pos) insertAfterQMenu->setTitle(tr("Insert after")); customMenu->addMenu(insertAfterQMenu); - for (int m=0; m<64; m++) { - connect(static_cast(modeChangeMenu)->action(m), &QAction::triggered, [=]() { cookedModeMenuSelected(m); }); - connect(static_cast(insertBeforeQMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, false); }); - connect(static_cast(insertAfterQMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, true); }); + for (int i=0; i<64; i++) { + connect(static_cast(modeChangeMenu)->action(i), &QAction::triggered, [=]() { cookedModeMenuSelected(i); }); + connect(static_cast(insertBeforeQMenu)->action(i), &QAction::triggered, [=]() { insertTriplet(i, false); }); + connect(static_cast(insertAfterQMenu)->action(i), &QAction::triggered, [=]() { insertTriplet(i, true); }); } QAction *insertCopyAct = new QAction(tr("Insert copy"), this); @@ -1152,8 +1163,8 @@ void X26DockWidget::customMenuRequested(QPoint pos) appendModeMenu->setTitle(tr("Append")); customMenu->addMenu(appendModeMenu); - for (int m=0; m<64; m++) - connect(static_cast(appendModeMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, m_x26Model->rowCount()); }); + for (int i=0; i<64; i++) + connect(static_cast(appendModeMenu)->action(i), &QAction::triggered, [=]() { insertTriplet(i, m_x26Model->rowCount()); }); } customMenu->popup(m_x26View->viewport()->mapToGlobal(pos)); diff --git a/x26menus.cpp b/x26menus.cpp index e8a6567..3ee071c 100644 --- a/x26menus.cpp +++ b/x26menus.cpp @@ -19,6 +19,7 @@ #include "x26menus.h" +#include #include #include #include @@ -140,3 +141,41 @@ TripletCharacterQMenu::TripletCharacterQMenu(int charSet, QWidget *parent): QMen 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'))); } } + + +TripletFlashQMenu::TripletFlashQMenu(QWidget *parent): QMenu(parent) +{ + QMenu *flashModeMenu = this->addMenu(tr("Flash mode")); + m_actions[0] = flashModeMenu->addAction(tr("Steady")); + m_actions[1] = flashModeMenu->addAction(tr("Normal")); + m_actions[2] = flashModeMenu->addAction(tr("Invert")); + m_actions[3] = flashModeMenu->addAction(tr("Adjacent CLUT")); + m_modeActionGroup = new QActionGroup(this); + for (int i=0; i<4; i++) { + m_actions[i]->setCheckable(true); + m_modeActionGroup->addAction(m_actions[i]); + } + + QMenu *flashRatePhaseMenu = this->addMenu(tr("Flash rate/phase")); + m_actions[4] = flashRatePhaseMenu->addAction(tr("Slow 1Hz")); + m_actions[5] = flashRatePhaseMenu->addAction(tr("Fast 2Hz phase 1")); + m_actions[6] = flashRatePhaseMenu->addAction(tr("Fast 2Hz phase 2")); + m_actions[7] = flashRatePhaseMenu->addAction(tr("Fast 2Hz phase 3")); + m_actions[8] = flashRatePhaseMenu->addAction(tr("Fast 2Hz inc/right")); + m_actions[9] = flashRatePhaseMenu->addAction(tr("Fast 2Hz dec/left")); + m_ratePhaseActionGroup = new QActionGroup(this); + for (int i=4; i<10; i++) { + m_actions[i]->setCheckable(true); + m_ratePhaseActionGroup->addAction(m_actions[i]); + } +} + +void TripletFlashQMenu::setModeChecked(int n) +{ + m_actions[n]->setChecked(true); +} + +void TripletFlashQMenu::setRatePhaseChecked(int n) +{ + m_actions[n+4]->setChecked(true); +} diff --git a/x26menus.h b/x26menus.h index 2b6af8e..16cfab1 100644 --- a/x26menus.h +++ b/x26menus.h @@ -20,6 +20,7 @@ #ifndef X26MENUS_H #define X26MENUS_H +#include #include #include #include @@ -155,4 +156,20 @@ private: TeletextFontBitmap m_fontBitmap; }; +class TripletFlashQMenu : public QMenu +{ + Q_OBJECT + +public: + TripletFlashQMenu(QWidget *parent = nullptr); + QAction *modeAction(int n) const { return m_actions[n]; }; + QAction *ratePhaseAction(int n) const { return m_actions[n+4]; }; + void setModeChecked(int n); + void setRatePhaseChecked(int n); + +private: + QAction *m_actions[10]; + QActionGroup *m_modeActionGroup, *m_ratePhaseActionGroup; +}; + #endif