feat: per-plate iXex mode selection with undo, dark mode icons, and menu fixes

- Add per-plate iXex mode icon to the plate toolbar (normal, hover, dark, dark-hover SVG variants)
- Left-click cycles through available modes; right-click shows a popup menu with all modes as radio items
- Mode changes are recorded in the undo/redo snapshot system
- Fix double context menu: suppress EVT_GLCANVAS_PLATE_RIGHT_CLICK and EVT_GLCANVAS_RIGHT_CLICK when the iXex icon popup was already shown
- Remove ixex_parallel_mode combo from Print Settings > Other > Special mode (superseded by per-plate icon)
- Remove dead code: refresh_ixex_mode_combo(), m_ixex_mode_combo member, related Tab reload hook
- iXex mode persisted in 3MF project files via existing plate metadata serialization

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Clifford Garwood
2026-04-07 23:25:22 -04:00
co-authored by Claude Sonnet 4.6
parent f8565df113
commit ec40172019
15 changed files with 226 additions and 91 deletions
+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43" viewBox="0 0 43 43">
<rect x="1.5" y="1.5" width="40" height="40" rx="3.5" style="fill:#e9e9e9"/>
<path d="M38,2a3,3,0,0,1,3,3V38a3,3,0,0,1-3,3H5a3,3,0,0,1-3-3V5A3,3,0,0,1,5,2H38m0-1H5A4,4,0,0,0,1,5V38a4,4,0,0,0,4,4H38a4,4,0,0,0,4-4V5a4,4,0,0,0-4-4Z" style="fill:#545454;stroke-width:1.0015748;stroke-dasharray:none"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#545454;stroke-width:0.8;stroke-dasharray:none" transform="translate(2,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#545454;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.543848,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#545454;stroke-width:0.8;stroke-dasharray:none" transform="translate(1.9999996,17.214798)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#545454;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.517972,17.291251)"/>
<path d="M 21.527502,7.146574 V 35.745655" style="fill:#545454;stroke:#545454;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
<path d="M 8.3002566,21.575891 H 34.251585" style="fill:#545454;stroke:#545454;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43" viewBox="0 0 43 43">
<rect x="1.5" y="1.5" width="40" height="40" rx="3.5" style="fill:#54545a"/>
<path d="M38,2a3,3,0,0,1,3,3V38a3,3,0,0,1-3,3H5a3,3,0,0,1-3-3V5A3,3,0,0,1,5,2H38m0-1H5A4,4,0,0,0,1,5V38a4,4,0,0,0,4,4H38a4,4,0,0,0,4-4V5a4,4,0,0,0-4-4Z" style="fill:#b3b3b3;stroke-width:1.0015748;stroke-dasharray:none"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#c4c4c4;stroke-width:0.8;stroke-dasharray:none" transform="translate(2,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#c4c4c4;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.543848,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#c4c4c4;stroke-width:0.8;stroke-dasharray:none" transform="translate(1.9999996,17.214798)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#c4c4c4;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.517972,17.291251)"/>
<path d="M 21.527502,7.146574 V 35.745655" style="fill:#c4c4c4;stroke:#c4c4c4;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
<path d="M 8.3002566,21.575891 H 34.251585" style="fill:#c4c4c4;stroke:#c4c4c4;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43" viewBox="0 0 43 43">
<rect x="1.5" y="1.5" width="40" height="40" rx="3.5" style="fill:#e9e9e9"/>
<path d="M38,2a3,3,0,0,1,3,3V38a3,3,0,0,1-3,3H5a3,3,0,0,1-3-3V5A3,3,0,0,1,5,2H38m0-1H5A4,4,0,0,0,1,5V38a4,4,0,0,0,4,4H38a4,4,0,0,0,4-4V5a4,4,0,0,0-4-4Z" style="fill:#009688;stroke-width:1.0015748;stroke-dasharray:none"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(2,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.543848,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(1.9999996,17.214798)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.517972,17.291251)"/>
<path d="M 21.527502,7.146574 V 35.745655" style="fill:#009688;stroke:#009688;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
<path d="M 8.3002566,21.575891 H 34.251585" style="fill:#009688;stroke:#009688;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43" viewBox="0 0 43 43">
<rect x="1.5" y="1.5" width="40" height="40" rx="3.5" style="fill:#54545a"/>
<path d="M38,2a3,3,0,0,1,3,3V38a3,3,0,0,1-3,3H5a3,3,0,0,1-3-3V5A3,3,0,0,1,5,2H38m0-1H5A4,4,0,0,0,1,5V38a4,4,0,0,0,4,4H38a4,4,0,0,0,4-4V5a4,4,0,0,0-4-4Z" style="fill:#009688;stroke-width:1.0015748;stroke-dasharray:none"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(2,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.543848,0.6593574)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(1.9999996,17.214798)"/>
<path d="M 16.798963,13.679793 14.08412,14.062706 12.860469,16.516209 11.657363,14.052567 8.9458146,13.646979 10.917098,11.741451 10.46492,9.0372811 12.886345,10.323242 15.318433,9.0575608 14.843673,11.757857 Z" style="fill:none;stroke:#009688;stroke-width:0.8;stroke-dasharray:none" transform="translate(15.517972,17.291251)"/>
<path d="M 21.527502,7.146574 V 35.745655" style="fill:#009688;stroke:#009688;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
<path d="M 8.3002566,21.575891 H 34.251585" style="fill:#009688;stroke:#009688;stroke-width:0.8;stroke-linecap:round;stroke-dasharray:none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB