Implement CLUT context menu

This commit is contained in:
G.K.MacGregor
2024-04-30 21:12:35 +01:00
parent 12649e3adf
commit 05cf313b63
3 changed files with 60 additions and 1 deletions

View File

@@ -1049,7 +1049,7 @@ void X26DockWidget::deleteTriplet()
void X26DockWidget::customMenuRequested(QPoint pos) void X26DockWidget::customMenuRequested(QPoint pos)
{ {
QMenu *customMenu; QMenu *customMenu = nullptr;
QModelIndex index = m_x26View->indexAt(pos); 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(); const int modeExt = index.model()->data(index.model()->index(index.row(), 2), Qt::EditRole).toInt();
switch (modeExt) { switch (modeExt) {
case 0x01: // Full Row colour
case 0x07: // Address row 0
customMenu = new TripletCLUTQMenu(true, this);
connect(static_cast<TripletCLUTQMenu *>(customMenu)->action(32), &QAction::triggered, [=]() { updateModelFromCookedWidget(0, Qt::UserRole+2); updateAllCookedTripletWidgets(index); });
connect(static_cast<TripletCLUTQMenu *>(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<TripletCLUTQMenu *>(customMenu)->setColour(m, m_parentMainWidget->document()->currentSubPage()->CLUTtoQColor(m));
connect(static_cast<TripletCLUTQMenu *>(customMenu)->action(m), &QAction::triggered, [=]() { updateModelFromCookedWidget(m, Qt::UserRole+1); updateAllCookedTripletWidgets(index); });
}
customMenu->addSeparator();
break;
case 0x21: // G1 mosaic character case 0x21: // G1 mosaic character
case 0x22: // G3 mosaic character at level 1.5 case 0x22: // G3 mosaic character at level 1.5
case 0x2b: // G3 mosaic character at level >=2.5 case 0x2b: // G3 mosaic character at level >=2.5

View File

@@ -19,8 +19,10 @@
#include "x26menus.h" #include "x26menus.h"
#include <QColor>
#include <QIcon> #include <QIcon>
#include <QMenu> #include <QMenu>
#include <QPixmap>
#include <QString> #include <QString>
#include "render.h" #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) TripletCharacterQMenu::TripletCharacterQMenu(int charSet, QWidget *parent): QMenu(parent)
{ {
QMenu *charRange[6]; QMenu *charRange[6];

View File

@@ -20,6 +20,7 @@
#ifndef X26MENUS_H #ifndef X26MENUS_H
#define X26MENUS_H #define X26MENUS_H
#include <QColor>
#include <QMenu> #include <QMenu>
#include <QString> #include <QString>
@@ -128,6 +129,19 @@ private:
ModeTripletNames m_modeTripletNames; 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 class TripletCharacterQMenu : public QMenu
{ {
Q_OBJECT Q_OBJECT