Crossfire Server, Trunk
CREResourcesWindow.cpp
Go to the documentation of this file.
1 #include <Qt>
2 #include <QtWidgets>
3 #include <QScriptValue>
4 #include <stdexcept>
5 
6 #include "CREResourcesWindow.h"
7 #include "CREUtils.h"
8 #include "CREPixmap.h"
9 
10 #include "CREFilterDialog.h"
11 #include "CREFilterDefinition.h"
12 
13 #include "CRESettings.h"
14 
15 #include "CREReportDialog.h"
16 #include "CREReportDisplay.h"
17 #include "CREReportDefinition.h"
18 
25 #include "recipes/RecipePanel.h"
26 #include "CREMapPanel.h"
27 #include "regions/RegionPanel.h"
28 #include "CREQuestPanel.h"
29 #include "CREMessagePanel.h"
32 #include "faces/FacesetsPanel.h"
34 
36 
38 #include "MessageFile.h"
40 
41 #include "CREScriptEngine.h"
42 
43 #include "random_maps/RandomMap.h"
45 
46 extern "C" {
47 #include "global.h"
48 #include "recipe.h"
49 }
50 #include "assets.h"
51 #include "AssetsManager.h"
52 
53 #include "MessageManager.h"
54 #include "ResourcesManager.h"
55 #include "assets/AssetModel.h"
56 #include "faces/FacePanel.h"
57 
58 CREResourcesWindow::CREResourcesWindow(CREMapInformationManager* store, MessageManager* messages, ResourcesManager* resources, ScriptFileManager* scripts, AssetModel *model, const QModelIndex &root, QWidget* parent) : QWidget(parent)
59 {
60  QApplication::setOverrideCursor(Qt::WaitCursor);
61  setWindowTitle(model->data(root, Qt::DisplayRole).toString());
62 
63  Q_ASSERT(store);
64  myStore = store;
65  Q_ASSERT(messages);
67  Q_ASSERT(resources);
68  myResources = resources;
69  Q_ASSERT(scripts);
71  myModel = new ScriptFilterAssetModel(model, &myEngine, this);
72  myTreeRoot = root;
73 
74  setAttribute(Qt::WA_DeleteOnClose);
75 
76  QVBoxLayout* layout = new QVBoxLayout(this);
77 
78  myFiltersMenu = new QMenu(this);
79  QHBoxLayout* buttons = new QHBoxLayout();
80  myFilterButton = new QPushButton(tr("Filter..."), this);
81  myFilterButton->setMenu(myFiltersMenu);
82  buttons->addWidget(myFilterButton);
83 
84  myReportsMenu = new QMenu(this);
85  QPushButton* report = new QPushButton(tr("Report"), this);
86  report->setMenu(myReportsMenu);
87  buttons->addWidget(report);
88 
89  layout->addLayout(buttons);
90 
91  auto splitter = new QSplitter(this);
92  layout->addWidget(splitter);
93 
94  myTree = new QTreeView(this);
95  myTree->setModel(myModel);
96  myTree->setRootIndex(myModel->mapFromSource(root));
97  splitter->addWidget(myTree);
98  myTree->setIconSize(QSize(32, 32));
99  myTree->collapseAll();
100  myTree->expand(myModel->mapFromSource(root));
101  myTree->setSelectionMode(QAbstractItemView::SingleSelection);
102  myTree->setDragEnabled(true);
103  myTree->setDropIndicatorShown(true);
104  myTree->setDragDropMode(QAbstractItemView::DragDrop);
105  myTree->setContextMenuPolicy(Qt::CustomContextMenu);
106  connect(myTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(treeCustomMenu(const QPoint&)));
107  connect(myTree->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(currentRowChanged(const QModelIndex&, const QModelIndex&)));
108  connect(myModel, &QAbstractItemModel::rowsInserted, [this](const QModelIndex &parent, int /*first*/, int /*last*/) {
109  myTree->expand(parent);
110  });
111 
112  QWidget* w = new QWidget(splitter);
113  myStackedPanels = new QStackedLayout(w);
114  splitter->addWidget(w);
115 
116  /* dummy panel to display for empty items */
117  CREPanel* dummy = new CREPanel(this);
118  QVBoxLayout* dl = new QVBoxLayout(dummy);
119  dl->addWidget(new QLabel(tr("No details available."), dummy));
120  addPanel("empty", dummy);
121  myStackedPanels->setCurrentWidget(dummy);
122  myCurrentPanel = dummy;
123 
124  connect(&myFiltersMapper, SIGNAL(mapped(QObject*)), this, SLOT(onFilterChange(QObject*)));
125  updateFilters();
126  connect(&myReportsMapper, SIGNAL(mapped(QObject*)), this, SLOT(onReportChange(QObject*)));
127  updateReports();
128 
129  addPanel("Archetype", new ArchetypePanel(myStore, myResources, this));
130  addPanel("Face", new CREFacePanel(this, model, myResources, myStore));
131  addPanel("Animation", new AnimationPanel(this, model));
132  addPanel("Artifact", new ArtifactPanel(this));
133  addPanel("ArtifactList", new ArtifactListPanel(this));
134  addPanel("Recipe", new RecipePanel(this));
135  addPanel("Treasure", new TreasurePanel(this));
136  addPanel("TreasureList", new CRETreasurePanel(this));
137  addPanel("Faceset", new FacesetsPanel(this, myResources->licenseManager()));
138  addPanel("Quest", new CREQuestPanel(myStore, myMessages, myResources, model, this));
139  addPanel("GeneralMessage", new CREGeneralMessagePanel(this));
140  addPanel("Region", new RegionPanel(this));
141  addPanel("Map", new CREMapPanel(myScripts, this));
142  addPanel("Script", new CREScriptPanel(this));
143  addPanel("Message", new CREMessagePanel(myMessages, this));
144  addPanel("RandomMap", new CRERandomMapPanel(this));
145  addPanel("AttackMessage", new AttackMessagePanel(this));
146 
147  splitter->setSizes({5000, 5000});
148 
149  QApplication::restoreOverrideCursor();
150 }
151 
153 {
154  qDeleteAll(myPanels);
155 }
156 
158 {
159  if (myCurrentPanel != NULL)
161 }
162 
163 void CREResourcesWindow::currentRowChanged(const QModelIndex &current, const QModelIndex &previous)
164 {
165  if (previous.isValid()) {
166  commitData();
167  }
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  CREPanel* newPanel = myPanels[item->displayPanelName()];
181  if (!newPanel) {
182 // printf("no panel for %s\n", qPrintable(item->getPanelName()));
183  return;
184  }
185 
186  item->displayFillPanel(newPanel);
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 }
ScriptFileManager
Definition: ScriptFileManager.h:12
CREResourcesWindow::onReport
void onReport()
Definition: CREResourcesWindow.cpp:211
CREResourcesWindow::myCurrentPanel
CREPanel * myCurrentPanel
Definition: CREResourcesWindow.h:42
global.h
CREMessagePanel.h
CREResourcesWindow::addMessage
void addMessage(bool)
Definition: CREResourcesWindow.cpp:465
ArchetypePanel
Definition: ArchetypePanel.h:15
ResourcesManager::licenseManager
LicenseManager * licenseManager()
Definition: ResourcesManager.h:132
layout
Definition: main.c:85
TreasureListPanel.h
CREResourcesWindow::myTree
QTreeView * myTree
Definition: CREResourcesWindow.h:40
CREResourcesWindow::onQuickFilter
void onQuickFilter()
Definition: CREResourcesWindow.cpp:262
CREResourcesWindow::myModel
ScriptFilterAssetModel * myModel
Definition: CREResourcesWindow.h:39
FacesetsPanel.h
ScriptFileManager.h
MessageManager.h
ResourcesManager
Definition: ResourcesManager.h:67
AssetsManager.h
say.previous
dictionary previous
Definition: say.py:205
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:58
CREFilterDialog
Definition: CREFilterDialog.h:12
CREUtils.h
ScriptFilterAssetModel::setFilter
void setFilter(const QString &filter)
Definition: AssetModel.cpp:244
CREFilterDialog.h
recipe.h
CREResourcesWindow::myReportsMenu
QMenu * myReportsMenu
Definition: CREResourcesWindow.h:53
root
static char root[500]
Definition: mapper.cpp:305
mad_mage_user.file
file
Definition: mad_mage_user.py:15
CREResourcesWindow::reportsModified
void reportsModified()
CREResourcesWindow::myFilters
CREFilterDefinitionManager myFilters
Definition: CREResourcesWindow.h:52
CREResourcesWindow::onReportChange
void onReportChange(QObject *object)
Definition: CREResourcesWindow.cpp:314
MessageManager::messages
QList< MessageFile * > & messages()
Definition: MessageManager.cpp:41
CREResourcesWindow::myMessages
MessageManager * myMessages
Definition: CREResourcesWindow.h:46
CREResourcesWindow::myPanels
QHash< QString, QPointer< CREPanel > > myPanels
Definition: CREResourcesWindow.h:43
CRERandomMapPanel
Definition: RandomMapPanel.h:10
CREQuestPanel
Definition: CREQuestPanel.h:26
RandomMap.h
CREResourcesWindow::myStore
CREMapInformationManager * myStore
Definition: CREResourcesWindow.h:45
MessageFile
Definition: MessageFile.h:56
CREReportDefinition
Definition: CREReportDefinition.h:7
AnimationPanel
Definition: AnimationPanel.h:19
getManager
AssetsManager * getManager()
Definition: assets.cpp:333
CRETreasurePanel
Definition: TreasureListPanel.h:10
RecipePanel.h
CREResourcesWindow::onFilter
void onFilter()
Definition: CREResourcesWindow.cpp:201
settings
struct Settings settings
Definition: init.c:39
CREResourcesWindow::onFilterChange
void onFilterChange(QObject *object)
Definition: CREResourcesWindow.cpp:255
quest
Definition: quest.py:1
disinfect.map
map
Definition: disinfect.py:4
CREFilterDefinition.h
CREResourcesWindow::addPanel
void addPanel(QString name, CREPanel *panel)
Definition: CREResourcesWindow.cpp:194
CREScriptEngine.h
RandomMapPanel.h
AssetModel::data
virtual QVariant data(const QModelIndex &index, int role) const override
Definition: AssetModel.cpp:58
CREScriptEngine
Definition: CREScriptEngine.h:6
CREResourcesWindow::myFiltersMenu
QMenu * myFiltersMenu
Definition: CREResourcesWindow.h:50
CREPanel
Definition: CREPanel.h:7
TreasurePanel
Definition: TreasurePanel.h:11
AssetsCollection::define
T * define(const Key &name, T *asset)
Definition: AssetsCollection.h:97
AssetWrapper
Definition: AssetWrapper.h:11
CREResourcesWindow::myReportsMapper
QSignalMapper myReportsMapper
Definition: CREResourcesWindow.h:54
RegionPanel
Definition: RegionPanel.h:7
CREReportDefinition.h
CREResourcesWindow::myFiltersMapper
QSignalMapper myFiltersMapper
Definition: CREResourcesWindow.h:51
CRESettings.h
ScriptFilterAssetModel
Definition: AssetModel.h:57
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:14
navar-midane_time.data
data
Definition: navar-midane_time.py:11
python_event.scripts
scripts
Definition: python_event.py:14
CREReportDisplay.h
CREResourcesWindow::myEngine
CREScriptEngine myEngine
Definition: CREResourcesWindow.h:56
FacePanel.h
CREReportDefinitionManager::reports
QList< CREReportDefinition * > & reports()
Definition: CREReportDefinitionManager.cpp:30
AssetModel.h
disinfect.count
int count
Definition: disinfect.py:7
CREQuestPanel.h
MessageManager
Definition: MessageManager.h:13
CREResourcesWindow::setFilter
void setFilter(const QString &filter, const QString &name)
Definition: CREResourcesWindow.cpp:274
AssetsCollection::get
T * get(const Key &name)
Definition: AssetsCollection.h:66
ArtifactPanel
Definition: ArtifactPanel.h:14
CREResourcesWindow::filtersModified
void filtersModified()
RecipePanel
Definition: RecipePanel.h:9
CREResourcesWindow::treeCustomMenu
void treeCustomMenu(const QPoint &pos)
Definition: CREResourcesWindow.cpp:432
CREResourcesWindow::myFilterButton
QPushButton * myFilterButton
Definition: CREResourcesWindow.h:49
CREResourcesWindow::addQuest
void addQuest(bool)
Definition: CREResourcesWindow.cpp:449
CREGeneralMessagePanel
Definition: GeneralMessagePanel.h:6
guild_entry.text
text
Definition: guild_entry.py:44
RegionPanel.h
CREMapInformationManager.h
ResourcesManager.h
CREResourcesWindow::myStackedPanels
QStackedLayout * myStackedPanels
Definition: CREResourcesWindow.h:44
navar-midane_apply.messages
list messages
Definition: navar-midane_apply.py:8
FacesetsPanel
Definition: FacesetsPanel.h:9
ArtifactListPanel.h
ScriptFilterAssetModel::filter
const QString & filter() const
Definition: AssetModel.h:62
CREResourcesWindow::myScripts
ScriptFileManager * myScripts
Definition: CREResourcesWindow.h:48
CREResourcesWindow::myResources
ResourcesManager * myResources
Definition: CREResourcesWindow.h:47
MessageFile.h
CREResourcesWindow::myReports
CREReportDefinitionManager myReports
Definition: CREResourcesWindow.h:55
report
Definition: report.py:1
item
Definition: item.py:1
TreasurePanel.h
ArtifactListPanel
Definition: ArtifactListPanel.h:13
CRESettings
Definition: CRESettings.h:9
AttackMessagePanel.h
AttackMessagePanel
Definition: AttackMessagePanel.h:10
assets.h
CREResourcesWindow::myTreeRoot
QModelIndex myTreeRoot
Definition: CREResourcesWindow.h:41
npc_dialog.index
int index
Definition: npc_dialog.py:102
CREReportDialog
Definition: CREReportDialog.h:12
AnimationPanel.h
ArtifactWrapper.h
CREFilterDefinition
Definition: CREFilterDefinition.h:7
CREMessagePanel
Definition: CREMessagePanel.h:20
ScriptFilePanel.h
CREMapPanel
Definition: CREMapPanel.h:11
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:17
CREResourcesWindow.h
replace.current
current
Definition: replace.py:64
quests
static struct_quest ** quests
Definition: mapper.cpp:915
CREMapPanel.h
CREPixmap.h
quest_create
quest_definition * quest_create(const char *name)
Definition: Quests.cpp:61
CREFacePanel
Definition: FacePanel.h:17
CREScriptPanel
Definition: ScriptFilePanel.h:9
CREReportDisplay
Definition: CREReportDisplay.h:7
CREResourcesWindow::updateFilters
void updateFilters()
Definition: CREResourcesWindow.cpp:221
give.name
name
Definition: give.py:27
CREFilterDefinitionManager::filters
QList< CREFilterDefinition * > & filters()
Definition: CREFilterDefinitionManager.cpp:29
CREResourcesWindow::currentRowChanged
void currentRowChanged(const QModelIndex &current, const QModelIndex &previous)
Definition: CREResourcesWindow.cpp:163
CREResourcesWindow::commitData
void commitData()
Definition: CREResourcesWindow.cpp:157
CREPanel::commitData
virtual void commitData()
Definition: CREPanel.h:14
CREResourcesWindow::~CREResourcesWindow
virtual ~CREResourcesWindow()
Definition: CREResourcesWindow.cpp:152