]> ruin.nu Git - hbs.git/blob - bs/bsview.cpp
2dfe3f37f45263381c262a25b30c8dfc1f8169ca
[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         vector<QString> raceNames;
66         const map<string, vector<int> >& races = Fleet::Races();
67         for(map<string, vector<int> >::const_iterator i = races.begin(); i != races.end(); ++i)
68         {
69                 raceNames.push_back(i->first.c_str());
70         }
71         m_InfoView->setRaces(raceNames);
72         
73         //the right side
74         m_TickView = new TickView(m_RightSplit);
75         m_FleetViews = new QWidgetStack(m_RightSplit);
76         m_ScanView = new ScanView(m_RightSplit);
77         
78         Fleet fl1;
79         //fl1.setRace(tr("Terran").latin1());
80         fl1.setRace("Terran");
81         Fleet fl2;
82         fl2.setRace(tr("Generic").latin1());
83
84         //the widget stack
85         m_BattleSum = new BattleSum();
86         m_FleetViews->addWidget(m_BattleSum, 0);
87         m_FleetView = new FleetView(&fl1, true);
88         m_FleetViews->addWidget(m_FleetView, 1);
89         m_GenericFleetView = new FleetView(&fl2, true);
90         m_FleetViews->addWidget(m_GenericFleetView, 2);
91         //m_FleetViews->raiseWidget(0);
92         connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *))); 
93 }
94
95 BSView::~BSView()
96 {
97 }
98
99 //////////////////////////////////////////////////////////////////////////
100 //
101 void BSView::addBattle(QString name)
102 {
103         QListViewItem* battle = new QListViewItem(m_NumberView, name);
104         QListViewItem* def = new QListViewItem(battle, tr("Friendly"),"", "","1");
105         (void) new QListViewItem(battle, tr("Hostile"),"", "","2");
106         (void) new QListViewItem(def, tr("Home Planet"), "","","1");
107 }
108
109 ///////////////////////////////////////////////////////////////////////////////
110 //
111 /***This function clears the listview and then iterates through the battles
112  * and recreates the listview hierarchy.
113  */
114 void BSView::slotDocumentChanged()
115 {
116         m_NumberView->clear();
117         
118         const BattleList& battles = m_doc->battles();   
119
120         for (BattleList::const_iterator i = battles.begin(); i != battles.end(); ++i)
121         {
122                 QString b = (*i).first;
123                 QListViewItem* battle = new QListViewItem(m_NumberView, b);
124                 battle->setOpen(m_TreeExpanded[b]["--"]);
125                         
126
127                 for (map<QString, map<QString, Fleet*> >::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
128                 {
129                         QString g = (*j).first;
130                         QListViewItem* group = new QListViewItem(battle, g);
131                         int groupShips = 0;
132                         unsigned groupScore = 0;
133                         group->setOpen(m_TreeExpanded[b][g]);
134
135                         for (map<QString, Fleet*>::const_iterator k = j->second.begin(); k != j->second.end(); ++k)
136                         {       
137                                 int ships = k->second->numberOfShips();
138                                 unsigned score = k->second->score();
139                                 groupShips += ships;
140                                 groupScore += score;
141                                 (void) new QListViewItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score));
142                         }
143                         group->setText(1, QString("%1").arg(groupShips));
144                         group->setText(3, QString("%1").arg(groupScore));
145                 }
146         }
147 }
148
149 //////////////////////////////////////////////////////////////////////////////
150 //
151 void BSView::slotFleetSelection(QListViewItem *lvi)
152 {
153         //cout << lvi->parent()->text(2).toLocal8bit() << endl;
154 //      for (int i = 0; i < 5; i++)
155 //              cout << lvi->text(i).local8Bit() << endl;
156         
157
158         if (lvi->parent() == '\0')
159         {
160                 m_FleetViews->raiseWidget(0);
161         }
162         else if (lvi->parent()->parent() == '\0')
163         {
164 //                      m_FleetView->slotHomePlanet(false);
165                 if (lvi->text(0) == tr("Friendly"))
166                 {
167 //                      m_FleetView->slotAttacker(false);
168                 }
169                 else
170                 {
171 //                      m_FleetView->slotAttacker(true);
172                 }
173                 m_FleetViews->raiseWidget(2);
174                 
175         }
176         else
177         {
178                 bool friendly = false;
179                 bool home       = false;
180                 QString fleet = lvi->text(0);
181                 QString group = lvi->parent()->text(0);
182                 QString battle = lvi->parent()->parent()->text(0);
183                 if ( group == tr("Friendly"))
184                 {
185                         friendly = true;
186                         if(fleet == tr("Home Planet"))
187                                 home=true;
188                 }
189                 const Fleet* fl = m_doc->specificFleet(battle, group, fleet);
190                 m_InfoView->setRace(fl->race().c_str());
191                 m_InfoView->setFleetName(fleet);
192                 m_InfoView->setEta(fl->ETA());
193                 if (fl->race() == tr("Generic").latin1())
194                 {
195                         m_GenericFleetView->viewFleet(fl, friendly);
196                         m_FleetViews->raiseWidget(2);
197
198                 }
199                 else 
200                 {
201                         if (fl->race() == m_FleetView->fleet()->race() &&
202                         m_FleetView->isHome() == home)
203                         {
204                                 m_FleetView->viewFleet(fl, friendly);
205                         }
206                         else
207                         {
208                                 m_FleetViews->removeWidget(m_FleetView);
209                                 m_FleetView = new FleetView(fl, friendly);
210                                 m_FleetViews->addWidget(m_FleetView, 1);
211                         }
212                         m_FleetViews->raiseWidget(1);
213                 }
214         }
215 }
216
217 //////////////////////////////////////////////////////////////////////////
218 //
219 void BSView::slotItemExpanded(QListViewItem *lvi)
220 {
221         if (lvi->parent() == '\0')
222         {
223                 m_TreeExpanded[lvi->text(0)]["--"] = true;
224         }
225         else if (lvi->parent()->parent() == '\0')
226         {
227                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = true;    
228         }
229 }
230
231 //////////////////////////////////////////////////////////////////////////
232 //
233 void BSView::slotItemCollapsed(QListViewItem *lvi)
234 {
235         if (lvi->parent() == '\0')
236         {
237                 m_TreeExpanded[lvi->text(0)]["--"] = false;
238         }
239         else if (lvi->parent()->parent() == '\0')
240         {
241                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = false;   
242         }
243 }
244