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 
61 
62  enum XYZ {
63  X, Y, Z
64  };
65 
66 public:
67 
68  RObject(RDocument* document=NULL, Id id = INVALID_ID) :
69  document(document), objectId(id), handle(INVALID_HANDLE), undone(false), protect(false) {
70  }
71  virtual ~RObject() {
72  }
73 
74  static void init();
75 
76  virtual RObject* clone() const = 0;
77 
79  return document;
80  }
81 
82  const RDocument* getDocument() const {
83  return document;
84  }
85 
86  void setDocument(RDocument* document) {
87  this->document = document;
88  }
89 
90  // static double variantToDouble(const QVariant& v, double defaultValue,
91  // bool ignoreError = true);
92  // static int variantToInt(const QVariant& v, int defaultValue,
93  // bool ignoreError = true);
94 
98  template<class T>
99  static bool setMember(T& variable, const QVariant& value,
100  bool condition = true) {
101 
102  if (!condition) {
103  return false;
104  }
105  variable = value.value<T> ();
106  return true;
107  }
108 
114  RObject::Id getId() const {
115  return objectId;
116  }
117 
119  return handle;
120  }
121 
122  bool isProtected() const {
123  return protect;
124  }
125 
126  void setProtected(bool on) {
127  protect = on;
128  }
129 
130  bool isUndone() const {
131  return undone;
132  }
133 
134  virtual void setUndone(bool on);
135 
136  virtual QSet<RPropertyTypeId> getPropertyTypeIds() const;
137  virtual QSet<RPropertyTypeId> getCustomPropertyTypeIds() const;
138 
143  virtual QPair<QVariant, RPropertyAttributes>
144  getProperty(RPropertyTypeId& propertyTypeId,
145  bool humanReadable = false,
146  bool noAttributes = false);
147 
156  virtual bool setProperty(RPropertyTypeId propertyTypeId,
157  const QVariant& value, RTransaction* transaction=NULL);
158 
163  virtual bool hasPropertyType(RPropertyTypeId propertyTypeId) {
164  return RPropertyTypeId::hasPropertyType(typeid(*this), propertyTypeId);
165  }
166 
172  virtual bool isSelectedForPropertyEditing() = 0;
173 
174  QVariant getCustomProperty(const QString& title, const QString& key, const QVariant& defaultValue = RDEFAULT_QVARIANT);
175  void setCustomProperty(const QString& title, const QString& key, const QVariant& value);
176  void removeCustomProperty(const QString& title, const QString& key);
177  QStringList getCustomPropertyTitles() const;
178  QStringList getCustomPropertyKeys(const QString& title) const;
179 
183  QMap<QString, QVariantMap> getCustomProperties() const;
184 
185  virtual int getComplexity() const {
186  return 0;
187  }
188 
192  // RPropertyTypeId getPropertyId(const QString& propertyGroupTitle, const QString& propertyTitle) {
193  // if (propertyTypeIdMap.count(propertyGroupTitle)==0 ||
194  // propertyTypeIdMap[propertyGroupTitle].count(propertyTitle)==0) {
195  //
196  // return -1;
197  // }
198  // else {
199  // return propertyTypeIdMap[propertyGroupTitle][propertyTitle];
200  // }
201  // }
202 
207  // static RPropertyTypeId getPropertyTypeId(const QString& propertyGroupTitle, const QString& propertyTitle) {
208  // if (propertyTypeIdMap.count(propertyGroupTitle)==0) {
209  // return -1;
210  // }
211  // if (propertyTypeIdMap[propertyGroupTitle].count(propertyTitle)==0) {
212  // return -1;
213  // }
214  //
215  // return propertyTypeIdMap[propertyGroupTitle][propertyTitle];
216  // }
217 
221  friend QDebug operator<<(QDebug dbg, const RObject& o) {
222  o.print(dbg);
223  return dbg;
224  }
225 
226 protected:
227  virtual void print(QDebug dbg) const;
228 
229  void setId(RObject::Id id) {
230  objectId = id;
231  }
232 
234  handle = h;
235  }
236 
240  static bool setMember(QString& variable, const QVariant& value,
241  bool condition = true);
245  static bool setMember(double& variable, const QVariant& value,
246  bool condition = true);
250  static bool setMember(int& variable, const QVariant& value,
251  bool condition = true);
255  static bool setMember(bool& variable, const QVariant& value,
256  bool condition = true);
260  static bool setMember(QList<double>& variable, const QVariant& value,
261  bool condition);
265  static bool setMemberX(QList<RVector>& variable, const QVariant& value,
266  bool condition = true);
270  static bool setMemberY(QList<RVector>& variable, const QVariant& value,
271  bool condition = true);
275  static bool setMemberZ(QList<RVector>& variable, const QVariant& value,
276  bool condition = true);
277 
281  static bool setMemberVector(QList<RVector>& variable, const QVariant& value,
282  RObject::XYZ xyz);
283 
284 private:
297  bool undone;
301  bool protect;
309  QMap<QString, QVariantMap> customProperties;
310 };
311 
314 Q_DECLARE_METATYPE(QList<QSharedPointer<RObject> >)
315 Q_DECLARE_METATYPE(QSharedPointer<RObject>)
316 Q_DECLARE_METATYPE(QSharedPointer<RObject>*)
317 typedef QMap<int, QSharedPointer<RObject> > _RMapIntObjectPointer;
318 Q_DECLARE_METATYPE(_RMapIntObjectPointer)
320 
321 #endif