| @@ -145,6 +145,7 @@ struct RackWidget : OpaqueWidget { | |||||
| WireContainer *wireContainer; | WireContainer *wireContainer; | ||||
| std::string lastPath; | std::string lastPath; | ||||
| Vec lastMousePos; | Vec lastMousePos; | ||||
| bool lockModules = false; | |||||
| RackWidget(); | RackWidget(); | ||||
| ~RackWidget(); | ~RackWidget(); | ||||
| @@ -9,3 +9,4 @@ Cat by Nabilauzwa from the Noun Project | |||||
| Stopwatch by Arthur Shlain from the Noun Project | Stopwatch by Arthur Shlain from the Noun Project | ||||
| Sound by Gregor Cresnar from the Noun Project | Sound by Gregor Cresnar from the Noun Project | ||||
| Refresh by un·delivered from the Noun Project | Refresh by un·delivered from the Noun Project | ||||
| Lock by Andres Gleixner from the Noun Project | |||||
| @@ -0,0 +1,56 @@ | |||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
| <svg | |||||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
| xmlns:cc="http://creativecommons.org/ns#" | |||||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
| xmlns:svg="http://www.w3.org/2000/svg" | |||||
| xmlns="http://www.w3.org/2000/svg" | |||||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
| version="1.1" | |||||
| x="0px" | |||||
| y="0px" | |||||
| viewBox="-7074.5 3413.5 16 16" | |||||
| enable-background="new -7074.5 3413.5 24 24" | |||||
| xml:space="preserve" | |||||
| id="svg12" | |||||
| sodipodi:docname="noun_468341_cc.svg" | |||||
| width="16" | |||||
| height="16" | |||||
| inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||||
| id="metadata18"><rdf:RDF><cc:Work | |||||
| rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
| id="defs16" /><sodipodi:namedview | |||||
| pagecolor="#ffffff" | |||||
| bordercolor="#666666" | |||||
| borderopacity="1" | |||||
| objecttolerance="10" | |||||
| gridtolerance="10" | |||||
| guidetolerance="10" | |||||
| inkscape:pageopacity="0" | |||||
| inkscape:pageshadow="2" | |||||
| inkscape:window-width="1600" | |||||
| inkscape:window-height="882" | |||||
| id="namedview14" | |||||
| showgrid="false" | |||||
| inkscape:zoom="7.8666667" | |||||
| inkscape:cx="-9.7372881" | |||||
| inkscape:cy="15" | |||||
| inkscape:window-x="0" | |||||
| inkscape:window-y="18" | |||||
| inkscape:window-maximized="0" | |||||
| inkscape:current-layer="svg12" /><g | |||||
| id="g6" | |||||
| transform="matrix(0.49999833,0,0,0.49999833,-3535.2618,1708.7557)" | |||||
| style="fill:#b4b4b4;fill-opacity:1"><path | |||||
| d="m -7066.5,3420.5 c 0,-2 1.054,-4.287 4,-4.287 2.973,0 4,2.287 4,4.287 v 3 h 3 v -3.509 c 0,-3.491 -3.196,-6.478 -7,-6.491 -4.063,-0.018 -7.002,2.991 -7,7 -0.01,0.084 0,3 0,3 h 3 z" | |||||
| id="path2" | |||||
| inkscape:connector-curvature="0" | |||||
| style="fill:#b4b4b4;fill-opacity:1" /><rect | |||||
| x="-7071.5" | |||||
| y="3424.5" | |||||
| width="18" | |||||
| height="13" | |||||
| id="rect4" | |||||
| style="fill:#b4b4b4;fill-opacity:1" /></g></svg> | |||||
| @@ -301,9 +301,11 @@ void ModuleWidget::onDragEnd(EventDragEnd &e) { | |||||
| } | } | ||||
| void ModuleWidget::onDragMove(EventDragMove &e) { | void ModuleWidget::onDragMove(EventDragMove &e) { | ||||
| Rect newBox = box; | |||||
| newBox.pos = gRackWidget->lastMousePos.minus(dragPos); | |||||
| gRackWidget->requestModuleBoxNearest(this, newBox); | |||||
| if (!gRackWidget->lockModules) { | |||||
| Rect newBox = box; | |||||
| newBox.pos = gRackWidget->lastMousePos.minus(dragPos); | |||||
| gRackWidget->requestModuleBoxNearest(this, newBox); | |||||
| } | |||||
| } | } | ||||
| @@ -140,6 +140,15 @@ struct SampleRateButton : TooltipIconButton { | |||||
| } | } | ||||
| }; | }; | ||||
| struct RackLockButton : TooltipIconButton { | |||||
| RackLockButton() { | |||||
| setSVG(SVG::load(assetGlobal("res/icons/noun_468341_cc.svg"))); | |||||
| tooltipText = "Lock modules"; | |||||
| } | |||||
| void onAction(EventAction &e) override { | |||||
| gRackWidget->lockModules ^= true; | |||||
| } | |||||
| }; | |||||
| Toolbar::Toolbar() { | Toolbar::Toolbar() { | ||||
| @@ -176,6 +185,7 @@ Toolbar::Toolbar() { | |||||
| layout->addChild(new SampleRateButton()); | layout->addChild(new SampleRateButton()); | ||||
| layout->addChild(new PowerMeterButton()); | layout->addChild(new PowerMeterButton()); | ||||
| layout->addChild(new RackLockButton()); | |||||
| struct ZoomSlider : Slider { | struct ZoomSlider : Slider { | ||||
| void onAction(EventAction &e) override { | void onAction(EventAction &e) override { | ||||