QCAD
Open Source 2D CAD
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
RObject.h
Go to the documentation of this file.
1 
20 #ifndef ROBJECT_H
21 #define ROBJECT_H
22 
23 #include "core_global.h"
24 
25 #include "RPropertyAttributes.h"
26 #include "RPropertyTypeId.h"
27 
28 class RDocument;
29 class RTransaction;
30 
31 #ifndef RDEFAULT_QVARIANT
32 #define RDEFAULT_QVARIANT QVariant()
33 #endif
34 
35 
49 
50  friend class RStorage;
51 
52 public:
53  typedef int Id;
54  const static Id INVALID_ID;
55  typedef int Handle;
56  const static Handle INVALID_HANDLE;
57 
60 
61  enum XYZ {
62  X, Y, Z
63  };
64 
65 public:
66 
67  RObject(RDocument* document=NULL, Id id = INVALID_ID) :
68  document(document), objectId(id), handle(INVALID_HANDLE), undone(false) {
69  }
70  virtual ~RObject() {
71  }
72 
73  static void init();
74 
75  virtual RObject* clone() const = 0;
76 
78  return document;
79  }
80 
81  const RDocument* getDocument() const {
82  return document;
83  }
84 
85  void setDocument(RDocument* document) {
86  this->document = document;
87  }
88 
89  // static double variantToDouble(const QVariant& v, double defaultValue,
90  // bool ignoreError = true);
91  // static int variantToInt(const QVariant& v, int defaultValue,
92  // bool ignoreError = true);
93 
97  template<class T>
98  static bool setMember(T& variable, const QVariant& value,
99  bool condition = true) {
100 
101  if (!condition) {
102  return false;
103  }
104  variable = value.value<T> ();
105  return true;
106  }
107 
113  RObject::Id getId() const {
114  return objectId;
115  }
116 
118  return handle;
119  }
120 
121  bool isUndone() const {
122  return undone;
123  }
124 
125  virtual void setUndone(bool on);
126 
127  virtual QSet<RPropertyTypeId> getPropertyTypeIds() const;
128  virtual QSet<RPropertyTypeId> getCustomPropertyTypeIds() const;
129 
134  virtual QPair<QVariant, RPropertyAttributes>
135  getProperty(RPropertyTypeId& propertyTypeId,
136  bool humanReadable = false,
137  bool noAttributes = false);
138 
147  virtual bool setProperty(RPropertyTypeId propertyTypeId,
148  const QVariant& value, RTransaction* transaction=NULL);
149 
154  virtual bool hasPropertyType(RPropertyTypeId propertyTypeId) {
155  return RPropertyTypeId::hasPropertyType(typeid(*this), propertyTypeId);
156  }
157 
163  virtual bool isSelectedForPropertyEditing() = 0;
164 
165  QVariant getCustomProperty(const QString& title, const QString& key, const QVariant& defaultValue = RDEFAULT_QVARIANT);
166  void setCustomProperty(const QString& title, const QString& key, const QVariant& value);
167  void removeCustomProperty(const QString& title, const QString& key);
168  QStringList getCustomPropertyTitles() const;
169  QStringList getCustomPropertyKeys(const QString& title) const;
170 
174  QMap<QString, QVariantMap> getCustomProperties() const;
175 
176  virtual int getComplexity() const {
177  return 0;
178  }
179 
183  // RPropertyTypeId getPropertyId(const QString& propertyGroupTitle, const QString& propertyTitle) {
184  // if (propertyTypeIdMap.count(propertyGroupTitle)==0 ||
185  // propertyTypeIdMap[propertyGroupTitle].count(propertyTitle)==0) {
186  //
187  // return -1;
188  // }
189  // else {
190  // return propertyTypeIdMap[propertyGroupTitle][propertyTitle];
191  // }
192  // }
193 
198  // static RPropertyTypeId getPropertyTypeId(const QString& propertyGroupTitle, const QString& propertyTitle) {
199  // if (propertyTypeIdMap.count(propertyGroupTitle)==0) {
200  // return -1;
201  // }
202  // if (propertyTypeIdMap[propertyGroupTitle].count(propertyTitle)==0) {
203  // return -1;
204  // }
205  //
206  // return propertyTypeIdMap[propertyGroupTitle][propertyTitle];
207  // }
208 
212  friend QDebug operator<<(QDebug dbg, const RObject& o) {
213  o.print(dbg);
214  return dbg;
215  }
216 
217 protected:
218  virtual void print(QDebug dbg) const;
219 
220  void setId(RObject::Id id) {
221  objectId = id;
222  }
223 
225  handle = h;
226  }
227 
231  static bool setMember(QString& variable, const QVariant& value,
232  bool condition = true);
236  static bool setMember(double& variable, const QVariant& value,
237  bool condition = true);
241  static bool setMember(int& variable, const QVariant& value,
242  bool condition = true);
246  static bool setMember(bool& variable, const QVariant& value,
247  bool condition = true);
251  static bool setMember(QList<double>& variable, const QVariant& value,
252  bool condition);
256  static bool setMemberX(QList<RVector>& variable, const QVariant& value,
257  bool condition = true);
261  static bool setMemberY(QList<RVector>& variable, const QVariant& value,
262  bool condition = true);
266  static bool setMemberZ(QList<RVector>& variable, const QVariant& value,
267  bool condition = true);
268 
272  static bool setMemberVector(QList<RVector>& variable, const QVariant& value,
273  RObject::XYZ xyz);
274 
275 private:
288  bool undone;
296  QMap<QString, QVariantMap> customProperties;
297 };
298 
301 Q_DECLARE_METATYPE(QList<QSharedPointer<RObject> >)
302 Q_DECLARE_METATYPE(QSharedPointer<RObject>)
303 Q_DECLARE_METATYPE(QSharedPointer<RObject>*)
304 typedef QMap<int, QSharedPointer<RObject> > _RMapIntObjectPointer;
305 Q_DECLARE_METATYPE(_RMapIntObjectPointer)
307 
308 #endif