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(ravel::Ravel::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;
90 cairo_scale(cairo, w/icon->
width(), h/icon->
height());
97 displayTooltip(cairo,tooltip());
98 if (onResizeHandles) drawResizeHandles(cairo);
102 cairo_rectangle(cairo,-0.5*w-8,-0.5*h-8,w+16,h+8);
104 if (selected) drawSelected(cairo);
111 if (
auto* r=ravelInput())
112 if (
auto p=r->ports(1).lock())
114 Units inputUnits=p->units(check);
115 if (inputUnits.empty())
return inputUnits;
119 for (
const auto& h: lockedState.handleStates)
120 if (h.collapsed && h.reductionOp==ravel::Op::prod)
125 for (; i<r->maxRank(); ++i)
126 if (r->handleDescription(i)==h.description)
128 multiplier*=r->numSliceLabels(i);
133 for (
auto& u: inputUnits)
134 u.second*=multiplier;
139 return m_ports[1]->units(check);
142 void Lock::applyLockedStateToRavel()
const 144 if (
auto ravel=ravelInput())
145 ravel->applyState(lockedState);
void reset()
resets the variables back to their initial values
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky's state cha...
represents the units (in sense of dimensional analysis) of a variable.
void render(cairo_t *) const
CLASSDESC_ACCESS_EXPLICIT_INSTANTIATION(minsky::Lock)
Minsky & minsky()
global minsky object