1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-23 16:25:16 +03:00

New LimitData::isEmpty function and context menu enhancements (#7030)

This commit is contained in:
Neil Horne 2019-11-21 18:28:24 +11:00 committed by Bertrand Songis
parent fd4d096058
commit 4b15e3910c
4 changed files with 108 additions and 22 deletions

View file

@ -85,6 +85,11 @@ void LimitData::clear()
max = +1000; max = +1000;
} }
bool LimitData::isEmpty() const
{
return (min == -1000 && max == 1000 && !revert && !offset && !ppmCenter && !symetrical && name[0] == '\0');
}
/* /*
* CurveData * CurveData

View file

@ -111,6 +111,7 @@ class LimitData {
QString revertToString() const; QString revertToString() const;
QString nameToString(int index) const; QString nameToString(int index) const;
void clear(); void clear();
bool isEmpty() const;
}; };
class CurvePoint { class CurvePoint {

View file

@ -101,6 +101,7 @@ Channels::Channels(QWidget * parent, ModelData & model, GeneralSettings & genera
{ {
Stopwatch s1("Channels"); Stopwatch s1("Channels");
chnCapability = firmware->getCapability(Outputs);
int channelNameMaxLen = firmware->getCapability(ChannelsName); int channelNameMaxLen = firmware->getCapability(ChannelsName);
QStringList headerLabels; QStringList headerLabels;
@ -115,11 +116,11 @@ Channels::Channels(QWidget * parent, ModelData & model, GeneralSettings & genera
headerLabels << tr("PPM Center"); headerLabels << tr("PPM Center");
if (firmware->getCapability(SYMLimits)) if (firmware->getCapability(SYMLimits))
headerLabels << tr("Linear Subtrim"); headerLabels << tr("Linear Subtrim");
TableLayout *tableLayout = new TableLayout(this, firmware->getCapability(LogicalSwitches), headerLabels); TableLayout *tableLayout = new TableLayout(this, chnCapability, headerLabels);
s1.report("header"); s1.report("header");
for (int i=0; i<firmware->getCapability(Outputs); i++) { for (int i=0; i<chnCapability; i++) {
int col = 0; int col = 0;
// Channel label // Channel label
@ -196,7 +197,7 @@ Channels::Channels(QWidget * parent, ModelData & model, GeneralSettings & genera
disableMouseScrolling(); disableMouseScrolling();
tableLayout->resizeColumnsToContents(); tableLayout->resizeColumnsToContents();
tableLayout->pushRowsUp(firmware->getCapability(Outputs)+1); tableLayout->pushRowsUp(chnCapability+1);
s1.report("end"); s1.report("end");
} }
@ -279,7 +280,7 @@ void Channels::ppmcenterEdited()
void Channels::update() void Channels::update()
{ {
for (int i=0; i<firmware->getCapability(Outputs); i++) { for (int i=0; i<chnCapability; i++) {
updateLine(i); updateLine(i);
} }
} }
@ -315,8 +316,8 @@ void Channels::chnPaste()
{ {
const QClipboard *clipboard = QApplication::clipboard(); const QClipboard *clipboard = QApplication::clipboard();
const QMimeData *mimeData = clipboard->mimeData(); const QMimeData *mimeData = clipboard->mimeData();
if (mimeData->hasFormat("application/x-companion-chn")) { if (mimeData->hasFormat(MIMETYPE_CHN)) {
QByteArray chnData = mimeData->data("application/x-companion-chn"); QByteArray chnData = mimeData->data(MIMETYPE_CHN);
LimitData *chn = &model->limitData[selectedChannel]; LimitData *chn = &model->limitData[selectedChannel];
memcpy(chn, chnData.constData(), sizeof(LimitData)); memcpy(chn, chnData.constData(), sizeof(LimitData));
updateLine(selectedChannel); updateLine(selectedChannel);
@ -326,8 +327,17 @@ void Channels::chnPaste()
void Channels::chnDelete() void Channels::chnDelete()
{ {
model->limitData[selectedChannel].clear(); int maxidx = chnCapability - 1;
updateLine(selectedChannel); for (int i=selectedChannel; i<maxidx; i++) {
if (!model->limitData[i].isEmpty() || !model->limitData[i+1].isEmpty()) {
LimitData *chn1 = &model->limitData[i];
LimitData *chn2 = &model->limitData[i+1];
memcpy(chn1, chn2, sizeof(LimitData));
updateLine(i);
}
}
model->limitData[maxidx].clear();
updateLine(maxidx);
emit modified(); emit modified();
} }
@ -336,32 +346,93 @@ void Channels::chnCopy()
QByteArray chnData; QByteArray chnData;
chnData.append((char*)&model->limitData[selectedChannel],sizeof(LimitData)); chnData.append((char*)&model->limitData[selectedChannel],sizeof(LimitData));
QMimeData *mimeData = new QMimeData; QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-companion-chn", chnData); mimeData->setData(MIMETYPE_CHN, chnData);
QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard);
} }
void Channels::chnCut() void Channels::chnCut()
{ {
chnCopy(); chnCopy();
chnDelete(); chnClear();
} }
void Channels::chn_customContextMenuRequested(QPoint pos) void Channels::chn_customContextMenuRequested(QPoint pos)
{ {
QLabel *label = (QLabel *)sender(); QLabel *label = (QLabel *)sender();
selectedChannel = label->property("index").toInt(); selectedChannel = label->property("index").toInt();
QPoint globalPos = label->mapToGlobal(pos); QPoint globalPos = label->mapToGlobal(pos);
const QClipboard *clipboard = QApplication::clipboard(); const QClipboard *clipboard = QApplication::clipboard();
const QMimeData *mimeData = clipboard->mimeData(); const QMimeData *mimeData = clipboard->mimeData();
bool hasData = mimeData->hasFormat("application/x-companion-chn"); bool hasData = mimeData->hasFormat(MIMETYPE_CHN);
bool moveUpAllowed = (selectedChannel > 0);
bool moveDownAllowed = (selectedChannel < (chnCapability - 1));
bool insertAllowed = (selectedChannel < (chnCapability - 1)) && (model->limitData[chnCapability - 1].isEmpty());
QMenu contextMenu; QMenu contextMenu;
contextMenu.addAction(CompanionIcon("copy.png"), tr("&Copy"),this,SLOT(chnCopy())); contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(chnCopy()));
contextMenu.addAction(CompanionIcon("cut.png"), tr("&Cut"),this,SLOT(chnCut())); contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(chnCut()));
contextMenu.addAction(CompanionIcon("paste.png"), tr("&Paste"),this,SLOT(chnPaste()))->setEnabled(hasData); contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(chnPaste()))->setEnabled(hasData);
contextMenu.addAction(CompanionIcon("clear.png"), tr("&Delete"),this,SLOT(chnDelete())); contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(chnClear()));
contextMenu.addSeparator();
contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"),this,SLOT(chnInsert()))->setEnabled(insertAllowed);
contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"),this,SLOT(chnDelete()));
contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(chnMoveUp()))->setEnabled(moveUpAllowed);
contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(chnMoveDown()))->setEnabled(moveDownAllowed);
contextMenu.addSeparator();
contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(chnClearAll()));
contextMenu.exec(globalPos); contextMenu.exec(globalPos);
}
void Channels::chnMoveUp()
{
swapChnData(selectedChannel, selectedChannel - 1);
}
void Channels::chnMoveDown()
{
swapChnData(selectedChannel, selectedChannel + 1);
}
void Channels::chnClear()
{
model->limitData[selectedChannel].clear();
updateLine(selectedChannel);
emit modified();
}
void Channels::chnClearAll()
{
for (int i=0; i<chnCapability; i++) {
model->limitData[i].clear();
updateLine(i);
}
emit modified();
}
void Channels::chnInsert()
{
for (int i=(chnCapability - 1); i>selectedChannel; i--) {
if (!model->limitData[i].isEmpty() || !model->limitData[i-1].isEmpty()) {
memcpy(&model->limitData[i], &model->limitData[i-1], sizeof(LimitData));
updateLine(i);
}
}
chnClear();
}
void Channels::swapChnData(int idx1, int idx2)
{
if ((idx1 != idx2) && (!model->limitData[idx1].isEmpty() || !model->limitData[idx2].isEmpty())) {
LimitData chntmp = model->limitData[idx2];
LimitData *chn1 = &model->limitData[idx1];
LimitData *chn2 = &model->limitData[idx2];
memcpy(chn2, chn1, sizeof(LimitData));
memcpy(chn1, &chntmp, sizeof(LimitData));
updateLine(idx1);
updateLine(idx2);
emit modified();
}
} }

View file

@ -26,6 +26,8 @@
#include <QtCore> #include <QtCore>
constexpr char MIMETYPE_CHN[] = "application/x-companion-chn";
class GVarGroup; class GVarGroup;
class LimitsGroup class LimitsGroup
@ -70,9 +72,15 @@ class Channels : public ModelPanel
void chnCopy(); void chnCopy();
void chnPaste(); void chnPaste();
void chnCut(); void chnCut();
void chnMoveUp();
void chnMoveDown();
void chnInsert();
void chnClear();
void chnClearAll();
void chn_customContextMenuRequested(QPoint pos); void chn_customContextMenuRequested(QPoint pos);
private: private:
void swapChnData(int idx1, int idx2);
QLineEdit *name[CPN_MAX_CHNOUT]; QLineEdit *name[CPN_MAX_CHNOUT];
LimitsGroup *chnOffset[CPN_MAX_CHNOUT]; LimitsGroup *chnOffset[CPN_MAX_CHNOUT];
LimitsGroup *chnMin[CPN_MAX_CHNOUT]; LimitsGroup *chnMin[CPN_MAX_CHNOUT];
@ -82,6 +90,7 @@ class Channels : public ModelPanel
QSpinBox *centerSB[CPN_MAX_CHNOUT]; QSpinBox *centerSB[CPN_MAX_CHNOUT];
QCheckBox *symlimitsChk[CPN_MAX_CHNOUT]; QCheckBox *symlimitsChk[CPN_MAX_CHNOUT];
int selectedChannel; int selectedChannel;
int chnCapability;
}; };
#endif // _CHANNELS_H_ #endif // _CHANNELS_H_