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