]> ruin.nu Git - hbs.git/blob - bs/bsview.cpp
df3f558d97de534a8a5d37512581b9c1de3c2a4f
[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         fl->setStays(m_InfoView->stays());
282         
283         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
284 }
285
286 //////////////////////////////////////////////////////////////////////////
287 //
288 void BSView::slotInfoCancel()
289 {
290         updateInfoView();
291 }
292
293 //////////////////////////////////////////////////////////////////////////
294 //
295 void BSView::slotInfoNew()
296 {
297
298         QString battle = m_InfoView->battle();
299         QString group  = m_InfoView->group();
300         QString fleet  = m_InfoView->fleetName();
301
302         const Fleet* fl1 = m_doc->specificFleet(battle, group, fleet);
303         if (fl1)
304         {
305                 //fleet does already exist, do not overwrite.
306                 //Need something else here....
307                 return;
308         }
309
310         
311         
312         Fleet* fl = new Fleet();
313
314         m_sBattle = battle;
315         m_sGroup = group;
316         m_sFleet = fleet;
317
318         fl->setETA(m_InfoView->eta());
319         fl->setName(m_sFleet.latin1());
320         fl->setRace(m_InfoView->race().latin1());
321         fl->setStays(m_InfoView->stays());
322
323         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
324
325 }
326
327 //////////////////////////////////////////////////////////////////////////
328 //
329 void BSView::slotInfoRemove()
330 {
331         m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
332         m_sFleet = "";
333 }
334
335 //////////////////////////////////////////////////////////////////////////
336 //
337 void BSView::updateInfoView()
338 {
339         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
340
341         if(!fl)
342         {
343                 m_InfoView->setFleetName("");
344                 m_InfoView->setEta(0);
345                 m_InfoView->enableNameChange(true);
346                 m_InfoView->enableRemove(false);
347                 return;
348         }
349         m_InfoView->setGroup(m_sGroup);
350         m_InfoView->setBattle(m_sBattle);
351
352 /*      NO LONGER NEEDED SINCE IT'S INTEGRATED IN THE InfoView CLASS
353  *      if(m_sFleet == tr("Home Planet") && m_sGroup == tr("Friendly"))
354         {
355                 //m_InfoView->enableNameChange(false);
356                 //m_InfoView->enableRemove(false);
357         }
358         else
359         {
360                 m_InfoView->enableNameChange(true);
361                 m_InfoView->enableRemove(true);
362         }
363 */
364
365         m_InfoView->setRace(fl->race().c_str());
366         m_InfoView->setFleetName(m_sFleet);
367         m_InfoView->setEta(fl->ETA());
368         m_InfoView->setGroup(m_sGroup);
369         m_InfoView->setBattle(m_sBattle);
370         m_InfoView->setStays(fl->stays());
371 }
372
373 //////////////////////////////////////////////////////////////////////////
374 //
375 void BSView::updateFleetView()
376 {
377         bool friendly = false;
378         bool home       = false;
379
380         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
381
382         if (!fl)
383         {
384                 m_FleetViews->raiseWidget(2);
385                 return;
386         }
387
388         if ( m_sGroup == tr("Friendly"))
389         {
390                         friendly = true;
391                         if(m_sFleet == tr("Home Planet"))
392                                 home=true;
393         }
394         if (fl->race() == tr("Generic").latin1())
395         {
396                 m_GenericFleetView->viewFleet(fl, friendly);
397                 m_FleetViews->raiseWidget(2);
398
399         }
400         else 
401         {
402                 if (fl->race() == m_FleetView->fleet()->race() &&
403                 m_FleetView->isHome() == home)
404                 {
405                         m_FleetView->viewFleet(fl, friendly);
406                 }
407                 else
408                 {
409                         m_FleetViews->removeWidget(m_FleetView);
410                         delete m_FleetView;
411                         m_FleetView = new FleetView(fl, friendly);
412                         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
413                         m_FleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
414                         m_FleetView->slotSetResultMode(m_iResultMode);
415                         m_FleetViews->addWidget(m_FleetView, 1);
416                 }
417                 m_FleetViews->raiseWidget(2);
418                 m_FleetViews->raiseWidget(1);
419         }
420 }
421
422 //////////////////////////////////////////////////////////////////////////
423 //
424 void BSView::slotTickChanged(int min, int max)
425 {
426         m_FleetView->slotViewTickRange(min, max);
427         m_GenericFleetView->slotViewTickRange(min, max);
428
429         m_iMinTick = min;
430         m_iMaxTick = max;
431 }
432
433 //////////////////////////////////////////////////////////////////////////
434 //
435 void BSView::slotResultModeChanged( int i)
436 {
437         m_FleetView->slotSetResultMode(i);
438         m_GenericFleetView->slotSetResultMode(i);
439         
440         m_iResultMode = i;
441 }