Crossfire Server, Trunk
CREQuestItemModel.cpp
Go to the documentation of this file.
1 #include "CREQuestItemModel.h"
2 #include "quest.h"
3 
4 CREQuestItemModel::CREQuestItemModel(QObject* parent) : QAbstractItemModel(parent)
5 {
6  myQuest = NULL;
7  myStepCount = 0;
8 }
9 
11 }
12 
14 {
15  return myQuest;
16 }
17 
19 {
20  emit beginResetModel();
21  myQuest = quest;
22  myStepCount = 0;
23  auto step = myQuest->steps;
24  while (step) {
25  myStepCount++;
26  step = step->next;
27  }
28 
29  emit endResetModel();
30 }
31 
32 int CREQuestItemModel::columnCount(const QModelIndex& parent) const
33 {
34  if (myQuest == NULL)
35  return 0;
36 
37  if (parent.isValid())
38  return 0;
39 
40  return 4;
41 }
42 
43 QModelIndex CREQuestItemModel::index(int row, int column, const QModelIndex& parent) const
44 {
45  if (parent.isValid())
46  return QModelIndex();
47 
48  return createIndex(row, column);
49 }
50 
51 QModelIndex CREQuestItemModel::parent(const QModelIndex&) const
52 {
53  return QModelIndex();
54 }
55 
56 int CREQuestItemModel::rowCount(const QModelIndex &parent) const
57 {
58  if (parent.isValid())
59  return 0;
60 
61  if (myQuest == NULL)
62  return 0;
63 
64  return myStepCount;
65 }
66 
67 QList<QStringList> conditionsToString(const quest_condition *condition) {
68  QList<QStringList> ret;
69  while (condition) {
70  char buf[500];
71  quest_write_condition(buf, sizeof(buf), condition);
72  ret.append(QString(buf).split(' '));
73  Q_ASSERT(ret.back().size() == 2);
74  condition = condition->next;
75  }
76  return ret;
77 }
78 
79 static QString toDisplay(const QList<QStringList>& list)
80 {
81  QStringList data;
82  foreach(QStringList item, list)
83  data.append(item.join(" "));
84  return data.join("\n");
85 }
86 
87 QVariant CREQuestItemModel::data(const QModelIndex& index, int role) const
88 {
89  if (myQuest == NULL || !index.isValid())
90  return QVariant();
91 
92  if (role != Qt::DisplayRole && role != Qt::EditRole && (role != Qt::CheckStateRole || index.column() != 2))
93  return QVariant();
94 
95  auto step = getStep(index.row());
96 
97  switch(index.column())
98  {
99  case 0:
100  return step->step;
101 
102  case 1:
103  return step->step_description;
104 
105  case 2:
106  if (role == Qt::DisplayRole)
107  return QVariant();
108  return step->is_completion_step ? Qt::Checked : Qt::Unchecked;
109 
110  case 3:
111  {
112  auto conditions = conditionsToString(step->conditions);
113  if (role == Qt::EditRole)
114  return QVariant::fromValue(conditions);
115  return toDisplay(conditions);
116  }
117  }
118 
119  return QVariant();;
120 }
121 
122 QVariant CREQuestItemModel::headerData(int section, Qt::Orientation orientation, int role) const
123 {
124  if (orientation != Qt::Horizontal || role != Qt::DisplayRole)
125  return QVariant();
126 
127  switch(section)
128  {
129  case 0:
130  return tr("step");
131  case 1:
132  return tr("description");
133  case 2:
134  return tr("end?");
135  case 3:
136  return tr("set when");
137  }
138 
139  return QVariant();
140 }
141 
142 Qt::ItemFlags CREQuestItemModel::flags(const QModelIndex& index) const
143 {
144  if (!index.isValid())
145  return 0;
146 
147  if (index.column() == 2)
148  return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
149 
150  return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;
151 }
152 
153 bool CREQuestItemModel::setData(const QModelIndex& index, const QVariant& value, int role)
154 {
155  if (!index.isValid() || myQuest == NULL || myStepCount <= index.row())
156  return false;
157 
158  if (role != Qt::EditRole && index.column() != 2)
159  return false;
160 
161  auto step = getStep(index.row());
162 
163  if (index.column() == 0)
164  step->step = value.toInt();
165  else if (index.column() == 1)
166  FREE_AND_COPY(step->step_description, value.toString().toStdString().data())
167  else if (index.column() == 2)
168  step->is_completion_step = (value == Qt::Checked);
169  else if (index.column() == 3) {
170  auto when = value.value<QList<QStringList>>();
171  auto cond = step->conditions;
172  while (cond) {
173  auto n = cond->next;
175  cond = n;
176  }
177  step->conditions = nullptr;
178  quest_condition *last = nullptr;
179 
180  for (auto single : when) {
181  auto cond = quest_create_condition();
182  if (!quest_condition_from_string(cond, single.join(' ').toStdString().data())) {
183  free(cond);
184  continue;
185  }
186  if (last)
187  last->next = cond;
188  else
189  step->conditions = cond;
190  last = cond;
191  }
192  }
193 
194  emit dataChanged(index, index);
195  emit questModified(myQuest);
196 
197  return true;
198 }
199 
201 {
202  if (myQuest == NULL)
203  return;
204 
205  beginInsertRows(QModelIndex(), myStepCount, myStepCount);
206 
207  if (myQuest->steps) {
208  auto cur = myQuest->steps;
209  while (cur->next) {
210  cur = cur->next;
211  }
212  cur->next = quest_create_step();
213  cur->next->step = cur->step + 10;
214  } else {
216  myQuest->steps->step = 10;
217  }
218  myStepCount++;
219 
220  emit questModified(myQuest);
221 
222  endInsertRows();
223 }
224 
225 bool CREQuestItemModel::removeRows(int row, int count, const QModelIndex& parent)
226 {
227  if (myQuest == NULL || parent.isValid() || count != 1)
228  return false;
229 
230  if (row < 0 || row >= myStepCount)
231  return false;
232 
233  beginRemoveRows(parent, row, row);
234 
235  quest_step_definition *cur = myQuest->steps, *prev = nullptr;
236  while (row > 0) {
237  prev = cur;
238  cur = cur->next;
239  row--;
240  }
241  if (!prev) {
242  myQuest->steps = cur->next;
243  } else {
244  prev->next = cur->next;
245  }
246  quest_destroy_step(cur);
247  myStepCount--;
248 
249  endRemoveRows();
250 
251  emit questModified(myQuest);
252 
253  return true;
254 }
255 
257 {
258  if (step < 1 || myStepCount < 2)
259  return;
260 
261  beginMoveRows(QModelIndex(), step, step, QModelIndex(), step - 1);
262 
263  quest_step_definition *cur = myQuest->steps, *prev = nullptr;
264  while (step > 1) {
265  prev = cur;
266  cur = cur->next;
267  step--;
268  }
269 
270  if (!prev) {
271  Q_ASSERT(cur);
272  Q_ASSERT(cur->next);
273  myQuest->steps = cur->next;
274  cur->next = cur->next->next;
275  myQuest->steps->next = cur;
276  } else {
277  prev->next = cur->next;
278  if (cur->next)
279  cur->next = cur->next->next;
280  else
281  cur->next = nullptr;
282  prev->next->next = cur;
283  }
284  endMoveRows();
285 
286  emit questModified(myQuest);
287 }
288 
290 {
291  if (step >= myStepCount - 1)
292  return;
293 
294  moveUp(step + 1);
295 }
296 
298  auto left = step;
299  Q_ASSERT(left <= myStepCount);
300  auto current = myQuest->steps;
301  while (left > 0) {
302  Q_ASSERT(current);
303  current = current->next;
304  left--;
305  }
306  return current;
307 }
CREQuestItemModel::removeRows
virtual bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex())
Definition: CREQuestItemModel.cpp:225
quest_definition::steps
quest_step_definition * steps
Definition: quest.h:51
CREQuestItemModel.h
CREQuestItemModel::moveUp
void moveUp(int step)
Definition: CREQuestItemModel.cpp:256
quest_create_step
quest_step_definition * quest_create_step(void)
Definition: Quests.cpp:47
quest_write_condition
void quest_write_condition(char *buf, size_t len, const quest_condition *cond)
Definition: Quests.cpp:134
toDisplay
static QString toDisplay(const QList< QStringList > &list)
Definition: CREQuestItemModel.cpp:79
CREQuestItemModel::~CREQuestItemModel
virtual ~CREQuestItemModel()
Definition: CREQuestItemModel.cpp:10
guildoracle.list
list
Definition: guildoracle.py:87
CREQuestItemModel::getStep
quest_step_definition * getStep(int step) const
Definition: CREQuestItemModel.cpp:297
inja::string_view::split
std::pair< nonstd::string_view, nonstd::string_view > split(nonstd::string_view view, char Separator)
Definition: inja.hpp:1886
quest_step_definition::step
int step
Definition: quest.h:34
quest_step_definition
Definition: quest.h:33
CREQuestItemModel::setQuest
void setQuest(quest_definition *quest)
Definition: CREQuestItemModel.cpp:18
CREQuestItemModel::setData
virtual bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: CREQuestItemModel.cpp:153
quest
Definition: quest.py:1
CREQuestItemModel::headerData
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const
Definition: CREQuestItemModel.cpp:122
quest_step_definition::next
struct quest_step_definition * next
Definition: quest.h:37
CREQuestItemModel::CREQuestItemModel
CREQuestItemModel(QObject *parent)
Definition: CREQuestItemModel.cpp:4
CREQuestItemModel::columnCount
virtual int columnCount(const QModelIndex &parent) const
Definition: CREQuestItemModel.cpp:32
CREQuestItemModel::data
virtual QVariant data(const QModelIndex &index, int role) const
Definition: CREQuestItemModel.cpp:87
FREE_AND_COPY
#define FREE_AND_COPY(sv, nv)
Definition: global.h:203
navar-midane_time.data
data
Definition: navar-midane_time.py:11
disinfect.count
int count
Definition: disinfect.py:7
CREQuestItemModel::quest
quest_definition * quest() const
Definition: CREQuestItemModel.cpp:13
CREQuestItemModel::questModified
void questModified(quest_definition *quest)
quest_destroy_condition
void quest_destroy_condition(quest_condition *condition)
Definition: Quests.cpp:67
CREQuestItemModel::addStep
void addStep(bool)
Definition: CREQuestItemModel.cpp:200
quest.h
item
Definition: item.py:1
quest_condition
Definition: quest.h:23
autojail.value
value
Definition: autojail.py:6
quest_definition
Definition: quest.h:42
CREQuestItemModel::myQuest
quest_definition * myQuest
Definition: CREQuestItemModel.h:47
CREQuestItemModel::moveDown
void moveDown(int step)
Definition: CREQuestItemModel.cpp:289
npc_dialog.index
int index
Definition: npc_dialog.py:102
buf
StringBuffer * buf
Definition: readable.c:1610
CREQuestItemModel::rowCount
virtual int rowCount(const QModelIndex &parent) const
Definition: CREQuestItemModel.cpp:56
CREQuestItemModel::myStepCount
int myStepCount
Definition: CREQuestItemModel.h:48
quest_destroy_step
void quest_destroy_step(quest_step_definition *step)
Definition: Quests.cpp:72
quest_condition::next
struct quest_condition * next
Definition: quest.h:29
conditionsToString
QList< QStringList > conditionsToString(const quest_condition *condition)
Definition: CREQuestItemModel.cpp:67
replace.current
current
Definition: replace.py:64
quest_condition_from_string
int quest_condition_from_string(quest_condition *condition, const char *buffer)
Definition: Quests.cpp:104
CREQuestItemModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
Definition: CREQuestItemModel.cpp:43
CREQuestItemModel::flags
virtual Qt::ItemFlags flags(const QModelIndex &index) const
Definition: CREQuestItemModel.cpp:142
quest_create_condition
quest_condition * quest_create_condition(void)
Definition: Quests.cpp:54
CREQuestItemModel::parent
virtual QModelIndex parent(const QModelIndex &index) const
Definition: CREQuestItemModel.cpp:51