Minsky: 3.17.0
item.h
Go to the documentation of this file.
1 /*
2  @copyright Steve Keen 2015
3  @author Russell Standish
4  This file is part of Minsky.
5 
6  Minsky is free software: you can redistribute it and/or modify it
7  under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Minsky is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with Minsky. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #ifndef ITEM_H
21 #define ITEM_H
22 
23 #include "noteBase.h"
24 #include "port.h"
25 #include "intrusiveMap.h"
26 #include "geometry.h"
27 #include "str.h"
28 #include "polyRESTProcessBase.h"
29 
30 #include <json_pack_base.h>
31 
32 #include <cairo.h>
33 #include <vector>
34 #include <cairo_base.h>
35 
36 #include <iostream>
37 #include <assert.h>
38 
39 #include <RESTProcess_base.h>
40 
41 namespace minsky
42 {
43  struct LassoBox;
44  struct Selection;
45  class GroupItems;
46  class Group;
47  class VariablePtr;
48  class VariableBase;
49  class OperationBase;
50  class SwitchIcon;
51  class PlotWidget;
52  class GodleyIcon;
53  class Ravel;
54 
55  class Item;
56  typedef std::shared_ptr<Item> ItemPtr;
57 
61  struct ClickType
62  {
64  };
65 
67  constexpr float portRadius=6;
68  constexpr float portRadiusMult=2.0f*portRadius;
69 
70  // ports are owned by their items, so it is not appropriate to
71  // default copy the port references
72  struct ItemPortVector: public std::vector<std::shared_ptr<Port> >
73  {
77  ItemPortVector& operator=(const ItemPortVector&) {return *this;}
79  };
80 
83  {
84  float m_left=0, m_right=0, m_top, m_bottom;
85  public:
86  void update(const Item& x);
87  bool contains(float x, float y) const {
88  // extend each item by a portradius to solve ticket #903
89  return m_left-portRadius<=x && m_right+portRadius>=x && m_top-portRadius<=y && m_bottom+portRadius>=y;
90  }
91  bool valid() const {return m_left!=m_right;}
92  float width() const {return m_right-m_left;}
93  float height() const {return m_bottom-m_top;}
94  float left() const {return m_left;}
95  float right() const {return m_right;}
96  float top() const {return m_top;}
97  float bottom() const {return m_bottom;}
98  };
99 
101  struct ItemExclude
102  {
104  classdesc::Exclude<std::weak_ptr<Group>> group;
105 
106  virtual ~ItemExclude() {}
107 
109  virtual const VariableBase* variableCast() const {return nullptr;}
110  virtual VariableBase* variableCast() {return nullptr;}
113  virtual const OperationBase* operationCast() const {return nullptr;}
114  virtual OperationBase* operationCast() {return nullptr;}
117  virtual const SwitchIcon* switchIconCast() const {return nullptr;}
118  virtual SwitchIcon* switchIconCast() {return nullptr;}
121  virtual const PlotWidget* plotWidgetCast() const {return nullptr;}
122  virtual PlotWidget* plotWidgetCast() {return nullptr;}
125  virtual const GodleyIcon* godleyIconCast() const {return nullptr;}
126  virtual GodleyIcon* godleyIconCast() {return nullptr;}
129  virtual const Ravel* ravelCast() const {return nullptr;}
130  virtual Ravel* ravelCast() {return nullptr;}
132 
135  virtual void insertControlled(Selection& selection) {}
139  void removeControlledItems();
140 
141  double m_rotation=0;
142  void rotate(const Point& mouse, const Point& orig);
144  };
145 
146  class Item: public NoteBase,
147  public classdesc::PolyRESTProcessBase,
148  public classdesc::Exclude<ItemExclude>
149  {
150 
151  protected:
152  // these need to be protected, not private to allow the setting of these in constructors.
153  double m_width=20, m_height=20;
155 
156  mutable struct MemoisedRotator: public Rotate
157  {
158  MemoisedRotator(): Rotate(0,0,0) {}
159  void update(float a,float x, float y) {
160  if (!initialisedFrom(a,x,y))
161  Rotate::operator=(Rotate(a,x,y));
162  }
163  } memoisedRotator;
164 
165  static void drawResizeHandle(cairo_t* cairo, double x, double y, double sf, double angle);
166 
167 
168  public:
169  Item()=default;
170  float m_x=0, m_y=0;
171  float m_sf=1;
172  mutable bool onResizeHandles=false;
173  bool onBorder=false;
174  std::string deleteCallback;
175 
177  virtual std::weak_ptr<Port> ports(std::size_t i) const {
178  return i<m_ports.size()? m_ports[i]: nullptr;
179  }
181  std::size_t portsSize() const {return m_ports.size();}
182  float portX(std::size_t i) {
183  if (auto p=ports(i).lock()) return p->x();
184  return 0;
185  }
186 
187  float portY(std::size_t i) {
188  if (auto p=ports(i).lock()) return p->y();
189  return 0;
190  }
192  mutable BoundingBox bb;
193  virtual bool contains(float xx, float yy) const {
194  auto hz=resizeHandleSize(); // extend by resize handle size (which is also portRadius)
195  return left()-hz<=xx && right()+hz>=xx && top()-hz<=yy && bottom()+hz>=yy;
196  }
197  bool contains(const Point& p) const {return contains(p.x(),p.y());}
198  void updateBoundingBox() override {bb.update(*this);}
199 
201  [[noreturn]] void throw_error(const std::string&) const;
202 
204  virtual bool ioVar() const {return false;}
206  virtual double value() const {return 0;}
207 
208  double rotation() const {return m_rotation;}
209  double rotation(const double& r) {return m_rotation=r;}
210 
212  std::pair<double,bool> rotationAsRadians() const;
213 
214  float iWidth() const {return m_width;}
215  float iWidth(const float& w) {
216  m_width=w;
217  bb.update(*this);
218  return m_width;
219  }
220 
221  float iHeight() const {return m_height;}
222  float iHeight(const float& h) {
223  m_height=h;
224  bb.update(*this);
225  return m_height;
226  }
227 
229  virtual void flip() {rotation(rotation()+180);}
230 
231  virtual std::string classType() const {return "Item";}
233  std::string id() const {return str(size_t(this));}
234 
235  virtual float x() const;
236  virtual float y() const;
237  virtual float zoomFactor() const;
238  void ensureBBValid() const {if (!bb.valid()) bb.update(*this);}
239  float width() const {return right()-left();}
240  float height() const {return bottom()-top();}
241  virtual std::vector<Point> corners() const; // 4 corners of item
242  float left() const;
243  float right() const;
244  float top() const;
245  float bottom() const;
246 
248  std::string bookmarkId() const {return tooltip().empty()? std::to_string(size_t(this)): tooltip();}
249  void adjustBookmark() const override;
250 
252  float resizeHandleSize() const {return std::max(portRadius*zoomFactor(), std::max(0.02f*width(), 0.02f*height()));}
254  virtual bool onResizeHandle(float x, float y) const;
256  virtual bool inItem(float x, float y) const {return false;}
258  virtual bool onItem(float x, float y) const;
260  virtual void onMouseDown(float x, float y) {}
262  virtual void onMouseUp(float x, float y) {}
265  virtual bool onMouseMotion(float x, float y) {return false;}
268  virtual bool onMouseOver(float x, float y) {return false;}
270  virtual void onMouseLeave() {}
273  virtual bool onKeyPress(int keySym, const std::string& utf8, int state)
274  {return false;}
275 
277  virtual void deleteAttachedWires();
278 
279  virtual Item* clone() const {
280  auto r=new Item(*this);
281  r->group.reset();
282  return r;
283  }
284 
286  virtual bool visible() const;
287 
288  void moveTo(float x, float y);
289 
291  virtual void draw(cairo_t* cairo) const;
293  virtual void resize(const LassoBox& b);
295  virtual float scaleFactor() const;
296  virtual float scaleFactor(const float& sf);
297 
300  void dummyDraw() const;
301 
303  virtual void displayTooltip(cairo_t*, const std::string&) const;
304 
306  virtual void updateIcon(double t) {}
307 
308  Item(const Item&)=default;
309  Item& operator=(const Item&)=default;
310  virtual ~Item() {}
311 
312  void drawPorts(cairo_t* cairo) const;
313  static void drawSelected(cairo_t* cairo);
314  virtual void drawResizeHandles(cairo_t* cairo) const;
315 
317  virtual ClickType::Type clickType(float x, float y) const;
318 
320  virtual std::shared_ptr<Port> closestOutPort(float x, float y) const;
321  virtual std::shared_ptr<Port> closestInPort(float x, float y) const;
322 
325  virtual std::shared_ptr<Item> select(float x, float y) const {return {};}
327  void RESTProcess(classdesc::RESTProcess_t& rp,const std::string& d) override
328  {::RESTProcess(rp,d,*this);}
329  void RESTProcess(classdesc::RESTProcess_t& rp,const std::string& d) const override
330  {::RESTProcess(rp,d,*this);}
331  virtual void json_pack(classdesc::json_pack_t& j) const
332  {::json_pack(j,"",*this);}
333 
335  virtual void displayDelayedTooltip(float x, float y) {}
336  virtual void disableDelayedTooltip() {}
337 
339  virtual bool editorMode() const {return false;}
340  virtual void toggleEditorMode() {}
341 
345  // all items feeding into other items must implement this
346  virtual Units units(bool check=false) const {
347  if (check) throw_error("units not implemented");
348  return {};
349  }
351  Units checkUnits() const {return units(true);}
352 
354  ItemPtr itemPtrFromThis() const;
355 
357  virtual void destroyFrame() {}
358  };
359 
360  typedef std::vector<ItemPtr> Items;
361 
363  {
364  bool onResizeHandle(float x, float y) const override;
365  void drawResizeHandles(cairo_t* cairo) const override;
367  virtual Point resizeHandleCoords() const;
368  };
369 
370 }
371 
372 #ifdef CLASSDESC
373 // omit these, because weak/shared pointers cause problems, and its
374 // not needed anyway
375 #pragma omit pack minsky::Item
376 #pragma omit unpack minsky::Item
377 
378 // omit ItemExclude to reduce the amount of boilerplate code needing to be compiled
379 #pragma omit pack minsky::ItemExclude
380 #pragma omit unpack minsky::ItemExclude
381 #pragma omit json_pack minsky::ItemExclude
382 #pragma omit json_unpack minsky::ItemExclude
383 #pragma omit xml_pack minsky::ItemExclude
384 #pragma omit xml_unpack minsky::ItemExclude
385 #pragma omit TCL_obj minsky::ItemExclude
386 #pragma omit RESTProcess minsky::ItemExclude
387 
388 #endif
389 namespace classdesc_access
390 {
391  template <> struct access_pack<minsky::Item>:
392  public classdesc::NullDescriptor<classdesc::pack_t> {};
393  template <> struct access_unpack<minsky::Item>:
394  public classdesc::NullDescriptor<classdesc::unpack_t> {};
395 }
396 #include "item.cd"
397 #include "item.xcd"
398 #endif
399 
virtual bool ioVar() const
indicates this is a group I/O variable
Definition: item.h:204
virtual Units units(bool check=false) const
compute the dimensional units
Definition: item.h:346
represents items that have been selected
Definition: selection.h:32
function f
Definition: canvas.m:1
float portY(std::size_t i)
Definition: item.h:187
virtual std::shared_ptr< Port > closestOutPort(float x, float y) const
returns closest output port to x,y
Definition: item.cc:421
virtual bool onMouseOver(float x, float y)
respond to mouse motion events (hover) without button pressed
Definition: item.h:268
void drawPorts(cairo_t *cairo) const
Definition: item.cc:294
void adjustBookmark() const override
adjust bookmark list to reflect current configuration
Definition: item.cc:192
float bottom() const
Definition: item.h:97
virtual void updateIcon(double t)
update display after a step()
Definition: item.h:306
represents whether a mouse click is on the item, on an output port (for wiring, or is actually outsid...
Definition: item.h:61
std::size_t portsSize() const
number of ports
Definition: item.h:181
virtual Point resizeHandleCoords() const
returns coordinates of the resizer handle
Definition: item.cc:205
Item()=default
bool initialisedFrom(float rot, float x, float y) const
Definition: geometry.h:53
float right() const
Definition: item.cc:170
virtual void displayTooltip(cairo_t *, const std::string &) const
display tooltip text, eg on mouseover
Definition: item.cc:398
virtual double value() const
current value of output port
Definition: item.h:206
bool contains(const Point &p) const
Definition: item.h:197
virtual float x() const
Definition: item.cc:107
virtual void removeControlledItems(GroupItems &)
remove all controlled items from a group
Definition: item.h:137
virtual void onMouseLeave()
respond to mouse leave events (when mouse leaves item)
Definition: item.h:270
virtual bool visible() const
whether this item is visible on the canvas.
Definition: item.cc:250
virtual float y() const
Definition: item.cc:114
virtual const PlotWidget * plotWidgetCast() const
a more efficient replacement for dynamic_cast<PlotWidget*>(this)
Definition: item.h:121
virtual void json_pack(classdesc::json_pack_t &j) const
Definition: item.h:331
float top() const
Definition: item.cc:177
void dummyDraw() const
draw into a dummy cairo context, for purposes of calculating port positions
Definition: item.cc:392
float iHeight() const
Definition: item.h:221
bool onResizeHandles
set to true to indicate mouse is ovcaler resize handles
Definition: item.h:172
bool onResizeHandle(float x, float y) const override
Definition: item.cc:236
represents rectangular region of a lasso operation
Definition: lasso.h:28
float m_sf
scale factor of item on canvas, or within group
Definition: item.h:171
virtual const SwitchIcon * switchIconCast() const
a more efficient replacement for dynamic_cast<SwitchIcon*>(this)
Definition: item.h:117
float y(float x, float y) const
Definition: geometry.h:60
virtual bool editorMode() const
some items have an editor mode attribute
Definition: item.h:339
std::shared_ptr< Item > ItemPtr
Definition: item.h:55
float width() const
Definition: item.h:92
Item members excluded from reflection.
Definition: item.h:101
virtual PlotWidget * plotWidgetCast()
a more efficient replacement for dynamic_cast<PlotWidget*>(this)
Definition: item.h:122
std::pair< double, bool > rotationAsRadians() const
return the rotation as radians, and whether rotation should have additional straight angle added for ...
Definition: item.cc:92
void RESTProcess(classdesc::RESTProcess_t &rp, const std::string &d) override
runs the RESTProcess descriptor suitable for this type
Definition: item.h:327
Rotate(float rot, float x0, float y0)
Definition: geometry.h:51
rotate (x,y) by rot (in degrees) around the origin (x0, y0) can be used for rotating multiple points ...
Definition: geometry.h:44
float m_left
Definition: item.h:84
float m_right
Definition: item.h:84
BoundingBox bb
canvas bounding box.
Definition: item.h:192
double m_height
Definition: item.h:153
virtual std::string const & tooltip() const
Definition: noteBase.h:36
virtual Ravel * ravelCast()
a more efficient replacement for dynamic_cast<Ravel*>(this)
Definition: item.h:130
bool valid() const
Definition: item.h:91
virtual float zoomFactor() const
Definition: item.cc:121
static void drawResizeHandle(cairo_t *cairo, double x, double y, double sf, double angle)
Definition: item.cc:316
minsky::Item::MemoisedRotator memoisedRotator
virtual const GodleyIcon * godleyIconCast() const
a more efficient replacement for dynamic_cast<GodleyIcon*>(this)
Definition: item.h:125
void update(const Item &x)
Definition: item.cc:46
void ensureBBValid() const
Definition: item.h:238
virtual SwitchIcon * switchIconCast()
a more efficient replacement for dynamic_cast<SwitchIcon*>(this)
Definition: item.h:118
virtual bool onResizeHandle(float x, float y) const
Definition: item.cc:228
Units checkUnits() const
perform units consistency checks
Definition: item.h:351
virtual void draw(cairo_t *cairo) const
draw this item into a cairo context
Definition: item.cc:363
float iHeight(const float &h)
Definition: item.h:222
virtual VariableBase * variableCast()
a more efficient replacement for dynamic_cast<VariableBase*>(this)
Definition: item.h:110
virtual ClickType::Type clickType(float x, float y) const
returns the clicktype given a mouse click at x, y.
Definition: item.cc:275
virtual bool onMouseMotion(float x, float y)
respond to mouse motion events with button pressed
Definition: item.h:265
virtual void insertControlled(Selection &selection)
insert this items controlled or controller items are inserted correctly into selection.
Definition: item.h:135
float left() const
Definition: item.cc:163
static void drawSelected(cairo_t *cairo)
Definition: item.cc:308
float iWidth(const float &w)
Definition: item.h:215
float width() const
Definition: item.h:239
float right() const
Definition: item.h:95
float iWidth() const
Definition: item.h:214
std::vector< ItemPtr > Items
Definition: item.h:360
float height() const
Definition: item.h:93
double rotation(const double &r)
Definition: item.h:209
float left() const
Definition: item.h:94
virtual const OperationBase * operationCast() const
a more efficient replacement for dynamic_cast<OperationBase*>(this)
Definition: item.h:113
virtual void onMouseUp(float x, float y)
respond to mouse up events
Definition: item.h:262
represents the units (in sense of dimensional analysis) of a variable.
Definition: units.h:34
double m_width
Definition: item.h:153
ItemPtr itemPtrFromThis() const
return a shared_ptr to this
Definition: item.cc:447
bool onBorder
true to indicate mouse hovering over border
Definition: item.h:173
void rotate(const Point &mouse, const Point &orig)
Definition: item.cc:100
boost::geometry::model::d2::point_xy< float > Point
Definition: geometry.h:34
std::string str(T x)
utility function to create a string representation of a numeric type
Definition: str.h:33
virtual void drawResizeHandles(cairo_t *cairo) const
Definition: item.cc:343
virtual bool contains(float xx, float yy) const
Definition: item.h:193
virtual void toggleEditorMode()
Definition: item.h:340
void throw_error(const std::string &) const
mark item on canvas, then throw
Definition: item.cc:86
virtual GodleyIcon * godleyIconCast()
a more efficient replacement for dynamic_cast<GodleyIcon*>(this)
Definition: item.h:126
ItemPortVector m_ports
Definition: item.h:154
float resizeHandleSize() const
resize handles should be at least a percentage if the icon size (#1025)
Definition: item.h:252
virtual float scaleFactor() const
factor by which item has been resized
Definition: item.cc:128
float m_bottom
Definition: item.h:84
virtual void resize(const LassoBox &b)
resize this item on the canvas
Definition: item.cc:333
ItemPortVector(const ItemPortVector &)
Definition: item.h:75
float bottom() const
Definition: item.cc:184
classdesc::Exclude< std::weak_ptr< Group > > group
owning group of this item.
Definition: item.h:104
virtual std::vector< Point > corners() const
Definition: item.cc:153
float height() const
Definition: item.h:240
virtual ~ItemExclude()
Definition: item.h:106
virtual void disableDelayedTooltip()
Definition: item.h:336
float portX(std::size_t i)
Definition: item.h:182
virtual std::string classType() const
Definition: item.h:231
void removeControlledItems()
remove all controlled items from their owning group
Definition: item.cc:441
virtual Item * clone() const
Definition: item.h:279
bounding box information (at zoom=1 scale)
Definition: item.h:82
std::string bookmarkId() const
Id of bookmark associated with this.
Definition: item.h:248
double m_rotation
rotation of icon, in degrees rotate item based on vector from orig to mouse
Definition: item.h:141
virtual bool inItem(float x, float y) const
Definition: item.h:256
virtual OperationBase * operationCast()
a more efficient replacement for dynamic_cast<OperationBase*>(this)
Definition: item.h:114
constexpr float portRadiusMult
Definition: item.h:68
virtual const Ravel * ravelCast() const
a more efficient replacement for dynamic_cast<Ravel*>(this)
Definition: item.h:129
virtual void deleteAttachedWires()
delete all attached wires
Definition: item.cc:139
Item & operator=(const Item &)=default
void moveTo(float x, float y)
Definition: item.cc:256
void updateBoundingBox() override
Definition: item.h:198
ItemPortVector & operator=(const ItemPortVector &)
Definition: item.h:77
bool contains(float x, float y) const
Definition: item.h:87
virtual std::weak_ptr< Port > ports(std::size_t i) const
callback to be run when item deleted from group
Definition: item.h:177
virtual bool onKeyPress(int keySym, const std::string &utf8, int state)
respond to key press events
Definition: item.h:273
void RESTProcess(classdesc::RESTProcess_t &rp, const std::string &d) const override
Definition: item.h:329
float m_y
position in canvas, or within group
Definition: item.h:170
virtual void destroyFrame()
destroy any popup windows associated with this
Definition: item.h:357
a container item for a plot widget
Definition: plotWidget.h:45
float m_x
Definition: item.h:170
constexpr float portRadius
radius of circle marking ports at zoom=1
Definition: item.h:67
virtual void displayDelayedTooltip(float x, float y)
enable extended tooltip help message appropriate for mouse at (x,y)
Definition: item.h:335
float x(float x, float y) const
Definition: geometry.h:59
void update(float a, float x, float y)
Definition: item.h:159
virtual void onMouseDown(float x, float y)
respond to mouse down events
Definition: item.h:260
virtual bool onItem(float x, float y) const
returns true if (x,y) is on the icon
Definition: item.cc:242
std::string id() const
return an id uniquely identifying this item
Definition: item.h:233
void drawResizeHandles(cairo_t *cairo) const override
Definition: item.cc:355
float top() const
Definition: item.h:96
ItemPortVector(ItemPortVector &&)
Definition: item.h:76
virtual std::shared_ptr< Port > closestInPort(float x, float y) const
Definition: item.cc:428
virtual void flip()
rotate icon though 180∘
Definition: item.h:229
double rotation() const
Definition: item.h:208
virtual ~Item()
Definition: item.h:310
std::string deleteCallback
Definition: item.h:174
virtual const VariableBase * variableCast() const
a more efficient replacement for dynamic_cast<VariableBase*>(this)
Definition: item.h:109
virtual std::shared_ptr< Item > select(float x, float y) const
returns the variable if point (x,y) is within a visible variable icon, null otherwise.
Definition: item.h:325
ItemPortVector & operator=(ItemPortVector &&)
Definition: item.h:78