Crossfire Server, Branch 1.12  R12190
CREResourcesWindow.cpp
Go to the documentation of this file.
00001 #include <Qt>
00002 #include <QtGui>
00003 
00004 #include "CREResourcesWindow.h"
00005 #include "CREUtils.h"
00006 #include "CREPixmap.h"
00007 
00008 #include "CRETreeItemAnimation.h"
00009 #include "CRETreeItemArchetype.h"
00010 #include "CRETreeItemTreasure.h"
00011 #include "CRETreeItemArtifact.h"
00012 #include "CRETreeItemFormulae.h"
00013 #include "CRETreeItemFace.h"
00014 
00015 #include "CREAnimationPanel.h"
00016 #include "CREArchetypePanel.h"
00017 #include "CRETreasurePanel.h"
00018 #include "CREArtifactPanel.h"
00019 #include "CREFormulaePanel.h"
00020 #include "CREFacePanel.h"
00021 
00022 extern "C" {
00023 #include "global.h"
00024 #include "recipe.h"
00025 }
00026 
00027 CREResourcesWindow::CREResourcesWindow(DisplayMode mode)
00028 {
00029     QApplication::setOverrideCursor(Qt::WaitCursor);
00030 
00031     setAttribute(Qt::WA_DeleteOnClose);
00032 
00033     QGridLayout* layout = new QGridLayout(this);
00034     mySplitter = new QSplitter(this);
00035     layout->addWidget(mySplitter);
00036     myTree = new QTreeWidget(this);
00037     mySplitter->addWidget(myTree);
00038     myTree->setIconSize(QSize(32, 32));
00039     myTree->setHeaderLabel(tr("All resources"));
00040 
00041     QString title;
00042     if (mode & DisplayArchetypes)
00043     {
00044         title = tr("Archetypes");
00045         fillArchetypes();
00046     }
00047     if (mode & DisplayAnimations)
00048     {
00049         title = tr("Animations");
00050         fillAnimations();
00051     }
00052     if (mode & DisplayTreasures)
00053     {
00054         title = tr("Treasures");
00055         fillTreasures();
00056     }
00057     if (mode & DisplayFormulae)
00058     {
00059         title = tr("Formulae");
00060         fillFormulae();
00061     }
00062     if (mode & DisplayArtifacts)
00063     {
00064         title = tr("Artifacts");
00065         fillArtifacts();
00066     }
00067     if (mode & DisplayFaces)
00068     {
00069         title = tr("Faces");
00070         fillFaces();
00071     }
00072 
00073     if (mode == DisplayAll)
00074         title = tr("All resources");
00075 
00076     myTree->setSortingEnabled(true);
00077 
00078     myCurrentPanel = NULL;
00079 
00080     connect(myTree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(tree_currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
00081 
00082     setWindowTitle(title);
00083 
00084     QApplication::restoreOverrideCursor();
00085 }
00086 
00087 void CREResourcesWindow::tree_currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem*)
00088 {
00089     if (!current || current->data(0, Qt::UserRole).value<void*>() == NULL)
00090         return;
00091     CRETreeItem* item = reinterpret_cast<CRETreeItem*>(current->data(0, Qt::UserRole).value<void*>());
00092     if (!item)
00093         return;
00094 
00095 
00096     QWidget* newPanel = myPanels[item->getPanelName()];
00097     if (!newPanel)
00098     {
00099 //        printf("no panel for %s\n", qPrintable(item->getPanelName()));
00100         return;
00101     }
00102 
00103     item->fillPanel(newPanel);
00104 
00105     if (myCurrentPanel != newPanel)
00106     {
00107         if (myCurrentPanel)
00108             myCurrentPanel->setVisible(false);
00109         newPanel->setVisible(true);
00110         myCurrentPanel = newPanel;
00111     }
00112 }
00113 
00114 void CREResourcesWindow::fillAnimations()
00115 {
00116     QTreeWidgetItem* animationsNode = CREUtils::animationNode(NULL);
00117     myTree->addTopLevelItem(animationsNode);
00118 
00119     QTreeWidgetItem* item;
00120 
00121     // There is the "bug" animation to consider
00122     for (int anim = 0; anim <= num_animations; anim++)
00123     {
00124         item = CREUtils::animationNode(&animations[anim], animationsNode);
00125         item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemAnimation(&animations[anim])));
00126     }
00127 
00128     addPanel("Animation", new CREAnimationPanel());
00129 }
00130 
00131 void CREResourcesWindow::fillTreasures()
00132 {
00133     QTreeWidgetItem* item, *sub;
00134     const treasurelist* list;
00135     const treasure* treasure;
00136 
00137     QTreeWidgetItem* treasures = CREUtils::treasureNode(NULL);
00138     myTree->addTopLevelItem(treasures);
00139 
00140     for (list = first_treasurelist; list; list = list->next)
00141     {
00142         item = CREUtils::treasureNode(list, treasures);
00143 
00144         item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemTreasure(list)));
00145         //item->setData(0, Qt::UserRole, allTreasures[t]);
00146         if (list->total_chance != 0)
00147             item->setText(1, QString::number(list->total_chance));
00148 
00149         for (treasure = list->items; treasure; treasure = treasure->next)
00150         {
00151             sub = CREUtils::treasureNode(treasure, item);
00152             if (treasure->chance)
00153                 sub->setText(1, QString::number(treasure->chance));
00154             sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemTreasure(list)));
00155         }
00156     }
00157 
00158     addPanel("Treasure", new CRETreasurePanel());
00159 }
00160 
00161 void CREResourcesWindow::fillArchetypes()
00162 {
00163     QTreeWidgetItem* item, *root, *sub;
00164     archt* arch;
00165 
00166     root = CREUtils::archetypeNode(NULL);
00167     myTree->addTopLevelItem(root);
00168 
00169     for (arch = first_archetype; arch; arch = arch->next)
00170     {
00171         item = CREUtils::archetypeNode(arch, root);
00172         item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemArchetype(arch)));
00173 
00174         for (archt* more = arch->more; more; more = more->more)
00175         {
00176             sub = CREUtils::archetypeNode(more, item);
00177             sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemArchetype(more)));
00178         }
00179     }
00180 
00181     addPanel("Archetype", new CREArchetypePanel());
00182 }
00183 
00184 void CREResourcesWindow::fillFormulae()
00185 {
00186     recipelist* list;
00187     recipe* recipe;
00188     QTreeWidgetItem* root, *form, *sub;
00189 
00190     form = new QTreeWidgetItem(myTree, QStringList(tr("Formulae")));
00191 //    myTree->addTopLevelItem(form);
00192 
00193     for (int ing = 1; ; ing++)
00194     {
00195         list = get_formulalist(ing);
00196         if (!list)
00197             break;
00198 
00199         root = new QTreeWidgetItem(form, QStringList(tr("%1 ingredients").arg(ing)));
00200 
00201         for (recipe = list->items; recipe; recipe = recipe->next)
00202         {
00203             sub = CREUtils::formulaeNode(recipe, root);
00204             sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemFormulae(recipe)));
00205         }
00206     }
00207 
00208     addPanel("Formulae", new CREFormulaePanel());
00209 }
00210 
00211 void CREResourcesWindow::fillArtifacts()
00212 {
00213     QTreeWidgetItem* item, *root, *sub;
00214     artifactlist* list;
00215     const typedata* data;
00216 
00217     root = new QTreeWidgetItem(myTree, QStringList(tr("Artifacts")));
00218 
00219     for (list = first_artifactlist; list; list = list->next)
00220     {
00221         data = get_typedata(list->type);
00222 
00223         item = new QTreeWidgetItem(root, QStringList(data ? data->name : tr("type %1").arg(list->type)));
00224 
00225         for (artifact* art = list->items; art; art = art->next)
00226         {
00227             sub = CREUtils::artifactNode(art, item);
00228             sub->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemArtifact(art)));
00229         }
00230     }
00231 
00232     addPanel("Artifact", new CREArtifactPanel());
00233 }
00234 
00235 void CREResourcesWindow::fillFaces()
00236 {
00237     QTreeWidgetItem* item, *root;
00238 
00239     root = CREUtils::faceNode(NULL);
00240     myTree->addTopLevelItem(root);
00241 
00242     extern int nrofpixmaps;
00243 
00244     for (int f = 0; f < nrofpixmaps; f++)
00245     {
00246         item = CREUtils::faceNode(&new_faces[f], root);
00247         item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(new CRETreeItemFace(&new_faces[f])));
00248     }
00249 
00250     addPanel("Face", new CREFacePanel());
00251 }
00252 
00253 void CREResourcesWindow::addPanel(QString name, QWidget* panel)
00254 {
00255     panel->setVisible(false);
00256     myPanels[name] = panel;
00257     mySplitter->addWidget(panel);
00258 }