31 QGraphicsItem *itemAtMouse,
33 const QList<GraphicElement *> &elements,
34 QComboBox *colorCombo,
36 const std::function<
void(QUndoCommand *)> &sendCommand,
37 const std::function<
void()> &onRename,
38 const std::function<
void()> &onTriggerChange,
39 const std::function<
void()> &onAppearanceChange,
40 const std::function<
void()> &onAppearanceRevert,
41 const std::function<
void()> &onFrequencyFocus,
42 const std::function<
void()> &onEditSubcircuit,
43 const std::function<
void()> &onEmbedSubcircuit,
44 const std::function<
void()> &onExtractToFile)
47 const QString changeAppearanceText(QObject::tr(
"Change appearance to ..."));
48 const QString colorMenuText(QObject::tr(
"Change color to..."));
49 const QString flipHorizontalText(QObject::tr(
"Flip horizontally"));
50 const QString flipVerticalText(QObject::tr(
"Flip vertically"));
51 const QString frequencyText(QObject::tr(
"Change frequency"));
52 const QString morphMenuText(QObject::tr(
"Morph to..."));
53 const QString renameText(QObject::tr(
"Rename"));
54 const QString revertAppearanceText(QObject::tr(
"Restore default appearance"));
55 const QString rotateLeftText(QObject::tr(
"Rotate left"));
56 const QString rotateRightText(QObject::tr(
"Rotate right"));
57 const QString triggerText(QObject::tr(
"Change trigger"));
60 menu.addAction(QIcon(QPixmap(
":/Interface/Toolbar/rename.svg")), renameText)->setData(renameText);
64 menu.addAction(QIcon(
ElementFactory::pixmap(ElementType::InputButton)), triggerText)->setData(triggerText);
68 menu.addAction(changeAppearanceText);
69 menu.addAction(revertAppearanceText);
72 menu.addAction(QIcon(QPixmap(
":/Interface/Toolbar/rotateL.svg")), rotateLeftText)->setData(rotateLeftText);
73 menu.addAction(QIcon(QPixmap(
":/Interface/Toolbar/rotateR.svg")), rotateRightText)->setData(rotateRightText);
74 menu.addAction(flipHorizontalText)->setData(flipHorizontalText);
75 menu.addAction(flipVerticalText)->setData(flipVerticalText);
81 QMenu *submenuColors =
nullptr;
84 submenuColors = menu.addMenu(colorMenuText);
85 for (
int i = 0; i < colorCombo->count(); ++i) {
86 if (colorCombo->currentIndex() != i) {
87 submenuColors->addAction(colorCombo->itemIcon(i), colorCombo->itemText(i));
92 QMenu *submenuMorph =
nullptr;
94 if (
auto *selectedElm = qgraphicsitem_cast<GraphicElement *>(itemAtMouse); selectedElm && caps.
canMorph) {
95 submenuMorph = menu.addMenu(morphMenuText);
97 switch (selectedElm->elementGroup()) {
98 case ElementGroup::Gate: {
99 if (selectedElm->inputSize() == 1) {
113 case ElementGroup::StaticInput: [[fallthrough]];
114 case ElementGroup::Input: {
124 case ElementGroup::Memory: {
126 if (selectedElm->inputSize() == 2) {
130 if (selectedElm->inputSize() == 4) {
135 if (selectedElm->inputSize() == 5) {
142 case ElementGroup::Output: {
143 if ((selectedElm->elementType() == ElementType::Display7)
144 || (selectedElm->elementType() == ElementType::Display14)
145 || (selectedElm->elementType() == ElementType::Display16)) {
156 case ElementGroup::IC: [[fallthrough]];
157 case ElementGroup::Mux: [[fallthrough]];
158 case ElementGroup::Other:
159 case ElementGroup::Unknown:
break;
164 if (submenuMorph->actions().empty()) {
165 menu.removeAction(submenuMorph->menuAction());
170 const QString editSubcircuitText(QObject::tr(
"Edit sub-circuit"));
171 const QString embedSubcircuitText(QObject::tr(
"Embed sub-circuit"));
172 const QString extractToFileText(QObject::tr(
"Extract to file"));
175 menu.addAction(editSubcircuitText)->setData(editSubcircuitText);
178 menu.addAction(embedSubcircuitText)->setData(embedSubcircuitText);
181 menu.addAction(extractToFileText)->setData(extractToFileText);
187 QAction *copyAction = menu.addAction(QIcon(QPixmap(
":/Interface/Toolbar/copy.svg")), QObject::tr(
"Copy"));
188 QAction *cutAction = menu.addAction(QIcon(QPixmap(
":/Interface/Toolbar/cut.svg")), QObject::tr(
"Cut"));
193 QAction *deleteAction = menu.addAction(QIcon(QPixmap(
":/Interface/Toolbar/delete.svg")), QObject::tr(
"Delete"));
196 QAction *action = menu.exec(screenPos);
202 const QString actionData = action->data().toString();
203 const QString actionText = action->text();
205 if (actionData == renameText) { onRename();
return; }
206 if (actionData == triggerText) { onTriggerChange();
return; }
207 if (actionText == changeAppearanceText) { onAppearanceChange();
return; }
208 if (actionText == revertAppearanceText) { onAppearanceRevert();
return; }
209 if (actionData == frequencyText) { onFrequencyFocus();
return; }
210 if (actionData == editSubcircuitText) { onEditSubcircuit();
return; }
211 if (actionData == embedSubcircuitText) { onEmbedSubcircuit();
return; }
212 if (actionData == extractToFileText) { onExtractToFile();
return; }
214 if (actionData == rotateLeftText) {
219 if (actionData == rotateRightText) {
224 if (actionData == flipHorizontalText) {
229 if (actionData == flipVerticalText) {
234 if (submenuMorph && submenuMorph->actions().contains(action)) {
235 if (
auto type =
static_cast<ElementType>(action->data().toInt()); type != ElementType::Unknown) {
241 if (submenuColors && submenuColors->actions().contains(action)) {
242 colorCombo->setCurrentText(action->text());
246 if ((actionText == QObject::tr(
"Copy")) || (actionText == QObject::tr(
"Cut")) || (actionText == QObject::tr(
"Delete"))) {