]> ruin.nu Git - hbs.git/blob - bs/bsview.cpp
f5e74bc82324a8f93440976d6b9bddad7cc388b9
[hbs.git] / bs / bsview.cpp
1 /***************************************************************************
2                           bcview.cpp  -  description
3                              -------------------
4     begin                : Sun Jun 17 19:19:58 CEST 2001
5     copyright            : (C) 2001 by Michael Andreen
6     email                : whale@linux.nu
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17
18 #include "bsview.h"
19
20 //standard library
21 #include <iostream>
22 #include <map>
23 #include <vector>
24 #include <string>
25
26 using namespace std;
27
28 //QT includes
29 #include <qlistview.h>
30 #include <qwidgetstack.h>
31
32 #include "battlesum.h"
33 #include "scanview.h"
34 #include "ui/infoview.h"
35 #include "tickview.h"
36 #include "fleetview.h"
37 #include "fleet.h"
38
39 BSView::BSView(QWidget *parent, BSDoc *doc) : QSplitter(parent)
40 {
41   /** connect doc with the view*/
42         connect(doc, SIGNAL(documentChanged()), this, SLOT(slotDocumentChanged()));
43         
44         m_doc = doc;
45         
46         m_LeftSplit = new QSplitter(QSplitter::Vertical, this);
47         m_RightSplit = new QSplitter(QSplitter::Vertical, this);
48
49         //setting up the listview
50         m_NumberView = new QListView(m_LeftSplit);
51         m_NumberView->setRootIsDecorated(true);  
52         m_NumberView->addColumn("Name");
53         m_NumberView->addColumn("Number");
54         m_NumberView->addColumn("ETA");
55         m_NumberView->addColumn("Score");
56         //addBattle("NO BATTLES");
57
58         
59         
60         connect(m_NumberView, SIGNAL(expanded(QListViewItem*)), SLOT(slotItemExpanded(QListViewItem*)));
61         connect(m_NumberView, SIGNAL(collapsed(QListViewItem*)), SLOT(slotItemCollapsed(QListViewItem*)));
62         
63         m_InfoView = new InfoView(m_LeftSplit);
64
65         connect(m_InfoView,SIGNAL(add()),SLOT(slotInfoNew()));
66         connect(m_InfoView,SIGNAL(apply()),SLOT(slotInfoApply()));
67         connect(m_InfoView,SIGNAL(cancel()),SLOT(slotInfoCancel()));
68         connect(m_InfoView,SIGNAL(remove()),SLOT(slotInfoRemove()));
69
70         vector<QString> raceNames;
71         const map<string, vector<int> >& races = Fleet::Races();
72         for(map<string, vector<int> >::const_iterator i = races.begin(); i != races.end(); ++i)
73         {
74                 raceNames.push_back(i->first.c_str());
75         }
76         m_InfoView->setRaces(raceNames);
77         
78         //the right side
79         m_TickView = new TickView(m_RightSplit);
80         m_FleetViews = new QWidgetStack(m_RightSplit);
81         m_ScanView = new ScanView(m_RightSplit);
82         
83         Fleet fl1;
84         //fl1.setRace(tr("Terran").latin1());
85         fl1.setRace("Terran");
86         Fleet fl2;
87         fl2.setRace(tr("Generic").latin1());
88
89         //the widget stack
90         m_BattleSum = new BattleSum();
91         m_FleetViews->addWidget(m_BattleSum, 0);
92         m_FleetView = new FleetView(&fl1, true);
93         m_FleetViews->addWidget(m_FleetView, 1);
94         m_GenericFleetView = new FleetView(&fl2, true);
95         m_FleetViews->addWidget(m_GenericFleetView, 2);
96         //m_FleetViews->raiseWidget(0);
97         connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *)));
98         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
99         connect(m_GenericFleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
100 }
101
102 BSView::~BSView()
103 {
104 }
105
106 //////////////////////////////////////////////////////////////////////////
107 //
108 void BSView::addBattle(QString name)
109 {
110         QListViewItem* battle = new QListViewItem(m_NumberView, name);
111         QListViewItem* def = new QListViewItem(battle, tr("Friendly"),"", "","1");
112         (void) new QListViewItem(battle, tr("Hostile"),"", "","2");
113         (void) new QListViewItem(def, tr("Home Planet"), "","","1");
114 }
115
116 ///////////////////////////////////////////////////////////////////////////////
117 //
118 /***This function clears the listview and then iterates through the battles
119  * and recreates the listview hierarchy.
120  */
121 void BSView::slotDocumentChanged()
122 {
123         m_NumberView->clear();
124         
125         const BattleList& battles = m_doc->battles();   
126
127         vector<QString> battlenames;
128
129         for (BattleList::const_iterator i = battles.begin(); i != battles.end(); ++i)
130         {
131                 QString b = (*i).first;
132                 battlenames.push_back(i->first);
133                 QListViewItem* battle = new QListViewItem(m_NumberView, b);
134                 battle->setOpen(m_TreeExpanded[b]["--"]);
135                         
136
137                 for (map<QString, map<QString, Fleet*> >::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
138                 {
139                         QString g = (*j).first;
140                         QListViewItem* group = new QListViewItem(battle, g);
141                         int groupShips = 0;
142                         unsigned groupScore = 0;
143                         group->setOpen(m_TreeExpanded[b][g]);
144
145                         for (map<QString, Fleet*>::const_iterator k = j->second.begin(); k != j->second.end(); ++k)
146                         {       
147                                 int ships = k->second->numberOfShips();
148                                 unsigned score = k->second->score();
149                                 groupShips += ships;
150                                 groupScore += score;
151                                 //if(k->first == tr("Home Planet"))
152                                         (void) new QListViewItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score));
153                                 /*else
154                                         (void) new QCheckListItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score), QCheckListItem::CheckBox);*/
155
156                         }
157                         group->setText(1, QString("%1").arg(groupShips));
158                         group->setText(3, QString("%1").arg(groupScore));
159                 }
160         }
161         m_InfoView->setBattles(battlenames);
162         updateInfoView();
163         updateFleetView();
164 }
165
166 //////////////////////////////////////////////////////////////////////////////
167 //
168 void BSView::slotFleetSelection(QListViewItem *lvi)
169 {
170
171         if (lvi->parent() == '\0')
172         {
173                 m_FleetViews->raiseWidget(0);
174         }
175         else if (lvi->parent()->parent() == '\0')
176         {
177                 if (lvi->text(0) == tr("Friendly"))
178                 {
179 //                      m_FleetView->slotAttacker(false);
180                 }
181                 else
182                 {
183 //                      m_FleetView->slotAttacker(true);
184                 }
185                 m_FleetViews->raiseWidget(2);
186                 
187         }
188         else
189         {
190                 m_sFleet = lvi->text(0);
191                 m_sGroup = lvi->parent()->text(0);
192                 m_sBattle = lvi->parent()->parent()->text(0);
193
194                 updateInfoView();
195                 updateFleetView();
196         }
197 }
198
199 //////////////////////////////////////////////////////////////////////////
200 //
201 void BSView::slotItemExpanded(QListViewItem *lvi)
202 {
203         if (lvi->parent() == '\0')
204         {
205                 m_TreeExpanded[lvi->text(0)]["--"] = true;
206         }
207         else if (lvi->parent()->parent() == '\0')
208         {
209                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = true;    
210         }
211 }
212
213 //////////////////////////////////////////////////////////////////////////
214 //
215 void BSView::slotItemCollapsed(QListViewItem *lvi)
216 {
217         if (lvi->parent() == '\0')
218         {
219                 m_TreeExpanded[lvi->text(0)]["--"] = false;
220         }
221         else if (lvi->parent()->parent() == '\0')
222         {
223                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = false;   
224         }
225 }
226
227 //////////////////////////////////////////////////////////////////////////
228 //
229 void BSView::slotFleetChanged(const Fleet* fleet)
230 {
231         m_doc->changeFleet(m_sBattle, m_sGroup, m_sFleet, fleet);
232 }
233
234 //////////////////////////////////////////////////////////////////////////
235 //
236 void BSView::slotInfoApply()
237 {
238 }
239
240 //////////////////////////////////////////////////////////////////////////
241 //
242 void BSView::slotInfoCancel()
243 {
244         updateInfoView();
245 }
246
247 //////////////////////////////////////////////////////////////////////////
248 //
249 void BSView::slotInfoNew()
250 {
251         Fleet* fl = new Fleet();
252
253         m_sBattle = m_InfoView->battle();
254         m_sGroup = m_InfoView->group();
255         m_sFleet = m_InfoView->fleetName();
256
257         fl->setETA(m_InfoView->eta());
258         fl->setName(m_sFleet.latin1());
259         fl->setRace(m_InfoView->race().latin1());
260
261         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
262
263 }
264
265 //////////////////////////////////////////////////////////////////////////
266 //
267 void BSView::slotInfoRemove()
268 {
269 }
270
271 //////////////////////////////////////////////////////////////////////////
272 //
273 void BSView::updateInfoView()
274 {
275         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
276
277         if(!fl)
278         {
279                 m_InfoView->setRace("");
280                 m_InfoView->setFleetName("");
281                 m_InfoView->setEta(0);
282                 m_InfoView->setGroup("");
283                 m_InfoView->setBattle("");              
284                 m_InfoView->enableNameChange(true);
285                 m_InfoView->enableRemove(false);
286                 return;
287         }
288
289         if(m_sFleet == tr("Home Planet"))
290         {
291                 m_InfoView->enableNameChange(false);
292                 m_InfoView->enableRemove(false);
293         }
294         else
295         {
296                 m_InfoView->enableNameChange(true);
297                 m_InfoView->enableRemove(true);
298         }
299
300         m_InfoView->setRace(fl->race().c_str());
301         m_InfoView->setFleetName(m_sFleet);
302         m_InfoView->setEta(fl->ETA());
303         m_InfoView->setGroup(m_sGroup);
304         m_InfoView->setBattle(m_sBattle);
305 }
306
307 //////////////////////////////////////////////////////////////////////////
308 //
309 void BSView::updateFleetView()
310 {
311         bool friendly = false;
312         bool home       = false;
313
314         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
315
316         if (!fl)
317         {
318                 m_FleetViews->raiseWidget(2);
319                 return;
320         }
321
322         if ( m_sGroup == tr("Friendly"))
323         {
324                         friendly = true;
325                         if(m_sFleet == tr("Home Planet"))
326                                 home=true;
327         }
328         if (fl->race() == tr("Generic").latin1())
329         {
330                 m_GenericFleetView->viewFleet(fl, friendly);
331                 m_FleetViews->raiseWidget(2);
332
333         }
334         else 
335         {
336                 if (fl->race() == m_FleetView->fleet()->race() &&
337                 m_FleetView->isHome() == home)
338                 {
339                         m_FleetView->viewFleet(fl, friendly);
340                 }
341                 else
342                 {
343                         m_FleetViews->removeWidget(m_FleetView);
344                         delete m_FleetView;
345                         m_FleetView = new FleetView(fl, friendly);
346                         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
347                         m_FleetViews->addWidget(m_FleetView, 1);
348                 }
349                 m_FleetViews->raiseWidget(1);
350         }
351 }