Crossfire Server, Trunk
CREResourcesWindow.cpp
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 #include <Qt>
14 #include <QtWidgets>
15 #include <QScriptValue>
16 #include <stdexcept>
17 
18 #include "CREResourcesWindow.h"
19 #include "CREPixmap.h"
20 
21 #include "CREFilterDialog.h"
22 #include "CREFilterDefinition.h"
23 
24 #include "CRESettings.h"
25 
26 #include "CREReportDialog.h"
27 #include "CREReportDisplay.h"
28 #include "CREReportDefinition.h"
29 
37 #include "recipes/RecipePanel.h"
38 #include "CREMapPanel.h"
39 #include "regions/RegionPanel.h"
40 #include "CREQuestPanel.h"
41 #include "CREMessagePanel.h"
44 #include "faces/FacesetsPanel.h"
46 
48 
50 #include "MessageFile.h"
52 
53 #include "CREScriptEngine.h"
54 
55 #include "random_maps/RandomMap.h"
57 
58 #include "global.h"
59 #include "recipe.h"
60 #include "assets.h"
61 #include "AssetsManager.h"
62 
63 #include "MessageManager.h"
64 #include "ResourcesManager.h"
65 #include "assets/AssetModel.h"
66 #include "faces/FacePanel.h"
67 
68 CREResourcesWindow::CREResourcesWindow(CREMapInformationManager* store, MessageManager* messages, ResourcesManager* resources, ScriptFileManager* scripts, AssetModel *model, const QModelIndex &root, QWidget* parent) : QWidget(parent)
69 {
70  QApplication::setOverrideCursor(Qt::WaitCursor);
71  setWindowTitle(model->data(root, Qt::DisplayRole).toString());
72 
73  Q_ASSERT(store);
74  myStore = store;
75  Q_ASSERT(messages);
77  Q_ASSERT(resources);
78  myResources = resources;
79  Q_ASSERT(scripts);
81  myModel = new ScriptFilterAssetModel(model, &myEngine, this);
82  myTreeRoot = root;
83 
84  setAttribute(Qt::WA_DeleteOnClose);
85 
86  QVBoxLayout* layout = new QVBoxLayout(this);
87 
88  myFiltersMenu = new QMenu(this);
89  QHBoxLayout* buttons = new QHBoxLayout();
90  myFilterButton = new QPushButton(tr("Filter..."), this);
91  myFilterButton->setMenu(myFiltersMenu);
92  buttons->addWidget(myFilterButton);
93 
94  myReportsMenu = new QMenu(this);
95  QPushButton* report = new QPushButton(tr("Report"), this);
96  report->setMenu(myReportsMenu);
97  buttons->addWidget(report);
98 
99  layout->addLayout(buttons);
100 
101  auto splitter = new QSplitter(this);
102  layout->addWidget(splitter);
103 
104  myTree = new QTreeView(this);
105  myTree->setModel(myModel);
106  myTree->setRootIndex(myModel->mapFromSource(root));
107  splitter->addWidget(myTree);
108  myTree->setIconSize(QSize(32, 32));
109  myTree->collapseAll();
110  myTree->expand(myModel->mapFromSource(root));
111  myTree->setSelectionMode(QAbstractItemView::SingleSelection);
112  myTree->setDragEnabled(true);
113  myTree->setDropIndicatorShown(true);
114  myTree->setDragDropMode(QAbstractItemView::DragDrop);
115  myTree->setContextMenuPolicy(Qt::CustomContextMenu);
116  connect(myTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(treeCustomMenu(const QPoint&)));
117  connect(myTree->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(currentRowChanged(const QModelIndex&, const QModelIndex&)));
118  connect(myModel, &QAbstractItemModel::rowsInserted, [this](const QModelIndex &parent, int /*first*/, int /*last*/) {
119  myTree->expand(parent);
120  });
121 
122  QWidget* w = new QWidget(splitter);
123  myStackedPanels = new QStackedLayout(w);
124  splitter->addWidget(w);
125 
126  /* dummy panel to display for empty items */
127  AssetWrapperPanel* dummy = new AssetWrapperPanel(this);
128  dummy->addLabel(tr("No details available."), nullptr);
129  addPanel("empty", dummy);
130  myStackedPanels->setCurrentWidget(dummy);
131  myCurrentPanel = dummy;
132 
133  connect(&myFiltersMapper, SIGNAL(mapped(QObject*)), this, SLOT(onFilterChange(QObject*)));
134  updateFilters();
135  connect(&myReportsMapper, SIGNAL(mapped(QObject*)), this, SLOT(onReportChange(QObject*)));
136  updateReports();
137 
138  addPanel("Archetype", new ArchetypePanel(model, this));
139  addPanel("Face", new CREFacePanel(this, model, myResources, myStore));
140  addPanel("Animation", new AnimationPanel(this, model));
141  addPanel("Artifact", new ArtifactPanel(this));
142  addPanel("ArtifactList", new ArtifactListPanel(this));
143  addPanel("Recipe", new RecipePanel(this));
144  addPanel("Treasure", new TreasurePanel(this));
145  addPanel("TreasureList", new CRETreasurePanel(model, this));
146  addPanel("Faceset", new FacesetsPanel(this, myResources->licenseManager()));
147  addPanel("Quest", new CREQuestPanel(model, this));
148  addPanel("QuestStep", new QuestStepPanel(myMessages, this));
149  addPanel("GeneralMessage", new CREGeneralMessagePanel(this));
150  addPanel("Region", new RegionPanel(this));
151  addPanel("Map", new CREMapPanel(myScripts, this));
152  addPanel("Script", new CREScriptPanel(model, this));
153  addPanel("Message", new CREMessagePanel(myMessages, this));
154  addPanel("RandomMap", new CRERandomMapPanel(this));
155  addPanel("AttackMessage", new AttackMessagePanel(this));
156 
157  splitter->setSizes({5000, 5000});
158 
159  QApplication::restoreOverrideCursor();
160 }
161 
163 {
164  qDeleteAll(myPanels);
165 }
166 
167 void CREResourcesWindow::currentRowChanged(const QModelIndex &current, const QModelIndex &)
168 {
169  if (!current.isValid()) {
170  myCurrentPanel = nullptr;
171  return;
172  }
173 
174  auto rc = myModel->mapToSource(current);
175  AssetWrapper *item = reinterpret_cast<AssetWrapper *>(rc.internalPointer());
176  if (!item) {
177  return;
178  }
179 
180  auto newPanel = myPanels[item->displayPanelName()];
181  if (!newPanel) {
182 // printf("no panel for %s\n", qPrintable(item->getPanelName()));
183  return;
184  }
185 
186  newPanel->setAsset(item);
187 
188  if (myCurrentPanel != newPanel) {
189  myStackedPanels->setCurrentWidget(newPanel);
190  myCurrentPanel = newPanel;
191  }
192 }
193 
195 {
196  panel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
197  myPanels[name] = panel;
198  myStackedPanels->addWidget(panel);
199 }
200 
202 {
203  CREFilterDialog dlg;
204  if (dlg.exec() != QDialog::Accepted)
205  return;
206 
207  /* sending this signal will ultimately call our own updateFilters() */
208  emit filtersModified();
209 }
210 
212 {
213  CREReportDialog dlg;
214  if (dlg.exec() != QDialog::Accepted)
215  return;
216 
217  /* sending this signal will ultimately call our own updateReports() */
218  emit reportsModified();
219 }
220 
222 {
224  settings.loadFilters(myFilters);
225 
226  myFiltersMenu->clear();
227 
228  QAction* clear = new QAction(tr("(none)"), this);
229  connect(clear, SIGNAL(triggered()), this, SLOT(clearFilter()));
230  myFiltersMenu->addAction(clear);
231 
232  if (myFilters.filters().size() > 0)
233  {
234 
236  {
237  QAction* a = new QAction(filter->name(), this);
238  myFiltersMenu->addAction(a);
239  myFiltersMapper.setMapping(a, filter);
240  connect(a, SIGNAL(triggered()), &myFiltersMapper, SLOT(map()));
241  }
242  }
243  myFiltersMenu->addSeparator();
244 
245  QAction* quick = new QAction(tr("Quick filter..."), this);
246  connect(quick, SIGNAL(triggered()), this, SLOT(onQuickFilter()));
247  myFiltersMenu->addAction(quick);
248  QAction* dialog = new QAction(tr("Filters definition..."), this);
249  connect(dialog, SIGNAL(triggered()), this, SLOT(onFilter()));
250  myFiltersMenu->addAction(dialog);
251 
252  clearFilter();
253 }
254 
255 void CREResourcesWindow::onFilterChange(QObject* object) {
256  CREFilterDefinition* filter = qobject_cast<CREFilterDefinition*>(object);
257  if (filter == NULL)
258  return;
259  setFilter(filter->filter(), filter->name());
260 }
261 
263  bool ok;
264  QString filter = QInputDialog::getText(this, tr("Quick filter"), tr("Filter:"), QLineEdit::Normal, myModel->filter(), &ok);
265  if (!ok)
266  return;
268 }
269 
271  setFilter(QString(), QString());
272 }
273 
274 void CREResourcesWindow::setFilter(const QString &filter, const QString &name) {
276  myFilterButton->setText(filter.isEmpty() ? tr("Filter...") : tr("Filter: %1").arg(name));
277  auto root = myModel->mapFromSource(myTreeRoot);
278  if (!myTreeRoot.isValid() || root.isValid()) {
279  if (myTree->model() == nullptr) {
280  myTree->setModel(myModel);
281  connect(myTree->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(currentRowChanged(const QModelIndex&, const QModelIndex&)));
282  }
283  myTree->setRootIndex(root);
284  } else {
285  myTree->setModel(nullptr);
286  }
287 }
288 
290 {
292  settings.loadReports(myReports);
293 
294  myReportsMenu->clear();
295 
296  if (myReports.reports().size() > 0)
297  {
299  {
300  QAction* a = new QAction(report->name(), this);
301  myReportsMenu->addAction(a);
302  myReportsMapper.setMapping(a, report);
303  connect(a, SIGNAL(triggered()), &myReportsMapper, SLOT(map()));
304  }
305 
306  myReportsMenu->addSeparator();
307  }
308 
309  QAction* dialog = new QAction(tr("Reports definition..."), this);
310  connect(dialog, SIGNAL(triggered()), this, SLOT(onReport()));
311  myReportsMenu->addAction(dialog);
312 }
313 
315 {
316  CREReportDefinition* report = qobject_cast<CREReportDefinition*>(object);
317  if (report == NULL)
318  return;
319 
320  int count = myModel->rowCount(myTree->rootIndex());
321 
322  QProgressDialog progress(tr("Generating report..."), tr("Abort report"), 0, count - 1, this);
323  progress.setWindowTitle(tr("Report: '%1'").arg(report->name()));
324  progress.setWindowModality(Qt::WindowModal);
325 
326  QStringList headers = report->header().split("\n");
327  QStringList fields = report->itemDisplay().split("\n");
328  QString sort = report->itemSort();
329 
330  QString text("<table><thead><tr>");
331 
332  foreach(QString header, headers)
333  {
334  text += "<th>" + header + "</th>";
335  }
336  text += "</tr></thead><tbody>";
337 
338  CREScriptEngine engine;
339  std::vector<QScriptValue> items;
340  for (int i = 0; i < count; i++) {
341  auto idx = myModel->index(i, 0, myTree->rootIndex());
342  if (!idx.isValid()) {
343  continue;
344  }
345  idx = myModel->mapToSource(idx);
346  auto w = static_cast<AssetWrapper *>(idx.internalPointer());
347  items.push_back(engine.newQObject(w));
348  }
349 
350  if (!sort.isEmpty())
351  {
352  try
353  {
354  progress.setLabelText(tr("Sorting items..."));
355 
356  engine.pushContext();
357 
358  sort = "(function(left, right) { return " + sort + "; })";
359  QScriptValue sortFun = engine.evaluate(sort);
360  if (!sortFun.isValid() || engine.hasUncaughtException())
361  throw std::runtime_error("A script error happened while compiling the sort criteria:\n" + engine.uncaughtException().toString().toStdString());
362 
363  std::sort(items.begin(), items.end(), [&sortFun, &engine](QScriptValue left, QScriptValue right) {
364  QScriptValueList args;
365  args.push_back(left);
366  args.push_back(right);
367  auto ret = sortFun.call(QScriptValue(), args);
368  if (!ret.isValid() || engine.hasUncaughtException())
369  {
370  throw std::runtime_error("A script error happened while sorting items:\n" + engine.uncaughtException().toString().toStdString());
371  return false;
372  }
373  return ret.isValid() ? ret.toBoolean() : true;
374  });
375  printf("complete");
376  engine.popContext();
377  }
378  catch (std::runtime_error& ex)
379  {
380  QMessageBox::critical(this, "Script error", ex.what(), QMessageBox::Ok);
381  return;
382  }
383  }
384 
385  progress.setLabelText(tr("Generating items text..."));
386  foreach(QScriptValue item, items)
387  {
388  if (progress.wasCanceled())
389  return;
390 
391  text += "<tr>";
392 
393  engine.pushContext();
394  engine.globalObject().setProperty("item", item);
395 
396  foreach(QString field, fields)
397  {
398  text += "<td>";
399  QString data = engine.evaluate(field).toString();
400  if (engine.hasUncaughtException())
401  {
402  QMessageBox::critical(this, "Script error", "A script error happened while display items:\n" + engine.uncaughtException().toString(), QMessageBox::Ok);
403  return;
404  }
405  text += data;
406  text += "</td>\n";
407  }
408  engine.popContext();
409  text += "</tr>\n";
410 
411  progress.setValue(progress.value() + 1);
412  }
413  text += "</tbody>";
414 
415  QStringList footers = report->footer().split("\n");
416  text += "<tfoot>";
417 
418  foreach(QString footer, footers)
419  {
420  text += "<th>" + footer + "</th>";
421  }
422  text += "</tfoot>";
423 
424  text += "</table>";
425  qDebug() << "report finished";
426 
427  CREReportDisplay display(text, tr("Report: '%1'").arg(report->name()));
428  display.exec();
429  progress.hide();
430 }
431 
432 void CREResourcesWindow::treeCustomMenu(const QPoint & pos)
433 {
434  QMenu menu;
435 
436  QModelIndex index = myModel->mapToSource(myTree->indexAt(pos));
437  if (index.isValid() && index.internalPointer()) {
438  AssetWrapper *item = reinterpret_cast<AssetWrapper *>(index.internalPointer());
439  if (item) {
440  item->fillMenu(&menu);
441  }
442  }
443 
444  if (menu.actions().size() == 0)
445  return;
446  menu.exec(myTree->mapToGlobal(pos) + QPoint(5, 5));
447 }
448 
450 {
451  auto name = QInputDialog::getText(this, "Create new quest", "New quest code").toStdString();
452  if (name.empty()) {
453  return;
454  }
455  if (getManager()->quests()->find(name)) {
456  QMessageBox::critical(this, "Quest already exists", tr("Quest %1 already exists!").arg(name.data()));
457  return;
458  }
459 
460  auto quest = quest_create(name.data());
461  quest->face = getManager()->faces()->get("quest_generic.111");
463 }
464 
466 {
467 #if 0
468  MessageFile* file = new MessageFile("<new file>");
469  file->setModified();
470  myMessages->messages().append(file);
471 #endif
472 }
AssetWrapperPanel
Definition: AssetWrapperPanel.h:28
ScriptFileManager
Definition: ScriptFileManager.h:26
CREResourcesWindow::onReport
void onReport()
Definition: CREResourcesWindow.cpp:211
QuestStepPanel
Definition: CREQuestPanel.h:30
global.h
CREMessagePanel.h
CREResourcesWindow::addMessage
void addMessage(bool)
Definition: CREResourcesWindow.cpp:465
settings
struct Settings settings
Definition: init.cpp:139
ArchetypePanel
Definition: ArchetypePanel.h:27
ResourcesManager::licenseManager
LicenseManager * licenseManager()
Definition: ResourcesManager.h:147
layout
Definition: main.cpp:84
TreasureListPanel.h
CREResourcesWindow::myTree
QTreeView * myTree
Definition: CREResourcesWindow.h:51
CREResourcesWindow::onQuickFilter
void onQuickFilter()
Definition: CREResourcesWindow.cpp:262
CREResourcesWindow::myModel
ScriptFilterAssetModel * myModel
Definition: CREResourcesWindow.h:50
python_init.scripts
scripts
Definition: python_init.py:11
FacesetsPanel.h
ScriptFileManager.h
MessageManager.h
ResourcesManager
Definition: ResourcesManager.h:80
AssetsManager.h
filter
Definition: filter.py:1
disinfect.a
a
Definition: disinfect.py:13
CREResourcesWindow::CREResourcesWindow
CREResourcesWindow(CREMapInformationManager *store, MessageManager *messages, ResourcesManager *resources, ScriptFileManager *scripts, AssetModel *model, const QModelIndex &root, QWidget *parent)
Definition: CREResourcesWindow.cpp:68
CREFilterDialog
Definition: CREFilterDialog.h:24
ScriptFilterAssetModel::setFilter
void setFilter(const QString &filter)
Definition: AssetModel.cpp:256
CREFilterDialog.h
recipe.h
CREResourcesWindow::myReportsMenu
QMenu * myReportsMenu
Definition: CREResourcesWindow.h:64
root
static char root[500]
Definition: mapper.cpp:312
mad_mage_user.file
file
Definition: mad_mage_user.py:15
CREResourcesWindow::reportsModified
void reportsModified()
CREResourcesWindow::myFilters
CREFilterDefinitionManager myFilters
Definition: CREResourcesWindow.h:63
CREResourcesWindow::onReportChange
void onReportChange(QObject *object)
Definition: CREResourcesWindow.cpp:314
MessageManager::messages
QList< MessageFile * > & messages()
Definition: MessageManager.cpp:51
CREResourcesWindow::myMessages
MessageManager * myMessages
Definition: CREResourcesWindow.h:57
CRERandomMapPanel
Definition: RandomMapPanel.h:25
CREQuestPanel
Definition: CREQuestPanel.h:40
RandomMap.h
CREResourcesWindow::myStore
CREMapInformationManager * myStore
Definition: CREResourcesWindow.h:56
MessageFile
Definition: MessageFile.h:68
CREReportDefinition
Definition: CREReportDefinition.h:19
AnimationPanel
Definition: AnimationPanel.h:29
getManager
AssetsManager * getManager()
Definition: assets.cpp:309
CRETreasurePanel
Definition: TreasureListPanel.h:30
RecipePanel.h
CREResourcesWindow::onFilter
void onFilter()
Definition: CREResourcesWindow.cpp:201
CREResourcesWindow::onFilterChange
void onFilterChange(QObject *object)
Definition: CREResourcesWindow.cpp:255
quest
Definition: quest.py:1
disinfect.map
map
Definition: disinfect.py:4
CREFilterDefinition.h
CREScriptEngine.h
RandomMapPanel.h
AssetModel::data
virtual QVariant data(const QModelIndex &index, int role) const override
Definition: AssetModel.cpp:70
CREScriptEngine
Definition: CREScriptEngine.h:18
CREResourcesWindow::myFiltersMenu
QMenu * myFiltersMenu
Definition: CREResourcesWindow.h:61
TreasurePanel
Definition: TreasurePanel.h:26
AssetsCollection::define
T * define(const Key &name, T *asset)
Definition: AssetsCollection.h:120
AssetWrapper
Definition: AssetWrapper.h:25
CREResourcesWindow::myReportsMapper
QSignalMapper myReportsMapper
Definition: CREResourcesWindow.h:65
RegionPanel
Definition: RegionPanel.h:22
CREReportDefinition.h
CREResourcesWindow::myFiltersMapper
QSignalMapper myFiltersMapper
Definition: CREResourcesWindow.h:62
CRESettings.h
ScriptFilterAssetModel
Definition: AssetModel.h:78
CREResourcesWindow::clearFilter
void clearFilter()
Definition: CREResourcesWindow.cpp:270
CREReportDialog.h
AssetsManager::quests
Quests * quests()
Definition: AssetsManager.h:71
AssetsManager::faces
Faces * faces()
Definition: AssetsManager.h:39
ArtifactPanel.h
ArchetypePanel.h
GeneralMessagePanel.h
AssetModel
Definition: AssetModel.h:29
navar-midane_time.data
data
Definition: navar-midane_time.py:11
CREReportDisplay.h
CREResourcesWindow::myEngine
CREScriptEngine myEngine
Definition: CREResourcesWindow.h:67
FacePanel.h
CREReportDefinitionManager::reports
QList< CREReportDefinition * > & reports()
Definition: CREReportDefinitionManager.cpp:42
AssetModel.h
disinfect.count
int count
Definition: disinfect.py:7
AssetWrapperPanel::addLabel
QLabel * addLabel(const QString &label, const char *property)
Definition: AssetWrapperPanel.cpp:68
CREResourcesWindow::addPanel
void addPanel(QString name, AssetWrapperPanel *panel)
Definition: CREResourcesWindow.cpp:194
CREQuestPanel.h
MessageManager
Definition: MessageManager.h:25
CREResourcesWindow::setFilter
void setFilter(const QString &filter, const QString &name)
Definition: CREResourcesWindow.cpp:274
AssetsCollection::get
T * get(const Key &name)
Definition: AssetsCollection.h:89
ArtifactPanel
Definition: ArtifactPanel.h:27
CREResourcesWindow::filtersModified
void filtersModified()
RecipePanel
Definition: RecipePanel.h:29
CREResourcesWindow::treeCustomMenu
void treeCustomMenu(const QPoint &pos)
Definition: CREResourcesWindow.cpp:432
CREResourcesWindow::myFilterButton
QPushButton * myFilterButton
Definition: CREResourcesWindow.h:60
CREResourcesWindow::addQuest
void addQuest(bool)
Definition: CREResourcesWindow.cpp:449
CREGeneralMessagePanel
Definition: GeneralMessagePanel.h:21
guild_entry.text
text
Definition: guild_entry.py:44
RegionPanel.h
CREMapInformationManager.h
ResourcesManager.h
CREResourcesWindow::myStackedPanels
QStackedLayout * myStackedPanels
Definition: CREResourcesWindow.h:55
navar-midane_apply.messages
list messages
Definition: navar-midane_apply.py:8
FacesetsPanel
Definition: FacesetsPanel.h:30
ArtifactListPanel.h
ScriptFilterAssetModel::filter
const QString & filter() const
Definition: AssetModel.h:83
AssetWrapperPanel.h
CREResourcesWindow::myScripts
ScriptFileManager * myScripts
Definition: CREResourcesWindow.h:59
CREResourcesWindow::myResources
ResourcesManager * myResources
Definition: CREResourcesWindow.h:58
MessageFile.h
CREResourcesWindow::myReports
CREReportDefinitionManager myReports
Definition: CREResourcesWindow.h:66
report
Definition: report.py:1
item
Definition: item.py:1
TreasurePanel.h
ArtifactListPanel
Definition: ArtifactListPanel.h:25
CREResourcesWindow::myCurrentPanel
AssetWrapperPanel * myCurrentPanel
Definition: CREResourcesWindow.h:53
CRESettings
Definition: CRESettings.h:21
AttackMessagePanel.h
AttackMessagePanel
Definition: AttackMessagePanel.h:26
assets.h
CREResourcesWindow::myTreeRoot
QModelIndex myTreeRoot
Definition: CREResourcesWindow.h:52
npc_dialog.index
int index
Definition: npc_dialog.py:102
CREReportDialog
Definition: CREReportDialog.h:24
AnimationPanel.h
ArtifactWrapper.h
CREResourcesWindow::myPanels
QHash< QString, QPointer< AssetWrapperPanel > > myPanels
Definition: CREResourcesWindow.h:54
CREFilterDefinition
Definition: CREFilterDefinition.h:19
CREMessagePanel
Definition: CREMessagePanel.h:31
ScriptFilePanel.h
CREMapPanel
Definition: CREMapPanel.h:26
connect
Definition: connect.py:1
hall_of_fame.header
list header
Definition: hall_of_fame.py:38
CREResourcesWindow::updateReports
void updateReports()
Definition: CREResourcesWindow.cpp:289
CREMapInformationManager
Definition: CREMapInformationManager.h:27
CREResourcesWindow.h
replace.current
current
Definition: replace.py:64
quests
static struct_quest ** quests
Definition: mapper.cpp:922
CREMapPanel.h
CREPixmap.h
quest_create
quest_definition * quest_create(const char *name)
Definition: Quests.cpp:63
CREFacePanel
Definition: FacePanel.h:30
CREScriptPanel
Definition: ScriptFilePanel.h:23
CREReportDisplay
Definition: CREReportDisplay.h:19
CREResourcesWindow::updateFilters
void updateFilters()
Definition: CREResourcesWindow.cpp:221
give.name
name
Definition: give.py:27
CREFilterDefinitionManager::filters
QList< CREFilterDefinition * > & filters()
Definition: CREFilterDefinitionManager.cpp:41
CREResourcesWindow::currentRowChanged
void currentRowChanged(const QModelIndex &current, const QModelIndex &previous)
Definition: CREResourcesWindow.cpp:167
CREResourcesWindow::~CREResourcesWindow
virtual ~CREResourcesWindow()
Definition: CREResourcesWindow.cpp:162