Crossfire Server, Branch 1.12
R12190
|
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 }