Xcos MVC: add a color and grid to diagrams and superblocks
[scilab.git] / scilab / modules / scicos / includes / model / BaseObject.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014-2014 - Scilab Enterprises - Clement DAVID
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #ifndef BASEOBJECT_HXX_
14 #define BASEOBJECT_HXX_
15
16 #include <vector>
17
18 #include "utilities.hxx"
19
20 namespace org_scilab_modules_scicos
21 {
22 namespace model
23 {
24
25 class BaseObject
26 {
27 public:
28     BaseObject(kind_t k) :
29         m_id(0), m_kind(k)
30     {
31     }
32     BaseObject(const BaseObject& b) :
33         m_id(0), m_kind(b.m_kind)
34     {
35     }
36     virtual ~BaseObject() = default;
37
38     inline bool operator<(BaseObject o) const
39     {
40         return m_id < o.m_id;
41     }
42     inline bool operator==(BaseObject o) const
43     {
44         return m_id == o.m_id;
45     }
46
47     inline ScicosID id() const
48     {
49         return m_id;
50     }
51     inline void id(ScicosID _id)
52     {
53         m_id = _id;
54     }
55
56     inline kind_t kind() const
57     {
58         return m_kind;
59     }
60
61 private:
62     /**
63      * An id is used as a reference to the current object
64      */
65     ScicosID m_id;
66
67     /**
68      * Kind of the Object
69      */
70     const kind_t m_kind;
71 };
72
73 /** @defgroup utilities Shared utility classes
74  * @{
75  */
76
77 /*
78  * Represent a graphical object
79  */
80 struct Geometry
81 {
82     double m_x;
83     double m_y;
84     double m_width;
85     double m_height;
86
87     Geometry() : m_x(0), m_y(0), m_width(20), m_height(20) {};
88     Geometry(const Geometry& g) : m_x(g.m_x), m_y(g.m_y), m_width(g.m_width), m_height(g.m_height) {};
89     Geometry(const std::vector<double>& v) : m_x(v[0]), m_y(v[1]), m_width(v[2]), m_height(v[3]) {};
90     Geometry(std::initializer_list<double> l) : m_x(*l.begin()), m_y(*(l.begin() + 1)), m_width(*(l.begin() + 2)), m_height(*(l.begin() + 3)) {};
91
92     void fill(std::vector<double>& v) const
93     {
94         v.resize(4);
95         v[0] = m_x;
96         v[1] = m_y;
97         v[2] = m_width;
98         v[3] = m_height;
99     }
100     bool operator==(const Geometry& g) const
101     {
102         return m_x == g.m_x && m_y == g.m_y && m_width == g.m_width && m_height == g.m_height;
103     }
104 };
105
106 /**
107  * Per port type descriptor
108  *
109  * FIXME: should reuse Scilab datatypes descriptors
110  */
111 struct Datatype
112 {
113 public:
114     Datatype(const Datatype& d) :
115         m_refCount(0), m_datatype_id(d.m_datatype_id), m_rows(d.m_rows), m_columns(d.m_columns) {};
116     Datatype(const std::vector<int>& v) :
117         m_refCount(0), m_datatype_id(v[2]), m_rows(v[0]), m_columns(v[1]) {};
118
119     // reference counter for the flyweight pattern
120     int m_refCount;
121
122     const int m_datatype_id;
123     const int m_rows;
124     const int m_columns;
125
126     bool operator==(const Datatype& d) const
127     {
128         return m_datatype_id == d.m_datatype_id && m_rows == d.m_rows && m_columns == d.m_columns;
129     }
130
131     bool operator<(const Datatype& d) const
132     {
133         // Lexicographical order
134         return m_datatype_id < d.m_datatype_id ||
135                (m_datatype_id == d.m_datatype_id && m_rows < d.m_rows) ||
136                (m_datatype_id == d.m_datatype_id && m_rows == d.m_rows && m_columns < d.m_columns);
137     }
138 };
139
140 /** @}*/
141
142 } /* namespace model */
143 } /* namespace org_scilab_modules_scicos */
144
145 #endif /* BASEOBJECT_HXX_ */