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