]> ruin.nu Git - hbs.git/blob - bs/bsview.cpp
7adc6db02ad18be3c2fbc297375a1480d57abb72
[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 #include "planet.h"
39
40 BSView::BSView(QWidget *parent, BSDoc *doc) : QSplitter(parent)
41 {
42   /** connect doc with the view*/
43
44         m_iMaxTick = 0;
45         m_iMinTick = 0;
46         m_iResultMode = 0;
47         
48         m_bMoreDocChanges = false;
49         connect(doc, SIGNAL(documentChanged()), this, SLOT(slotDocumentChanged()));
50         
51         m_doc = doc;
52         
53         m_LeftSplit = new QSplitter(QSplitter::Vertical, this);
54         m_RightSplit = new QSplitter(QSplitter::Vertical, this);
55
56         //setting up the listview
57         m_NumberView = new QListView(m_LeftSplit);
58         m_NumberView->setRootIsDecorated(true);  
59         m_NumberView->addColumn("Name");
60         m_NumberView->addColumn("Number");
61         m_NumberView->addColumn("ETA");
62         m_NumberView->addColumn("Score");
63         //addBattle("NO BATTLES");
64
65         
66         
67         connect(m_NumberView, SIGNAL(expanded(QListViewItem*)), SLOT(slotItemExpanded(QListViewItem*)));
68         connect(m_NumberView, SIGNAL(collapsed(QListViewItem*)), SLOT(slotItemCollapsed(QListViewItem*)));
69         
70         m_InfoView = new InfoView(m_LeftSplit);
71
72         connect(m_InfoView,SIGNAL(add()),SLOT(slotInfoNew()));
73         connect(m_InfoView,SIGNAL(apply()),SLOT(slotInfoApply()));
74         connect(m_InfoView,SIGNAL(cancel()),SLOT(slotInfoCancel()));
75         connect(m_InfoView,SIGNAL(remove()),SLOT(slotInfoRemove()));
76
77         vector<QString> raceNames;
78         const map<string, vector<int> >& races = Fleet::Races();
79         for(map<string, vector<int> >::const_iterator i = races.begin(); i != races.end(); ++i)
80         {
81                 raceNames.push_back(i->first.c_str());
82         }
83         m_InfoView->setRaces(raceNames);
84         
85         //the right side
86         //m_TickView = new TickView(m_RightSplit);
87         m_FleetViews = new QWidgetStack(m_RightSplit);
88         //m_ScanView = new ScanView(m_RightSplit);
89         
90         Fleet fl1;
91         //fl1.setRace(tr("Terran").latin1());
92         fl1.setRace("Terran");
93         Fleet fl2;
94         fl2.setRace(tr("Generic").latin1());
95
96         //the widget stack
97         m_BattleSum = new BattleSum();
98         m_FleetViews->addWidget(m_BattleSum, 0);
99         m_FleetView = new FleetView(&fl1, true);
100         m_FleetViews->addWidget(m_FleetView, 1);
101         m_GenericFleetView = new FleetView(&fl2, true);
102         m_FleetViews->addWidget(m_GenericFleetView, 2);
103         m_FleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
104         m_GenericFleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
105
106         //m_FleetViews->raiseWidget(0);
107         connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *)));
108         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
109         connect(m_GenericFleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
110 }
111
112 BSView::~BSView()
113 {
114 }
115
116 //////////////////////////////////////////////////////////////////////////
117 //
118 void BSView::addBattle(QString name)
119 {
120         QListViewItem* battle = new QListViewItem(m_NumberView, name);
121         QListViewItem* def = new QListViewItem(battle, tr("Friendly"),"", "","1");
122         (void) new QListViewItem(battle, tr("Hostile"),"", "","2");
123         (void) new QListViewItem(def, tr("Home Planet"), "","","1");
124 }
125
126 ///////////////////////////////////////////////////////////////////////////////
127 //
128 /***This function clears the listview and then iterates through the battles
129  * and recreates the listview hierarchy.
130  */
131 void BSView::slotDocumentChanged()
132 {
133         if (m_bMoreDocChanges)
134                 return;
135
136         m_NumberView->clear();
137         
138         const BattleList& battles = m_doc->battles();   
139
140         vector<QString> battlenames;
141
142         for (BattleList::const_iterator i = battles.begin(); i != battles.end(); ++i)
143         {
144                 QString b = (*i).first;
145                 battlenames.push_back(i->first);
146                 QListViewItem* battle = new QListViewItem(m_NumberView, b);
147                 battle->setOpen(m_TreeExpanded[b]["--"]);
148                         
149
150                 for (map<QString, map<QString, Fleet*> >::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
151                 {
152                         QString g = (*j).first;
153                         QListViewItem* group = new QListViewItem(battle, g);
154                         int groupShips = 0;
155                         unsigned groupScore = 0;
156                         group->setOpen(m_TreeExpanded[b][g]);
157
158                         for (map<QString, Fleet*>::const_iterator k = j->second.begin(); k != j->second.end(); ++k)
159                         {       
160                                 int ships = k->second->numberOfShips();
161                                 unsigned score = k->second->score();
162                                 groupShips += ships;
163                                 groupScore += score;
164                                 //if(k->first == tr("Home Planet"))
165                                         (void) new QListViewItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score));
166                                 /*else
167                                         (void) new QCheckListItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score), QCheckListItem::CheckBox);*/
168
169                         }
170                         group->setText(1, QString("%1").arg(groupShips));
171                         group->setText(3, QString("%1").arg(groupScore));
172                 }
173         }
174         m_InfoView->setBattles(battlenames);
175         updateInfoView();
176         updateFleetView();
177 }
178
179 //////////////////////////////////////////////////////////////////////////////
180 //
181 void BSView::slotFleetSelection(QListViewItem *lvi)
182 {
183
184         if (lvi->parent() == '\0')
185         {
186                 m_FleetViews->raiseWidget(0);
187         }
188         else if (lvi->parent()->parent() == '\0')
189         {
190                 if (lvi->text(0) == tr("Friendly"))
191                 {
192         //                      m_FleetView->slotAttacker(false);
193                 }
194                 else
195                 {
196         //                      m_FleetView->slotAttacker(true);
197                 }
198                 m_FleetViews->raiseWidget(2);
199                 
200         }
201         else
202         {
203                 m_sFleet = lvi->text(0);
204                 m_sGroup = lvi->parent()->text(0);
205                 m_sBattle = lvi->parent()->parent()->text(0);
206
207                 updateInfoView();
208                 updateFleetView();
209         }
210 }
211
212 //////////////////////////////////////////////////////////////////////////
213 //
214 void BSView::slotItemExpanded(QListViewItem *lvi)
215 {
216         if (lvi->parent() == '\0')
217         {
218                 m_TreeExpanded[lvi->text(0)]["--"] = true;
219         }
220         else if (lvi->parent()->parent() == '\0')
221         {
222                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = true;    
223         }
224 }
225
226 //////////////////////////////////////////////////////////////////////////
227 //
228 void BSView::slotItemCollapsed(QListViewItem *lvi)
229 {
230         if (lvi->parent() == '\0')
231         {
232                 m_TreeExpanded[lvi->text(0)]["--"] = false;
233         }
234         else if (lvi->parent()->parent() == '\0')
235         {
236                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = false;   
237         }
238 }
239
240 //////////////////////////////////////////////////////////////////////////
241 //
242 void BSView::slotFleetChanged(const Fleet* fleet)
243 {
244         m_doc->changeFleet(m_sBattle, m_sGroup, m_sFleet, fleet);
245 }
246
247 //////////////////////////////////////////////////////////////////////////
248 //
249 void BSView::slotInfoApply()
250 {
251         QString battle = m_InfoView->battle();
252         QString group  = m_InfoView->group();
253         QString fleet  = m_InfoView->fleetName();
254
255
256         
257         const Fleet* old = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
258
259         const Planet* oldpl = dynamic_cast<const Planet*>(old);
260
261         Fleet* fl;
262         if(oldpl)
263                 fl = new Planet(*oldpl);
264         else
265                 fl = new Fleet(*old);
266
267         
268                 
269         m_bMoreDocChanges = true;
270         m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
271         m_bMoreDocChanges = false;
272
273         m_sBattle = battle;
274         m_sGroup = group;
275         m_sFleet = fleet;
276
277
278         fl->setETA(m_InfoView->eta());
279         fl->setName(m_sFleet.latin1());
280         fl->setRace(m_InfoView->race().latin1());
281         
282         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
283 }
284
285 //////////////////////////////////////////////////////////////////////////
286 //
287 void BSView::slotInfoCancel()
288 {
289         updateInfoView();
290 }
291
292 //////////////////////////////////////////////////////////////////////////
293 //
294 void BSView::slotInfoNew()
295 {
296
297         QString battle = m_InfoView->battle();
298         QString group  = m_InfoView->group();
299         QString fleet  = m_InfoView->fleetName();
300
301         const Fleet* fl1 = m_doc->specificFleet(battle, group, fleet);
302         if (fl1)
303         {
304                 //fleet does already exist, do not overwrite.
305                 //Need something else here....
306                 return;
307         }
308
309         
310         
311         Fleet* fl = new Fleet();
312
313         m_sBattle = battle;
314         m_sGroup = group;
315         m_sFleet = fleet;
316
317         fl->setETA(m_InfoView->eta());
318         fl->setName(m_sFleet.latin1());
319         fl->setRace(m_InfoView->race().latin1());
320
321         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
322
323 }
324
325 //////////////////////////////////////////////////////////////////////////
326 //
327 void BSView::slotInfoRemove()
328 {
329         m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
330         m_sFleet = "";
331 }
332
333 //////////////////////////////////////////////////////////////////////////
334 //
335 void BSView::updateInfoView()
336 {
337         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
338
339         if(!fl)
340         {
341                 m_InfoView->setFleetName("");
342                 m_InfoView->setEta(0);
343                 m_InfoView->enableNameChange(true);
344                 m_InfoView->enableRemove(false);
345                 return;
346         }
347         m_InfoView->setGroup(m_sGroup);
348         m_InfoView->setBattle(m_sBattle);
349
350 /*      NO LONGER NEEDED SINCE IT'S INTEGRATED IN THE InfoView CLASS
351  *      if(m_sFleet == tr("Home Planet") && m_sGroup == tr("Friendly"))
352         {
353                 //m_InfoView->enableNameChange(false);
354                 //m_InfoView->enableRemove(false);
355         }
356         else
357         {
358                 m_InfoView->enableNameChange(true);
359                 m_InfoView->enableRemove(true);
360         }
361 */
362
363         m_InfoView->setRace(fl->race().c_str());
364         m_InfoView->setFleetName(m_sFleet);
365         m_InfoView->setEta(fl->ETA());
366         m_InfoView->setGroup(m_sGroup);
367         m_InfoView->setBattle(m_sBattle);
368 }
369
370 //////////////////////////////////////////////////////////////////////////
371 //
372 void BSView::updateFleetView()
373 {
374         bool friendly = false;
375         bool home       = false;
376
377         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
378
379         if (!fl)
380         {
381                 m_FleetViews->raiseWidget(2);
382                 return;
383         }
384
385         if ( m_sGroup == tr("Friendly"))
386         {
387                         friendly = true;
388                         if(m_sFleet == tr("Home Planet"))
389                                 home=true;
390         }
391         if (fl->race() == tr("Generic").latin1())
392         {
393                 m_GenericFleetView->viewFleet(fl, friendly);
394                 m_FleetViews->raiseWidget(2);
395
396         }
397         else 
398         {
399                 if (fl->race() == m_FleetView->fleet()->race() &&
400                 m_FleetView->isHome() == home)
401                 {
402                         m_FleetView->viewFleet(fl, friendly);
403                 }
404                 else
405                 {
406                         m_FleetViews->removeWidget(m_FleetView);
407                         delete m_FleetView;
408                         m_FleetView = new FleetView(fl, friendly);
409                         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
410                         m_FleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
411                         m_FleetView->slotSetResultMode(m_iResultMode);
412                         m_FleetViews->addWidget(m_FleetView, 1);
413                 }
414                 m_FleetViews->raiseWidget(2);
415                 m_FleetViews->raiseWidget(1);
416         }
417 }
418
419 //////////////////////////////////////////////////////////////////////////
420 //
421 void BSView::slotTickChanged(int min, int max)
422 {
423         m_FleetView->slotViewTickRange(min, max);
424         m_GenericFleetView->slotViewTickRange(min, max);
425
426         m_iMinTick = min;
427         m_iMaxTick = max;
428 }
429
430 //////////////////////////////////////////////////////////////////////////
431 //
432 void BSView::slotResultModeChanged( int i)
433 {
434         m_FleetView->slotSetResultMode(i);
435         m_GenericFleetView->slotSetResultMode(i);
436         
437         m_iResultMode = i;
438 }