Crossfire Resources Editor
AssetWrapper.h
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 2022 the Crossfire Development Team
5  *
6  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
7  * welcome to redistribute it under certain conditions. For details, please
8  * see COPYING and LICENSE.
9  *
10  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
11  */
12 
13 #ifndef ASSETWRAPPER_H
14 #define ASSETWRAPPER_H
15 
16 #include <QObject>
17 #include <QIcon>
18 
19 class QMimeData;
20 class QMenu;
21 
25 class AssetWrapper : public QObject {
26  Q_OBJECT
27 
28  Q_PROPERTY(AssetWrapper *self READ self)
29  Q_PROPERTY(QString displayName READ displayName)
30 
31 public:
34  static const char *tipProperty;
35 
36  AssetWrapper(AssetWrapper *parent, const QString &panelName = "empty")
37  : QObject(parent), myParent(parent), myPanelName(panelName) {
38  }
39  virtual ~AssetWrapper() override {};
40 
41  AssetWrapper *self() { return this; }
42 
43  virtual QString displayName() const = 0;
44  virtual QIcon displayIcon() const { return QIcon(); }
45  virtual QString displayPanelName() const { return myPanelName; }
46  AssetWrapper *displayParent() const { return myParent; }
47  void setDisplayParent(AssetWrapper *parent) { myParent = parent; }
48 
49  virtual QString tooltip() const { return QString(); }
50 
51  virtual int childrenCount() const { return 0; }
52  virtual AssetWrapper *child(int) { return nullptr; }
53  virtual int childIndex(AssetWrapper *) { return -1; }
54 
55  virtual PossibleUse uses(const AssetWrapper *, std::string &) const { return DoesntUse; }
56 
57  void markModified(ChangeType change, int extra = 0) {
58  emit modified();
59  wasModified(this, change, extra);
60  }
61 
62  virtual bool canDrag() const { return false; }
63  virtual void drag(QMimeData *) const { }
64  virtual bool canDrop(const QMimeData *, int) const { return false; }
65  virtual void drop(const QMimeData *, int) { }
66  virtual void fillMenu(QMenu *) { }
67 
68  virtual bool canExportAsCsv() const { return false; }
69  virtual void fillCsvHeader(QString&) const { assert(false); }
70  virtual void exportAsCSV(const AssetWrapper *, QString&) const { assert(false); }
71 
72  static bool compareByDisplayName(const AssetWrapper *left, const AssetWrapper *right) {
73  return left->displayName().compare(right->displayName(), Qt::CaseInsensitive) < 0;
74  }
75 
76 public slots:
77  virtual void removeChild(AssetWrapper *) { }
78 
79 signals:
80  void dataModified(AssetWrapper *asset, AssetWrapper::ChangeType type, int extra);
81  void modified();
82 
83 protected:
84  virtual void wasModified(AssetWrapper *asset, ChangeType type, int extra) {
85  if (myParent) {
86  myParent->wasModified(asset, type, extra);
87  } else {
88  emit dataModified(asset, type, extra);
89  }
90  }
91 
93  QString myPanelName;
94 };
95 
99 template<typename T>
100 class AssetTWrapper : public AssetWrapper {
101 public:
102  AssetTWrapper(AssetWrapper *parent, const QString &panelName, T* wrappedItem)
103  : AssetWrapper(parent, panelName) {
105  };
106 
107  T *wrappedItem() const { return myWrappedItem; }
108 
109 protected:
111 };
112 
120 #define ATW_RPROP(type_, name_, field_) \
121  public: \
122  type_ name_() const { return myWrappedItem->field_; } \
123  Q_PROPERTY(type_ name_ READ name_)
124 
132 #define ATW_PROP(type_, name_, field_) \
133  public: \
134  type_ name_() const { return myWrappedItem->field_; } \
135  void name_(const type_ &val) { myWrappedItem->field_ = val; } \
136  Q_PROPERTY(type_ name_ READ name_ WRITE name_)
137 
138 #endif /* ASSETWRAPPER_H */
AssetTWrapper::myWrappedItem
T * myWrappedItem
Definition: AssetWrapper.h:110
AssetWrapper::AfterLayoutChange
@ AfterLayoutChange
Definition: AssetWrapper.h:33
AssetWrapper::AssetUpdated
@ AssetUpdated
Definition: AssetWrapper.h:33
AssetWrapper::drag
virtual void drag(QMimeData *) const
Definition: AssetWrapper.h:63
AssetWrapper::AfterChildAdd
@ AfterChildAdd
Definition: AssetWrapper.h:33
AssetWrapper::AssetWrapper
AssetWrapper(AssetWrapper *parent, const QString &panelName="empty")
Definition: AssetWrapper.h:36
AssetWrapper::PossibleUse
PossibleUse
Definition: AssetWrapper.h:32
AssetWrapper::AfterChildRemove
@ AfterChildRemove
Definition: AssetWrapper.h:33
AssetWrapper::setDisplayParent
void setDisplayParent(AssetWrapper *parent)
Definition: AssetWrapper.h:47
AssetWrapper::removeChild
virtual void removeChild(AssetWrapper *)
Definition: AssetWrapper.h:77
AssetWrapper::displayName
QString displayName
Definition: AssetWrapper.h:29
AssetWrapper::child
virtual AssetWrapper * child(int)
Definition: AssetWrapper.h:52
AssetWrapper::tipProperty
static const char * tipProperty
Definition: AssetWrapper.h:34
AssetWrapper::ChildrenMayUse
@ ChildrenMayUse
Definition: AssetWrapper.h:32
AssetWrapper::myPanelName
QString myPanelName
Definition: AssetWrapper.h:93
AssetWrapper::canDrag
virtual bool canDrag() const
Definition: AssetWrapper.h:62
AssetWrapper::fillCsvHeader
virtual void fillCsvHeader(QString &) const
Definition: AssetWrapper.h:69
AssetWrapper::BeforeChildAdd
@ BeforeChildAdd
Definition: AssetWrapper.h:33
AssetWrapper::childrenCount
virtual int childrenCount() const
Definition: AssetWrapper.h:51
AssetWrapper
Base class for all assets that can be displayed or edited by CRE.
Definition: AssetWrapper.h:25
AssetWrapper::myParent
AssetWrapper * myParent
Definition: AssetWrapper.h:92
AssetWrapper::canDrop
virtual bool canDrop(const QMimeData *, int) const
Definition: AssetWrapper.h:64
AssetWrapper::tooltip
virtual QString tooltip() const
Definition: AssetWrapper.h:49
AssetWrapper::~AssetWrapper
virtual ~AssetWrapper() override
Definition: AssetWrapper.h:39
AssetWrapper::ChangeType
ChangeType
Definition: AssetWrapper.h:33
AssetWrapper::fillMenu
virtual void fillMenu(QMenu *)
Definition: AssetWrapper.h:66
AssetWrapper::Uses
@ Uses
Definition: AssetWrapper.h:32
AssetWrapper::modified
void modified()
AssetTWrapper::wrappedItem
T * wrappedItem() const
Definition: AssetWrapper.h:107
AssetWrapper::childIndex
virtual int childIndex(AssetWrapper *)
Definition: AssetWrapper.h:53
AssetWrapper::drop
virtual void drop(const QMimeData *, int)
Definition: AssetWrapper.h:65
AssetWrapper::displayIcon
virtual QIcon displayIcon() const
Definition: AssetWrapper.h:44
AssetWrapper::uses
virtual PossibleUse uses(const AssetWrapper *, std::string &) const
Definition: AssetWrapper.h:55
AssetWrapper::wasModified
virtual void wasModified(AssetWrapper *asset, ChangeType type, int extra)
Definition: AssetWrapper.h:84
AssetWrapper::BeforeLayoutChange
@ BeforeLayoutChange
Definition: AssetWrapper.h:33
AssetWrapper::dataModified
void dataModified(AssetWrapper *asset, AssetWrapper::ChangeType type, int extra)
AssetWrapper::exportAsCSV
virtual void exportAsCSV(const AssetWrapper *, QString &) const
Definition: AssetWrapper.h:70
AssetWrapper::BeforeChildRemove
@ BeforeChildRemove
Definition: AssetWrapper.h:33
AssetTWrapper::AssetTWrapper
AssetTWrapper(AssetWrapper *parent, const QString &panelName, T *wrappedItem)
Definition: AssetWrapper.h:102
AssetWrapper::markModified
void markModified(ChangeType change, int extra=0)
Definition: AssetWrapper.h:57
AssetWrapper::canExportAsCsv
virtual bool canExportAsCsv() const
Definition: AssetWrapper.h:68
AssetWrapper::DoesntUse
@ DoesntUse
Definition: AssetWrapper.h:32
AssetWrapper::displayPanelName
virtual QString displayPanelName() const
Definition: AssetWrapper.h:45
AssetWrapper::compareByDisplayName
static bool compareByDisplayName(const AssetWrapper *left, const AssetWrapper *right)
Definition: AssetWrapper.h:72
AssetWrapper::displayParent
AssetWrapper * displayParent() const
Definition: AssetWrapper.h:46
AssetTWrapper
Base class for assets mapping to a native Crossfire structure.
Definition: AssetWrapper.h:100