Add insert options to context menu

This commit is contained in:
G.K.MacGregor
2024-05-22 16:30:02 +01:00
parent 5b688d47ea
commit 771bc66b89
2 changed files with 64 additions and 35 deletions

View File

@@ -978,41 +978,51 @@ void X26DockWidget::updateModelFromCookedWidget(const int value, const int role)
void X26DockWidget::insertTriplet(int modeExt, bool after) void X26DockWidget::insertTriplet(int modeExt, bool after)
{ {
QModelIndex index = m_x26View->currentIndex(); QModelIndex index = m_x26View->currentIndex();
if (index.isValid())
insertTriplet(modeExt, index.row()+after);
else
insertTriplet(modeExt);
}
void X26DockWidget::insertTriplet(int modeExt, int row)
{
X26Triplet newTriplet(modeExt < 0x20 ? 41 : 0, modeExt & 0x1f, 0); X26Triplet newTriplet(modeExt < 0x20 ? 41 : 0, modeExt & 0x1f, 0);
int newListRow;
if (index.isValid()) { if (row != -1) {
newListRow = index.row()+after; QModelIndex index = m_x26View->currentIndex();
// If we're inserting a column triplet next to another column triplet, if (index.isValid()) {
// duplicate the column number // If we're inserting a column triplet next to another column triplet,
// Avoid the PDC and reserved mode triplets // duplicate the column number
if (modeExt >= 0x20 && modeExt != 0x24 && modeExt != 0x25 && modeExt != 0x26 && modeExt != 0x2a) { // Avoid the PDC and reserved mode triplets
const int existingTripletModeExt = index.model()->data(index.model()->index(index.row(), 2), Qt::EditRole).toInt(); if (modeExt >= 0x20 && modeExt != 0x24 && modeExt != 0x25 && modeExt != 0x26 && modeExt != 0x2a) {
const int existingTripletModeExt = index.model()->data(index.model()->index(index.row(), 2), Qt::EditRole).toInt();
if (existingTripletModeExt >= 0x20 && existingTripletModeExt != 0x24 && existingTripletModeExt != 0x25 && existingTripletModeExt != 0x26 && existingTripletModeExt != 0x2a) if (existingTripletModeExt >= 0x20 && existingTripletModeExt != 0x24 && existingTripletModeExt != 0x25 && existingTripletModeExt != 0x26 && existingTripletModeExt != 0x2a)
newTriplet.setAddress(index.model()->data(index.model()->index(index.row(), 0), Qt::UserRole).toInt()); newTriplet.setAddress(index.model()->data(index.model()->index(index.row(), 0), Qt::UserRole).toInt());
} }
// If we're inserting a Set Active Position or Full Row Colour triplet, // If we're inserting a Set Active Position or Full Row Colour triplet,
// look for a previous row setting triplet and set this one to the row after // look for a previous row setting triplet and set this one to the row after
if (modeExt == 0x04 || modeExt == 0x01) { if (modeExt == 0x04 || modeExt == 0x01) {
for (int i=newListRow-1; i>=0; i--) { for (int i=row-1; i>=0; i--) {
const int scanTripletModeExt = index.model()->data(index.model()->index(i, 2), Qt::EditRole).toInt(); const int scanTripletModeExt = index.model()->data(index.model()->index(i, 2), Qt::EditRole).toInt();
if (scanTripletModeExt == 0x04 || scanTripletModeExt == 0x01) { if (scanTripletModeExt == 0x04 || scanTripletModeExt == 0x01) {
const int scanActivePositionRow = index.model()->data(index.model()->index(i, 0), Qt::EditRole).toInt()+1; const int scanActivePositionRow = index.model()->data(index.model()->index(i, 0), Qt::EditRole).toInt()+1;
if (scanActivePositionRow < 25) if (scanActivePositionRow < 25)
newTriplet.setAddressRow(scanActivePositionRow); newTriplet.setAddressRow(scanActivePositionRow);
else else
newTriplet.setAddressRow(24); newTriplet.setAddressRow(24);
break; break;
}
} }
} }
} }
} else } else
newListRow = 0; row = 0;
// For character triplets, ensure Data is not reserved // For character triplets, ensure Data is not reserved
if (modeExt == 0x21 || modeExt == 0x22 || modeExt == 0x29 || modeExt == 0x2b || modeExt >= 0x2f) if (modeExt == 0x21 || modeExt == 0x22 || modeExt == 0x29 || modeExt == 0x2b || modeExt >= 0x2f)
@@ -1026,7 +1036,7 @@ void X26DockWidget::insertTriplet(int modeExt, bool after)
newTriplet.setData(7); newTriplet.setData(7);
} }
m_x26Model->insertRows(newListRow, 1, QModelIndex(), newTriplet); m_x26Model->insertRows(row, 1, QModelIndex(), newTriplet);
} }
void X26DockWidget::insertTripletCopy() void X26DockWidget::insertTripletCopy()
@@ -1110,23 +1120,41 @@ void X26DockWidget::customMenuRequested(QPoint pos)
TripletModeQMenu *modeChangeMenu = new TripletModeQMenu(this); TripletModeQMenu *modeChangeMenu = new TripletModeQMenu(this);
modeChangeMenu->setTitle(tr("Change mode")); modeChangeMenu->setTitle(tr("Change mode"));
customMenu->addMenu(modeChangeMenu); customMenu->addMenu(modeChangeMenu);
for (int m=0; m<64; m++)
connect(static_cast<TripletModeQMenu *>(modeChangeMenu)->action(m), &QAction::triggered, [=]() { cookedModeMenuSelected(m); });
customMenu->addSeparator(); customMenu->addSeparator();
} else
customMenu = new QMenu(this);
QAction *insertAct = new QAction("Insert triplet copy", this); TripletModeQMenu *insertBeforeQMenu = new TripletModeQMenu(this);
customMenu->addAction(insertAct); insertBeforeQMenu->setTitle(tr("Insert before"));
connect(insertAct, &QAction::triggered, this, &X26DockWidget::insertTripletCopy); customMenu->addMenu(insertBeforeQMenu);
if (index.isValid()) {
TripletModeQMenu *insertAfterQMenu = new TripletModeQMenu(this);
insertAfterQMenu->setTitle(tr("Insert after"));
customMenu->addMenu(insertAfterQMenu);
for (int m=0; m<64; m++) {
connect(static_cast<TripletModeQMenu *>(modeChangeMenu)->action(m), &QAction::triggered, [=]() { cookedModeMenuSelected(m); });
connect(static_cast<TripletModeQMenu *>(insertBeforeQMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, false); });
connect(static_cast<TripletModeQMenu *>(insertAfterQMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, true); });
}
QAction *insertCopyAct = new QAction(tr("Insert copy"), this);
customMenu->addAction(insertCopyAct);
connect(insertCopyAct, &QAction::triggered, this, &X26DockWidget::insertTripletCopy);
QAction *deleteAct = new QAction("Delete triplet", this); QAction *deleteAct = new QAction("Delete triplet", this);
customMenu->addAction(deleteAct); customMenu->addAction(deleteAct);
connect(deleteAct, &QAction::triggered, this, &X26DockWidget::deleteTriplet); connect(deleteAct, &QAction::triggered, this, &X26DockWidget::deleteTriplet);
} else {
customMenu = new QMenu(this);
TripletModeQMenu *appendModeMenu = new TripletModeQMenu(this);
appendModeMenu->setTitle(tr("Append"));
customMenu->addMenu(appendModeMenu);
for (int m=0; m<64; m++)
connect(static_cast<TripletModeQMenu *>(appendModeMenu)->action(m), &QAction::triggered, [=]() { insertTriplet(m, m_x26Model->rowCount()); });
} }
customMenu->popup(m_x26View->viewport()->mapToGlobal(pos)); customMenu->popup(m_x26View->viewport()->mapToGlobal(pos));
} }

View File

@@ -63,6 +63,7 @@ public:
public slots: public slots:
void insertTriplet(int modeExt, bool after); void insertTriplet(int modeExt, bool after);
void insertTriplet(int modeExt, int row = -1);
void insertTripletCopy(); void insertTripletCopy();
void deleteTriplet(); void deleteTriplet();
void customMenuRequested(QPoint pos); void customMenuRequested(QPoint pos);