3 #include <QScriptValue> 60 QApplication::setOverrideCursor(Qt::WaitCursor);
75 setAttribute(Qt::WA_DeleteOnClose);
77 QVBoxLayout*
layout =
new QVBoxLayout(
this);
80 QHBoxLayout* buttons =
new QHBoxLayout();
86 QPushButton* report =
new QPushButton(tr(
"Report"),
this);
88 buttons->addWidget(report);
90 layout->addLayout(buttons);
94 myTree =
new QTreeWidget(
this);
96 myTree->setIconSize(QSize(32, 32));
97 myTree->setHeaderLabel(tr(
"All resources"));
101 myTree->setContextMenuPolicy(Qt::CustomContextMenu);
102 connect(
myTree, SIGNAL(customContextMenuRequested(
const QPoint&)),
this, SLOT(
treeCustomMenu(
const QPoint&)));
103 connect(
myTree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
this, SLOT(
tree_currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
107 QVBoxLayout* dl =
new QVBoxLayout(dummy);
108 dl->addWidget(
new QLabel(tr(
"No details available."), dummy));
110 dummy->setVisible(
true);
120 QApplication::restoreOverrideCursor();
134 QApplication::setOverrideCursor(Qt::WaitCursor);
145 title = tr(
"Archetypes");
150 title = tr(
"Animations");
155 title = tr(
"Treasures");
160 title = tr(
"Formulae");
165 title = tr(
"Artifacts");
180 title = tr(
"Quests");
185 title = tr(
"NPC dialogs");
190 title = tr(
"Scripts");
195 title = tr(
"Random maps");
200 title = tr(
"All resources");
202 if (
myTree->topLevelItemCount() == 1)
203 myTree->topLevelItem(0)->setExpanded(
true);
205 setWindowTitle(title);
207 myTree->resizeColumnToContents(0);
209 QApplication::restoreOverrideCursor();
220 if (!current || current->data(0, Qt::UserRole).value<
void*>() == NULL)
241 newPanel->setVisible(
true);
250 animationsNode->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
251 myTree->addTopLevelItem(animationsNode);
253 QTreeWidgetItem* item;
257 foreach(QString name, animations)
262 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
270 QTreeWidgetItem* item, *sub;
276 treasures->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
277 myTree->addTopLevelItem(treasures);
281 foreach(QString name, names)
287 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
292 for (treasure = list->
items; treasure; treasure = treasure->
next)
296 sub->setText(1, QString::number(treasure->
chance));
298 sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
307 QTreeWidgetItem* item, *
root, *sub;
309 int added = 0, count = 0;
313 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
314 myTree->addTopLevelItem(root);
320 foreach(QString name, archs)
332 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
338 sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
348 root->setText(0, tr(
"%1 [%2 items]").arg(root->text(0)).arg(count));
350 root->setText(0, tr(
"%1 [%2 items out of %3]").arg(root->text(0)).arg(added).arg(count));
356 QTreeWidgetItem*
root, *form, *sub;
358 int count = 0, added = 0, subCount, subAdded;
360 form =
new QTreeWidgetItem(
myTree, QStringList(tr(
"Formulae")));
362 form->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
367 root =
new QTreeWidgetItem(form, QStringList(tr(
"%1 ingredients").arg(ing)));
373 foreach(QString name, recipes)
386 sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
392 if (subCount == subAdded)
393 root->setText(0, tr(
"%1 [%2 items]").arg(root->text(0)).arg(subCount));
395 root->setText(0, tr(
"%1 [%2 items out of %3]").arg(root->text(0)).arg(added).arg(subCount));
401 form->setText(0, tr(
"%1 [%2 items]").arg(form->text(0)).arg(count));
403 form->setText(0, tr(
"%1 [%2 items out of %3]").arg(form->text(0)).arg(added).arg(count));
408 QTreeWidgetItem* item, *
root, *sub;
411 int count = 0, added = 0;
413 root =
new QTreeWidgetItem(
myTree, QStringList(tr(
"Artifacts")));
415 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
421 int subCount = 0, subAdded = 0;
424 item =
new QTreeWidgetItem(root, QStringList(data ? data->
name : tr(
"type %1").arg(list->
type)));
436 sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
441 if (subCount == subAdded)
442 item->setText(0, tr(
"%1 [%2 items]").arg(item->text(0)).arg(subCount));
444 item->setText(0, tr(
"%1 [%2 items out of %3]").arg(item->text(0)).arg(subAdded).arg(subCount));
449 root->setText(0, tr(
"%1 [%2 items]").arg(root->text(0)).arg(count));
451 root->setText(0, tr(
"%1 [%2 items out of %3]").arg(root->text(0)).arg(added).arg(count));
456 QTreeWidgetItem* item, *
root;
461 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
462 myTree->addTopLevelItem(root);
466 foreach(QString name, faces)
471 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
488 headers << tr(
"Maps") << tr(
"Experience");
489 myTree->setHeaderLabels(headers);
490 myTree->sortByColumn(0, Qt::AscendingOrder);
494 QTreeWidgetItem* regionNode, *
root, *leaf;
498 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
499 myTree->addTopLevelItem(root);
501 QHash<QString, region*>
regions;
504 regions[reg->name] = reg;
507 QStringList names = regions.keys();
512 foreach(QString name, names)
518 regionNode->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
523 leaf->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
525 leaf->setText(1, tr(
"%1").arg(QString::number(map->
experience()), 20));
531 totalMaps += maps.size();
536 root->setExpanded(
true);
537 myTree->resizeColumnToContents(0);
538 myTree->resizeColumnToContents(1);
540 root->setText(0, tr(
"Maps [%1 items]").arg(totalMaps));
548 QTreeWidgetItem* item, *
root;
552 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
553 myTree->addTopLevelItem(root);
563 codes.append(quest->
code());
567 foreach(QString code, codes)
572 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
580 QTreeWidgetItem* item, *
root;
584 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
585 myTree->addTopLevelItem(root);
591 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
599 return left->
path().compare(right->
path()) < 0;
604 QTreeWidgetItem* item, *
root;
608 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
609 myTree->addTopLevelItem(root);
618 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
626 panel->setVisible(
false);
634 if (dlg.exec() != QDialog::Accepted)
644 if (dlg.exec() != QDialog::Accepted)
660 QAction* clear =
new QAction(tr(
"(none)"),
this);
661 connect(clear, SIGNAL(triggered()),
this, SLOT(
clearFilter()));
666 QAction* a =
new QAction(filter->
name(),
this);
675 QAction* quick =
new QAction(tr(
"Quick filter..."),
this);
676 connect(quick, SIGNAL(triggered()),
this, SLOT(
onQuickFilter()));
678 QAction* dialog =
new QAction(tr(
"Filters definition..."),
this);
679 connect(dialog, SIGNAL(triggered()),
this, SLOT(
onFilter()));
698 QString filter = QInputDialog::getText(
this, tr(
"Quick filter"), tr(
"Filter:"), QLineEdit::Normal,
myFilter.
filter(), &ok);
701 if (filter.isEmpty())
729 QAction* a =
new QAction(report->
name(),
this);
738 QAction* dialog =
new QAction(tr(
"Reports definition..."),
this);
739 connect(dialog, SIGNAL(triggered()),
this, SLOT(
onReport()));
749 QProgressDialog progress(tr(
"Generating report..."), tr(
"Abort report"), 0,
myDisplayedItems.size() - 1,
this);
750 progress.setWindowTitle(tr(
"Report: '%1'").arg(report->
name()));
751 progress.setWindowModality(Qt::WindowModal);
753 QStringList headers = report->
header().split(
"\n");
754 QStringList fields = report->
itemDisplay().split(
"\n");
757 QString text(
"<table><thead><tr>");
759 foreach(QString header, headers)
761 text +=
"<th>" + header +
"</th>";
763 text +=
"</tr></thead><tbody>";
766 std::vector<QScriptValue> items;
768 [&items, &engine] (QObject* item) { items.push_back(engine.newQObject(item)); });
774 progress.setLabelText(tr(
"Sorting items..."));
776 engine.pushContext();
778 sort =
"(function(left, right) { return " + sort +
"; })";
779 QScriptValue sortFun = engine.evaluate(sort);
780 if (!sortFun.isValid() || engine.hasUncaughtException())
781 throw std::runtime_error(
"A script error happened while compiling the sort criteria:\n" + engine.uncaughtException().toString().toStdString());
783 std::sort(items.begin(), items.end(), [&sortFun, &engine](QScriptValue left, QScriptValue right) {
784 QScriptValueList args;
785 args.push_back(left);
786 args.push_back(right);
787 auto ret = sortFun.call(QScriptValue(), args);
788 if (!ret.isValid() || engine.hasUncaughtException())
790 throw std::runtime_error(
"A script error happened while sorting items:\n" + engine.uncaughtException().toString().toStdString());
793 return ret.isValid() ? ret.toBoolean() :
true;
798 catch (std::runtime_error& ex)
800 QMessageBox::critical(
this,
"Script error", ex.what(), QMessageBox::Ok);
805 progress.setLabelText(tr(
"Generating items text..."));
806 foreach(QScriptValue item, items)
808 if (progress.wasCanceled())
813 engine.pushContext();
814 engine.globalObject().setProperty(
"item", item);
816 foreach(QString field, fields)
819 QString data = engine.evaluate(field).toString();
820 if (engine.hasUncaughtException())
822 QMessageBox::critical(
this,
"Script error",
"A script error happened while display items:\n" + engine.uncaughtException().toString(), QMessageBox::Ok);
831 progress.setValue(progress.value() + 1);
835 QStringList footers = report->
footer().split(
"\n");
838 foreach(QString footer, footers)
840 text +=
"<th>" + footer +
"</th>";
845 qDebug() <<
"report finished";
854 QTreeWidgetItem* node =
myTree->itemAt(pos);
855 if (!node || node->data(0, Qt::UserRole).value<
void*>() == NULL)
870 QAction*
addMessage =
new QAction(
"add message", &menu);
871 connect(addMessage, SIGNAL(triggered(
bool)),
this, SLOT(
addMessage(
bool)));
872 menu.addAction(addMessage);
877 QAction*
addQuest =
new QAction(
"add quest", &menu);
878 connect(addQuest, SIGNAL(triggered(
bool)),
this, SLOT(
addQuest(
bool)));
879 menu.addAction(addQuest);
884 if (menu.actions().size() == 0)
886 menu.exec(
myTree->mapToGlobal(pos));
925 if (left->
x() < right->
x())
927 if (left->
x() == right->
x() && left->
y() < right->
y())
940 headers << tr(
"Random maps") << tr(
"Final map") << tr(
"Depth");
941 myTree->setHeaderLabels(headers);
942 myTree->sortByColumn(0, Qt::AscendingOrder);
948 root->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
949 myTree->addTopLevelItem(root);
955 QString source(tr(
"from %1 [%2, %3]").arg(map->
map()->
name()).arg(map->
x()).arg(map->
y()));
956 QStringList data(source);
961 QTreeWidgetItem* leaf =
new QTreeWidgetItem(root, QStringList(data));
963 leaf->setData(0, Qt::UserRole, QVariant::fromValue<void*>(
myTreeItems.last()));
966 root->setText(0, tr(
"Random maps [%1]").arg(maps.size()));
970 root->setExpanded(
true);
971 myTree->resizeColumnToContents(0);
const QString & face() const
void deleteQuest(Quest *quest)
QHash< QString, QPointer< CREPanel > > myPanels
QList< MessageFile * > & messages()
QStringList recipes(int count) const
static QTreeWidgetItem * animationNode(QTreeWidgetItem *parent)
static QTreeWidgetItem * archetypeNode(QTreeWidgetItem *parent)
static QTreeWidgetItem * artifactNode(QTreeWidgetItem *parent)
const QString & path() const
CREPanel * myCurrentPanel
const treasurelist * treasureList(const QString &name)
QList< CREReportDefinition * > & reports()
struct artifactstruct * items
void tree_currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)
static QTreeWidgetItem * questsNode()
const QString & itemDisplay() const
const animations_struct * animation(const QString &name) const
const QString & code() const
static bool sortRandomMap(const CRERandomMap *left, const CRERandomMap *right)
QSignalMapper myFiltersMapper
virtual ~CREResourcesWindow()
virtual QString getPanelName() const =0
static struct struct_region_info ** regions
static QTreeWidgetItem * formulaeNode(const recipe *recipe, QTreeWidgetItem *parent)
static QTreeWidgetItem * faceNode(QTreeWidgetItem *parent)
QStringList archetypes() const
virtual void fillPanel(QWidget *panel)=0
QStringList allAnimations() const
QList< CREFilterDefinition * > & filters()
static QTreeWidgetItem * questNode(const Quest *quest, QTreeWidgetItem *parent)
const typedata * get_typedata(int itemtype)
CREMapInformationManager * myStore
void onReportChange(QObject *object)
void setModified(bool modified=true)
const recipestruct * recipe(int ingredients, const QString &name) const
const QString & footer() const
struct artifactliststruct * next
void setFilter(const QString &filter)
bool showItem(QObject *item)
CREFilterDefinitionManager myFilters
void setObject(const object *obj)
QList< CRETreeItem * > myTreeItems
void onFilterChange(QObject *object)
static QTreeWidgetItem * scriptNode(const ScriptFile *script, QTreeWidgetItem *parent)
const QString & itemSort() const
MessageManager * myMessages
QStringList faces() const
const ResourcesManager * resourcesManager() const
static QTreeWidgetItem * scriptsNode()
QSignalMapper myReportsMapper
EXTERN Animations * animations
const archt * archetype(const QString &name) const
CREResourcesWindow(CREMapInformationManager *store, QuestManager *quests, MessageManager *messages, ResourcesManager *resources, ScriptFileManager *scripts, QWidget *parent, DisplayMode mode=DisplayAll)
void setCode(const QString &code)
const RMParms * parameters() const
const QString & filter() const
EXTERN artifactlist * first_artifactlist
static bool scriptLessThan(const ScriptFile *left, const ScriptFile *right)
void addPanel(QString name, CREPanel *panel)
struct treasurestruct * items
const QString & header() const
QList< QObject * > myDisplayedItems
QList< ScriptFile * > scripts() const
static QTreeWidgetItem * messagesNode()
struct treasurestruct treasure
ScriptFileManager * myScripts
ResourcesManager * myResources
const QString & name() const
void treeCustomMenu(const QPoint &pos)
bool sortMapInformation(const CREMapInformation *left, const CREMapInformation *right)
static QTreeWidgetItem * regionNode(const QString &name, int count, QTreeWidgetItem *parent)
virtual void commitData()
const QString & name() const
void setFaceNumber(int face)
QPushButton * myFilterButton
static quest_definition * quests
static QTreeWidgetItem * messageNode(const MessageFile *message, QTreeWidgetItem *parent)
const Face * face(const QString &name) const
static QTreeWidgetItem * treasureNode(QTreeWidgetItem *parent)
const CREMapInformation * map() const
int recipeMaxIngredients() const
EXTERN region * first_region
CREReportDefinitionManager myReports
void loadFilters(CREFilterDefinitionManager &filters)
QList< const Quest * > quests() const
struct treasurestruct * next
void setArtifact(const artifact *art)
virtual void fillContextMenu(QMenu *)
const QString & filter() const
void fillItem(const QPoint &pos, QMenu *menu)
void loadReports(CREReportDefinitionManager &reports)
struct artifactstruct * next
Quest * getByCode(const QString &code)
static QTreeWidgetItem * mapNode(QTreeWidgetItem *parent)
QStringList treasureLists() const