From 05cf313b63f711b8c9e9ea0f0f28513eaea3655d Mon Sep 17 00:00:00 2001 From: "G.K.MacGregor" Date: Tue, 30 Apr 2024 21:12:35 +0100 Subject: [PATCH] Implement CLUT context menu --- x26dockwidget.cpp | 19 ++++++++++++++++++- x26menus.cpp | 28 ++++++++++++++++++++++++++++ x26menus.h | 14 ++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/x26dockwidget.cpp b/x26dockwidget.cpp index 4aec3d0..989f399 100644 --- a/x26dockwidget.cpp +++ b/x26dockwidget.cpp @@ -1049,7 +1049,7 @@ void X26DockWidget::deleteTriplet() void X26DockWidget::customMenuRequested(QPoint pos) { - QMenu *customMenu; + QMenu *customMenu = nullptr; QModelIndex index = m_x26View->indexAt(pos); @@ -1064,6 +1064,23 @@ void X26DockWidget::customMenuRequested(QPoint pos) const int modeExt = index.model()->data(index.model()->index(index.row(), 2), Qt::EditRole).toInt(); switch (modeExt) { + case 0x01: // Full Row colour + case 0x07: // Address row 0 + customMenu = new TripletCLUTQMenu(true, this); + connect(static_cast(customMenu)->action(32), &QAction::triggered, [=]() { updateModelFromCookedWidget(0, Qt::UserRole+2); updateAllCookedTripletWidgets(index); }); + connect(static_cast(customMenu)->action(33), &QAction::triggered, [=]() { updateModelFromCookedWidget(1, Qt::UserRole+2); updateAllCookedTripletWidgets(index); }); + // fall-through + case 0x00: // Full Screen colour + case 0x20: // Foreground colour + case 0x23: // Background colour + 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); }); + } + customMenu->addSeparator(); + break; case 0x21: // G1 mosaic character case 0x22: // G3 mosaic character at level 1.5 case 0x2b: // G3 mosaic character at level >=2.5 diff --git a/x26menus.cpp b/x26menus.cpp index 7433c88..e8a6567 100644 --- a/x26menus.cpp +++ b/x26menus.cpp @@ -19,8 +19,10 @@ #include "x26menus.h" +#include #include #include +#include #include #include "render.h" @@ -101,6 +103,32 @@ void TripletModeQMenu::addModeAction(QMenu *menu, int mode) } +TripletCLUTQMenu::TripletCLUTQMenu(bool rows, QWidget *parent): QMenu(parent) +{ + QMenu *clut[4]; + + for (int c=0; c<4; c++) { + clut[c] = this->addMenu(QString("CLUT %1").arg(c)); + + for (int e=0; e<8; e++) + m_actions[c*8+e] = clut[c]->addAction(QString("CLUT %1:%2").arg(c).arg(e)); + } + + if (rows) { + m_actions[32] = this->addAction(tr("This row only")); + m_actions[33] = this->addAction(tr("Down to bottom")); + } +} + +void TripletCLUTQMenu::setColour(int i, QColor c) +{ + QPixmap menuColour(32, 32); // Should get downscaled to the menu text size + + menuColour.fill(c); + m_actions[i]->setIcon(QIcon(menuColour)); +} + + TripletCharacterQMenu::TripletCharacterQMenu(int charSet, QWidget *parent): QMenu(parent) { QMenu *charRange[6]; diff --git a/x26menus.h b/x26menus.h index aa08050..2b6af8e 100644 --- a/x26menus.h +++ b/x26menus.h @@ -20,6 +20,7 @@ #ifndef X26MENUS_H #define X26MENUS_H +#include #include #include @@ -128,6 +129,19 @@ private: ModeTripletNames m_modeTripletNames; }; +class TripletCLUTQMenu : public QMenu +{ + Q_OBJECT + +public: + TripletCLUTQMenu(bool rows, QWidget *parent = nullptr); + QAction *action(int n) const { return m_actions[n]; }; + void setColour(int i, QColor c); + +private: + QAction *m_actions[34]; +}; + class TripletCharacterQMenu : public QMenu { Q_OBJECT