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