25 #include <cairo_base.h> 35 SVGRenderer Lock::lockedIcon;
36 SVGRenderer Lock::unlockedIcon;
40 tooltip(
"Double click to lock/unlock");
49 m_ports.emplace_back(make_shared<Port>(*
this));
50 m_ports[0]->moveTo(x()+15,y());
51 m_ports.emplace_back(make_shared<InputPort>(*
this));
52 m_ports[1]->moveTo(x()-15,y());
57 if (
auto inputPort=ports(1).lock())
58 if (!inputPort->wires().empty())
59 if (
auto fromPort=inputPort->wires()[0]->from())
60 return dynamic_cast<Ravel*>(&fromPort->item());
65 void Lock::toggleLocked()
70 if (
auto* r=ravelInput())
74 lockedState=r->getState();
75 tooltip(ravelCAPI::description(lockedState));
78 throw_error(
"Locks can only be applied to Ravels");
81 void Lock::draw(cairo_t* cairo)
const 83 const float z=zoomFactor()*scaleFactor();
84 const float w=iWidth()*z, h=iHeight()*z;
87 const ecolab::cairo::CairoSave cs(cairo);
88 cairo_translate(cairo,-0.5*w,-0.5*h);
89 SVGRenderer* icon=locked()? &lockedIcon: &unlockedIcon;
96 displayTooltip(cairo,tooltip());
97 if (onResizeHandles) drawResizeHandles(cairo);
101 cairo_rectangle(cairo,-0.5*w-8,-0.5*h-8,w+16,h+8);
103 if (selected) drawSelected(cairo);
110 if (
auto* r=ravelInput())
111 if (
auto p=r->ports(1).lock())
113 Units inputUnits=p->units(check);
114 if (inputUnits.empty())
return inputUnits;
118 for (
const auto& h: lockedState.handleStates)
119 if (h.collapsed && h.reductionOp==ravel::Op::prod)
124 for (; i<r->maxRank(); ++i)
125 if (r->handleDescription(i)==h.description)
127 multiplier*=r->numSliceLabels(i);
132 for (
auto& u: inputUnits)
133 u.second*=multiplier;
138 return m_ports[1]->units(check);
141 void Lock::applyLockedStateToRavel()
const 143 if (
auto ravel=ravelInput())
144 ravel->applyState(lockedState);
void reset()
resets the variables back to their initial values
represents the units (in sense of dimensional analysis) of a variable.
CLASSDESC_ACCESS_EXPLICIT_INSTANTIATION(minsky::Lock)
Minsky & minsky()
global minsky object
void render(cairo_t *, double width, double height) const
render SVG into region of size width height